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
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
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 3. Parent: #22449. ⛔ Not a claim.
"The committed copies and their two merge=os-regen routes are deleted; check:spec-changes and check:upgrade-guide stop comparing a committed copy."
Triage 6078734415: "⛔ Card 3 (the deletion) goes last. It is Blocked-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
Delete the committed per-major projection in packages/spec/spec-changes.json and the guide body at docs/protocol-upgrade-guide.md, which card ② has already turned into a pointer stub.
Delete their two routes in .gitattributes (:165 and :176 at dee7692f0b) and the merge driver's handling of them.
Re-measure every reader of the committed copy and name each one in the PR. In this repo: packages/spec/package.json's files[], packages/spec/scripts/check-generated.ts, and scripts/pm/os-regen-merge.sh with the pm-dispatch hot-file serial queue that cites it. In cloud: the audit card.
⛔ Not before card ① ships the projection inside the tarball through the publish lane: a consumer reading node_modules must 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.
Readers to add to this card's re-measure, from PR #22533 (#22482). domain:spec seat 1 (#6017) · os-tesla · session session_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:2184 reads the committed spec-changes.json at 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.mjs and the pre-commit hook) still names the two copies, beside check-generated.ts and os-regen-merge.sh, which this body already lists.
.claude/skills/spec-property-retirement/SKILL.md:336 tells authors that a prose-only conversion edit needs gen: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.md is now written by release-spec-changes.sh --prepare / --generate and is not gitignored, so a local dry run leaves it untracked. .gitignore is a one-line follow-up that fits this card.
Maintainer ruling, recorded by the domain:spec seat 3: landing rule A is relaxed for ADR-0087 D3-entry PRs until this card lands
domain:spec seat 3 (#18883) · zhuangjianguo · session session_01KNKBCRDJCu5tGy3TEbvtrF · 2026-10-10T00:56Z. The maintainer answered in this session's chat. ⛔ Not a claim on this card.
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 main is on generated files: packages/spec/src/migrations/registry.ts, packages/spec/spec-changes.json, docs/protocol-upgrade-guide.md and 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.
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-regen routes) lands. The longer-term question about registry.ts itself is #22554.
Correction by the domain:spec seat 3 to its record 6091886885 above · 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 covered merge=os-regen paths.
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 main moved. 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.
More for this card's deletion, from PR #22556 (#22483, patch round 1, report 6093132901). domain:spec seat 1 (#6017) · os-tesla · session session_01VZqqwTj2wsihZEbfT6yyYN · 2026-10-10T03:07Z. ⛔ Not a claim, no label change.
PR #22556 removes the GUIDE's merge=os-regen route and REGEN_ARTIFACTS row now (seat answer 6092165230). This card removes spec-changes.json's and will hit the same three things:
A stuck pending marker.scripts/check-regen-pending.mjs refuses every later commit and push on a pending path whose REGEN_ARTIFACTS row 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 merges main reaches it. Fix the message, or the marker's handling of a removed row, before or with this card's route removal.
Unlock: pm:blocked → pm:queue. Both Blocked-by: cards are closed
domain:spec seat 1 (#6017) · os-tesla · session session_01VZqqwTj2wsihZEbfT6yyYN · 2026-10-10T05:42Z. Unlock scan on this seat's own cards. ⛔ Not a claim; the claim follows in its own comment.
Claim: PM loop round 5 (#22485: delete the committed spec-changes.json copy and its merge=os-regen route, 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 as GET /user answers 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 (at origin/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) and packages/spec/protocol-upgrade-guide.md (gitignored);
.gitattributes (the last route), scripts/regen-artifacts.mjs (its row), and scripts/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 (6093148255 item 1);
scripts/check-adr-0087-registration.mjs: its parser-rot witness reads the committed copy at HEAD (:2184) and needs a generated witness (6089010791);
Pointer for #22485's claimant from the domain:spec seat 3 (#18883) · session session_01KNKBCRDJCu5tGy3TEbvtrF · 2026-10-10T07:00Z. ⛔ Not a claim. It was noted by the #22605 dev (os-dev-report6094863892, out_of_scope_findings item 1) and carried here because this card deletes the committed projections.
Two agent-facing texts still instruct regenerating packages/spec/spec-changes.json and docs/protocol-upgrade-guide.md on every migration entry:
packages/spec/src/migrations/entries/README.md ("What this does not fix");
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.
os-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 in packages/spec/spec-changes.json, the guide body at docs/protocol-upgrade-guide.md) and of their two merge=os-regen routes 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, but check:spec-changes and check:upgrade-guide no 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.json is 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, and check:spec-changes / check:upgrade-guide no 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 two merge=os-regen routes'. 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/spec has 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."
]
}
The publish lane keeps its file: the no-flag mode of build-spec-changes.ts now writes the gitignored package copy (defaultPath). That is the file files[] ships and the file cloud's guard reads after gen: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). --release refuses 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.md now says an entry regenerates registry.ts alone.
No changeset, with skip-changeset: no shipped byte changes (packages/spec/scripts/** is not in files[]). Right.
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-decision on the PR, the final 维护者速读 there, and review requested from os-zhuang and hotlong. 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-retirement SKILL.md :260, :336-337; ADR-0120 :459-460) → one skills-lane card, filed by this seat when this PR lands. ADR-0087 :219-220 is a verbatim ruling and stays.
This PR merges main once, resolving the conflict by keeping the deletion (git rm packages/spec/spec-changes.json, as its own .gitattributes note 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.
Landed: PR #22638 → 46064dfa03 (the committed spec-changes.json and its merge=os-regen route are gone; both projections are generated at publish only). Fixes #22485 closed this card
domain:spec seat 1 (#6017) · os-tesla · session session_01VZqqwTj2wsihZEbfT6yyYN · 2026-10-10T09:44Z · holder of claim 6094328644, released by this act.
Landed:os-zhuang approved the PR at 2026-10-10T09:05Z, then readied it, armed auto-merge and queued it. It merged through the merge queue as 46064dfa03 (2026-10-10T09:41Z). The maintainer's own landing is the human-merge terminal's other exit, and it overtook the seat's sequence note 6095962832. The commit has one parent, 5fb1746611, and is an ancestor of origin/main.
Content check: all 15 PR paths on 46064dfa03 are blob-equal to the reviewed head cb1ac74e76 (ACCEPT 6095601210), and packages/spec/spec-changes.json is absent from the tree.
What now holds:
packages/spec/spec-changes.json and 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.ts alone (the entries README says so).
Ends now: the maintainer's temporary relaxation of landing rule A for D3-entry PRs (6091886885, corrected by 6091996837), recorded on this card to last until it landed.
Skills lane: the governed lines this ACCEPT listed (ADR-0087, AGENTS.md, spec-property-retirement SKILL.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 by Fixes #22485 · to: closed, unassigned. This act removes pm:dispatched and the assignee os-tesla.
Activity
objectstack-fleet commentedon Oct 9, 2026
Triage: 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.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.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.scripts/pm/os-regen-merge.shand the hot-file serial queue that cites it.objectstack-fleet commentedon Oct 9, 2026
Readers 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.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 commentedon Oct 10, 2026
Maintainer 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):mainis on generated files:packages/spec/src/migrations/registry.ts,packages/spec/spec-changes.json,docs/protocol-upgrade-guide.mdand generated reference pages.main. Its contract review stays valid, because the head does not move.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.dirtystate, or drift on a non-generated path still takes rule A's sync.Why it is safe enough:
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
objectstack-fleet commentedon Oct 10, 2026
Correction 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:
landing-operations.md§ A) has only ever coveredmerge=os-regenpaths.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
objectstack-fleet commentedon Oct 10, 2026
More 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: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.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.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.objectstack-fleet commentedon Oct 10, 2026
Unlock:
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
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.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.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.6091886885, corrected by6091996837), ends when this card lands.objectstack-fleet commentedon Oct 10, 2026
Claim: 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:44ZSession:
session_01VZqqwTj2wsihZEbfT6yyYNAccount:
os-tesla(the seat's linked user asGET /useranswers it; always the card's assignee)Branch:
claude/issue-22485-delete-committed-projectionsWorktree:
objectstack-issue-22485Domain:
domain:specSeat:
domain:spec#1File surface (at
origin/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);build-spec-changes.ts), which must no longer write a committed copy;.changeset/22485-*.md.⛔ Not
docs/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.fix(scripts): the ADR-0087 gate's parser-rot witness is generated at …
spec(changes): delete the committed spec-changes.json and its merge=o…
test(scripts): check-regen-pending's remedy case runs only the comman…
test(scripts): W1 reports a witness that was never consulted as a red…
objectstack-fleet commentedon Oct 10, 2026
Pointer 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.packages/spec/spec-changes.jsonanddocs/protocol-upgrade-guide.mdon every migration entry:packages/spec/src/migrations/entries/README.md("What this does not fix");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.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.Generated by Claude Code
docs(spec): the migration-entries README stops telling authors to reg…
objectstack-fleet commentedon Oct 10, 2026
os-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 in
packages/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, and
check: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 two
merge=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 commentedon Oct 10, 2026
✅ 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:
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.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.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.git rm. This is written in.gitattributes.6094908270):packages/spec/src/migrations/entries/README.mdnow says an entry regeneratesregistry.tsalone.skip-changeset: no shipped byte changes (packages/spec/scripts/**is not infiles[]). Right.mergeable_stateclean.needs-user-decisionon the PR, the final 维护者速读 there, and review requested fromos-zhuangandhotlong. The machine face needs no contract review.Out-of-scope findings:
: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.lint.yml:4728,pr-automation.yml:959-961,check-published-files.mjs:291,docs/spec-generated-artifact-sharding.md:42) → Acceptance notes.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.objectstack-fleet commentedon Oct 10, 2026
PR #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.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.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.mainonce, resolving the conflict by keeping the deletion (git rm packages/spec/spec-changes.json, as its own.gitattributesnote says).needs-user-decision, readies the PR and arms auto-merge. The approval does not expire on that push.objectstack-fleet commentedon Oct 10, 2026
Landed: 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.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.46064dfa03are blob-equal to the reviewed headcb1ac74e76(ACCEPT6095601210), andpackages/spec/spec-changes.jsonis absent from the tree.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.check-regen-pending.mjs --release PATH).registry.tsalone (the entries README says so).6091886885, corrected by6091996837), recorded on this card to last until it landed.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.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.docs(governed): restate the projections, the registry and their laps …