Repository navigation
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
Description
Activity
objectstack-fleet commented
on Oct 9, 2026 ContributorAuthorMore actionsTriage: first grade,
priority:p2·domain:spec·area:devpath·pm:blocked(itsBlocked-by: #22482/#22483stand)Triage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-09T13:03Z. ⛔ Not a claim, ⛔ not a dispatch.- Admission: ③, maintainer-directed ([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 B′, card ③). Deleting a committed projection that a load-bearing gate reads is the migration-shape case. It is ordered here, not re-asked, because the maintainer ruled it. - The cloud card: objectstack-ai/cloud#2750, filed this round. It is now
Blocked-by:of 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, so this card follows it transitively and needs no line of its own. The amendment is on [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. - Direction: the body's own. ⛔ Not before 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 ships the projection inside the tarball. In the PR, name each reader of the committed copy with its re-measurement, including
scripts/pm/os-regen-merge.shand the hot-file serial queue that cites it.
- Admission: ③, maintainer-directed ([Decision] generated protocol-change records (
- addedarea:devpathThe road — create, dev, verify, publish/install, connect an agent, iterateThe road — create, dev, verify, publish/install, connect an agent, iteratepriority:p2Medium: important, M3Medium: important, M3
on Oct 9, 2026 objectstack-fleet commented
on Oct 9, 2026 ContributorAuthorMore actionsReaders to add to this card's re-measure, from PR #22533 (#22482).
domain:specseat 1 (#6017) ·os-tesla· sessionsession_01VZqqwTj2wsihZEbfT6yyYN· 2026-10-09T20:48Z. ⛔ Not a claim, no label change.PR #22533 stops comparing the committed copies; it does not delete them. Its dev measured four readers this card's body does not name yet. Each one must be handled before, or in, the deletion:
scripts/check-adr-0087-registration.mjs:2184reads the committedspec-changes.jsonat HEAD as its parser-rot witness. Once the copy stops being regenerated it ages. It stays a subset under insertion-only registration, but a withdrawn migration id would false-red it. Deleting the copy reds it ("not found at HEAD"). It needs a generated witness before the copy goes.- The merge-driver discharge (
regen-artifacts.mjsand the pre-commit hook) still names the two copies, besidecheck-generated.tsandos-regen-merge.sh, which this body already lists. .claude/skills/spec-property-retirement/SKILL.md:336tells authors that a prose-only conversion edit needsgen:spec-changes+gen:upgrade-guide. That stops being true. This is a governed.claude/**line (Tier S), so it goes through that path.packages/spec/protocol-upgrade-guide.mdis now written byrelease-spec-changes.sh --prepare/--generateand is not gitignored, so a local dry run leaves it untracked..gitignoreis a one-line follow-up that fits this card.
objectstack-fleet commented
on Oct 10, 2026 ContributorAuthorMore actionsMaintainer ruling, recorded by the
domain:specseat 3: landing rule A is relaxed for ADR-0087 D3-entry PRs until this card landsdomain:specseat 3 (#18883) ·zhuangjianguo· sessionsession_01KNKBCRDJCu5tGy3TEbvtrF· 2026-10-10T00:56Z. The maintainer answered in this session's chat. ⛔ Not a claim on this card.The question, verbatim: 「在 #22485(删两个投影副本)落地前,是否临时放宽落地规则 A:加迁移条目的 PR 只要 GitHub 判定可干净合并,就直接进合并队列,由队列里的 check:migration-registry / check:generated 把关,不再先手动同步 main、也不因此重做合同复审?」
The answer, verbatim: 「临时放宽,至 #22485 落地 (Recommended)」
What it changes (
.claude/skills/pm-dispatch/references/landing-operations.md§ A, and the contract-review carry):- Which PRs it covers: a PR that adds an ADR-0087 D3 entry. Its only drift against
mainis on generated files:packages/spec/src/migrations/registry.ts,packages/spec/spec-changes.json,docs/protocol-upgrade-guide.mdand generated reference pages. - What the seat may do: queue such a PR when GitHub reports it mergeable and clean, with no pre-queue sync of
main. Its contract review stays valid, because the head does not move. - Who checks the merge: the merge group.
Lint & Repo Gatesrunscheck:migration-registryandcheck:generated, andcheck:spec-changes/check:upgrade-guidegenerate in memory since 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. A merge group that fails ejects the PR, and the seat then syncs it under rule A as written. - What it does not change: a real textual conflict, a
dirtystate, or drift on a non-generated path still takes rule A's sync.
Why it is safe enough:
- Since 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 (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), no check compares the two committed projection copies, and publish regenerates both from the registries.
registry.ts's generated regions are sorted by entry id, so two PRs that add different entries text-merge to the generated answer. The two syncs measured this week each regenerated it unchanged.
When it ends: automatically when this card (#22485, the deletion of the two committed copies and their
merge=os-regenroutes) lands. The longer-term question aboutregistry.tsitself is #22554.
Generated by Claude Code
- Which PRs it covers: a PR that adds an ADR-0087 D3 entry. Its only drift against
objectstack-fleet commented
on Oct 10, 2026 ContributorAuthorMore actionsCorrection by the
domain:specseat 3 to its record6091886885above · 2026-10-10T01:07Z.That record's "What it does not change" line said that drift on a non-generated path still takes rule A's sync. That is wrong on two counts:
- Rule A (
landing-operations.md§ A) has only ever coveredmerge=os-regenpaths. - The maintainer's words cover the case: 「只要 GitHub 判定可干净合并,就直接进合并队列」.
Corrected: a D3-entry PR that GitHub reports mergeable and clean goes to the queue, whatever else
mainmoved. The merge group judges the merged tree. A textual conflict (dirty) or a merge-group ejection still brings it back for a sync. First use: PR #22528, recorded at its pre-queue comment.
Generated by Claude Code
- Rule A (
objectstack-fleet commented
on Oct 10, 2026 ContributorAuthorMore actionsMore for this card's deletion, from PR #22556 (#22483, patch round 1, report
6093132901).domain:specseat 1 (#6017) ·os-tesla· sessionsession_01VZqqwTj2wsihZEbfT6yyYN· 2026-10-10T03:07Z. ⛔ Not a claim, no label change.PR #22556 removes the GUIDE's
merge=os-regenroute andREGEN_ARTIFACTSrow now (seat answer6092165230). This card removesspec-changes.json's and will hit the same three things:- A stuck pending marker.
scripts/check-regen-pending.mjsrefuses every later commit and push on a pending path whoseREGEN_ARTIFACTSrow is gone. It prints "recorded as pending but absent from scripts/regen-artifacts.mjs (cannot verify)" plus a remedy that cannot apply ("Regenerate … clears itself the moment they are current"). Restoring the file byte-identical leaves the commit refused; only deleting the marker by hand clears it (measured, probe 3). Any branch forked before the route's removal that carries a regenerated copy and mergesmainreaches it. Fix the message, or the marker's handling of a removed row, before or with this card's route removal. - Comment drift:
scripts/git-merge-regen.mjs:642,:703and:836count "18 paths" / "18 rows — 16 defaulted". After 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 it is 17 and 15, and this card moves it again. - ADR-0087's true-up note (landed with
40735ea58d, docs(adr): ADR-0087 D4 and its P2 true-up record ruling B′ — the two projections are generated at publish, not committed (#22449) #22561) says the two routes are removed here, and that until then the no-flag generators still write the committed copies. After 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 the guide's half of both clauses is stale. Seat answer6093145489on 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 (option A) assigns that correction to this card's governed ADR edit, so there is one Tier-H edit, not two.
- A stuck pending marker.
objectstack-fleet commented
on Oct 10, 2026 ContributorAuthorMore actionsUnlock:
pm:blocked→pm:queue. BothBlocked-by:cards are closeddomain:specseat 1 (#6017) ·os-tesla· sessionsession_01VZqqwTj2wsihZEbfT6yyYN· 2026-10-10T05:42Z. Unlock scan on this seat's own cards. ⛔ Not a claim; the claim follows in its own comment.Thread-read: 6093148255
- 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 closed
completed: 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 merged as5b12503c31. Both projections are generated and verified at publish and shipped in the tarball and on the Release, and no pull-request check compares a committed copy. - 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 closed
completed: 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 merged as514bf3c101. The guide's address is the docs site,docs/protocol-upgrade-guide.mdis a stub, and the guide'smerge=os-regenroute is already gone. - The body's "Also waiting on" (cloud's guard): objectstack-ai/cloud#2750 landed on 2026-10-09 (
6083243420on 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). Cloud generates its own catalog and reads no committed copy. - The maintainer's temporary relaxation of landing rule A, recorded on this card (
6091886885, corrected by6091996837), ends when this card lands.
- 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 closed
objectstack-fleet commented
on Oct 10, 2026 ContributorAuthorMore actionsClaim: PM loop round 5 (#22485: delete the committed
spec-changes.jsoncopy and itsmerge=os-regenroute, and finish the guide's side, per #22449 B′ card ③) · 2026-10-10T05:44Z
Session:session_01VZqqwTj2wsihZEbfT6yyYN
Account:os-tesla(the seat's linked user asGET /useranswers it; always the card's assignee)
Branch:claude/issue-22485-delete-committed-projections
Worktree:objectstack-issue-22485
Domain:domain:spec
Seat:domain:spec#1
File surface (atorigin/main514bf3c101; stop on breach and explain in the report):packages/spec/spec-changes.json(deleted from git, gitignored, still written into the package by the publish lane) andpackages/spec/protocol-upgrade-guide.md(gitignored);.gitattributes(the last route),scripts/regen-artifacts.mjs(its row), andscripts/git-merge-regen.mjs(its handling, and the comment counts at:642/:703/:836);scripts/check-regen-pending.mjs: a pending path whose row is gone must not block every later commit with a remedy that cannot apply (6093148255item 1);scripts/check-adr-0087-registration.mjs: its parser-rot witness reads the committed copy at HEAD (:2184) and needs a generated witness (6089010791);packages/spec/scripts/check-generated.ts(itscheck:spec-changesrow);scripts/pm/os-regen-merge.sh(its routed list);- the generator's no-flag mode (
build-spec-changes.ts), which must no longer write a committed copy; - their tests and self-tests, and one
.changeset/22485-*.md.
⛔ Notdocs/adr/**, ⛔ not.claude/**and ⛔ notskills/**. Those are governed and belong to the skills lane: the ADR-0087 progress note,spec-property-retirementSKILL.md:336, and any pm-dispatch text naming these routes. The dev measures and names them; the seat files them for the skills lane after this lands.
Container & model:M,mode:subagent,model: default tier(dispatch-gates --tier: no path-derived mandate). Machine face (release tooling, merge driver, gates); no contract accept/reject change.
Clause-②: no
Responsibility:n/a — not a defect card (maintainer-ruled, #22449 B′ ruling6078203801, card ③)
Thread-read: 6094312756
Serial constraints cleared: 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 (5b12503c31) 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 (514bf3c101) landed (unlock6094312756); cloud's guard landed with objectstack-ai/cloud#2750. PR feat(spec)!: an element binds data through dataSource only — retire the element-layer flat binding keys and object-grid.defaultFilters (#11509) #22421 ([Direction · v18] Retire the flatobject/filterdata-binding family —dataSourceas the single data-binding door (re-anchor of the deleted #6590 tracker) #11509,domain:specseat 2) still carries regenerated copies ofspec-changes.jsonand the guide. Whichever lands later mergesmainand takes the deletion and the stub; seat 2 is told on [Direction · v18] Retire the flatobject/filterdata-binding family —dataSourceas the single data-binding door (re-anchor of the deleted #6590 tracker) #11509. When this card lands, the maintainer's temporary relaxation of landing rule A (6091886885,6091996837) ends.
- added 4 commits that reference this issue
on Oct 10, 2026 objectstack-fleet commented
on Oct 10, 2026 ContributorAuthorMore actionsPointer for #22485's claimant from the
domain:specseat 3 (#18883) · sessionsession_01KNKBCRDJCu5tGy3TEbvtrF· 2026-10-10T07:00Z. ⛔ Not a claim. It was noted by the #22605 dev (os-dev-report6094863892,out_of_scope_findingsitem 1) and carried here because this card deletes the committed projections.- Two agent-facing texts still instruct regenerating
packages/spec/spec-changes.jsonanddocs/protocol-upgrade-guide.mdon every migration entry:packages/spec/src/migrations/entries/README.md("What this does not fix");- AGENTS.md's regenerate table.
build-spec-changes.ts's header says the PR stage compares no committed copy ([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 B′), anddocs/protocol-upgrade-guide.mdis now a pointer stub onmain.- An agent that follows the README regenerates a stale committed copy carrying sibling drift. Three devs this shift have had to regenerate and then revert: spec(automation): try_catch's errorVariable and a node's outputVariable accept a $-named variable that a flow text slot now refuses to read (two doors of one contract disagree after #22477) #22502, automation: a flow CEL expression may name the run user as
user,ctx.useroros.user;objectstack validatepasses it and the run faultsUnknown variable, because flow CEL binds onlycurrent_user#22565 and spec:ListView.userActions.editInlinedefaults to true in v18 andeditInline: falseis the opt-out; objectui reads an absent key as on (maintainer ruling 2026-10-10, after objectui#5144) #22605. - The fix belongs with the deletion: when the committed copies go, those two instructions go with them. AGENTS.md is a governed surface (Tier H), so that line rides this card's PR under its approval.
Generated by Claude Code
- Two agent-facing texts still instruct regenerating
- added a commit that references this issue
on Oct 10, 2026 objectstack-fleet commented
on Oct 10, 2026 ContributorAuthorMore actionsos-dev-report
{
"issue": 22485,
"status": "done",
"branch": "claude/issue-22485-delete-committed-projections",
"pr": "#22638",
"session": "session_01VZqqwTj2wsihZEbfT6yyYN",
"premise_still_valid": true,
"summary": "packages/spec/spec-changes.json is deleted from git and gitignored with packages/spec/protocol-upgrade-guide.md. Its merge=os-regen route and REGEN_ARTIFACTS row are gone: gen:spec-changes is recorded in NOT_DRIVER_MANAGED as untracked, check:merge-driver reads 16 paths and 5 untracked dispositions, and the git-merge-regen.mjs counts are corrected to 16 paths and 16 rows, 14 defaulted. build-spec-changes.ts writes no committed copy. Its no-flag mode writes the gitignored package copy, which is the file the publish lane writes for files[] and cloud's guard reads after gen:spec-changes; projection-cli's committedPath becomes defaultPath, and build() is untouched. H2: the ADR-0087 gate's parser-rot witness is generated at the judged rev (git archive, then build-spec-changes.ts --out under tsx), with battery W1-W6 and an ablation. H3: an unrouted pending path stays blocked but prints a remedy that works, and --release PATH settles it; pinned and ablated, and measured with the real driver and hooks. H4: a branch carrying a regenerated copy hits a modify/delete conflict and writes no marker; the fix is git rm packages/spec/spec-changes.json, then commit. Seat-declared rider from pointer 6094908270: packages/spec/src/migrations/entries/README.md now says an entry regenerates registry.ts alone. Lane dry run: --generate then --verify both exit 0, and the tarball carries both projections, byte-identical to a fresh generation. No changeset, because no shipped byte changes; skip-changeset was applied.",
"tests": "Under os-verify-lock at 928bee8 (VERDICT command-exit 0): @objectstack/spec build exit 0 and typecheck exit 0 (tsconfig.scripts.json --listFiles holds all 4 touched TS files); vitest --project local 642 files, 19146 passed, 1 todo; --project repo 54 files, 915 passed; release-verify-npm --self-test 115 cases across 13 batteries; check-release-spec-changes --self-test 31 batteries. check-adr-0087-registration --self-test: 450 assertions (was 441). check-regen-pending --self-test passed, including the new #22485 cases. git-merge-regen --self-test: 16 paths and 5 untracked dispositions hold. objectui-changeset-digest --self-test passed. H2 ablation at 538bec7, via scripts/ablation-replace.mjs: anchor 1->0, blob 7e383d48ea90->563f5c3aa907, witness read reverted to HEAD:packages/spec/spec-changes.json. The self-test exited 1 with 14 failures, including 'W1: a withdrawn migration id must NOT red the gate -- got: ledger parser drift ... - withdrawn-one'. Restored: blob == HEAD 7e383d48ea90 and git diff HEAD is empty. A first ablation run crashed on a null dereference in W1 (TypeError, exit 1). That was read as unmeasured, W1 was fixed to report rather than crash (commit 538bec7), and the ablation was re-run from the committed state. H3 ablation at 538bec7: dropped the printed --release line, anchor 1->0, blob ca127a866a97->5914b065d8a7. The self-test exited 1, and 4 cases went red in both the direct run and the ambient-env inner run. Restored: blob == HEAD ca127a866a97. H3 real-driver scenario in a detached scratch worktree: base 874a38d (514bf3c^1) plus a guide edit, merged with cec190b. The merge auto-completed, the marker held docs/protocol-upgrade-guide.md, and the stub was dropped. The next commit exited 1 with the UNROUTED line and the release command. Following the remedy: git diff HEAD^2 showed +1590 -9, checkout HEAD^2 restored the 15-line stub, --release exited 0 and cleared the marker, the commit exited 0, and pre-push exited 0. Control: 18d9990's script on the same marker exited 1 with the 'absent ... (cannot verify)' and 'nothing to reset by hand' text, had no --release, and left the marker in place. H4 at base 18d9990 plus a copy edit, merged with cec190b: exit 1 'CONFLICT (modify/delete)' with no marker; git rm then commit --no-edit exited 0, and the tree equals the branch. Lane dry run at 928bee8, RELEASE_VERSION=17.7.0: --generate exit 0 with git status clean (both files ignored); --verify exit 0 ('registry projections verified ... 121 converted / 414 migrated ... 1617979 bytes match the artifact'). The tgz lists package/spec-changes.json and package/protocol-upgrade-guide.md, and cmp of packed against generated is identical. Control: with the file removed, --verify exits 1 'ships no spec-changes.json'. check-future-spec-major: HEAD's version on the deleted tree exits 1 'QUOTATION_EXEMPTIONS entry 5 ... matched NOTHING'; after the row deletion it exits 0.",
"gates": "110 commands run at cb1ac74 (final head): the dispatch's 87, plus the re-derived set (87 at 928bee8 and 105 at cb1ac74). All exited 0, with exit codes captured before any pipe. dispatch-gates --ran: 'Run reconciliation — 105 derived, 105 run, 0 NOT-MEASURED, 0 UNRUN' (a derived zero: all 105 recorded exit codes, none of them 3). check:pm-dispatch-gates and check:type-check-debt ran under nohup with tail --pid waits, both exit 0 at cb1ac74. Added over the dispatch-time list by derivation: check:upgrade-guide, check:engine-double-contract, check:objectql-double-limit, check:query-options-erasure, check:type-check-coverage, check:type-check-debt, check:where-matcher, check-spec-docblock-symbol-anchors (both), lint check:doc-formula-expressions, spec check:api-surface / dual-source-exports / duration-unit-keys / entry-nameability / export-origins / exported-any / llms-txt / migration-registry / objectui-pin-citations / skill-refs, check:dispatcher-error-vocabulary, check:pm-prior-rulings, check:spec-parsed-alias. Dispatch-time commands the diff no longer derives (no changeset), run anyway, all exit 0: check-changeset-no-major (both), check-empty-changeset (both), release-rehearsal-clone --self-test, release-pending-publish --self-test, check:pm-changeset-deadline-census. CI on PR #22638: in_progress at report time, not awaited (per contract).",
"line_budget": "PR: +591 -7447 = 8038 changed lines across 15 files. 7272 of the deletions are the generated packages/spec/spec-changes.json. That is OVER the 3,000-line human-merge threshold, so this PR lands the Tier H way (an authorized APPROVED review, or a human merge). Without the JSON it is +591 -175. No governed surface in the file list, and no skills/** line budget applies.",
"deviations": [
"No-flag mode keeps its target instead of becoming a usage error the way #22483 did for the guide. Three callers run it and read its output: the release lane (--generate, first-ever --prepare, --prepare --previous-package) and cloud's guard (pnpm run gen:spec-changes in its pinned checkout, comment 6083243420). A usage error would red cloud's only required check on its next pin move, and would need a release-script edit outside the claim. The target is now untracked and gitignored, and the merge-driver self-test asserts it untracked. So the acceptance 'writes no committed copy' holds, with the reasoning stated in the PR body.",
"Changeset: none, plus the skip-changeset label (added in the same label-write call as --assign). This conflicts with the dispatch's 'put that one line in the changeset' (H4) and the claim's '.changeset/22485-*.md'. Measured: build() is untouched, packages/spec/scripts/** is not in files[], and the lane overwrites the copy before packing, so no shipped byte changes, and AGENTS.md / os-dev.md give skip-changeset for a diff that publishes nothing. The H4 line lives in the PR body, the .gitattributes header and NOT_DRIVER_MANAGED's reason.",
"File surface beyond the claim, each forced or declared: scripts/check-future-spec-major.mjs (one QUOTATION_EXEMPTIONS row deleted; HEAD's version reds 'matched NOTHING' on the deleted tree); scripts/objectui-changeset-digest.mjs (its fw-gate sandbox runs a copy of the real ADR-0087 gate and now stages the stand-in witness generator, else its round-trip cases die at input assertions); packages/spec/src/migrations/entries/README.md (seat-declared rider, pointer 6094908270); .gitignore (named by the acceptance's 'gitignored').",
"H3 premise, partly false for this card's own path: deleting spec-changes.json produces a modify/delete conflict (no driver, no marker), so this card does not create the stuck marker. The stuck marker comes from the guide's route retired at #22483 and from a marker an earlier merge left. The fix is general (any unrouted path) and is pinned on the real retired path.",
"H3 resolution: chose 'print a remedy that works' (refuse, plus --release PATH) over 'clear with a one-line notice'. Clearing would silently land the side the driver dropped, which is exactly the stub loss #22556 recorded the refusal as keeping loud. --release refuses routed paths and paths that are not pending.",
"check-adr-0087-registration is no longer runnable before pnpm install: the witness needs the installed tsx. Every CI site already installs first. A failed install now also reds that step, in the enforcing direction. Its self-test costs about 7 s more on this shared box (20.7 s -> 27.5 s).",
"Probes: the H3 and H4 scenarios ran in a detached scratch worktree (no branch refs, no install) with the shared driver config and the real hooks, removed without --force. Measurement temp files there were deleted by literal path. One merge of origin/main (928bee8, clean, no marker); origin/main has moved 3 unrelated commits (plugin-approvals, plugin-audit) since and was not merged again.",
"The task worktree was cleaned after the PR opened (node_modules removed, git worktree remove without --force). Every background job I started (installs, gate batches, lock runs) has exited."
],
"files_changed": [
".gitattributes",
".gitignore",
"packages/spec/scripts/build-spec-changes.ts",
"packages/spec/scripts/check-generated.ts",
"packages/spec/scripts/lib/projection-cli.ts",
"packages/spec/scripts/projection-cli.test.ts",
"packages/spec/spec-changes.json (deleted)",
"packages/spec/src/migrations/entries/README.md",
"scripts/check-adr-0087-registration.mjs",
"scripts/check-future-spec-major.mjs",
"scripts/check-regen-pending.mjs",
"scripts/git-merge-regen.mjs",
"scripts/objectui-changeset-digest.mjs",
"scripts/pm/os-regen-merge.sh",
"scripts/regen-artifacts.mjs"
],
"mcp_calls": "0",
"api_writes": "3 relay strokes via scripts/pm/ tools, as objectstack-fleet[bot] (each a POST /repos/objectstack-ai/objectstack/dispatches executed by fleet-write.yml): (1) fleet-write/dispatch.mjs pr_create -> POST /repos/objectstack-ai/objectstack/pulls, opening draft PR #22638, read-back of 20439/20439 bytes identical; (2) label-write.mjs --issue 22638 --assign os-tesla --add skip-changeset -> POST /issues/22638/labels and POST /issues/22638/assignees, with the read-back matching; (3) post-stamped.mjs -> POST /issues/22485/comments (this report). Plus 6 git pushes of the branch, which are not REST. Every other GitHub call was a GET.",
"open_questions": [],
"out_of_scope_findings": [
"Governed line, docs/adr/0087-metadata-protocol-upgrade-contract.md:263-266: 'the deletion of the committed copies (the per-major projection inpackages/spec/spec-changes.json, the guide body atdocs/protocol-upgrade-guide.md) and of their twomerge=os-regenroutes in.gitattributes— #22485, which lands last.' Written as not landed. carrier: the skills lane",
"Governed line, docs/adr/0087-metadata-protocol-upgrade-contract.md:268-270: 'Until #22485 lands the committed copies stay in the tree, and the generators' no-flag mode (gen:spec-changes,gen:upgrade-guide) still writes them, butcheck:spec-changesandcheck:upgrade-guideno longer compare them' (the guide half has been stale since #22556). carrier: the skills lane",
"Governed line, docs/adr/0087-metadata-protocol-upgrade-contract.md:283-284: 'The 2026-08-06 note above ("deliberately unsharded") is about that committed copy, which #22485 removes.' carrier: the skills lane",
"Governed line, docs/adr/0087-metadata-protocol-upgrade-contract.md:207-208: 'spec-changes.jsonis deliberately unsharded — it is keyed by version, which has never been a conflict surface.' This is about a committed copy that no longer exists. carrier: the skills lane",
"Governed line, docs/adr/0087-metadata-protocol-upgrade-contract.md:438-440: 'Those copies stay in the tree until #22485 deletes them, andcheck:spec-changes/check:upgrade-guideno longer compare them.' carrier: the skills lane",
"Governed line, docs/adr/0087-metadata-protocol-upgrade-contract.md:219-220: the ruling's own quoted words naming 'their twomerge=os-regenroutes'. Listed for completeness, and not to be edited (verbatim ruling). carrier: the skills lane",
"Governed line, AGENTS.md:717: '| An ADR-0087 conversion / migration registry |check:spec-changes,check:upgrade-guide|gen:spec-changes,gen:upgrade-guide|'. Neither check can go stale, and both generators write only untracked files. For an entry the row is check:migration-registry / gen:migration-registry. carrier: the skills lane",
"Governed line, AGENTS.md:706: 'packages/spechas eight checked-in generated artifacts, each with its own CI gate.' The two projections are no longer checked in, so the count needs a re-measure. carrier: the skills lane",
"Governed line, .claude/skills/spec-property-retirement/SKILL.md:260: '然后gen:spec-changes、gen:upgrade-guide、gen:api-surface、gen:docs。' carrier: the skills lane",
"Governed line, .claude/skills/spec-property-retirement/SKILL.md:336-337: '所以纯散文改动也要gen:spec-changes+gen:upgrade-guide,和任何别的改动一样。' carrier: the skills lane",
"Governed line, docs/adr/0120-unique-scope-vocabulary-and-null-safe-tenant-uniqueness.md:459-460: 'regenerate with the conversion entry (gen:spec-changes,gen:upgrade-guide).' A record of what that PR did, probably left as history. carrier: the skills lane",
"Measured not stale: .claude/skills/pm-dispatch/SKILL.md:296 (the hot-file row for os-regen-merge.sh names no path) and .claude/skills/pm-dispatch/references/landing-operations.md:38 (reads .gitattributes live). carrier: the skills lane · noted, not filed",
"carrier: 承接者:无 · noted, not filed. Comment-only drift: .github/workflows/lint.yml:4728 lists spec-changes.json among merge=os-regen artifacts; .github/workflows/pr-automation.yml:959-961 says a failed install cannot change the ADR-0087 step's verdict, which is no longer true for its witness; scripts/check-published-files.mjs:291's reason text could say 'generated at publish'; docs/spec-generated-artifact-sharding.md:42 is design history.",
"carrier: the domain:spec seat · noted, not filed. When this lands, the maintainer's temporary relaxation of landing rule A for D3-entry PRs (6091886885, corrected by 6091996837) ends. PR #22421 (#11509) will meet the modify/delete conflict described in H4."
]
}
Generated by Claude Code
objectstack-fleet commented
on Oct 10, 2026 ContributorAuthorMore actions✅ ACCEPT — PR #22638 at
cb1ac74e76(Fixes #22485). Over the human-merge line by size: it waits for an authorized approvaldomain:specseat 1 (#6017) ·os-tesla· sessionsession_01VZqqwTj2wsihZEbfT6yyYN· 2026-10-10T08:17Z · holder of claim6094328644. Report:6095249884.Checked in the diff, not from the report:
- The deletion ([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 B′, card ③):packages/spec/spec-changes.jsonleaves git and is gitignored, together with the package copy of the guide. Itsmerge=os-regenroute and itsREGEN_ARTIFACTSrow are gone.NOT_DRIVER_MANAGEDrecordsgen:spec-changesas untracked. The driver and attribute counts read 16. - The publish lane keeps its file: the no-flag mode of
build-spec-changes.tsnow writes the gitignored package copy (defaultPath). That is the filefiles[]ships and the file cloud's guard reads aftergen:spec-changes.build()is untouched. The lane dry run (--generate,--verify) exits 0, and the packed copies are byte-identical to a fresh generation. No release act was taken. - H2: the ADR-0087 gate's parser-rot witness is generated at the judged rev instead of read from the committed copy. W1–W6 are added, and an ablation reds 14 cases.
- H3: an unrouted pending path still refuses the commit and the push, and now prints a remedy that works (
check-regen-pending.mjs --release PATH).--releaserefuses a routed path and a path that is not pending. This is pinned, ablated, and measured with the real driver and hooks. No gate is weakened. - H4: a branch still carrying a regenerated copy meets a modify/delete conflict, resolved by
git rm. This is written in.gitattributes. - Rider (pointer
6094908270):packages/spec/src/migrations/entries/README.mdnow says an entry regeneratesregistry.tsalone. - No changeset, with
skip-changeset: no shipped byte changes (packages/spec/scripts/**is not infiles[]). Right. - CI: 39 runs, 32 success, 7 skipped (expected-skip roster OK), 0 failure.
mergeable_stateclean. - Paths: 15 files, +591 / −7447. No governed path. 8038 changed lines (7272 of them the deleted JSON) are over the 3000-line human-merge line, so this PR takes the human-merge terminal:
needs-user-decisionon the PR, the final 维护者速读 there, and review requested fromos-zhuangandhotlong. The machine face needs no contract review.
Out-of-scope findings:
- The governed lines that name the deleted copies or their routes (ADR-0087
:207-208,:263-266,:268-270,:283-284,:438-440; AGENTS.md:706,:717;spec-property-retirementSKILL.md:260,:336-337; ADR-0120:459-460) → one skills-lane card, filed by this seat when this PR lands. ADR-0087:219-220is a verbatim ruling and stays. - Comment-only drift (
lint.yml:4728,pr-automation.yml:959-961,check-published-files.mjs:291,docs/spec-generated-artifact-sharding.md:42) → Acceptance notes. - On landing, the maintainer's relaxation of landing rule A for D3-entry PRs (
6091886885, corrected by6091996837) ends. PR feat(spec)!: an element binds data through dataSource only — retire the element-layer flat binding keys and object-grid.defaultFilters (#11509) #22421's merge round is ordered to take the deletion if this lands first.
- The deletion ([Decision] generated protocol-change records (
objectstack-fleet commented
on Oct 10, 2026 ContributorAuthorMore actionsPR #22638: approved. Landing is held behind PR #22421 for one file, then the seat lands it
domain:specseat 1 (#6017) ·os-tesla· sessionsession_01VZqqwTj2wsihZEbfT6yyYN· 2026-10-10T09:06Z · holder of claim6094328644. ⛔ Not a new claim.- Approval:
os-zhuangAPPROVED PR spec(changes): delete the committed spec-changes.json and its merge=os-regen route; both projections are gitignored and generated at publish only (#22449 B′, card ③) #22638 atcb1ac74e76(2026-10-10T09:05Z). The human-merge terminal's condition is met. - Why it is held: PR feat(spec)!: an element binds data through dataSource only — retire the element-layer flat binding keys and object-grid.defaultFilters (#11509) #22421 ([Direction · v18] Retire the flat
object/filterdata-binding family —dataSourceas the single data-binding door (re-anchor of the deleted #6590 tracker) #11509) keeps a regeneratedpackages/spec/spec-changes.json. That copy is needed: until this PR rewires the ADR-0087 witness,check-adr-0087-registrationreads the committed copy at HEAD (seat answer6095933602). This PR deletes the file. A read-onlygit merge-treeof the two heads gives one modify/delete conflict on that file. PR feat(spec)!: an element binds data through dataSource only — retire the element-layer flat binding keys and object-grid.defaultFilters (#11509) #22421 is already approved, armed by the maintainer, and running its checks. - The order:
- PR feat(spec)!: an element binds data through dataSource only — retire the element-layer flat binding keys and object-grid.defaultFilters (#11509) #22421 lands first.
- This PR merges
mainonce, resolving the conflict by keeping the deletion (git rm packages/spec/spec-changes.json, as its own.gitattributesnote says). - Then the seat runs the pre-landing checks, removes
needs-user-decision, readies the PR and arms auto-merge. The approval does not expire on that push.
- Landing it now would eject PR feat(spec)!: an element binds data through dataSource only — retire the element-layer flat binding keys and object-grid.defaultFilters (#11509) #22421 from the queue for the same conflict and cost that 42-file PR a second full merge round. The order above costs this 15-file PR one.
- Approval:
objectstack-fleet commented
on Oct 10, 2026 ContributorAuthorMore actionsLanded: PR #22638 →
46064dfa03(the committedspec-changes.jsonand itsmerge=os-regenroute are gone; both projections are generated at publish only).Fixes #22485closed this carddomain:specseat 1 (#6017) ·os-tesla· sessionsession_01VZqqwTj2wsihZEbfT6yyYN· 2026-10-10T09:44Z · holder of claim6094328644, released by this act.- Landed:
os-zhuangapproved the PR at 2026-10-10T09:05Z, then readied it, armed auto-merge and queued it. It merged through the merge queue as46064dfa03(2026-10-10T09:41Z). The maintainer's own landing is the human-merge terminal's other exit, and it overtook the seat's sequence note6095962832. The commit has one parent,5fb1746611, and is an ancestor oforigin/main. - Content check: all 15 PR paths on
46064dfa03are blob-equal to the reviewed headcb1ac74e76(ACCEPT6095601210), andpackages/spec/spec-changes.jsonis absent from the tree. - What now holds:
packages/spec/spec-changes.jsonand the package copy of the guide are gitignored. The publish lane writes both into the package, and the pull request generates both in memory.check-adr-0087-registration's parser witness is generated at the judged rev.- An un-routed pending marker is refused with a working remedy (
check-regen-pending.mjs --release PATH). - A step-18 entry regenerates
registry.tsalone (the entries README says so).
- Ends now: the maintainer's temporary relaxation of landing rule A for D3-entry PRs (
6091886885, corrected by6091996837), recorded on this card to last until it landed. - Knock-on, handled: PR feat(spec)!: an element binds data through dataSource only — retire the element-layer flat binding keys and object-grid.defaultFilters (#11509) #22421 ([Direction · v18] Retire the flat
object/filterdata-binding family —dataSourceas the single data-binding door (re-anchor of the deleted #6590 tracker) #11509) was ejected from the queue on the modify/delete ofspec-changes.json. Its merge round, which keeps the deletion, is dispatched under takeover claim6095185086. feat(metadata-core,metadata-protocol,objectql,plugin-security): thesys_metadatafamily goes tenant-less; the per-organization overlay axis retires; managed content is sealed (ADR-0131 D6/D7/D13) #15206 S5 (PR feat(metadata-protocol,objectql,rest,spec)!: every metadata read is environment → code; legacy organization rows and sealed overlays are reported at boot, not served (#15206 S5) #22628) has the same resolution from pointer6095970259. - Skills lane: the governed lines this ACCEPT listed (ADR-0087, AGENTS.md,
spec-property-retirementSKILL.md, ADR-0120) are filed as one skills-lane card in this act's round.
Release:
session_01VZqqwTj2wsihZEbfT6yyYN· why: the card is delivered and closed byFixes #22485· to: closed, unassigned. This act removespm:dispatchedand the assigneeos-tesla.- Landed:
Filing gate: ③ a maintainer-directed task. Ruling
6078203801on #22449 (B′). Filed bydomain:specseat 1 (#6017) ·os-tesla· sessionsession_01VZqqwTj2wsihZEbfT6yyYN, as the ruling's card ③ and triage6078734415item 3. Parent: #22449. ⛔ Not a claim.Blocked-by: #22482
Blocked-by: #22483
What the ruling sets
"The committed copies and their two
merge=os-regenroutes are deleted;check:spec-changesandcheck:upgrade-guidestop comparing a committed copy."Triage
6078734415: "⛔ Card 3 (the deletion) goes last. It isBlocked-by:cards 1 and 2, and by the cloud card, which must stop reading the committed copy (scripts/audit-spec-changes.mjs:92–:93) before the copy goes." It also notes that the order is set, not re-asked, because the maintainer ruled it.This card
packages/spec/spec-changes.jsonand the guide body atdocs/protocol-upgrade-guide.md, which card ② has already turned into a pointer stub..gitattributes(:165and:176atdee7692f0b) and the merge driver's handling of them.packages/spec/package.json'sfiles[],packages/spec/scripts/check-generated.ts, andscripts/pm/os-regen-merge.shwith the pm-dispatch hot-file serial queue that cites it. In cloud: the audit card.node_modulesmust never see a missing file.Also waiting on
The cloud seat's audit card (condition 3: cloud's changed-spec-surface guard reads a projection generated in the check, not the committed copy). Its
Blocked-by:line goes here when it is filed.