Summary
Pre-existing spec divergence in src/adcp/signing/verifier.py:95: VerifierCapability.covers_content_digest defaults to \"required\" but the AdCP 3.0 schema explicitly sets \"default\": \"either\" (schemas/cache/protocol/get-adcp-capabilities-response.json:912-921) with the rationale: "'required' is recommended for spend-committing operations in production; 4.0 recommends 'required' for those operations."
The 3.0 spec position: default is \"either\", \"required\" is opt-in for spend-committing ops, and 4.0 will recommend it broadly.
Background
Surfaced during the v6.0 DecisioningPlatform foundation audit (PR #297 expert review). PR #297's first commit included a regression test pinning the divergent default — that test was dropped in the scope-down per protocol-expert finding.
Proposed change
- Flip
VerifierCapability.covers_content_digest default from \"required\" to \"either\".
- Promote spend-committing operations (
create_media_buy, update_media_buy) to \"required\" via required_for=frozenset({...}).
- Webhook profile (
adcp.signing.webhook_verifier) keeps its hard-coded \"required\" (correct, distinct from the request-signing default).
Risk
Any existing adopter relying on \"required\" by default will need to set it explicitly when constructing VerifierCapability(covers_content_digest=\"required\"). Document in CHANGELOG.
References
Summary
Pre-existing spec divergence in
src/adcp/signing/verifier.py:95:VerifierCapability.covers_content_digestdefaults to\"required\"but the AdCP 3.0 schema explicitly sets\"default\": \"either\"(schemas/cache/protocol/get-adcp-capabilities-response.json:912-921) with the rationale: "'required' is recommended for spend-committing operations in production; 4.0 recommends 'required' for those operations."The 3.0 spec position: default is
\"either\",\"required\"is opt-in for spend-committing ops, and 4.0 will recommend it broadly.Background
Surfaced during the v6.0 DecisioningPlatform foundation audit (PR #297 expert review). PR #297's first commit included a regression test pinning the divergent default — that test was dropped in the scope-down per protocol-expert finding.
Proposed change
VerifierCapability.covers_content_digestdefault from\"required\"to\"either\".create_media_buy,update_media_buy) to\"required\"viarequired_for=frozenset({...}).adcp.signing.webhook_verifier) keeps its hard-coded\"required\"(correct, distinct from the request-signing default).Risk
Any existing adopter relying on
\"required\"by default will need to set it explicitly when constructingVerifierCapability(covers_content_digest=\"required\"). Document in CHANGELOG.References
schemas/cache/protocol/get-adcp-capabilities-response.json:912-921src/adcp/signing/verifier.py:84-95