Tracking issue for the OpenID AIIM CG
Which columns ZeroID can claim
| Role |
Available |
| OAuth AS |
yes |
| Resource AS |
yes |
| OpenID Provider |
no — no id_token issuance, no /.well-known/openid-configuration, no ID-JAG minting; we only redeem |
| MCP Client / Server / Gateway |
no — firehog's entry, see below |
Two of the three top-level rows are the ceiling. The event's own top-level matrix already greys out OAuth token based access for both our columns.
Status
EMA — in good shape. Valid ID-JAG alone checks the EMA box, and we implement every clause of the p.9 verification table plus single-use jti replay rejection the event does not ask for. Gaps: #265 (sub_id), #258 (resource as a request parameter).
CIMD — cannot check the box today. Qualification needs ≥1 Client ID Metadata row and ≥1 client-authentication row. We pass the first and score zero on the second, because our CIMD clients are public by construction. #264 is the fix; #263 blocks testing it with anyone.
Issues
|
Priority |
#263 — /oauth2/authorize has no browser GET leg |
P0, blocks all CIMD interop testing |
#264 — confidential CIMD clients (jwks_uri/jwks + private_key_jwt) |
P0, decides the CIMD box |
#265 — sub_id on ID-JAG redemption |
P1, small |
#258 — RFC 8707 resource request parameter |
P1, pre-existing |
#266 — client_credentials for CIMD clients |
P2, depends on #264 |
#206 — private_key_jwt client auth |
prerequisite for #264 |
Deliberately not doing
ID-JAG issuance / the OpenID Provider role. Claiming the EMA OP column means id_token issuance, refresh tokens, and OIDC discovery first. That is not a December-sized item. The test harness stubs the OP instead, which also tells us cheaply whether the real thing is worth building.
tls_client_auth / the MTLS rows. No implementation anywhere, least valuable of the three client-auth rows, already deferred in #206.
Per-client_id CIMD allow-list. The pre-registered client row is satisfied — arguably — by cimd.allowed_domains (config.go:97), a host allow-list. It is coarser than the row implies: one approved host vouches for every document on it. Worth flagging to the tester rather than building, unless a partner objects.
Test harness
highflame-regression/tests/api/mcp_interop/ — one test per matrix row, named so the pytest report transcribes into the submission form. Gaps are xfail(strict=True), so closing one turns the suite red until the marker comes off; a green run means the recorded matrix is accurate. Each issue above names the tests it flips.
Flows are MCP-native (mcp 2.0.0, protocol revision 2026-07-28) — a real MCPServer and a real OAuthClientProvider, because hand-rolled HTTP can be written to match whatever we happen to accept and will pass while a partner's client fails. The SDK speaks CIMD (client_metadata_url) and SEP-990 ID-JAG natively, and ZeroID already advertises both discovery flags, so it drives our paths with no glue.
Findings for the CG, not for us
- The plan has a typo. p.9 says the ID-JAG
typ is oauth-id-jag-jwt; the draft and our implementation use oauth-id-jag+jwt (internal/service/oauth_id_jag.go:25). A partner building to the published document will hand us assertions we correctly refuse, and the row reads as our failure. Get it corrected before Aug 10.
- No CIMD matrix row for a public PKCE client — the MCP 2025-11-25 preferred shape, and what we implement.
- The reference Python SDK cannot check the
scope-in-WWW-Authenticate row. mcp 2.0.0 builds the challenge from error/error_description/resource_metadata only. One of only two rows in the OAuth matrix, so most participants will leave it blank. Firehog implements it (highflame-firehog/src/gateway/proxy.rs:674).
Firehog
src/gateway/federated.rs terminates and re-originates rather than transparently proxying, and the plan explicitly disqualifies transparent proxies. So firehog can enter as a second participant and reach the MCP Gateway column and the OAuth matrix — boxes ZeroID structurally cannot touch. Confirm the client leg, then point the existing harness at it.
Tracking issue for the OpenID AIIM CG
Which columns ZeroID can claim
id_tokenissuance, no/.well-known/openid-configuration, no ID-JAG minting; we only redeemTwo of the three top-level rows are the ceiling. The event's own top-level matrix already greys out OAuth token based access for both our columns.
Status
EMA — in good shape.
Valid ID-JAGalone checks the EMA box, and we implement every clause of the p.9 verification table plus single-usejtireplay rejection the event does not ask for. Gaps: #265 (sub_id), #258 (resourceas a request parameter).CIMD — cannot check the box today. Qualification needs ≥1 Client ID Metadata row and ≥1 client-authentication row. We pass the first and score zero on the second, because our CIMD clients are public by construction. #264 is the fix; #263 blocks testing it with anyone.
Issues
/oauth2/authorizehas no browser GET legjwks_uri/jwks+private_key_jwt)sub_idon ID-JAG redemptionresourcerequest parameterclient_credentialsfor CIMD clientsprivate_key_jwtclient authDeliberately not doing
ID-JAG issuance / the OpenID Provider role. Claiming the EMA OP column means
id_tokenissuance, refresh tokens, and OIDC discovery first. That is not a December-sized item. The test harness stubs the OP instead, which also tells us cheaply whether the real thing is worth building.tls_client_auth/ the MTLS rows. No implementation anywhere, least valuable of the three client-auth rows, already deferred in #206.Per-
client_idCIMD allow-list. Thepre-registered clientrow is satisfied — arguably — bycimd.allowed_domains(config.go:97), a host allow-list. It is coarser than the row implies: one approved host vouches for every document on it. Worth flagging to the tester rather than building, unless a partner objects.Test harness
highflame-regression/tests/api/mcp_interop/— one test per matrix row, named so the pytest report transcribes into the submission form. Gaps arexfail(strict=True), so closing one turns the suite red until the marker comes off; a green run means the recorded matrix is accurate. Each issue above names the tests it flips.Flows are MCP-native (
mcp2.0.0, protocol revision2026-07-28) — a realMCPServerand a realOAuthClientProvider, because hand-rolled HTTP can be written to match whatever we happen to accept and will pass while a partner's client fails. The SDK speaks CIMD (client_metadata_url) and SEP-990 ID-JAG natively, and ZeroID already advertises both discovery flags, so it drives our paths with no glue.Findings for the CG, not for us
typisoauth-id-jag-jwt; the draft and our implementation useoauth-id-jag+jwt(internal/service/oauth_id_jag.go:25). A partner building to the published document will hand us assertions we correctly refuse, and the row reads as our failure. Get it corrected before Aug 10.scope-in-WWW-Authenticaterow.mcp2.0.0 builds the challenge fromerror/error_description/resource_metadataonly. One of only two rows in the OAuth matrix, so most participants will leave it blank. Firehog implements it (highflame-firehog/src/gateway/proxy.rs:674).Firehog
src/gateway/federated.rsterminates and re-originates rather than transparently proxying, and the plan explicitly disqualifies transparent proxies. So firehog can enter as a second participant and reach the MCP Gateway column and the OAuth matrix — boxes ZeroID structurally cannot touch. Confirm the client leg, then point the existing harness at it.