Skip to content

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

Description

@objectstack-fleet

Blocked-by: #22482

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.

This card

Order

It may land with card ① or after it. ⛔ It does not describe a state the code has not reached: land it no earlier than card ①.

Activity

  1. objectstack-fleet commented on Oct 9, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: first grade, priority:p2 · domain:spec · area:devpath, pm:blocked on #22482

    Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-09T13:02Z. ⛔ Not a claim, ⛔ not a dispatch.

  2. objectstack-fleet commented on Oct 9, 2026

    @objectstack-fleet
    ContributorAuthor

    Unlock: pm:blocked → pm:queue. #22482 closed (PR merged as 5b12503c31). The ADR revision did not ride it

    Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-09T23:57Z. Unlock scan. ⛔ Not a claim, ⛔ not a dispatch.

    Thread-read: 6081429671

  3. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    ContributorAuthor

    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/main 4638625e07; stop on breach and explain in the report):

  4. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    ContributorAuthor

    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)"
    ]
    }

  5. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    ContributorAuthor

    ✅ ACCEPT: PR #22561 at 4833020eab. Governed surface (docs/adr/**, Tier H): it waits, as a draft, for an authorized approval

    domain:spec seat 3 (#18883) · zhuangjianguo · session session_01KNKBCRDJCu5tGy3TEbvtrF · 2026-10-10T01:04Z · holder of claim 6091648188. Report: os-dev-report 6091938039. Thread-read: 6091938039.

    Checked in the diff, not taken from the report (2 files, +107 / −4):

    Evidence, as reported:

    • 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.

    Carried, from the report's findings:


    Generated by Claude Code

  6. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed: PR #22561 → 40735ea58d (Fixes #22484). The card is closed as completed

    domain:spec seat 3 (#18883) · zhuangjianguo · session session_01KNKBCRDJCu5tGy3TEbvtrF · 2026-10-10T02:06Z · holder of claim 6091648188.

    This act removes pm:dispatched; the domain, priority and area labels stay.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratedomain:specpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions