Repository navigation
Conversation
provenance_audit_observation - declare sync_creatives on both audit reads, as adcp-client#3524 expects - run each audit read in its own phase after the sync create_media_buy_async_lifecycle - run each optional get_task_status/list_tasks read in its own phase - keep the force_task_completion gate on the completed-task reads governance_agent_binding_acceptance - isolate the optional controller read from the recovery sync tests - runner regressions for sellers with and without each optional tool - provenance audit reads name the tool whose state they read
Preview approval requiredThis pull request comes from a fork, so Mintlify won't build a preview until someone with write access approves commit |
There was a problem hiding this comment.
Ladon verdict: Approve
Approve
Compliance-grading fix: splits three storyboards so a skipped optional tool no longer cascades prerequisite_failed onto stateful dependents. Each optional read now sits alone in its own phase with explicit depends_on, and the provenance audit reads are re-gated requires_tool: sync_creatives, matching precedent at deterministic-testing.yaml:1148. Verified: no phase left empty by the splits, every depends_on target exists, declaration order preserved, and storyboard-level requires: [controller] still covers the controller.
Changeset is patch on adcontextprotocol for a static/compliance/source/** change — in-scope and non-breaking (loosens grading), consistent with prior compliance fixes (#8703, #8603). No schema/dist/3.1.x surface touched. New tests assert exact dispatch order, correct skip_reason values, and no prerequisite_failed cascade.
No Critical/High/Medium findings. No gated paths, no high-risk flag, no team gate. Falls through to row 9.
Refs #8506
Problem
When a seller does not advertise an optional tool, the runner skips that step as
missing_tooland the step passes. If the skipped step is stateful and other stateful steps share its phase, the runner cascadesprerequisite_failedonto them, asrunner-output-contract.yaml > cascade_rules.default_cascaderequires. Those steps then count as failures, so the storyboard fails for a tool the seller is allowed to omit.In
provenance_audit_observation, the two audit-observation reads after a skippedsync_creativesfailed this way. That made Strict Spec Incomplete for sellers without a creative library.What already landed, and what this PR adds
creative.supports_provenanceon mainrequires_toolbefore the cascade (single-agent runs)@adcp/sdk17.0.0-beta.22. adcp still pins beta.21.requires_toolis unadvertised as not applicableclassifyRunStep(#7454). It reaches the audit reads once they namesync_creatives, which takes effect when hosted grading uses a release built from this source (the next 3.3 cut or the 3.2.x backport). Hosted runs on 3.1.29 or 3.2.x bundles do not change before then.sync_creatives(the source half #3524 asks for)create_media_buy_async_lifecycleandgovernance_agent_binding_acceptance, which #3524 does not coverChanges
provenance_audit_observation(1.1.0)query_directed_audit_observationandquery_edited_audit_observationnow declarerequires_tool: sync_creatives, the tool whose state they read. The storyboard-levelrequires: [controller]still covers the controller.universal/deterministic-testing.yaml:1146gatesforce_session_terminated(task: comply_test_controller) onrequires_tool: si_initiate_session.depends_on: [accept_carveout_claim].requires_tool.cascade_rulesdo not include AAO Verified: per-major-version badges (3.0 verified stays valid when 3.1 ships) #3524's precedence, so this form also holds on other runners.sync_creatives(with or without a creative-library declaration) skips the sync and both reads. Its verifier discovery is still graded.sync_creativesruns the full audit.prerequisite_failedonto both reads.create_media_buy_async_lifecycle(1.1.0)get_task_statusandlist_tasksare optional in 3.x. Each read now runs in its own phase, withdepends_onnaming only the submit phase, or the submit and completion phases.force_task_completiongate.list_tasksis graded on it.governance_agent_binding_acceptance(1.1.0)comply_test_controllerread and the recoverysync_governanceeach run in their own phase after account setup.Tests
tests/sdk-runner-capability-gates.test.cjs: three runner tests. Each loads its storyboard with the SDKparseStoryboardand runs it against stub sellers, asserting dispatch order and that no step isprerequisite_failedor failed.sync_creatives, one withsync_creativesbut no library declaration (full audit), and one whose sync is rejected (both readsprerequisite_failed).list_tasksonly, and with both reads; also both reads withoutforce_task_completion.tests/provenance-tool-gates.test.cjs: the audit reads must namesync_creatives, and must not share a phase with the sync they depend on.Tests
@adcp/sdk17.0.0-beta.21 (pinned):tests/sdk-runner-capability-gates.test.cjs71/71.test:governance-task-slices55/55.test:auction-only-compliance182/182.@adcp/sdk17.0.0-beta.22, loaded from the published tarball without changing the lockfile:tests/sdk-runner-capability-gates.test.cjs71/71.scripts/lint-storyboard-*.cjslints over the source pass.Changeset
adcontextprotocolpatch: compliance source change.Out of scope / follow-ups
requires_toolis honored before the stateful cascade) inrunner-output-contract.yaml > cascade_rules, so other runners, such as the Python SDK, behave the same way. Until then, keep one phase per audit read. After that change, the reads could fold back into the sync phase.protocols/media-buy/scenarios/get_products_async.yaml:list_products_task(list_tasks) is a stateful peer insubmitted_discovery_response, andcompleted_discovery_resultdepends on that phase by default.protocols/signals/scenarios/get_signals_async.yaml:list_signals_taskhas the same shape.list_tasks, which is optional in 3.x, would getprerequisite_failedon the completion. Neither was run.universal/deterministic-testing.yaml > deterministic_creative: same defect for creative agents without a library. Following AAO Verified: per-major-version badges (3.0 verified stays valid when 3.1 ships) #3524's pattern there would mean declaringsync_creativeson the controller steps that depend on the synced creative, and isolating them.vendor_metric_accountability:read_back_commitment_timestamps(requires_tool: get_media_buys) would cascade into the simulation phase.get_media_buysis required for media-buy sellers, so only a non-conformant seller is affected.🤖 Generated with Claude Code