Skip to content

fix(compliance): preserve account ownership and task envelopes on 3.1 - #8731

Merged
bokelley merged 2 commits into
3.1.xfrom
backport/3.1.x-deterministic-account-lifecycle
Nov 4, 2026
Merged

bokelley merged 2 commits into
3.1.xfrom
backport/3.1.x-deterministic-account-lifecycle

Conversation

@bokelley

@bokelley bokelley commented Nov 4, 2026 •

Copy link
Copy Markdown
Contributor

The maintained deterministic storyboard keeps catalogue fixtures and resource controls on their consuming account, while account provisioning, filtered listing and account-state controls keep the account selected by the run. Successful custom-tool responses also receive the task envelope needed by the selected 3.1 schema.

The fixture owner is the Acme Outdoor / Pinnacle sandbox account. Sync may legitimately select the separate Test account; listing filters by that effective identity so another visible account cannot supply the state-transition ID. Explicit resource-control scopes continue to name the fixture owner. The same filter preserves a caller-selected account ID on sellers without provisioning.

The reference adapter defaults only absent successful task status to completed, including matching and empty account lists. Explicit statuses, the four existing status-free tools, errors, advisory successes, response summaries, replay behavior and input ownership stay intact. This is a partial backport of ce91b14 (#8522), alongside the existing maintained adaptation of ded86cd (#8730).

The private fixture-test runner now pins the actually published @adcp/sdk@17.0.0-beta.17, whose preserved account-subject identity and packaged controller schemas resolve the runner-side failure. Its private manifest, root lockfile and physical scoped resolution agree on the official registry tarball and SRI. Production stays on @adcp/sdk@9.6.2. No wire field, schema, DSL, authorization rule, matrix floor, timeout or skip allowance changes in this final adapter/dependency batch; the existing main-equivalent precommit budgets in the prior source commit are preserved.

Validation completed before the final normal hooks:

  • Full maintained fixture suite: 46 passed, including all six deterministic regressions.
  • Registered MCP adapter suite: 17 passed (13 new cases plus four existing cases).
  • All 14 source/schema/compliance/auth/context/sample/test-kit/reference checks and normal typecheck passed.
  • Independent final code and runner reviews cleared tree 557befc1eeedee269ced5dc9c59d8ca50dd96097 with no blockers.
  • A fresh ordinary install of the public beta passed signature, SRI and workflow/source/run provenance checks. The public-API strict HTTP source preview passed all eight authored buyer steps both with and without an explicit run brand; removing only the list filter or resource scopes produced exactly the intended failures. Every dispatched request and response passed native 3.1.31 validation; caller inputs stayed unchanged.

Final normal hooks passed on a3daf34803e6f164c0025706151c7a802f153215 (reviewed tree 557befc1…): full server suite 288 files / 4,416 passed, with the same three existing baseline skips; unit suite 1,012 passed; discovery/auction suite 120 passed; lint checks 7 and 10 passed; typecheck passed. The sole normal-push current and frozen 3.0.28 pair passed every tenant floor and required-clean check, with all twelve raw logs preserved.

Tenant Current clean / passed steps Frozen 3.0.28 clean / passed steps
signals 121 / 132 65 / 112
sales 114 / 504 65 / 283
governance 124 / 178 65 / 164
creative 116 / 202 65 / 156
creative-builder 114 / 179 65 / 141
brand 123 / 104 65 / 87

Explicit current-sales target review: deterministic_testing improves from 25 passed / one failed / seven skipped to 26 passed / zero failed / seven skipped; product_filter_behavior has ten passed and zero failed; sales_non_guaranteed has eleven passed and zero failed; all three provenance storyboards have zero failures and one skip each. The source provenance gate requires affirmative creative.supports_provenance; these normal logs do not expose individual skip payloads. The seven deterministic skip causes are not established by the summary log and are not claimed as exercised controls. The separate controlled public-API preview above runs all eight authored buyer steps without skips.

This is a comparison of the reported targets, not a blanket conformance claim: current sales retains 18 broader failures, including assertions for specialisms the reference seller does not advertise. Aggregate floors alone do not establish a target fix. The unchanged frozen wrapper archives actual 3.0.28 from origin/3.0.x and applies its existing scratch compatibility transforms. The normal scripts restored generated production SDK JavaScript byte-for-byte; schema/cache overlays are not a claim of complete installed-cache restoration. Ready CI and exact-head Ladon review remain pending.

The earlier maintained source commit carries main-equivalent aggregate precommit budgets (300 seconds for unit checks and 1,500 seconds for server units); no per-test or CI timeout was changed.

This is source-preview qualification. It does not claim published AdCP 3.1.32, packaged stable SDK 16.7, native CLI run-brand support, namespace qualification or Activate conformance. Publication and fresh installed-artifact qualification remain separate gates.

🤖 Generated with Codex.

bokelley and others added 2 commits November 4, 2026 04:13
…cycle controls (#8730)

The deterministic_testing storyboard's product and pricing-option fixtures
belong to the Acme Outdoor / Pinnacle sandbox account, while its
sync_accounts step legitimately provisions a separate test.example account
for the account-state checks. The runner then rebinds context.account to
that provisioned account, so later media-buy, creative, delivery and budget
controller calls followed it and targeted the wrong sandbox account, and an
unfiltered list_accounts could hand an unrelated visible account's ID to the
account-state controls.

- Declare the Acme / Pinnacle sandbox account as the fixture owner.
- Scope the ten media-buy, creative, delivery and budget controller calls
  explicitly to that owner.
- Filter list_accounts to the effective run account ($context.account): the
  provisioned Test account after sync, or the caller-selected account ID when
  buyer provisioning is not applicable.
- Regression tests, with causal negatives, for resource ownership after
  provisioning, exact account listing, and the no-sync namespace path.

Replaces the closed #8726 with this expanded repair. No schema, normative
or new storyboard-DSL change.

Maintenance adaptation: preserve the 3.1 legacy fixtures, all 817 existing
fixture-test lines and the selected-schema test wrapper. After recorded
aggregate cutoffs, align only local precommit unit/server budgets with main
(180s to 300s; 240s to 1500s). Commands, per-test settings, dependencies,
versions, workflow limits and both matrix gates remain unchanged.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit ded86cd)
Partially backport ce91b14 (#8522): retain its four status-free tools, thread the tool name through serialization, and default only absent successful task status to completed. Preserve the maintenance serializer's JSON text, errors, advisories, explicit statuses, replay behavior and payload ownership. Registered MCP regression cases cover filtered account listing and serialization behavior.

Adopt the actually published @adcp/sdk@17.0.0-beta.17 only in the private fixture-test runner and root lockfile. Its account-subject identity repair and native controller schemas are bound to release merge 2d1ea7059f116a178841e43b95165735dc722c2e. Production @adcp/sdk stays 9.6.2. Keep the original deterministic lifecycle source repair unchanged.

This is a deliberately partial backport and test-runtime adoption, not a schema or DSL change. It does not claim AdCP 3.1.32, stable SDK 16.7, or Activate qualification.
@bokelley bokelley changed the title fix(compliance): preserve deterministic account ownership on 3.1 fix(compliance): preserve account ownership and task envelopes on 3.1 Nov 4, 2026
@bokelley
bokelley marked this pull request as ready for review November 4, 2026 09:02
@bokelley
bokelley requested a review from a team as a code owner November 4, 2026 09:02

@aao-secretariat aao-secretariat Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ladon verdict: Approve

Approve

No blocking or medium findings. Reviewer confirmed the production change in custom-tool-helper.ts (L60-89) correctly stamps envelope status:'completed' only on status-free-exempt success roots lacking an explicit status; the error branch returns early and explicit statuses are preserved, with both call sites (L98/L107) updated. The four status-free tools are not registered via customToolFor, so the unchanged replay stamp (L230) is inert. Compliance YAML scopes are coherent, test isolation/no-mutation invariants verified, and the @adcp/sdk 17.0.0-beta.17 bump is consistent across package.json/lockfile/sdk-runner with an appropriate patch changeset.

No author-team gate, no gated paths, high_risk false, no prior decision. Falls through to row 9.

@bokelley
bokelley merged commit c6ab3c2 into 3.1.x Nov 4, 2026
13 checks passed
@bokelley
bokelley deleted the backport/3.1.x-deterministic-account-lifecycle branch November 4, 2026 09:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant