โ† All docs  ยท  Home

ADR 0010 โ€” JWT export profile (PUT /submit/{jwt})

Context

Mangrove submits reviews as a signed JWT (PUT ${api}/submit/${jwt}). To interoperate with that shape โ€” and to offer a single self-contained, signature-carrying transport for an annotation โ€” Freedback needs a JWT export/transport profile. It must never become the native format: the native wire format is the W3C Web Annotation (INVARIANT 1).

Decision

protocol-lib::export:

The feedback server exposes PUT /submit/{jwt}: the JWT signature is the issuer proof, so this path needs no bearer/self-signature; the decoded annotation goes through the normal SHACL-validate + store pipeline. The capability is advertised as jwt-export in /.well-known/freedback.

Why reuse our own ES256, not a JWT crate

We already have a pinned, dual-target ES256 (P-256) implementation and a canonical-bytes signer. A compact-JWS encode/decode is ~40 lines on top of it and avoids adding a JOSE dependency (the plan flagged jsonwebtoken as WASM-discouraged). The format is standard ES256 JWS, so it interoperates.

Consequences / limitations