Repository navigation
spec(reporting): report definitions at contract_version 1.2 require a package_id dimension (#8971) - #8983
Conversation
…on 1.2, in the rc.0 docs #8983 (#8971) adds Reliable Reporting report-definition contract_version 1.2: a definition whose dimensions include media_buy_id must include package_id, account-level definitions are exempt, and callers pinned below 3.3 get 1.0 or 1.1 offerings. Add it to the release notes (checkpoint row, feature index, behavior change, experimental table), What's new, and the migration guide (checklist row 55 and a section), with markers until it merges. The checkpoint row also gains #8974 and #8972, which it was missing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… package_id dimension (#8971) Adds report-definition contract_version 1.2 to experimental Reliable Reporting. A 1.2 definition keeps every 1.1 rule; when its dimensions include media_buy_id they must also include package_id (draft-07 `contains`, conditional on the 1.2 const), so every row carries the buyer-visible package. Definitions without media_buy_id, such as account-level summaries, are exempt. 1.0 and 1.1 definitions are unchanged; graders report a missing package_id there as advisory. Callers pinned below 3.3 accept only 1.0 and 1.1, so sellers serve them 1.0 or 1.1 offerings. Adds test-vectors/reporting-report-definition with a 1.2 fixture and a negative vector; the reporting-reconciliation reference fixture and its digests are unchanged. Refs #8971 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
fa00629 to
9148fa5
Compare
…on 1.2, in the rc.0 docs #8983 (#8971) adds Reliable Reporting report-definition contract_version 1.2: a definition whose dimensions include media_buy_id must include package_id, account-level definitions are exempt, and callers pinned below 3.3 get 1.0 or 1.1 offerings. Add it to the release notes (checkpoint row, feature index, behavior change, experimental table), What's new, and the migration guide (checklist row 55 and a section), with markers until it merges. The checkpoint row also gains #8974 and #8972, which it was missing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#8972 merged as e903ee6. Drop its markers and narrow the shared ones to #8983. The migration guide adds #8972's capability rule: buyers send installment_refs only to a seller that lists the feature id, and a seller without it rejects the field with UNSUPPORTED_FEATURE. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
Ladon verdict: Escalate to human review
Escalate — gated schema paths require human/CODEOWNERS approval.
This PR modifies files under the deterministic hard approval gate (static/schemas/source/**) while review_decision is REVIEW_REQUIRED (not APPROVED). Per decision rule row 2, the outcome must be escalate.
Escalation reasons
- Modifies
static/schemas/source/core/reporting-report-definition.json(gated pathstatic/schemas/source/**) — human/CODEOWNERS review required. - Modifies
static/schemas/source/enums/reporting-dimension.json(gated pathstatic/schemas/source/**) — human/CODEOWNERS review required.
The change itself is clean on the merits: the reviewer found no Critical/High/Medium findings. The new contract_version 1.2 branch requiring package_id on media-buy-scoped report definitions is additive on an experimental surface, is 1.2-const-discriminated with x-added-in: 3.3.0, the official_correction_mode condition correctly extends to ["1.1","1.2"], schema↔docs coherence holds across all four docs edits, the minor changeset is correctly scoped, no dist/** artifact is touched, and the test vectors + independent grader mirror the schema rule. The gate lifts once a human approval lands.
Why human review
- Modifies static/schemas/source/core/reporting-report-definition.json (gated path static/schemas/source/**) with review_decision REVIEW_REQUIRED — human/CODEOWNERS approval required
- Modifies static/schemas/source/enums/reporting-dimension.json (gated path static/schemas/source/**) with review_decision REVIEW_REQUIRED — human/CODEOWNERS approval required
- This PR touches a path under a hard, non-overridable approval gate (static/schemas/source/core/reporting-report-definition.json (modified) matches
static/schemas/source/**; static/schemas/source/enums/reporting-dimension.json (modified) matchesstatic/schemas/source/**) and the current GitHub review decision is 'REVIEW_REQUIRED', not APPROVED. This is a hard gate enforced in code — Ladon cannot auto-approve until a human/CODEOWNERS approval is recorded, regardless of how clean the diff is.
…on 1.2, in the rc.0 docs #8983 (#8971) adds Reliable Reporting report-definition contract_version 1.2: a definition whose dimensions include media_buy_id must include package_id, account-level definitions are exempt, and callers pinned below 3.3 get 1.0 or 1.1 offerings. Add it to the release notes (checkpoint row, feature index, behavior change, experimental table), What's new, and the migration guide (checklist row 55 and a section), with markers until it merges. The checkpoint row also gains #8974 and #8972, which it was missing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#8972 merged as e903ee6. Drop its markers and narrow the shared ones to #8983. The migration guide adds #8972's capability rule: buyers send installment_refs only to a seller that lists the feature id, and a seller without it rejects the field with UNSUPPORTED_FEATURE. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…on 1.2, in the rc.0 docs #8983 (#8971) adds Reliable Reporting report-definition contract_version 1.2: a definition whose dimensions include media_buy_id must include package_id, account-level definitions are exempt, and callers pinned below 3.3 get 1.0 or 1.1 offerings. Add it to the release notes (checkpoint row, feature index, behavior change, experimental table), What's new, and the migration guide (checklist row 55 and a section), with markers until it merges. The checkpoint row also gains #8974 and #8972, which it was missing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#8972 merged as e903ee6. Drop its markers and narrow the shared ones to #8983. The migration guide adds #8972's capability rule: buyers send installment_refs only to a seller that lists the feature id, and a seller without it rejects the field with UNSUPPORTED_FEATURE. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…on 1.2, in the rc.0 docs #8983 (#8971) adds Reliable Reporting report-definition contract_version 1.2: a definition whose dimensions include media_buy_id must include package_id, account-level definitions are exempt, and callers pinned below 3.3 get 1.0 or 1.1 offerings. Add it to the release notes (checkpoint row, feature index, behavior change, experimental table), What's new, and the migration guide (checklist row 55 and a section), with markers until it merges. The checkpoint row also gains #8974 and #8972, which it was missing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#8972 merged as e903ee6. Drop its markers and narrow the shared ones to #8983. The migration guide adds #8972's capability rule: buyers send installment_refs only to a seller that lists the feature id, and a seller without it rejects the field with UNSUPPORTED_FEATURE. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Closes #8971. Thanks to Emma (EmmaLouise2018) for the report and the precise problem statement.
Summary
Reliable Reporting (
media_buy.reporting_delivery) is experimental. This adds report-definitioncontract_version1.2tocore/reporting-report-definition.json.1.2, a definition whosedimensionsincludemedia_buy_idMUST also includepackage_id, so every row carries the buyer-visible package. The schema uses draft-07contains, conditional on the1.2const, and the newallOfbranch carriesx-added-in: 3.3.0.media_buy_idand is exempt at every version.1.2keeps every1.1rule. The existingofficial_correction_modecondition now matches["1.1", "1.2"].1.2:media_buy_id, not a seller-native name;reporting_profile.primary_keysMUST then includepackage_id, so per-package rows stay distinct.1.0and1.1definitions keep validating unchanged. A grader SHOULD report one that includesmedia_buy_idbut notpackage_idas an advisory finding, never a failure. This is the "advisory first" step from the issue.package_idmatchesmedia_buy_id. Subscription selectors and offeringstandard_dimensionskeep the standard namepackage. The mapping is noted inenums/reporting-dimension.json,sync_principal, andget_reporting_status.How a seller and a buyer get
1.21.0and1.1shipped together in #7228 with no capability or request field. The version lives in the definition, and the offering pins it withreport_definition_uriand SHA-256. A seller adopts1.2by publishing a1.2definition in an offering, and a buyer chooses it by selecting that offering, exactly as for1.1. No capability, feature id, or request field is added.One difference from
1.1: receivers built from 3.2 already exist, and theircontract_versionenum is closed at["1.0", "1.1"]. The PR therefore states the version-pin rule this surface already uses forconfiguration_task(get_adcp_capabilities): callers pinned below 3.3 accept only1.0and1.1, so a seller MUST serve them offerings whose definitions are1.0or1.1, and a1.2offering serves 3.3 callers only.experimental-status.mdxrecords that a strict validator built from 3.2 rejects a1.2definition, which is acceptable for an experimental surface.Fixtures
reporting-reconciliationreference fixture and its digests are unchanged. It stays at1.1with["date", "media_buy_id"]and draws the advisory.static/compliance/source/test-vectors/reporting-report-definition/(README,report-definition-1-2.json,vectors.json):1.2fixture with["date", "media_buy_id", "package_id"];1.2media-buy definition withoutpackage_idfails;1.2(["date"]and[]);["date", "package_id"]at1.2, which is valid because the rule keys onmedia_buy_id;1.2withoutofficial_correction_mode, which fails;1.0and1.1media-buy definitions withoutpackage_id, which are valid with the advisory.tests/reporting-report-definition-vectors.test.cjsreplays them against the built schema and an independent rule grader, and is added totest:schemas. The set is listed indocs/reference/test-vectors/index.mdx.Storyboards
No storyboard step is added:
dimensions.universal/reporting-core.yaml,exact_nonempty_revision_content) already requirespackage_idin its fixed row vector, as a required check, so an advisory step there would be redundant.The advisory is defined in the vectors instead.
Release metadata
minor.x-added-in: 3.3.0on the new conditional branch.1.2is noted in the enum description with "3.3", and thex-added-in-3-3sweep test asserts both.lint:additive-minor: 0 new against 3.2.10. The schema is experimental.38a83d1d44with and without the change:comply_test_controllerparity grows from 1,330,813 to 1,330,906 bytes (+93), all from the longerpackageenum description. The 1,388,000 bound is unchanged.capabilities-structural-boundsworst case, and themcp-schema-analysiscounts are unchanged.e903ee6320, after feat(media-buy): choose installments through refine_proposals without opening commercial_terms (#8967) #8974 and feat(schema): assign a creative to specific installments of a package (experimental) #8972, andtest:schemaskeepsinstallment-refinement,installment-creative-assignmentandreporting-report-definition-vectors. After the rebase the controller still measures 1,330,906 bytes, and every bound suite passes.The training agent is not touched. Its definitions are
1.1withdimensions: [], andREPORTING_STORAGE_CONTRACTis unchanged.Notes for review
media_buy_iddimension. Every revision and obligation carries amedia_buy_idsdenominator, aggregates included, so that field cannot tell an account-level definition apart. The definition has no other machine-readable scope;grainis free text. The naming MUST closes the gap of a seller-native name such asorder_id.media_buy_idanddatecount towardunmapped_dimensionsfor subscription matching. The1.2fixture makes that question concrete formatch: exact.Tests run
node --test tests/reporting-report-definition-vectors.test.cjs: 4/4.x-added-in-3-3-sweep,reporting-status-contract,reporting-subscriptions, andlint-schema-enum-drifttogether: 104/104.reporting-core-fixture,reporting-reconciliation-fixture,docs-json-field-audit, andlint-additive-minor: 209/209.mcp-schema-projectionandmcp-schema-analysis: 41/41.capabilities-structural-bounds,counterparty-asserted-capability-bounds, andresponse-size-bounds: 100/100.node tests/schema-validation.test.cjs: 36/36. An earlier run failed once with anENOENTbecause it overlapped a concurrentbuild:schemas; it passed when rerun alone.npm run lint:additive-minor: 0 new.npm run build:compliance -- --check: links current.scripts/lint-conformance-doc-freshness.cjs: vector catalog complete. The compliance source-authority, packaged-refs, doc-drift, and doc-freshness lint tests pass.json-schema-validationandsnippet-validationwith--fileon each edited page: pass.test:docs-navandtest:owned-links: pass.changeset status: pass (minor).check-pr-title: exit 0, with the usual notice for thespectype.1.2) and Should Fix items are applied as described above.test:unit1284/1284,test:test-dynamic-imports,test:format-identity-boundaries, andtest:callapi-state-changeall passed.exact-inference.server/file, so it was committed withHUSKY=0, as the coordinator's brief allows.typecheckpassed by hand. CI runs the server unit suite.ADCP_SKIP_STORYBOARD_MATRIX=1. The matrix is triggered bystatic/compliance/source/andpackage.json, but this PR changes no storyboard and no training-agent code. CI storyboards are authoritative.e903ee6320replays the same commit; its spec diff is byte-identical apart from thepackage.jsonunion. It was committed withHUSKY=0.test:unithad 10 s timeouts in three unrelated files:ipr-check-and-record,compliance-authored-tool-gates, andadagents-builder-xss. Each passes alone (23/23, 66/66, 10/10).typecheckpass by hand.🤖 Generated with Claude Code