Summary
The security_baseline/mechanism_required storyboard fails any agent that uses HTTP Basic auth, even when the test harness can successfully authenticate against it. The current contract only credits auth_mechanism_verified from two phases — api_key_path (Bearer) or oauth_discovery (RFC 9728) — leaving Basic-auth agents non-conformant despite the harness supporting Basic since adcp-client#1318.
Current behavior
compliance/cache/<version>/universal/security.yaml:
api_key_path skips on !test_kit.auth.api_key
oauth_discovery requires /.well-known/oauth-protected-resource/<path>
mechanism_required/assert_mechanism fails if neither phase contributes
A Basic-auth agent (e.g. InMobi's seller agent) trips the failure even though:
- The test runner can authenticate against it (Authorization: Basic header is supported end-to-end)
- The agent properly rejects unauthenticated requests
- All other security baseline probes pass
Why this matters
Basic and Bearer are semantically equivalent on the wire — single shared secret in the Authorization header. The storyboard's rejection of Basic is format prescription, not a real security stance. Forcing existing Basic-using agents to retrofit to Bearer creates adoption friction without a corresponding security benefit.
The original argument for Bearer-only ("modern API convention") doesn't hold up against the reality that several deployed adopters use Basic, the harness supports it, and the protocol-level guarantees (auth attempted on every request, valid creds accepted, invalid creds rejected) are identical.
Proposed change
Add a basic_path phase to security.yaml parallel to api_key_path:
- id: basic_path
title: "HTTP Basic auth probe"
skip_if: "!test_kit.auth.basic"
branch_set:
id: auth_mechanism_verified
semantics: any_of
steps:
- id: probe_basic_valid
# Authenticate with test_kit.auth.basic credentials → expect 200
- id: probe_basic_invalid
# Authenticate with random invalid Basic → expect 401 with WWW-Authenticate
Test-kit schema additions:
auth.basic.username / auth.basic.password (or a single auth.basic.credentials field)
assert_mechanism updates to accept contribution from any of api_key_path, basic_path, or oauth_discovery.
Open questions
- Should the
auth_mechanism_verified flag distinguish which mechanism passed (so buyers can introspect what they're connecting to)? Or stay generic?
- Does the
protocol/authentication doc need a corresponding section on Basic, or is "any single-shared-secret transport" sufficient framing?
- Any downstream impacts on the AAO Verified engine's introspection check (§6.7)?
Affected adopters
InMobi seller agent (https://adcp-nonprod.exchange.inmobi.com/mcp) — currently blocked on security_baseline/assert_mechanism despite otherwise clean 3.0.12 compliance.
Summary
The
security_baseline/mechanism_requiredstoryboard fails any agent that uses HTTP Basic auth, even when the test harness can successfully authenticate against it. The current contract only creditsauth_mechanism_verifiedfrom two phases —api_key_path(Bearer) oroauth_discovery(RFC 9728) — leaving Basic-auth agents non-conformant despite the harness supporting Basic since adcp-client#1318.Current behavior
compliance/cache/<version>/universal/security.yaml:api_key_pathskips on!test_kit.auth.api_keyoauth_discoveryrequires/.well-known/oauth-protected-resource/<path>mechanism_required/assert_mechanismfails if neither phase contributesA Basic-auth agent (e.g. InMobi's seller agent) trips the failure even though:
Why this matters
Basic and Bearer are semantically equivalent on the wire — single shared secret in the
Authorizationheader. The storyboard's rejection of Basic is format prescription, not a real security stance. Forcing existing Basic-using agents to retrofit to Bearer creates adoption friction without a corresponding security benefit.The original argument for Bearer-only ("modern API convention") doesn't hold up against the reality that several deployed adopters use Basic, the harness supports it, and the protocol-level guarantees (auth attempted on every request, valid creds accepted, invalid creds rejected) are identical.
Proposed change
Add a
basic_pathphase tosecurity.yamlparallel toapi_key_path:Test-kit schema additions:
auth.basic.username/auth.basic.password(or a singleauth.basic.credentialsfield)assert_mechanismupdates to accept contribution from any ofapi_key_path,basic_path, oroauth_discovery.Open questions
auth_mechanism_verifiedflag distinguish which mechanism passed (so buyers can introspect what they're connecting to)? Or stay generic?protocol/authenticationdoc need a corresponding section on Basic, or is "any single-shared-secret transport" sufficient framing?Affected adopters
InMobi seller agent (
https://adcp-nonprod.exchange.inmobi.com/mcp) — currently blocked onsecurity_baseline/assert_mechanismdespite otherwise clean 3.0.12 compliance.