feat(schema): bills_through_adcp capability + BILLING_OUT_OF_BAND error (closes #2881, #2882)#4561
Merged
Merged
Conversation
…ND error PR #2879 softened the creative-ad-server conformance for agents that bill out of band (flat license, SaaS contract, bundled enterprise — CM360 is the canonical case) but left two loops open on the wire: buyers had no pre-call way to discover which billing mode an agent was in, and there was no standard error code for "this account does not accept usage records." Both follow-ups are strictly additive: - capabilities.creative.bills_through_adcp lets buyers pre-filter creative agents across a portfolio without first establishing an account just to probe pricing. Agents that don't declare it stay in the probe-to-discover mode buyers already tolerate. - BILLING_OUT_OF_BAND is the per-record report_usage rejection for accounts that bill via a non-AdCP channel. Distinct from BILLING_NOT_SUPPORTED (media-buy billing-value rejection) and BILLING_NOT_PERMITTED_FOR_AGENT (per-agent commercial gate) — this signals that the entire billing surface is offline for the account, not that a specific value or caller is rejected. Recovery: terminal — auto-retry will not change the outcome. Both codes are held-for-next-minor / 3.1 per the drift registry policy: adding to an enum is a wire change against 3.0.x receivers. Closes #2881, #2882. Builds on #2879.
This was referenced May 15, 2026
Closed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Two strictly additive schema changes spawned by #2879 (which softened creative-ad-server conformance for agents that bill out of band). Both close loops that #2879 deliberately left open.
capabilities.creative.bills_through_adcp(boolean, default false/absent) onget-adcp-capabilities-response.json. Pre-call discriminator so buyer agents can pre-filter creative agents across a portfolio before establishing an account just to probe pricing. Whentrue, buyers can expectpricing_optionsonlist_creatives,pricing_option_id/vendor_costonbuild_creative, andreport_usagethat accepts records. Closes spec: add bills_through_adcp capability to creative get_adcp_capabilities #2881.BILLING_OUT_OF_BAND(recovery: terminal) on the error-code enum. The standard per-recordreport_usagerejection for accounts that bill via a non-AdCP channel. Distinct fromBILLING_NOT_SUPPORTED(media-buybilling-value rejection) andBILLING_NOT_PERMITTED_FOR_AGENT(per-buyer-agent commercial gate) — this signals that the entire billing surface is offline for the account, not that a specific value or caller is rejected. The code itself is the discriminator; noerror.detailsshape defined (mirroringCONFIGURATION_ERROR). Closes spec: standard error code for "agent does not accept usage records" #2882.Investigation note: checked whether
OPERATION_NOT_SUPPORTEDexisted as #2882 raised — it does not.BILLING_OUT_OF_BANDis the right choice on specificity grounds and not redundant.Both follow the established 3.0.x drift policy:
held-for-next-minor/3.1. Adding an enum value is a wire change and ships in 3.1, not as a 3.0.x patch.What this touches
static/schemas/source/protocol/get-adcp-capabilities-response.json—bills_through_adcpadded to thecreativeblock alongside the existing boolean siblings.static/schemas/source/enums/error-code.json—BILLING_OUT_OF_BANDin enum,enumDescriptions, andenumMetadata(per the dual-surface pattern established in feat(schema): manifest.json + structured enumMetadata (closes #3725) #3738).scripts/error-code-drift-dispositions.json—held-for-next-minor/3.1entry.static/compliance/source/specialisms/creative-ad-server/index.yaml—report_usagenarrative replaces the "vendor codes are fine today" placeholder with the standard code. No new hard assertions (theskip_ifgating on the new capability is a separate follow-up — keeping fix(storyboards): make creative-ad-server pricing/billing optional #2879's softer conformance posture).specs/creative-agent-pricing.md— Pre-account-discovery and Capabilities-change sections updated.docs/protocol/get_adcp_capabilities.mdx— capability table row + example..changeset/2881-2882-creative-billing-schema.mdTest plan
npm run test:error-codesclean (87 storyboard files scanned against 67 canonical codes — +1)npm run test:error-code-driftclean (22 ahead, all dispositioned)npm run test:schemas— 525 schemas, 7 tests passednpm run test:json-schema— 260 schema blocks validatednpm run test:storyboard-doc-paritycleannpm run test:examplescleannpm run test:unit— 887 tests passnpm run typecheckcleanBackward compatibility
Strictly additive. No existing agents break — they remain in probe-to-discover mode until they opt into declaring
bills_through_adcp. Buyers that haven't upgraded continue to probe; the response shape forreport_usageis unchanged, only theerrors[].codevocabulary is widened.