This page enumerates spec gaps that currently affect storyboard conformance. Each entry covers one of three patterns: a specDocumentation Index
Fetch the complete documentation index at: https://agenticadvertisingorg-changeset-release-main.mintlify.app/llms.txt
Use this file to discover all available pages before exploring further.
MAY branch where vectors assert one outcome, a response field storyboards assert that the schema does not yet require, or a testing-infrastructure quirk that prevents a vector from probing through the reference SDK.
Entries persist until the fix ships in a tagged @adcp/sdk or spec release — closing the GitHub issue is not the removal trigger, because an implementer on an SDK version that predates the fix still hits the symptom. Each entry’s Workaround names the release gate when relevant. If an entry here doesn’t match what you’re seeing, check the GitHub issue for the latest state — the fix may have landed in a release you haven’t pulled yet.
How to use this page
If a storyboard fails on a behavior you believe is spec-conformant, search this page for the storyboard name or the assertion text. Each entry describes the gap, the workaround that gets you past the blocker, and the issue that tracks the fix. Entries are removed when the fix ships in a tagged release, not when the issue closes — pair this page with the linked issue and the SDK / spec release notes for the authoritative state. For the opposite direction — failures that are not in this list and do have clean fixes — see the storyboard troubleshooting guide.Current ambiguities
check_governance conditions field shape
- Schema:
check-governance-response.jsondefinesconditions[]items as{ field, required_value?, reason }withfieldandreasonrequired. Thestatus: conditionsstatus now requiresconditionswithminItems: 1. - Resolution: #2603. The schema tightening lands in the protocol patch release following this entry’s removal.
- Workaround (until you pull the fix): emit
conditions[]with the canonical{ field, reason }shape on everystatus: conditionsresponse. Agents following the prose description already do this; the schema tightening just makes enforcement mechanical.
PRM required for non-OAuth agents
- Storyboard:
universal/security.yamlphasesoauth_discovery+mechanism_required. - Gap: the RFC 9728 / RFC 8414 probes run for every agent by default. API-key-only sandboxes were standing up fake issuer URLs to “pass” the probes, which is worse than skipping them.
- Resolution: #2606 — the storyboard narrative now explicitly directs API-key-only agents to declare
auth.api_keyin the test kit and omit PRM entirely. Optional-phase semantics makeoauth_discoveryfailures non-fatal;mechanism_requiredpasses via the API-key path. - Workaround: if your agent has no OAuth issuer, do not serve
/.well-known/oauth-protected-resource/.... Configure your agent to accept the test kit’s probe key as a valid credential — the default test kit (acme-outdoor) probes withdemo-acme-outdoor-v1, and your agent must accept that value alongside your production key. This satisfiestest_kit.auth.api_keyand lets theapi_key_pathphase run; without it the phase is skipped andassert_mechanismfails withactual: []. See the storyboard troubleshooting guide — Bearer-only agent: assert_mechanism for the concrete fix.
Idempotency missing-key probe via SDK
- Storyboard:
universal/idempotency.yamlstepmissing_key/create_media_buy_missing_key. - Gap: the reference
@adcp/sdkSDK auto-injectsidempotency_keyon mutating tasks, so a vector that tries to probe “missing key rejection” never reaches the agent with a missing key — the runner would inject one before dispatch. - Resolution: #2607 — the step declares
omit_idempotency_key: true, which signals the runner to skip both its ownapplyIdempotencyInvariantand the SDK’s auto-inject. The request arrives at your agent without a key, letting the vector probe the rejection path honestly. - Workaround: nothing required — honor the existing spec requirement (reject missing
idempotency_keyon mutating tasks withINVALID_REQUESTorVALIDATION_ERROR).
Response schema fields asserted by storyboards
- Storyboards:
sales_catalog_driven(catalog counts),creative_ad_server(pricing_options),media_buy_seller/inventory_list_targeting(property_list echo),creative_ad_server(vendor_cost required). - Gap: historical drift between what storyboard vectors assert and what the response schemas require.
- Resolution: #2604. Audit complete:
sync-catalogs-response.jsonnow requiresitem_counton catalog entries whenactioniscreated/updated/unchanged.property_list/collection_listecho: already canonical viapackages[].targeting_overlay.list-creatives-response.jsonpricing_options: already canonical (array,minItems: 1, items requirepricing_option_id).report-usage-request.jsonvendor_cost: already required.
- Workaround: emit
item_counton every non-failed/non-deleted catalog entry. Conformant agents already do this; the schema tightening catches gaps atresponse_schemavalidation.
Rights-holder vs advertiser brand_id in brand protocol
- Storyboard:
specialisms/brand-rights/index.yamlphasesidentity_discovery+rights_search. - Gap:
get_brand_identity.brand_ididentifies the advertiser (e.g.,acme_outdoor);get_rights.brand_idscopes the search to a specific rights-holder brand (e.g., talent likedaan_janssen). Same field name, different entities — before the #2627 fix the storyboard threaded the advertiser id through to the rights-holder filter, and a conformant agent either returned empty rights (fail) or added a “return all when no match” fallback (masking bugs). - Resolution: #2627 — the storyboard now sends
buyer_brand(advertiser for compatibility filtering) and omits the rights-holderbrand_idfilter so the agent returns its full catalog. - Workaround: treat
get_rights.brand_idas a rights-holder filter only; populatebuyer_brandfor compatibility filtering against the buyer’sbrand.json.
Re-cancel error code — NOT_CANCELLABLE vs INVALID_STATE
- Storyboards:
protocols/media-buy/state-machine.yaml > recancel_buyandscenarios/invalid_transitions.yaml > double_cancel/second_cancel. - Gap:
specification.mdx§128 (MAYNOT_CANCELLABLE) and §129 (MUSTINVALID_STATEon terminal-state updates) both applied to re-cancel of acanceledbuy. State-machine-first implementations returnedINVALID_STATEper §129; cancellation-first implementations returnedNOT_CANCELLABLE. Vectors historically pinned one. - Resolution: #2617 / #2619 + #2628 — §129 now carves out the cancellation case: when the terminal-state update IS a cancellation attempt, agents MUST return
NOT_CANCELLABLE. Other illegal transitions (pause/resume on canceled) still returnINVALID_STATE. Both storyboards now assertNOT_CANCELLABLEon re-cancel. - Workaround: return
NOT_CANCELLABLEoncanceled: trueupdates to buys already incanceled. ReturnINVALID_STATEon pause/resume of terminal-state buys. The cancellation-specific code wins on re-cancel; the generic code wins on everything else.
Branch-set step grading (peer_branch_taken)
- Storyboards: any with parallel
optional: truephases sharing acontributes_to:flag — canonical exampleuniversal/schema-validation.yaml > past_start_reject_path+past_start_adjust_path(aggregation flagpast_start_handled). - Gap: a conformant agent picks one branch (e.g., rejects past
start_time); the other branch’s assertion (e.g.,field_present: media_buy_id) fails because the agent took the opposite behavior. Runners before the #2629 fix surfaced this as× (unknown step)in the summary even though theany_ofaggregate passed — implementers debugged a branch they weren’t on. - Resolution: #2629 — runners now grade non-chosen branch steps with skip reason
peer_branch_taken(distinct fromnot_applicable, which is reserved for protocol/specialism coverage gaps). Seestoryboard-schema.yaml§ “Per-step grading in any_of branch patterns” for the authoring rules andrunner-output-contract.yaml > skip_result.reasons.peer_branch_takenfor the canonicaldetailshape. - Workaround: if your runner reports an unexpected branch failure, check whether a peer optional phase contributed the same
contributes_toflag. If so, you’re conformant on the branch you chose — the runner needs the #2629 update.
SDK request-builder overriding spec-conformant sample_request
- Storyboard:
sales_catalog_drivenoptimization_loop/provide_feedback, exposed via the@adcp/sdkcompliance runner. - Gap: the storyboard’s
sample_requestcorrectly declaresperformance_index,metric_type,feedback_sourceper theprovide-performance-feedback-request.jsonschema. But@adcp/sdk’s internalrequest-builder.jshad a hardcoded override forprovide_performance_feedbackthat replaced the payload with a non-specfeedback: { satisfaction, notes }shape, so conformant agents rejected withINVALID_REQUESTand failed the vector. - Resolution: upstream adcontextprotocol/adcp-client#689 + #2626 — remove the override and let the storyboard’s
sample_requestdrive the payload. - Workaround: bump to an
@adcp/sdkrelease that includes the adcp-client#689 fix. Until then, theprovide_performance_feedbackvector will fail on any agent that validates its requests against the spec schema.