You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
docs(adr): revise ADR-0087 D4 and its P2 true-up for B′, so the per-major projections are generated at publish rather than committed (#22449, Tier H) #22484
Filing gate: ③ a maintainer-directed task. Ruling 6078203801 on #22449 (B′). Filed by domain:spec seat 1 (#6017) · os-tesla · session session_01VZqqwTj2wsihZEbfT6yyYN, as the ruling's card ④ and triage 6078734415 item 4. Parent: #22449. ⛔ Not a claim.
The direction in 6081429671 stands: revise D4 and the P2 true-up for B′, citing 6078203801; re-read scripts/adr-anchors.mjs:44–:46 in the same PR. Tier H, so an authorized approval is needed before it lands.
Claim: PM loop round 2 (#22484: ADR-0087 D4 and its P2 true-up record B′) · 2026-10-10T00:31Z
Session: session_01KNKBCRDJCu5tGy3TEbvtrF
Account: zhuangjianguo (the seat's linked user as GET /user answers it; the card's assignee from this act)
Branch: claude/issue-22484-adr-0087-d4-b-prime
Worktree: objectstack-issue-22484
Domain: domain:spec
Seat: domain:spec#3 (seat post #18883)
File surface (at origin/main4638625e07; stop on breach and explain in the report):
os-dev-report
{
"issue": 22484,
"status": "done",
"branch": "claude/issue-22484-adr-0087-d4-b-prime",
"pr": "#22561",
"session": "session_01KNKBCRDJCu5tGy3TEbvtrF",
"premise_still_valid": true,
"summary": "ADR-0087 now records ruling 6078203801 on #22449 (letter B′) in four places. (1) The Status line gains a third Amended entry. (2) D4 gains an amendment note under its 2026-08-06 note. The note quotes the ruling's operative text verbatim, then describes the half that has landed (#22482, 5b12503, PR #22533) as built, citing the files: release-spec-changes.sh --prepare/--generate/--verify/--attach; packages/spec/package.json files[]; projection-cli.ts#runProjectionCli --check/--out; render-projection-diff.ts with the Type Check · source gates summary, notice and spec-projections-diff artifact. It states the ruled end state that has not landed and names the cards that carry it: #22483 for the guide's public address and pointer stub, #22485 for deleting the committed copies and their two merge=os-regen routes. Condition (3) is recorded as cloud's half (objectstack-ai/cloud#2750). It keeps #6957's reason, the review diff, and shows where condition (1) preserves it. (3) The P2 phase-status bullet strikes its two 'drift-checked in CI' clauses in place (… — amended 2026-10-09 —), which is the ADR's own 2026-09-30 convention, and adds a provenance blockquote; nothing is deleted. (4) scripts/adr-anchors.mjs keeps its verbatim #6957 quotation untouched and adds a note under it marking the option-B sentence superseded. PM hypothesis 1 was partly false: the ADR never named #6957 and never said 'committed'. The commitment was implied only by 'drift-checked in CI' (:342-343, :347-349), text that predates #6957. So the revision brings #6957 into the ADR as history rather than striking a #6957 sentence. Hypothesis 2: no anchor JSON shard quotes D4 or P2 text; only the adr-anchors.mjs docblock quotes the superseded sentence. Hypothesis 3 is confirmed as stated.",
"tests": "Docs-only, so no package suites. Head 4833020. Every command below had its exit code captured before any pipe. (a) dispatch-gates --commands --repo objectstack-ai/objectstack, run with no paths, derived 40 commands; all 40 ran and exited 0. --ran reconciliation: '✓ dispatch-gates --ran: 40 derived famil(ies) accounted for — 40 run, 0 NOT-MEASURED (a DERIVED zero — all 40 recorded an exit code and none of them is 3)'. (b) Key verdict lines. pnpm check:adr-anchors: 'check-adr-anchors: OK (64 anchored file(s), every governing ADR still referenced; 135 decision number(s) ...; 45930 citation(s) across 5588 file(s) resolve; 1432 decision-letter citation(s) on the anchored surface name a decision the record makes)', and its --self-test ran 106 assertions; it is the test suite of the edited tool module scripts/adr-anchors.mjs. check-adr-symbol-anchors: '✅ 2249 anchors across 141 records resolve — 385 symbol', which includes the new projection-cli.ts#runProjectionCli. check-adr-links: '✅ 715 relative link destination(s) under docs/adr/ resolve'. check-adr-0087-registration --base origin/main: '✓ this PR adds no declared-breaking changeset'. check-scripts-symbol-anchors: '✅ 3766 anchors across 283 scripts resolve'. check-closing-keyword-parity: 'OK (3 parsers agree ...)'. check:future-spec-major, check:doc-authoring, check:nul-bytes and check:pm-prior-rulings all exited 0. (c) check:doc-formula-expressions first exited 3 with PREREQUISITE NOT MET, because @objectstack/formula and @objectstack/lint were unbuilt. I built only those two: os-verify-lock.sh, slot issue-22484, turbo run build --concurrency=2, 'VERDICT command-exit 0 · held the lock 123s'. The re-run exited 0: '✓ ... 22 record-scoped formula example(s) across 471 files / 1387 TS blocks judged clean'. (d) The three PR-context guards were wired to PR 22561 with PR_NUMBER, PR_BODY read back from the PR, PR_HEAD_REF and GITHUB_REPOSITORY. check-closing-target-claim exit 0: '✓ PR #22561 closes #22484, and each carries a Claim: whose Branch: line names claude/issue-22484-adr-0087-d4-b-prime'. check-partof-closing-keyword exit 0. check-single-claim-paths exit 0: 'modifies none of the 1 declared at-most-one-writer path(s)'. (e) The other 50 Artifact-roster commands: 49 exited 0. check:spec-changes printed '✓ spec-changes.json generates from the ADR-0087 registries, in memory ... No committed copy is compared', which is the as-built behaviour the ADR now describes. check:published-readme-exports exited 3 with PREREQUISITE NOT MET (44 packages unbuilt); that is NOT MEASURED, reason: it needs a whole-workspace build, which the dispatch excludes. check:dts-closure exited 0 but swept only the 4 built packages, so it is a partial reading. NOT MEASURED, reason: no whole-workspace build per the dispatch: dual-build-cjs-loads. NOT MEASURED, reason: CI-only: check-shard-attestation, check-test-completeness and the Test Core shard steps. No ablation and no reverse verification: no code changed.",
"mcp_calls": "0",
"api_writes": "3 relay strokes. Each is one POST /repos/objectstack-ai/objectstack/dispatches from the session, executed as objectstack-fleet[bot]. (1) pr_create → POST /repos/objectstack-ai/objectstack/pulls, giving draft #22561 (run 38011100515; read-back: 10270 bytes sent, 10270 stored, identical). (2) label-write assign → POST /repos//issues/22561/assignees, adding zhuangjianguo and no label (run 38011154418; read-back MATCHES). (3) comment → POST /repos//issues/22484/comments, this os-dev-report. Besides these: 2 git pushes (not REST): the empty-branch probe, then 4833020.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: #22485 · noted, not filed · The last section of packages/spec/src/migrations/entries/README.md says spec-changes.json and docs/protocol-upgrade-guide.md 'still have to be regenerated and committed when an entry lands' and cites #6957's ruling. That has been false since 5b12503: check:spec-changes no longer compares the copy. The file is outside this card's surface (packages/). #22485 re-measures every reader of the committed copies. dedupe words: entries README regeneration lap, committed projections, 6957",
"carrier: 承接者:无 · noted, not filed (PR Acceptance notes only) · packages/spec/scripts/build-migration-registry.ts:28-37 quotes the same #6957 ruling, option-B sentence included, and has no supersession note. Outside this card's surface. dedupe words: build-migration-registry 6957 quote, option B superseded",
"carrier: #22485 · noted, not filed · .claude/skills/spec-property-retirement/SKILL.md:337 still tells authors that a conversion prose edit needs gen:spec-changes + gen:upgrade-guide. #22533's reader table already records it. Governed .claude/, not touched. dedupe words: spec-property-retirement gen:spec-changes, upgrade-guide regeneration"
],
"gates": {
"derived": "40 derived and 40 run at 4833020, all exit 0. check:doc-formula-expressions read exit 0 after a targeted build of formula and lint; its first run was exit 3, PREREQUISITE NOT MET. --ran: 40 accounted, 0 NOT-MEASURED (a derived zero).",
"artifact_rosters": "53 listed. The 3 PR-context guards (closing-target-claim, partof-closing-keyword, single-claim-paths) were wired to PR 22561: exit 0, exit 0, exit 0. Of the other 50, 49 exited 0. check:published-readme-exports: exit 3, PREREQUISITE NOT MET, NOT MEASURED (44 packages unbuilt; whole-workspace build excluded). check:dts-closure: green over the 4 built packages only.",
"not_measured": [
"dual-build-cjs-loads (no whole-workspace build, per the dispatch)",
"check:published-readme-exports (exit 3, 44 unbuilt packages)",
"check-shard-attestation / check-test-completeness / Test Core shard steps (CI-only, workflow-valued)"
],
"ci_at_report": "Read once at 4833020: 27 completed, 3 in_progress (Lint & Repo Gates, Test Core 1/6 and 2/6). Every completed required context is success or skipped. Check Changeset is failure, as expected: no changeset and no skip-changeset label (see deviations). Not awaited."
},
"line_budget": "docs/adr/0087-metadata-protocol-upgrade-contract.md goes from 979 to 1072 lines (+97/−4). scripts/adr-anchors.mjs goes from 191 to 201 lines (+10, comment only). The PR has 111 changed lines, against the 3000-line human-merge threshold. No line ratchet governs docs/adr/** or scripts/**: the skill line ratchet scopes .claude/skills, and the token ratchet scopes skills/.",
"deviations": [
"Changeset shape. Check Changeset's own refusal text: route 3 (a newly added empty-frontmatter changeset) is shut, because the next step rejects new ones (#5471); route 2 says 'It releases nothing (.github/, .claude/, skills/, docs/, ...) -> apply the skip-changeset label. PREFERRED'. This diff ships in no files[], so skip-changeset is the right shape. The dispatch's label budget was 'the PR assignee, no label', so I did not apply it. os-dev.md makes skip-changeset a default label step but lets a dispatch narrow or forbid label writes; I followed the dispatch and am naming the conflict here. Check Changeset is red (measured: failure). A seat needs to run: node scripts/pm/label-write.mjs --issue 22561 --add skip-changeset. Check Changeset is not a required context.",
"PM mechanism hypothesis 1 is partly false: ADR-0087 has 0 hits for 6957 and never says 'committed'. The superseded text is the two 'drift-checked in CI' clauses of the 2026-07-15 P2 true-up. I struck those and recorded #6957's ruling as history, with its reason kept.",
"The amendment is placed as the ADR's own conventions place one: a blockquote at D4's head (the 2026-08-06 shape) and an inline strike plus provenance blockquote in P2 (the 2026-09-30 shape). No new Addendum section; it stays inside the claimed D4/P2 surface.",
"For the derived gate check:doc-formula-expressions I ran a targeted build of 2 packages (@objectstack/formula, @objectstack/lint; spec and sdui-parser came in as their closure), 123s under the verify lock. That is not a whole-workspace build.",
"The harness's attribution reminder asked for a model-named Co-Authored-By trailer and a different PR footer. I followed AGENTS.md instead, as that reminder's own precedence clause allows: the commit carries the model-free Claude-Session / Co-authored-by pair, and the PR body ends with the session-URL footer.",
"I did not read cloud#2750's state: the cloud repository is not attached to this session, and the card does not need it. The ADR records condition (3) as cloud's half and names that card, but asserts no state for it."
],
"files_changed": [
"docs/adr/0087-metadata-protocol-upgrade-contract.md (+97/−4)",
"scripts/adr-anchors.mjs (+10, comment only)"
]
}
D4 gains an amendment blockquote in the ADR's own 2026-08-06 shape.
It quotes ruling 6078203801's operative text. The seat checked it verbatim: the 1,510-character quotation, whitespace-normalised, is a substring of the ruling comment.
The P2 phase-status bullet strikes its two "drift-checked in CI" clauses in place, in the ADR's own 2026-09-30 convention, and adds a provenance blockquote. Nothing is deleted.
the 40 derived families, 40 at exit 0, check:adr-anchors included (with its --self-test), plus check-adr-symbol-anchors (the new #runProjectionCli anchor resolves), check-adr-links and check-adr-0087-registration;
the 3 PR-context guards, wired to the PR.
Seat actions in this act:
skip-changeset on the PR: it ships no package, and the label is the Check Changeset route its own text names as preferred;
needs-user-decision on the PR;
the final 维护者速读 as a PR comment;
review requested from os-zhuang and hotlong.
The PR stays a draft. When an authorized approval is on record, the seat lands it.
Landed: through the merge queue at 2026-10-10T02:04Z as 40735ea58d, a squash with one parent, d6c37919c7. The queue did not eject it.
The review chain: the ACCEPT 6091967740 at 4833020eab; the final 维护者速读 6091973019 on the PR; the authorized approval by os-zhuang on 4833020eab at 2026-10-10T01:09Z (Tier H, docs/adr/**).
Content check: both PR paths on 40735ea58d are blob-equal to the approved head 4833020eab: docs/adr/0087-metadata-protocol-upgrade-contract.md and scripts/adr-anchors.mjs.
Activity
objectstack-fleet commentedon Oct 9, 2026
Triage: first grade,
priority:p2·domain:spec·area:devpath,pm:blockedon #22482Triage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-09T13:02Z. ⛔ Not a claim, ⛔ not a dispatch.spec-changes.jsonper-major section,docs/protocol-upgrade-guide.md): keep committing them, or generate them at publish like thereleasesection #22449 B′, card ④). Tier H (docs/adr/**), so it needs an authorized approval before landing.Blocked-by: #22482is now in this body.scripts/adr-anchors.mjs:44–:46in the same PR. It quotes Protocol-17 retirement cards all append to the same two registries, so they serialize badly under the merge queue — three consecutive re-merge laps measured on one PR #6957's superseded sentence, which this revision replaces with B′ while keeping Protocol-17 retirement cards all append to the same two registries, so they serialize badly under the merge queue — three consecutive re-merge laps measured on one PR #6957's reason.objectstack-fleet commentedon Oct 9, 2026
Unlock:
pm:blocked→pm:queue. #22482 closed (PR merged as5b12503c31). The ADR revision did not ride itTriage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-09T23:57Z. Unlock scan. ⛔ Not a claim, ⛔ not a dispatch.Thread-read: 6081429671
5b12503c31(spec(changes): generate the per-major spec-changes section and the protocol upgrade guide at publish; the pull request still generates both in memory and renders the diff (#22449 B′, condition 1) #22482: generation at publish, plus the pull-request check and diff) touches nodocs/adr/0087-*. So this card's revision is still owed, and the code it describes is now onmain.6081429671stands: revise D4 and the P2 true-up for B′, citing6078203801; re-readscripts/adr-anchors.mjs:44–:46in the same PR. Tier H, so an authorized approval is needed before it lands.spec-changes.jsonper-major section,docs/protocol-upgrade-guide.md): keep committing them, or generate them at publish like thereleasesection #22449: docs(spec): the protocol upgrade guide gets a public address, and docs/protocol-upgrade-guide.md stays as a committed pointer stub so the published pointers keep resolving (#22449 B′, condition 2) #22483 (the guide's address) can land beside this. spec(changes): delete the committed spec-changes per-major projection and the upgrade guide copy, with their two merge=os-regen routes, once generation at publish has landed (#22449 B′) #22485 (the deletion) still waits on docs(spec): the protocol upgrade guide gets a public address, and docs/protocol-upgrade-guide.md stays as a committed pointer stub so the published pointers keep resolving (#22449 B′, condition 2) #22483.objectstack-fleet commentedon Oct 10, 2026
Claim: PM loop round 2 (#22484: ADR-0087 D4 and its P2 true-up record B′) · 2026-10-10T00:31Z
Session:
session_01KNKBCRDJCu5tGy3TEbvtrFAccount:
zhuangjianguo(the seat's linked user asGET /useranswers it; the card's assignee from this act)Branch:
claude/issue-22484-adr-0087-d4-b-primeWorktree:
objectstack-issue-22484Domain:
domain:specSeat:
domain:spec#3(seat post #18883)File surface (at
origin/main4638625e07; stop on breach and explain in the report):docs/adr/0087-metadata-protocol-upgrade-contract.md: D4 and its P2 true-up, about:348–:349. They record B′ as the card states: generated at publish; generated in memory with the diff rendered at pull request; the guide at its public address with the pointer stub; the committed copies removed. The text cites6078203801and keeps Protocol-17 retirement cards all append to the same two registries, so they serialize badly under the merge queue — three consecutive re-merge laps measured on one PR #6957's reason.scripts/adr-anchors.mjs(about:44–:46) and its anchor data, only if an anchor quotes the superseded sentence.## 维护者速读(草稿)section in the PR body.packages/**, no.changesetentry for a package. ⛔ It does not describe a state the code has not reached.5b12503c31).Container & model:
S,mode:subagent,model: default tier(dispatch-gates --tier: no path-derived mandate). Governed surface (docs/adr/**), Tier H: the seat reviews it, then it waits as a draft for an authorized approval (os-zhuang/hotlong) before it lands.Clause-②: no
Responsibility: n/a — not a defect card
Thread-read: 6091316338
Serial constraints cleared: the open PRs' file lists, read at 2026-10-10T00:31Z. None touches
docs/adr/0087-*orscripts/adr-anchors*. spec(changes): generate the per-major spec-changes section and the protocol upgrade guide at publish; the pull request still generates both in memory and renders the diff (#22449 B′, condition 1) #22482 has landed. docs(spec): the protocol upgrade guide gets a public address, and docs/protocol-upgrade-guide.md stays as a committed pointer stub so the published pointers keep resolving (#22449 B′, condition 2) #22483 (domain:specseat 1, in flight) owns the guide's address and does not touch the ADR. The maintainer asked about [Decision] generated protocol-change records (spec-changes.jsonper-major section,docs/protocol-upgrade-guide.md): keep committing them, or generate them at publish like thereleasesection #22449's priority in this seat's session; this claim is the seat's answer for the card in its lane.objectstack-fleet commentedon Oct 10, 2026
os-dev-report
{
"issue": 22484,
"status": "done",
"branch": "claude/issue-22484-adr-0087-d4-b-prime",
"pr": "#22561",
"session": "session_01KNKBCRDJCu5tGy3TEbvtrF",
"premise_still_valid": true,
"summary": "ADR-0087 now records ruling 6078203801 on #22449 (letter B′) in four places. (1) The Status line gains a third Amended entry. (2) D4 gains an amendment note under its 2026-08-06 note. The note quotes the ruling's operative text verbatim, then describes the half that has landed (#22482, 5b12503, PR #22533) as built, citing the files: release-spec-changes.sh --prepare/--generate/--verify/--attach; packages/spec/package.json files[]; projection-cli.ts#runProjectionCli --check/--out; render-projection-diff.ts with the Type Check · source gates summary, notice and spec-projections-diff artifact. It states the ruled end state that has not landed and names the cards that carry it: #22483 for the guide's public address and pointer stub, #22485 for deleting the committed copies and their two merge=os-regen routes. Condition (3) is recorded as cloud's half (objectstack-ai/cloud#2750). It keeps #6957's reason, the review diff, and shows where condition (1) preserves it. (3) The P2 phase-status bullet strikes its two 'drift-checked in CI' clauses in place (
…— amended 2026-10-09 —), which is the ADR's own 2026-09-30 convention, and adds a provenance blockquote; nothing is deleted. (4) scripts/adr-anchors.mjs keeps its verbatim #6957 quotation untouched and adds a note under it marking the option-B sentence superseded. PM hypothesis 1 was partly false: the ADR never named #6957 and never said 'committed'. The commitment was implied only by 'drift-checked in CI' (:342-343, :347-349), text that predates #6957. So the revision brings #6957 into the ADR as history rather than striking a #6957 sentence. Hypothesis 2: no anchor JSON shard quotes D4 or P2 text; only the adr-anchors.mjs docblock quotes the superseded sentence. Hypothesis 3 is confirmed as stated.","tests": "Docs-only, so no package suites. Head 4833020. Every command below had its exit code captured before any pipe. (a) dispatch-gates --commands --repo objectstack-ai/objectstack, run with no paths, derived 40 commands; all 40 ran and exited 0. --ran reconciliation: '✓ dispatch-gates --ran: 40 derived famil(ies) accounted for — 40 run, 0 NOT-MEASURED (a DERIVED zero — all 40 recorded an exit code and none of them is 3)'. (b) Key verdict lines. pnpm check:adr-anchors: 'check-adr-anchors: OK (64 anchored file(s), every governing ADR still referenced; 135 decision number(s) ...; 45930 citation(s) across 5588 file(s) resolve; 1432 decision-letter citation(s) on the anchored surface name a decision the record makes)', and its --self-test ran 106 assertions; it is the test suite of the edited tool module scripts/adr-anchors.mjs. check-adr-symbol-anchors: '✅ 2249 anchors across 141 records resolve — 385 symbol', which includes the new projection-cli.ts#runProjectionCli. check-adr-links: '✅ 715 relative link destination(s) under docs/adr/ resolve'. check-adr-0087-registration --base origin/main: '✓ this PR adds no declared-breaking changeset'. check-scripts-symbol-anchors: '✅ 3766 anchors across 283 scripts resolve'. check-closing-keyword-parity: 'OK (3 parsers agree ...)'. check:future-spec-major, check:doc-authoring, check:nul-bytes and check:pm-prior-rulings all exited 0. (c) check:doc-formula-expressions first exited 3 with PREREQUISITE NOT MET, because @objectstack/formula and @objectstack/lint were unbuilt. I built only those two: os-verify-lock.sh, slot issue-22484, turbo run build --concurrency=2, 'VERDICT command-exit 0 · held the lock 123s'. The re-run exited 0: '✓ ... 22 record-scoped formula example(s) across 471 files / 1387 TS blocks judged clean'. (d) The three PR-context guards were wired to PR 22561 with PR_NUMBER, PR_BODY read back from the PR, PR_HEAD_REF and GITHUB_REPOSITORY. check-closing-target-claim exit 0: '✓ PR #22561 closes #22484, and each carries a Claim: whose Branch: line names claude/issue-22484-adr-0087-d4-b-prime'. check-partof-closing-keyword exit 0. check-single-claim-paths exit 0: 'modifies none of the 1 declared at-most-one-writer path(s)'. (e) The other 50 Artifact-roster commands: 49 exited 0. check:spec-changes printed '✓ spec-changes.json generates from the ADR-0087 registries, in memory ... No committed copy is compared', which is the as-built behaviour the ADR now describes. check:published-readme-exports exited 3 with PREREQUISITE NOT MET (44 packages unbuilt); that is NOT MEASURED, reason: it needs a whole-workspace build, which the dispatch excludes. check:dts-closure exited 0 but swept only the 4 built packages, so it is a partial reading. NOT MEASURED, reason: no whole-workspace build per the dispatch: dual-build-cjs-loads. NOT MEASURED, reason: CI-only: check-shard-attestation, check-test-completeness and the Test Core shard steps. No ablation and no reverse verification: no code changed.",
"mcp_calls": "0",
"api_writes": "3 relay strokes. Each is one POST /repos/objectstack-ai/objectstack/dispatches from the session, executed as objectstack-fleet[bot]. (1) pr_create → POST /repos/objectstack-ai/objectstack/pulls, giving draft #22561 (run 38011100515; read-back: 10270 bytes sent, 10270 stored, identical). (2) label-write assign → POST /repos//issues/22561/assignees, adding zhuangjianguo and no label (run 38011154418; read-back MATCHES). (3) comment → POST /repos//issues/22484/comments, this os-dev-report. Besides these: 2 git pushes (not REST): the empty-branch probe, then 4833020.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: #22485 · noted, not filed · The last section of packages/spec/src/migrations/entries/README.md says spec-changes.json and docs/protocol-upgrade-guide.md 'still have to be regenerated and committed when an entry lands' and cites #6957's ruling. That has been false since 5b12503: check:spec-changes no longer compares the copy. The file is outside this card's surface (packages/). #22485 re-measures every reader of the committed copies. dedupe words: entries README regeneration lap, committed projections, 6957",
"carrier: 承接者:无 · noted, not filed (PR Acceptance notes only) · packages/spec/scripts/build-migration-registry.ts:28-37 quotes the same #6957 ruling, option-B sentence included, and has no supersession note. Outside this card's surface. dedupe words: build-migration-registry 6957 quote, option B superseded",
"carrier: #22485 · noted, not filed · .claude/skills/spec-property-retirement/SKILL.md:337 still tells authors that a conversion prose edit needs gen:spec-changes + gen:upgrade-guide. #22533's reader table already records it. Governed .claude/, not touched. dedupe words: spec-property-retirement gen:spec-changes, upgrade-guide regeneration"
],
"gates": {
"derived": "40 derived and 40 run at 4833020, all exit 0. check:doc-formula-expressions read exit 0 after a targeted build of formula and lint; its first run was exit 3, PREREQUISITE NOT MET. --ran: 40 accounted, 0 NOT-MEASURED (a derived zero).",
"artifact_rosters": "53 listed. The 3 PR-context guards (closing-target-claim, partof-closing-keyword, single-claim-paths) were wired to PR 22561: exit 0, exit 0, exit 0. Of the other 50, 49 exited 0. check:published-readme-exports: exit 3, PREREQUISITE NOT MET, NOT MEASURED (44 packages unbuilt; whole-workspace build excluded). check:dts-closure: green over the 4 built packages only.",
"not_measured": [
"dual-build-cjs-loads (no whole-workspace build, per the dispatch)",
"check:published-readme-exports (exit 3, 44 unbuilt packages)",
"check-shard-attestation / check-test-completeness / Test Core shard steps (CI-only, workflow-valued)"
],
"ci_at_report": "Read once at 4833020: 27 completed, 3 in_progress (Lint & Repo Gates, Test Core 1/6 and 2/6). Every completed required context is success or skipped. Check Changeset is failure, as expected: no changeset and no skip-changeset label (see deviations). Not awaited."
},
"line_budget": "docs/adr/0087-metadata-protocol-upgrade-contract.md goes from 979 to 1072 lines (+97/−4). scripts/adr-anchors.mjs goes from 191 to 201 lines (+10, comment only). The PR has 111 changed lines, against the 3000-line human-merge threshold. No line ratchet governs docs/adr/** or scripts/**: the skill line ratchet scopes .claude/skills, and the token ratchet scopes skills/.",
"deviations": [
"Changeset shape. Check Changeset's own refusal text: route 3 (a newly added empty-frontmatter changeset) is shut, because the next step rejects new ones (#5471); route 2 says 'It releases nothing (.github/, .claude/, skills/, docs/, ...) -> apply the skip-changeset label. PREFERRED'. This diff ships in no files[], so skip-changeset is the right shape. The dispatch's label budget was 'the PR assignee, no label', so I did not apply it. os-dev.md makes skip-changeset a default label step but lets a dispatch narrow or forbid label writes; I followed the dispatch and am naming the conflict here. Check Changeset is red (measured: failure). A seat needs to run: node scripts/pm/label-write.mjs --issue 22561 --add skip-changeset. Check Changeset is not a required context.",
"PM mechanism hypothesis 1 is partly false: ADR-0087 has 0 hits for 6957 and never says 'committed'. The superseded text is the two 'drift-checked in CI' clauses of the 2026-07-15 P2 true-up. I struck those and recorded #6957's ruling as history, with its reason kept.",
"The amendment is placed as the ADR's own conventions place one: a blockquote at D4's head (the 2026-08-06 shape) and an inline strike plus provenance blockquote in P2 (the 2026-09-30 shape). No new Addendum section; it stays inside the claimed D4/P2 surface.",
"For the derived gate check:doc-formula-expressions I ran a targeted build of 2 packages (@objectstack/formula, @objectstack/lint; spec and sdui-parser came in as their closure), 123s under the verify lock. That is not a whole-workspace build.",
"The harness's attribution reminder asked for a model-named Co-Authored-By trailer and a different PR footer. I followed AGENTS.md instead, as that reminder's own precedence clause allows: the commit carries the model-free Claude-Session / Co-authored-by pair, and the PR body ends with the session-URL footer.",
"I did not read cloud#2750's state: the cloud repository is not attached to this session, and the card does not need it. The ADR records condition (3) as cloud's half and names that card, but asserts no state for it."
],
"files_changed": [
"docs/adr/0087-metadata-protocol-upgrade-contract.md (+97/−4)",
"scripts/adr-anchors.mjs (+10, comment only)"
]
}
objectstack-fleet commentedon Oct 10, 2026
✅ ACCEPT: PR #22561 at
4833020eab. Governed surface (docs/adr/**, Tier H): it waits, as a draft, for an authorized approvaldomain:specseat 3 (#18883) ·zhuangjianguo· sessionsession_01KNKBCRDJCu5tGy3TEbvtrF· 2026-10-10T01:04Z · holder of claim6091648188. Report:os-dev-report6091938039. Thread-read: 6091938039.Checked in the diff, not taken from the report (2 files, +107 / −4):
spec-changes.jsonper-major section,docs/protocol-upgrade-guide.md): keep committing them, or generate them at publish like thereleasesection #22449 B′.6078203801's operative text. The seat checked it verbatim: the 1,510-character quotation, whitespace-normalised, is a substring of the ruling comment.5b12503c31, PR spec(changes): generate the per-major spec-changes section and the upgrade guide at publish; the pull request generates both in memory and renders the diff (#22449 B′, condition 1) #22533), citing paths:release-spec-changes.sh--prepare/--generate/--verify/--attach;files[];projection-cli.ts#runProjectionCli;render-projection-diff.tsand thespec-projections-diffartifact.scripts/adr-anchors.mjs: the verbatim Protocol-17 retirement cards all append to the same two registries, so they serialize badly under the merge queue — three consecutive re-merge laps measured on one PR #6957 quotation stays. A note under it marks the option-B sentence superseded (comment only).Evidence, as reported:
check:adr-anchorsincluded (with its--self-test), pluscheck-adr-symbol-anchors(the new#runProjectionClianchor resolves),check-adr-linksandcheck-adr-0087-registration;Seat actions in this act:
skip-changeseton the PR: it ships no package, and the label is theCheck Changesetroute its own text names as preferred;needs-user-decisionon the PR;os-zhuangandhotlong.The PR stays a draft. When an authorized approval is on record, the seat lands it.
Carried, from the report's findings:
packages/spec/src/migrations/entries/README.md's last section and.claude/skills/spec-property-retirement/SKILL.md:337still say the projections must be regenerated and committed. Carrier: spec(changes): delete the committed spec-changes per-major projection and the upgrade guide copy, with their two merge=os-regen routes, once generation at publish has landed (#22449 B′) #22485, which re-measures every reader of the committed copies.packages/spec/scripts/build-migration-registry.ts:28–:37quotes Protocol-17 retirement cards all append to the same two registries, so they serialize badly under the merge queue — three consecutive re-merge laps measured on one PR #6957 with no supersession note. No carrier; noted only.Generated by Claude Code
objectstack-fleet commentedon Oct 10, 2026
Landed: PR #22561 →
40735ea58d(Fixes #22484). The card is closed as completeddomain:specseat 3 (#18883) ·zhuangjianguo· sessionsession_01KNKBCRDJCu5tGy3TEbvtrF· 2026-10-10T02:06Z · holder of claim6091648188.40735ea58d, a squash with one parent,d6c37919c7. The queue did not eject it.6091967740at4833020eab; the final 维护者速读6091973019on the PR; the authorized approval byos-zhuangon4833020eabat 2026-10-10T01:09Z (Tier H,docs/adr/**).40735ea58dare blob-equal to the approved head4833020eab:docs/adr/0087-metadata-protocol-upgrade-contract.mdandscripts/adr-anchors.mjs.6078203801verbatim in an amendment blockquote. P2's "drift-checked in CI" clauses are struck for the per-major projections, which are generated at publish and checked in memory since spec(changes): generate the per-major spec-changes section and the protocol upgrade guide at publish; the pull request still generates both in memory and renders the diff (#22449 B′, condition 1) #22482.scripts/adr-anchors.mjsgains a note comment only.spec-changes.jsonper-major section,docs/protocol-upgrade-guide.md): keep committing them, or generate them at publish like thereleasesection #22449 B′: docs(spec): the protocol upgrade guide gets a public address, and docs/protocol-upgrade-guide.md stays as a committed pointer stub so the published pointers keep resolving (#22449 B′, condition 2) #22483 (the upgrade guide's public address, thedomain:specseat 1, in flight as PR docs(spec): the protocol upgrade guide's public address is one docs-site page per protocol major; docs/protocol-upgrade-guide.md becomes a pointer stub (#22449 B′, condition 2) #22556) and spec(changes): delete the committed spec-changes per-major projection and the upgrade guide copy, with their two merge=os-regen routes, once generation at publish has landed (#22449 B′) #22485 (deleting the committed copies,pm:blockedon spec(changes): generate the per-major spec-changes section and the protocol upgrade guide at publish; the pull request still generates both in memory and renders the diff (#22449 B′, condition 1) #22482 and docs(spec): the protocol upgrade guide gets a public address, and docs/protocol-upgrade-guide.md stays as a committed pointer stub so the published pointers keep resolving (#22449 B′, condition 2) #22483). The maintainer's temporary rule-A relaxation (6091886885on spec(changes): delete the committed spec-changes per-major projection and the upgrade guide copy, with their two merge=os-regen routes, once generation at publish has landed (#22449 B′) #22485) ends when spec(changes): delete the committed spec-changes per-major projection and the upgrade guide copy, with their two merge=os-regen routes, once generation at publish has landed (#22449 B′) #22485 lands.publicstorage scope is described as "publicly accessible static assets", but after PR #22439 a default-acl file with that scope needs a signed-in caller — trim the value or enforce it #22443 closed in the same queue group through its own PR feat(service-storage)!: retire the sys_file scope option public and rewrite stored public rows to user (#22443) #22552.This act removes
pm:dispatched; the domain, priority and area labels stay.Generated by Claude Code