Conversation
IPR Policy Agreement RequiredThank you for your contribution! Before we can accept your pull request, you must agree to our Intellectual Property Rights Policy. By making a Contribution, you agree that:
To agree, please comment below with the exact phrase: You can read the full IPR Policy here. I have read the IPR Policy You can retrigger this bot by commenting recheck in this Pull Request. Posted by the CLA Assistant Lite bot. |
| --- | ||
| --- | ||
|
|
||
| Clarify that v3 agents MUST NOT emit legacy status fields (`task_status`, `response_status`, or any alias) alongside the v3 `status` field. Adds a migration checklist row, a conformance warning in the task-lifecycle reference, and extends the protocol envelope schema's `status` description with the prohibition. Closes #2987. |
There was a problem hiding this comment.
fix or other changeset entry? spec?
nastassiafulconis
left a comment
There was a problem hiding this comment.
Reviewed: docs-only change adding normative prohibition against dual-emission of legacy status fields alongside v3 status. Placement in the envelope's status description (rather than the shared task-status.json enum) is correct given draft-07 $ref sibling-keyword limitations. Changeset and conventions look good.
Non-blocking suggestions:
- Migration row uses
Restructureeffort label which is a weak fit per the legend — consider aRemoverow. - Prohibition is only human-discoverable; worth a follow-up conformance check asserting no envelope property matches
/^(task|response)_status$/. - "or any alias" is undefined across the three surfaces — enumerate known aliases or tighten the rule.
…v3 status Closes #2987. Adds explicit MUST NOT conformance language so migrating agents know the v3 `status` field is the sole authoritative task state. https://claude.ai/code/session_01XeNaS3wfWQApdBpDsU5gC7
- Correct effort classification Rename → Restructure in migration table - Remove unsupported storyboard-testing claim from conformance warning - Replace x-adcp-conformance annotation (ignored on $ref nodes in draft-07) with prose in description field https://claude.ai/code/session_01XeNaS3wfWQApdBpDsU5gC7
Per @bokelley comment: PR touches static/schemas/source/core/protocol-envelope.json (a published protocol schema), so the changeset should bump the spec package, not be empty. Description-only schema change = patch per SemVer guidance in .agents/playbook.md. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…ify parse Blocks the broken-links workflow: Mintlify's MDX parser hits ./.changeset/triage-ship-more.md:4:156 with "Unexpected character \`1\` (U+0031) before name" because \`<150-line\` looks like a malformed JSX tag opener. Replace with "under-150-line" — same meaning, MDX-safe. Same fix shipped by @bokelley on bokelley/issue-3010 (ce11b32); cherry-picking here so this PR's CI isn't gated on that unrelated PR landing first. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
7bbf727 to
04a4a32
Compare
…e aliases - Add `Remove` effort label to migration legend; apply to the Task status row. - Drop vague "or any alias" from all three surfaces (migration table, task lifecycle warning, envelope schema description) — enumerate only the concrete pre-v3 names (`task_status`, `response_status`). Broader semantic overlap is covered by the prose, not by an open-ended prohibition. - Follow-up conformance check tracked in #3041. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Conflict in .changeset/triage-ship-more.md — both sides independently fixed the `<150-line` MDX parse error: this branch wrapped as `<150`-line in backticks, main (via #3021) rephrased to `under-150-line`. Took main's version as the cleaner prose fix (no `<` character at all, simpler than a code span). The workflow-level `.changeset/` shuffle + React-crash-tolerant grep filter in .github/workflows/broken-links.yml are retained — they protect against future changesets reintroducing `<anything>` patterns and against the upstream Mintlify React hook-call crash tracked in #2983. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…loses #3041) (#3044) PR #3021 added MUST NOT prose against dual-emitting legacy `task_status` and `response_status` alongside v3 `status`. Reviewer flagged that the rule was only human-discoverable. This lifts the prohibition into the JSON Schema itself via the existing `not: { anyOf: [{ required: [...] }] }` idiom (used by `core/catchment.json`). Any envelope containing `task_status` or `response_status` now fails draft-07 validation against `/schemas/core/protocol-envelope.json` — no runner-side primitive required. The prose MUST NOT in the `status` description remains for implementors reading the schema by eye; the `not` constraint is what validators act on. Verified with ajv: - clean envelope → valid - envelope with task_status → invalid - envelope with response_status → invalid - envelope with both → invalid - envelope with unrelated additional properties → valid (additionalProperties: true unchanged) Non-breaking: the prohibition targets behavior that was already incorrect per #3021. No conformant v3 agent emits these fields. Runtime conformance — a storyboard-level `field_absent` primitive plus @adcp/client implementation — is out of scope here and will be tracked as a follow-up on @adcp/client once the schema-level enforcement has shipped. Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…ard for #3041 (#3045) Formalises the normative MUST NOT on task_status / response_status envelope fields (established in PRs #2987 / #3021) as machine-checkable constraints. Changes: - static/schemas/source/core/protocol-envelope.json: adds "task_status": { "not": {} } and "response_status": { "not": {} } to the properties block. Any schema-aware validator operating on the full v3 protocol envelope will now detect these legacy field names without consulting the prose migration guide. - static/compliance/source/universal/v3-envelope-integrity.yaml: new universal storyboard (interaction_model: "*") asserting the canonical v3 status field is present. field_absent checks for the two prohibited fields are included as commented-out TODO steps pending @adcp/client runner support for that check type. Non-breaking justification: adds new forbidden-property constraints to two field names that were already normatively prohibited (MUST NOT). No conformant v3 implementation uses these fields; existing v3 consumers are unaffected. https://claude.ai/code/session_0144VBMThUyhomU346keD32C Co-authored-by: Claude <noreply@anthropic.com>
Closes #2987
Summary
AdCP v3 defines
statusas the single authoritative task state, but the spec said nothing about agents that continue emitting a legacytask_status(or similar) field alongside it during migration. Scope3 flagged this as an active ambiguity: buyers were assuming v3statuswins on terminal states but had no normative text to cite.This PR closes the gap with explicit MUST NOT language in three places:
docs/reference/migration/index.mdx): adds a "Task status" row so migrating agents have a concrete action item.docs/building/implementation/task-lifecycle.mdx): adds a:::warningcallout immediately after the Response Structure section — the primary reference implementors consult from code.static/schemas/source/core/protocol-envelope.json): extends thestatuspropertydescriptionwith the prohibition (sibling keywords on$refnodes are ignored by draft-07 validators; description is the correct channel for this).Non-breaking justification
Adds optional normative text and documentation only. No field added, removed, renamed, or made required. No enum values changed. No existing clients need to change code to keep working — the prohibition targets behavior that was already incorrect per intent.
Pre-PR review
Two rounds of review were completed (cap: 2). Both experts approved the substantive conformance language.
Open nit for reviewers: The migration table effort label is
Restructure. The protocol expert argues the closest match for a field-removal prohibition isRename("find-and-replace semantics"); the code reviewer considersRestructure("requires code changes") equally valid. NeitherRenamenorRestructureis a perfect fit — the table legend has noRemovecategory. Please pick whichever reads more accurately to you; either is fine. I stopped at the 2-iteration cap rather than introducing a third loop over taxonomy.Session: https://claude.ai/code/session_01XeNaS3wfWQApdBpDsU5gC7
Generated by Claude Code