Repository navigation
Conversation
…#8501 entry 1) force_hold_unavailable registered its directive on ForcedDirectiveSuccess with a new `unable` arm and a `forced.proposal_id` echo. `forced` is closed, and a minor does not add to a closed schema (DR-0036), so both are withdrawn and ForcedDirectiveSuccess goes back to its 3.2 shape. The scenario now answers on SimulationSuccess with `simulated.proposal_id`, the value the call applied. The hold_unavailable_batch storyboard reads it there, the training agent returns it there, and the additive-minor baseline drops the `forced.proposal_id` entry. Refs #8501 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e 3.3 guides
Beta conformance-runner authors read the migration guide and the beta
page, not the changeset. Both now show the old and new shapes:
`forced: { arm: "unable", proposal_id }` in 3.3.0-beta.0 through
beta.4, `simulated: { proposal_id }` after.
Refs #8501
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
bokelley
added a commit
that referenced
this pull request
Nov 7, 2026
…erimental, and inventory the rest Adds scripts/audit-schema-bounds.cjs and its inventory: every unbounded array and string in the schema source, by stability, request or response side and proposed limit, plus every property or collection list carried inline. Bounds the arrays and strings that are new in 3.3 or experimental: 646 maxItems/maxLength keywords in 152 schemas, written by `node scripts/audit-schema-bounds.cjs --apply`, which is idempotent and is the one command for regenerating the slice after a conflict. Stable fields are proposed for 4.0 in specs/collection-bounds-proposal.md and registered as schema_bounds_required_in_4_0. Not bounded: get_adcp_capabilities and its referenced types (#8198), inline property and collection lists, five nodes the SDK generators cannot carry a bound on, and seven 3.3 beta fields that the #8501 withdrawal PRs (#8765, #8762, #8758, #8767) remove. The script now compares with the highest 3.2.x release (3.2.8), the base lint-additive-minor uses. Build Check runs its --check-unreleased guard as npm run lint:schema-bounds, so every new 3.3 or experimental array or string arrives with a bound. The MCP parity compile limit moves from 1,376,000 to 1,378,000 bytes (the controller closure measures 1,377,055). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
10 tasks done
bokelley
added a commit
that referenced
this pull request
Nov 7, 2026
…erimental, and inventory the rest Adds scripts/audit-schema-bounds.cjs and its inventory: every unbounded array and string in the schema source, by stability, request or response side and proposed limit, plus every property or collection list carried inline. Bounds the arrays and strings that are new in 3.3 or experimental: 646 maxItems/maxLength keywords in 152 schemas, written by `node scripts/audit-schema-bounds.cjs --apply`, which is idempotent and is the one command for regenerating the slice after a conflict. Stable fields are proposed for 4.0 in specs/collection-bounds-proposal.md and registered as schema_bounds_required_in_4_0. Not bounded: get_adcp_capabilities and its referenced types (#8198), inline property and collection lists, five nodes the SDK generators cannot carry a bound on, and seven 3.3 beta fields that the #8501 withdrawal PRs (#8765, #8762, #8758, #8767) remove. The script now compares with the highest 3.2.x release (3.2.8), the base lint-additive-minor uses. Build Check runs its --check-unreleased guard as npm run lint:schema-bounds, so every new 3.3 or experimental array or string arrives with a bound. The MCP parity compile limit moves from 1,376,000 to 1,378,000 bytes (the controller closure measures 1,377,055). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
bokelley
added a commit
that referenced
this pull request
Nov 8, 2026
…erimental, and inventory the rest Adds scripts/audit-schema-bounds.cjs and its inventory: every unbounded array and string in the schema source, by stability, request or response side and proposed limit, plus every property or collection list carried inline. Bounds the arrays and strings that are new in 3.3 or experimental: 648 maxItems/maxLength keywords in 152 schemas, written by `node scripts/audit-schema-bounds.cjs --apply`, which is idempotent and is the one command for regenerating the slice after a conflict. Stable fields are proposed for 4.0 in specs/collection-bounds-proposal.md and registered as schema_bounds_required_in_4_0. Not bounded: get_adcp_capabilities and its referenced types (#8198), inline property and collection lists, five nodes the SDK generators cannot carry a bound on, and seven 3.3 beta fields that the #8501 withdrawal PRs (#8765, #8762, #8758, #8767) remove. The script now compares with the highest 3.2.x release (3.2.8), the base lint-additive-minor uses. Build Check runs its --check-unreleased guard as npm run lint:schema-bounds, so every new 3.3 or experimental array or string arrives with a bound. The match_keys arrays #8446 added on product identity and TMP provider registration get maxItems 64, the cap media_buy.supported_match_keys already carries. The MCP parity compile limit moves from 1,384,000 to 1,386,000 bytes (the controller closure measures 1,385,040). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
bokelley
added a commit
that referenced
this pull request
Nov 8, 2026
…erimental, and inventory the rest Adds scripts/audit-schema-bounds.cjs and its inventory: every unbounded array and string in the schema source, by stability, request or response side and proposed limit, plus every property or collection list carried inline. Bounds the arrays and strings that are new in 3.3 or experimental: 648 maxItems/maxLength keywords in 152 schemas, written by `node scripts/audit-schema-bounds.cjs --apply`, which is idempotent and is the one command for regenerating the slice after a conflict. Stable fields are proposed for 4.0 in specs/collection-bounds-proposal.md and registered as schema_bounds_required_in_4_0. Not bounded: get_adcp_capabilities and its referenced types (#8198), inline property and collection lists, five nodes the SDK generators cannot carry a bound on, and seven 3.3 beta fields that the #8501 withdrawal PRs (#8765, #8762, #8758, #8767) remove. The script now compares with the highest 3.2.x release (3.2.8), the base lint-additive-minor uses. Build Check runs its --check-unreleased guard as npm run lint:schema-bounds, so every new 3.3 or experimental array or string arrives with a bound. The match_keys arrays #8446 added on product identity and TMP provider registration get maxItems 64, the cap media_buy.supported_match_keys already carries. The MCP parity compile limit moves from 1,384,000 to 1,386,000 bytes (the controller closure measures 1,385,040). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
bokelley
added a commit
that referenced
this pull request
Nov 8, 2026
…erimental, and inventory the rest Adds scripts/audit-schema-bounds.cjs and its inventory: every unbounded array and string in the schema source, by stability, request or response side and proposed limit, plus every property or collection list carried inline. Bounds the arrays and strings that are new in 3.3 or experimental: 648 maxItems/maxLength keywords in 152 schemas, written by `node scripts/audit-schema-bounds.cjs --apply`, which is idempotent and is the one command for regenerating the slice after a conflict. Stable fields are proposed for 4.0 in specs/collection-bounds-proposal.md and registered as schema_bounds_required_in_4_0. Not bounded: get_adcp_capabilities and its referenced types (#8198), inline property and collection lists, five nodes the SDK generators cannot carry a bound on, and seven 3.3 beta fields that the #8501 withdrawal PRs (#8765, #8762, #8758, #8767) remove. The script now compares with the highest 3.2.x release (3.2.8), the base lint-additive-minor uses. Build Check runs its --check-unreleased guard as npm run lint:schema-bounds, so every new 3.3 or experimental array or string arrives with a bound. The match_keys arrays #8446 added on product identity and TMP provider registration get maxItems 64, the cap media_buy.supported_match_keys already carries. The MCP parity compile limit moves from 1,384,000 to 1,386,000 bytes (the controller closure measures 1,385,040). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Contributor
Author
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.
What this changes
force_hold_unavailableis the experimentalcomply_test_controllerscenario (media_buy.hold_policy) that makes the nextrefine_proposalsfinalize of a draft fail withhold_unavailable. In the 3.3 betas, registering it returned the forced-directive response with a newunablevalue forforced.armand a newforced.proposal_idecho. Theforcedobject is closed, and a minor release does not add to a closed schema (DR-0036).This PR removes both values. The controller now returns the draft's ID in
simulated.proposal_id.simulatedis the open object for "values injected or applied by this call", andsimulate_later_proposalalready returns aproposal_idthere.ForcedDirectiveSuccessgoes back to its 3.2 shape: armssubmitted,completed,input-requiredandrejected, and noproposal_id. TheSimulationSuccessdescription now names the scenario, and the schema example moves tosimulated.hold_unavailable_batchreadssimulated.proposal_idand drops itsforced.arm: "unable"check.simulated: { proposal_id }.media_buy.hold_policyrow on the experimental-status page.forced: { arm: "unable", proposal_id }→simulated: { proposal_id }, for beta conformance-runner authors.forced.proposal_identry (37 entries remain).withdraw-commercial-terms-features-to-4-0precedent. Both values shipped in3.3.0-beta.0through3.3.0-beta.4(checked againstdist/schemas), so the changeset tells beta adopters what to change.Nothing else about the scenario changes. Its request, its errors, and what the next finalize returns stay the same.
Refs #8501 (entry 1)
Merge timing
This merges only after the Nov 13 consent window closes.
Tests run
npm run build:schemasandnpm run build:complianceADCP_ADDITIVE_MINOR_BASELINE_REF=origin/main npm run test:additive-minor: 92 tests pass; lint reports 37 recorded changes and 0 newnode --test tests/hold-policy.test.cjs tests/hold-policy-vectors.test.cjs: 135 passnpx vitest run --config server/vitest.config.ts tests/unit/training-agent-hold-vectors.test.ts tests/unit/proposal-negotiation-profiles.test.ts: 28 passnpm run test:schemas: all passvalidations-paths,response-schema,context-output-paths,check-enum,controller-requires,contradictions: all passnpm run typecheck: clean/sales:hold_unavailable_batch12P/0S,hold_policy_terms_only19P/4S,hold_extension22P/10S,hold_policy_bounds18P/0S,hold_policy_version_gate11P/0S,hold_ranking11P/0S/sales/profiles/finalization-failure:hold_unavailable_batch12P/0Scheck-changeset-protocol-scope.cjs origin/mainandchangeset status --since=origin/mainboth passLocal hooks
CI is the gate. Locally, the two hooks went like this:
/tmpcheckout of the same base with its ownnpm ci, and its tree is identical to the working branch. Earlier attempts from the agent worktree failed for reasons unrelated to this diff:server/tests/unit/training-agent-creative33-buyer.test.tsgets a 404 for its fixture video in any checkout under a dot-directory, such as.claude/worktrees/. The creative 3.3 router serves the file withres.sendFile(path.resolve(...)), and Express refuses paths with a dot segment. A five-line Express script reproduces it, and the test passes from a path without one.tests/addie/compliance-sdk-rc-transport.test.tstakes about 8.5s inside the full root suite against a 10s limit, with or without this diff, so it fails intermittently on a loaded host. It passes alone, and the full root suite passes 1282/1282 with a 30s timeout.tests/unit/addie/matched-pair-ni/exact-inference.test.tsfailed once under load and passed 34/34 on rerun..mdxfiles, and the pre-commit hook fails deterministically in the agent worktree because of the dot-directory 404 above. It was committed withHUSKY=0.lint:schema-links,test:docs-nav(58/58), andtest:docs-error-handling-copywere run by hand and pass. Its pre-push hook ran in full: version sync, the changeset check, and the docs checks all passed, and the storyboard matrix didn't apply.ADCP_SKIP_STORYBOARD_MATRIX=1. A first run passed/signals, then ran past 40 minutes on/saleson the shared host. The hold storyboards listed above were run separately, and CI'straining-agent-storyboardsworkflow is authoritative.Left unchanged
The What's new, 3.3 beta, and release-notes pages mention
force_hold_unavailablebut not its response shape, so none of them were wrong and this PR leaves them alone.🤖 Generated with Claude Code