Repository navigation
fix(compliance): qualify independent catalog collection features - #8428
Conversation
There was a problem hiding this comment.
Ladon verdict: Comment (human reviewer recommended)
Comment — governance review warranted; no blocking findings.
The reviewer found no Critical/High/Medium findings. The behavior-carrying code (catalog-reporting-runner.ts, member-tools.ts) cleanly generalizes the reporting path to collections, preserves timeouts/abort/finally-based grant release, fails closed on missing prior context, and orders NOT-APPLICABLE labeling correctly (never crediting an absent reader). Changeset is present and correctly scoped (patch; compliance surface + Addie). No schema source, oneOf, or released-artifact changes, so those mandatory rules are not triggered. Error-code allow-list tightening aligns with not-found precedence in error-handling.mdx.
Why a human should look: the reviewer explicitly deferred a governance question to the arbiter — this PR introduces new 3.3 normative obligations (optional product-collection qualification spec) and was authored by a maintainer. New normative requirements on the published protocol surface deserve a human eye to confirm classification (Editorial/Normative-non-breaking vs. Breaking-class) and that any controlling governance precedent is satisfied. The reviewer did not read the four smaller test files or the readback/subset/restatement scenario tails line-by-line (template clones), so coverage on those is asserted, not verified.
Decision-table trace: No critical/high findings (row 1 no). gated_paths is false (row 2 no). high_risk reasons are all (modified) with no (deleted) (row 3 no). No medium findings at all, so rows 4–6 and 8 do not fire. No no-auto-approve team match (row 7 no). With zero findings this would fall through to row 9 (approve); however, review_decision is REVIEW_REQUIRED and the reviewer deferred a live governance/normative-obligation question on a new-spec, maintainer-authored change. Surfacing this for human eyes via comment rather than silently auto-approving a new normative protocol obligation is the conservative, correct posture.
Note: high_risk is true only on (modified) files with no medium-or-higher concerns, so the flag alone does not escalate.
There was a problem hiding this comment.
Ladon verdict: Approve
Approve — clean pass, no blocking findings.
The reviewer traced the full delta: a security-hardening refactor of standalone collection readback. Caller-supplied-context provenance is replaced by an HMAC commitment (catalog-reporting-runner.ts L293-346) minted only on a genuine successful create, bound to seller/authored-storyboard/adcpVersion/sandbox_account/buy-package-product ids/normalized pairs, and verified via timingSafeEqual (L348-365). Every path was walked: assertCollectionReadHistory fires before seller contact on the profile-supplied path; the wrapper execute covers native fallbacks; invalid-caller-map and executeRootGate yield typed denial / skipped gate only — no forged-pass path. Tests (history.test.cjs L445-473, L528-552) assert failed creates carry no proof, never dispatch get_media_buys, and that rebinding invalidates replayed proofs. Spec doc matches code.
Decision table applied top-down:
- Rows 1 (critical/high): no such findings.
- Row 2 (gated_paths): gated_paths is false — does not fire despite review_decision REVIEW_REQUIRED.
- Row 3 (deletion in high-risk): no deletions.
- Rows 4-5 (medium in sensitive/modified high-risk): no medium findings at all.
- Row 6 (sticky escalate): prior decision was comment, not escalate.
- Row 7 (no-auto-approve team): no team match.
- Row 8 (≥3 medium): zero medium findings.
- Row 9: approve.
high_risk is true on two (modified) files, but that is a heuristic LOOK signal; the reviewer surfaced no medium-or-higher concern on either, so the modifications are presumed safe. No schema↔docs drift, changeset present and correctly scoped, no oneOf regression, no artifact mutation.
|
This closes #8254 the way we hoped: an agent that doesn't offer the feature now grades |
|
Following up on my earlier comment: hosted grading puts 3.2 agents on 3.2.8, which still has the pre-#8428 and pre-#8336 versions of these storyboards. I don't see a 3.2.x backport, open or merged. Local run on 2026-10-30: our sales agent (https://sell.nofluffadvisory.com/mcp) with its 3.2 line switched on, runner
The same agent on the 3.3.0-beta.1 bundle, which carries both PRs, has none of these failures. All three storyboards grade not applicable, which is the outcome #8254 asked for. So any 3.2 seller that doesn't offer these optional features still fails on products the fixture invents. Could #8428 and the storyboard part of #8336 go to 3.2.x, the way #8555 and #8581 did? Happy to open the backport PRs if that helps. |
…eporting features (3.2.x backport) (#8826) * chore(compliance): integrate published 3.1.32 records on 3.2.x Publishing the 3.1.32 SDK bundle advanced the adcp-3.1 npm tag, so the 3.2.x publication-manifest check has failed Build Check since a4af1a1, including the v3.2.9 merge ee0ca50. Integrate only the published 3.1.32 records, following the 3.1.30 integration: the immutable compliance bundle, schemas and signed protocol tarball, taken unchanged from v3.1.32 (tree hashes match main), the manifest registration, regenerated root schema discovery, and the release notes. The 3.1 hosted alias floor advances to 3.1.32, 3.1.30 stays pinned as an explicit target, and the current-bundle tests follow main's alias-relative form because 3.1.32 adds three storyboards. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(compliance): stop failing sellers on seeded-only collection and reporting features (3.2.x backport) Backports the applicability part of #8336 and a narrowed #8428 to 3.2.x for 3.2.10 (#8744). 3.2.x runs @adcp/sdk 14.0.0-rc.53, whose closed fixture DSL cannot load #8376's collection operator or fixture context_outputs, so neither PR cherry-picks cleanly. advanced_delivery_reporting takes #8336's storyboard: it discovers a native wholesale product advertising format breakdown with a fixed-price CPM option instead of seeding a video product, and reports fixture_unsatisfied when none qualifies. The price snapshot capture and the 3.3 time_based_delivery_reporting storyboard are left out, so 3.2 no longer grades time_based_views against an invented threshold. collection_selection and owner_sold_channel_carriage keep their 3.2 checks behind a discover-only gate: a native product that allows collection targeting and declares a domain-qualified collection. No match is fixture_unsatisfied; malformed discovery still fails. All three storyboards now require the wholesale buying mode. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Forward-merges the published 3.2.10 release (v3.2.10 = a6163fb, the 3.2.x head) and the three 3.2.x maintenance commits since v3.2.9: adcontextprotocol#8826, adcontextprotocol#8839 and adcontextprotocol#8847, released by the adcontextprotocol#8886 Version Packages merge. Release records: - dist/compliance/3.2.10, dist/schemas/3.2.10 and the signed dist/protocol/3.2.10.tgz tuple are taken from v3.2.10 unchanged. - dist/schemas/index.json and latest.json are regenerated (forward-merge-release-records.cjs schema-discovery). - CHANGELOG.md is main's file plus the 3.2.10 block (forward-merge-release-records.cjs changelog). - package.json, package-lock.json, static/schemas/source/index.json: main's. - static/compliance/published-versions.json: main's. 3.2.x's only extra entry is 3.2.10, which is registered in a separate commit after qualification. adcontextprotocol#8839 and adcontextprotocol#8847 are cherry-picks of main's adcontextprotocol#8838 and adcontextprotocol#8841. Their storyboards and tests auto-merged to main's bytes; nothing changes. Content conflicts, all from adcontextprotocol#8826 and all resolved to main's file. adcontextprotocol#8826 is an SDK 14 narrowing of adcontextprotocol#8336 and adcontextprotocol#8428 for the 3.2 runner; main carries both in full on SDK 17: - advanced_delivery_reporting.yaml: main's adcontextprotocol#8336 storyboard, with the adcontextprotocol#8376 price snapshot and the separate time_based_delivery_reporting scope. - collection_selection.yaml, owner_sold_channel_carriage.yaml: main's adcontextprotocol#8428 independently qualified catalog scopes. The 3.2.x side's native_collection_product discovery gate is dropped. - docs/reference/known-limitations.mdx: main's catalog reporting and collection bullets already state the scope and fixture_unsatisfied semantics the 3.2.x paragraph describes. - tests/sdk-runner-capability-gates.test.cjs: main's reporting gate test (both reporting storyboards). The 3.2.x single-storyboard variant is dropped. Auto-merge reverted: the non-conflicting adcontextprotocol#8826 collection gate test ("<name> grades only sellers whose catalog offers selectable collections") asserts the 3.2-only native_collection_product handle, which main's storyboards do not declare. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Optional collection tests currently seed a product and thereby invent the feature they purport to grade. This change resolves native catalog products independently for selectable subsets, default materialization, fixed-bundle enforcement/restatement and structural cross-publisher carriage/subsets. A complete valid no-match is
fixture_unsatisfied/not_applicable(feature untested); malformed discovery and broken selected support still fail.Closes #8254, completing the collection work after reporting #8336 merged. Supersedes proposal #8259 using the merged foundation #3354, authoring/output contract #8376 and already installed SDK16.3.0. Patch changeset; no SDK/dependency/lock/bridge changes, new capability fields or controller refusal semantics.
Implementation details, exact scenario/selector contracts, authority and historical proposal reconciliation: qualification memo.
Review repairs:
Validation at
cf2ca5de81351c5811068847c069f7e1f54776d6(base3e94f5e3):75deae4abbaedba310274a5e8e6a576a5f5a9b8d8ef8fce5ca7fe13aab87b650). The unchanged original R1 probe independently exits 0. Fresh code/security/protocol-product delta review resolves R1/R2 with no remaining concrete blocker within the reviewed scope. Frozen 10e88cd failed probes and its independent 94-pass run remain separate; neither prior counts nor agent reviews become human approval.env -u ANTHROPIC_API_KEY -u ADDIE_ANTHROPIC_API_KEYto match CI. Historical live-key route timeouts remain failed evidence; the exact unchanged two-file non-live replay passed 27/27 before the full successful hook run. No hook, timeout, source or test guard was changed.record) / 0 pending or failed, including Training Agent Storyboards and all canonical/server checks. Canonical 3/4 executed 130/130 collection tests and the actual handler file (90 tests, including four opaque-reference round trips) inside 1,276 passing root tests. Canonical 4/4 passed the unchanged registration guard, 3/3. Normal pre-push checks passed; only the repository-supported local advisory matrix skip was used. No inline comments, conversation comments or unresolved review threads remain at the final read. Exact-head Ladon approval is automation, not human/WG approval. Existing fixture/sample lints and capability/evaluator/reporting evidence retain their scope in the memo.fixture_unsatisfiedwith zero graded steps. These are untested gaps, never positive support evidence. The reporting baseline run 39895814069 has the identical source tree as this PR base: 170/174 clean, 1,222 passing / 4 failing / 106 skipped / 0 N/A steps. The only changed existing result rows remove 12+8 seeded collection pass credits; six new independent rows are gaps. The same four raw failures remain:version_negotiation,inline_creatives_without_sync,provenance_audit_observation,provenance_truth_of_claim. Floors and grading are unchanged. Post-result child teardown telemetry is retained (baseline: 182 SIGKILL after received result; current: 187 plus one natural exit, all received results and no timeouts); this is not a claim that every storyboard child exits naturally.Bounded coverage and follow-ups:
media_buy_statuscan falsely fail an active read. Positive fixture uses the legal explicit lifecycle form; omission is unqualified, not made mandatory.context_key; output conformance is not claimed. The existing output MUST is unchanged.adcp_versionis tested separately as a schema failure.Main merge disposition: ordinary main merge can automatically refresh draft Version Packages #8419 and build/register/sign candidate artifacts through the unchanged release.yml blob
68a2822d8bf89322deea5e6887e2d66cd4061335. Merge remains held for Brian/root's separate disposition of this consequence. This PR does not authorize or execute merge, workflow dispatch, VP mutation, publication, release, maintenance or production writes. The maintainer/root coordinator owns repeated expert review of repaired bytes and the ordinary merge decision.