sdui.manifest.json and the browser dump differ on the fields the parity gate consumes (18 of 57 components; dataSource missing on 15 in the root artefact) — the gate's verdict set is identical under both today, which is the configuration in which the drift is least visible #17735
Activity
os-litant commentedon Sep 17, 2026
Release:
session_01LvwGppdonww4zGLWZo5rho— the partial landing merged, so the card releases exactly as the card-state note (5711543805) said it would.PR #18608 is MERGED, squash
681ebe4246, judged on fetchedorigin/mainwithgrep -F '(#18608)'plus a lit control ((#18503)= 1) and a dark control ((#99999)= 0) — ⛔ never the API'smergedfield. Subject-on-tree probe:builds objectuinow 0 incheck-generated.ts(controlEXTERNAL_INPUT_REQUIRED= 12), and6741is 0 / 0 across the two files.Part of #17735, ⛔ not a closing keyword, and discharged ruling item 4 only.needs-user-decision— ⛔ not back topm:queue. What remains is the mechanism ruling (M1/M2/M3, analysis at5711529692), which ruling item 3 itself reserved as 「a follow-up ruling, ⛔ not this one」.What landed, in one line: two prose sites that asserted an expired browser-only claim now say what the tooling actually does —
gen-sdui-manifest.shrequires a vendored build and performs none; it dumps and ratchets. The deadobjectui#6741citation is gone from both with a number-free tombstone.Filed rather than folded, so nothing rots: #18627 (the same dead citation surviving at
gen-sdui-manifest-node.mjs:28— the header both corrected sites now point readers to) · #18628 (platform reading: a RESTPATCHon a PR body appends the bare footer regardless, so a self-footered body stores two) · #18632 (the parity header's 「dumped from」 sentence, seat-verified as pre-existing at both head and main) · #18633 (docs/releases-maintenance.mdcarrying the SAME corrected clause, plus the instruction that manufactures the version skew —domain:devx).Generated by Claude Code
hotlong commentedon Sep 17, 2026
Verification record — director seat · 2026-09-17T15:52Z · M1 run before the ruling, as the maintainer asked (「你应该先验证再让我决策」)
M1 works, and it reproduces the browser-dump reading line for line. Run by a verification subagent in a dedicated worktree from
origin/mainf8eaf670(pin.objectui-sha=53ded82bf7a4…), nothing committed, pushed or posted:bash scripts/build-console.sh(=pnpm objectui:build).cache/objectui-53ded82bf7a4,turbo run build --filter=@object-ui/console^...34/34, console bundle canaries greenpnpm --filter @objectstack/sdui-parser buildpackages/sdui-parser/dist/index.mjs), 2 snode scripts/gen-sdui-manifest-node.mjs --modules-root .cache/objectui-53ded82bf7a4/apps/consolecmpidentical)apps/console/node_modules/@object-ui/carries all 17 packages as workspace symlinks whoseexports["."].importis./dist/index.js, so stock resolution lands on the built dist and keeps one@object-ui/coreregistry instance. The objectui repo root does not work (node_modules/@object-ui/holds onlytest-support→ 16 import failures, nothing written)dataSourceon the same 15,actionTypeonaction:button/action:icon,align+variantontext; only-in-old 2 —typeon the two action blocks. ⇒ #17735's table, reproduced exactly; size 73,194 B = the browser dump's size in the card. Three more differences the card's name-only basis did not see:flex.isContainer: true;object-master-detail-form.formTypestring → enum[simple, tabbed];page:header.actionsdescription textcheck:react-declaration-parity --baseline … --strictexit 0 — 「111 spec-only divergences, 1 block missing」, 「no new DECLARATION divergence vs accepted baseline」; per-block triples identical to the tracked run; only the node-level bucket moves (2 → 13,dataSourceon the 11 judged rows), which feeds no verdictcheck-sdui-manifest.mjswith the regenerated record--self-test6/6Not run:
gen-sdui-manifest.sh(the browser dump) — byte-identity to it is inferred from the size match, ⛔ not proved.What M1 needs to become the standing producer (measured, for the dev): ① the record's
objectuiPackagesVersionno longer means 「the npm tarball installed」 — record the provenance truthfully (source: built-tree, the modules root, the workspace version read from<modules-root>/node_modules/@object-ui/core/package.json), and re-keycheck-sdui-manifest.mjs's presence check + self-test seed + header prose; ② the prose that describes the npm route becomes false and is rewritten — the record's//block, the generator header,build-console.sh's trailing reminder,docs/releases-maintenance.md:115-121(#18633's second half — the instruction that manufactures the skew), the parity gate header's 「PUBLISHED @object-ui/* packages」 bullet; ③ the default route derives the modules root from.objectui-sha(.cache/objectui-<SHA12>/apps/console), asserts the tree is built (…/@object-ui/core/dist/index.jsexists) and fails loudly 「run pnpm objectui:build first」; the temp-npm-install default — the input that produced the skew — is deleted; ④ the runner file is written to a temp dir or unlinked (today it litters the objectui build worktree); ⑤ cost: an objectui build only at regeneration time, whichobjectui:refreshalready runs at the pin-bump moment; the per-PR gates stay offline and unchanged.The ruling (M1 / M2 / retire the parity ratchet) is the maintainer's; this record only makes it decidable. Card stays
needs-user-decision.Generated by Claude Code
hotlong commentedon Sep 18, 2026
Ruling: batch #151 item 2 · letter 丙 (M1 becomes the standing producer of
sdui.manifest.json; the declaration-parity ratchet is retired; the console build ships the tracked artefact and the browser dump retires — that last step conditional on one byte comparison) · maintainer 「先验证再让我决策……评估声明对齐门禁有价值吗?可以作废吗?」, then 「其他同意」 on 丙 2026-09-18T03:59ZDirector seat, summon #24,
session_01Wj1HUjzyeiBQ8atRf1ZhaL. The maintainer asked for verification before a decision; the verification record is 5717306177 (M1 works: the node generator with--modules-root .cache/objectui-<SHA12>/apps/consolereproduces this card's browser-dump reading line for line — 18 / 19 / 2, 73,194 bytes, byte-deterministic; parity gate exit 0;check-sdui-manifestfresh). The director then evaluated the gate the artefact feeds; the maintainer chose 丙.The evaluation, as presented
lint.yml, per PR),check-sdui-manifest.mjs(freshness vs the pin, required lint job), the lint package's production-witness tests andsdui-jsx-baseline.json(they read the real file from disk to prove the wired JSX gate parses a real manifest), andci.yml's path filter. The CLI (os validate/build/lint) reads the project's own manifest or the copy shipped in@objectstack/console/dist/— which is the browser dump produced at RC cut. ⇒ platform users were never on the stale artefact; the artefact must stay for the witness tests and the freshness gate.check-react-blocks-declaration-parity.ts, 515 lines): by its own header it compares two declarations and never a renderer; the class that hurts users — both sides declare, nothing reads — is invisible to it (kind:'react' 页面上 record:* 四个 block 全部失效——契约 publish 的 objectName/recordId 渲染器根本不读(#4340 后续) #4413 stayed green for its whole life); the direction that hurts an author's AI (spec declares, objectui ignores) is reported and never ratcheted (111 rows today); what it ratchets is the reverse direction, 5 accepted registry-only rows with hand-written reasons and no recorded new catch since 2026-09-09. Pipeline ≈ 2,100 lines (gate 515, node generator 194, browser dump 689, checker 396, build-console 299), a 2,338-line artefact, Playwright at RC cut, and ≥ 8 cards (feat(sdui): wire the ADR-0080 manifest into the production JSX gate — artefact, freshness gate, witness tests, ratchet-to-zero ledger #13446, [finding] html tier:action:button/action:icondeclare an input namedtype, so the discriminator refusal makes that input unauthorable on the html tier — and the refusal's prescription ("write the tag you meant") has no answer for these two components #14490,check:react-declaration-parityrefuses to run for want of a manifest that is now checked in at the repo root #15367, [finding] the tracked rootsdui.manifest.jsonand the browser dump differ on the fields the parity gate consumes (18 of 57 components;dataSourcemissing on 15 in the root artefact) — the gate's verdict set is identical under both today, which is the configuration in which the drift is least visible #17735, [finding] the trackedsdui.manifest.jsonhas noobject-treeentry althoughplugin-treeregisters the renderer — the newobject-treespec row gets no parity comparison at all #18407, [finding]scripts/gen-sdui-manifest-node.mjs:28still carries the deadobjectui#6741citation that PR #18608 removed from two sibling files — and it is the header both corrected sites point readers to #18627, [finding] the parity gate's own header says the tracked manifest was "dumped from" the pinned sha — it was generated from npm 17.6.0, which is the false equivalence the same header explains fifteen lines above #18632, [finding]docs/releases-maintenance.mdcarries the same "builds objectui at the pin … over the built console" clause PR #18608 just corrected in the scripts — and the script drives a vite DEV server, not a built console #18633).Ruling — 丙
scripts/gen-sdui-manifest-node.mjsderives its modules root from.objectui-sha(.cache/objectui-<SHA12>/apps/console), asserts the tree is built (…/node_modules/@object-ui/core/dist/index.jsexists) and fails loudly 「runpnpm objectui:buildfirst」; the temp-npm-install default — the input that produced the skew — is deleted; the runner file goes to a temp dir (no litter in the build worktree);scripts/sdui-manifest.record.jsonrecords the truth (source: built-tree, the modules root, the workspace version read from the built@object-ui/core/package.json), andcheck-sdui-manifest.mjs's presence check, self-test seed and header prose are re-keyed to match; every sentence describing the npm route is rewritten — the record's//block, the generator header,build-console.sh's trailing reminder,AGENTS.md:156-157and:752-754's pin-move instruction,docs/releases-maintenance.md:115-121. The artefact is regenerated at the pin in the same PR (the 18-component skew closes).packages/spec/scripts/check-react-blocks-declaration-parity.ts, its test,react-declaration-parity.baseline.json, thecheck:react-declaration-parityscript, thelint.ymlstep and the cut-rc 「Declaration-parity ratchet at the committed pin」 step go; ADR-0082 D4 gets a status line 「retired 2026-09-18 by maintainer ruling on [finding] the tracked rootsdui.manifest.jsonand the browser dump differ on the fields the parity gate consumes (18 of 57 components;dataSourcemissing on 15 in the root artefact) — the gate's verdict set is identical under both today, which is the configuration in which the drift is least visible #17735; the artefact stays for the CLI witness and the freshness gate」 (an ADR amendment, ⛔ not a rewrite).scripts/gen-sdui-manifest.shonce in the built tree andcmps its output against the node output. Identical ⇒build-console.shcopies the trackedsdui.manifest.jsonintopackages/console/dist/, andgen-sdui-manifest.sh,pnpm sdui:manifestand cut-rc's Playwright install step retire. Not identical ⇒ stop at 乙: keep the browser dump for the console copy, report the diff on this card, ⛔ do not force the copy.check-sdui-manifest.mjs(freshness vs pin), the lint witness tests andsdui-jsx-baseline.json,ci.yml's path filter,.objectui-shaandbuild-console.sh(the console vendoring).scripts/gen-sdui-manifest-node.mjs:28still carries the deadobjectui#6741citation that PR #18608 removed from two sibling files — and it is the header both corrected sites point readers to #18627 (dead citation in the generator header) and [finding]docs/releases-maintenance.mdcarries the same "builds objectui at the pin … over the built console" clause PR #18608 just corrected in the scripts — and the script drives a vite DEV server, not a built console #18633 (releases-maintenance.md's clause and the skew-manufacturing instruction) fold into step 1; [finding] the parity gate's own header says the tracked manifest was "dumped from" the pinned sha — it was generated from npm 17.6.0, which is the false equivalence the same header explains fifteen lines above #18632 (the parity header's 「dumped from」 sentence) folds into step 2 — all three closed with a pointer here; [finding] the trackedsdui.manifest.jsonhas noobject-treeentry althoughplugin-treeregisters the renderer — the newobject-treespec row gets no parity comparison at all #18407 (object-treeabsent from the public tier) stays, it is a registry curation question; [finding] html tier:action:button/action:icondeclare an input namedtype, so the discriminator refusal makes that input unauthorable on the html tier — and the refusal's prescription ("write the tag you meant") has no answer for these two components #14490 (html tieraction:button/action:iconinput namedtype) is re-measured after landing — the regenerated artefact carriesactionTypein place oftype.Clause-②: no— no published contract moves; retiring a required gate is the maintainer's floor and the maintainer ruled it here. Changesets:skip-changesetfor scripts and the ADR line;@objectstack/consolepatch if step 3's copy lands (its dist gains a file it already shipped from the browser dump).Four-facet reading: ① users read the console copy — unchanged, or one source cleaner; ② one producer, one artefact, deterministic; ③ the ratchet did not guard the direction that matters to an author's AI; ④ −689 lines of browser script, −515 of gate, −1 required step, −Playwright at RC cut.
Execution
needs-user-decision→pm:queue;domain:spec,priority:p2,bugstay. The verification worktree's readings (5717306177) are the dev's starting point, ⛔ not its evidence — every number is re-taken on the PR's head.Generated by Claude Code
os-elon-musk commentedon Sep 18, 2026
Deferred by seat 3 on a measured cross-lane collision — ⛔ not skipped, ⛔ no label changed.
domain:specseat 3,session_019srGWGCBBCBHqcDoRZpQRh, R2.This is the head of this lane's dispatchable take order after #18670 (
priority:p2, typeBug,pm:queue, unassigned, ⛔ no open PR), and it was ruled at 2026-09-18T03:59Z — batch #151 item 2 letter 丙, maintainer 「其他同意」. It is held back for a sequencing reason, recorded so the next seat does not re-derive it.The collision — and what it is NOT
⭐ First, the good news, so nobody inherits a phantom fence. The ruling's step 4 keeps
.objectui-sha. That matters because.objectui-shais the only entry inSINGLE_CLAIM_PATHS(scripts/check-single-claim-paths.mjs:288-297) — the repo's one hard single-writer path. The generator only reads it to derive.cache/objectui-<SHA12>/apps/console. ⇒ no hard single-claim collision, and the H17 index's.objectui-sharow for hold #14490 is not triggered by a read.The actual collision is two-part, and both parts are open PR #18723 (card #17645,
domain:devx, os-try-charles — 「re-record the lockstep and bump the pin」). Read from its ownfilesendpoint at 2026-09-18T05:33Z: it holds.objectui-shaandscripts/sdui-manifest.record.json.scripts/sdui-manifest.record.json(source: built-tree, the modules root, the workspace version). PR sdui-parser: port inert-quick-add and member-type-mismatch from objectui, re-record the lockstep and bump the pin #18723 is writing that same record.check-sdui-manifest.mjs— which step 4 explicitly keeps as the freshness gate against the pin — is precisely the check that would then red. Landing this card before that bump buys a guaranteed follow-up.⇒ This card wants to go after PR #18723, or to be sequenced with its author.
H17 naming (this seat ran the intersection BEFORE deciding, as the step requires)
Hold #14490 declares
scripts/sdui-manifest.record.jsonand.objectui-shaasRestart-touchtrigger files, and this card's surface reaches the first. ⇒ the taker names #14490 in its dispatch brief. Note the ruling's own step 5 already schedules #14490 for re-measurement after landing (the regenerated artefact carriesactionTypein place oftype), so the hold and this card are already linked by the ruling.What the next taker should know
scripts/gen-sdui-manifest-node.mjs:28still carries the deadobjectui#6741citation that PR #18608 removed from two sibling files — and it is the header both corrected sites point readers to #18627 and [finding]docs/releases-maintenance.mdcarries the same "builds objectui at the pin … over the built console" clause PR #18608 just corrected in the scripts — and the script drives a vite DEV server, not a built console #18633 fold into step 1, [finding] the parity gate's own header says the tracked manifest was "dumped from" the pinned sha — it was generated from npm 17.6.0, which is the false equivalence the same header explains fifteen lines above #18632 folds into step 2, all three closed with a pointer here; [finding] the trackedsdui.manifest.jsonhas noobject-treeentry althoughplugin-treeregisters the renderer — the newobject-treespec row gets no parity comparison at all #18407 stays out (a registry-curation question). ⇒ this seat's earlier fold-or-serial reasoning about the manifest family is superseded — the answer comes from the ruling.Clause-②: **no**— stated in the ruling's step 6, on the grounds that no published contract moves. ⭐ Note that retiring a required gate is the maintainer's floor, and the maintainer ruled it here — so the retirement is authorised, but ⛔ nothing beyond what step 2 names may be retired with it.skip-changesetfor the scripts and the ADR line;@objectstack/consolepatch only if step 3's copy lands.cmpthe browser dump against the node output in the built tree: identical ⇒ the copy lands and the browser route retires; not identical ⇒ stop at 乙, keep the browser dump, report the diff here, ⛔ do not force the copy.Written 2026-09-18T05:33Z. The ruling, PR #18723's file list, the H17 index and
SINGLE_CLAIM_PATHSwere read at 2026-09-18T05:33Z. Seat post: #18883.Generated by Claude Code
os-steve commentedon Sep 18, 2026
Claim: PM loop round 5⚠️ It therefore moved recently, so this card's line references and counts are suspect and must be re-derived. Same-family cards #18407 and #18818 are
Session:
session_01AmH9bKvGoLjiY86Q4Z3og2Branch:
claude/issue-17735-sdui-manifest-parity-driftWorktree:
objectstack-issue-17735Domain:
domain:specSeat:
domain:spec#4File surface:
scripts/check-sdui-manifest.mjs(the GATE — it declares the comparison), the tracked rootsdui.manifest.json(the ARTEFACT), andscripts/gen-sdui-manifest.sh(the GENERATOR) only if the repair is on the producing side (stop on breach; explain in the report).⭐ Roles derived by reading each file, ⛔ not by a
grep -lhit — this seat put a card into the decision box this same shift by taking the first file containing a symbol as its declaration site, and is not repeating it.Container & model:
M,mode:subagent,model: opus (default judgment tier)— this seat's per-card call.Clause-②: no
Thread-read: see the comment preceding this claim.
Serial constraints cleared:
cleared at 10:52Z— the file that blocked this card,scripts/check-sdui-manifest.mjs, was held by #18879 (seat 2), which closedcompleted; the gate file is free.pm:queue/unassigned — ⛔ not in flight, so no block today, but whoever takes them next serialises behind this one. H17 trigger index (#2657 · #8345 · #8346 · #11331): intersection EMPTY.Generated by Claude Code
os-steve commentedon Sep 18, 2026
Release: claimed, then released unworked — I found a same-file collision I should have found before claiming. Seat
domain:spec#4,session_01AmH9bKvGoLjiY86Q4Z3og2, seat post #18917, R5 at 2026-09-18T10:58Z. Session —session_01AmH9bKvGoLjiY86Q4Z3og2. Reason — serial collision with an open PR on the file the ruling's step 1 rewrites; ⛔ no dev was dispatched and nothing was worked. Destination —pm:queue, assignee cleared, unchanged otherwise.The collision
PR #18723 (open, draft) modifies
scripts/sdui-manifest.record.json— read from that PR's own file list at 10:57Z. Ruling batch #151 item 2 letter 丙 step 1 rewrites that same file (source: built-tree, the modules root, the workspace version). ⇒ Same file, hard serial. PR #18723 also modifies.objectui-sha.⇒ Waits on: PR #18723 landing. ⛔ Not on a date and not on a person.
⭐ Two errors of mine, both in the claim I am now withdrawing
1. I claimed this card as if it were unruled. It is not. It was ruled 2026-09-18T03:59:10Z by the director seat (summon #24, comment on this thread): batch #151 item 2 · letter 丙 — M1 becomes the standing producer of
sdui.manifest.json, the declaration-parity ratchet retires,Clause-②: noper step 6,skip-changesetfor scripts, and step 5 prescribes a fold: #18627 and #18633 into step 1, #18632 into step 2.⭐ I caught this only because I ran the check I had filed #18993 about one round earlier — reading the card's own thread for prior rulings before dispatching. ⇒ The discipline that card asks for caught a ruled card being dispatched as unruled on its first use. ⛔ Had I not run it, I would have dispatched a dev against a card whose direction, fold set and changeset posture were already decided.
2. My claim's H17 line said 「intersection EMPTY」 — I had no right to say that. I reused the H17 trigger-file list I extracted at seating instead of re-deriving it for this surface. Seat 3's preparation note on this card (2026-09-18T05:33Z) states hold #14490 declares⚠️ I confirmed #14490 is
scripts/sdui-manifest.record.jsonand.objectui-shaasRestart-touchtrigger files, and that this card's surface reaches the first.open/pm:on-hold, but I did not reproduce those trigger lines from its body — so I record seat 3's reading as theirs, unreproduced by me, ⛔ and my 「EMPTY」 as withdrawn rather than replaced with a number I have not taken.For whoever takes this next
⭐ Seat 3 already left a full preparation note on this thread at 2026-09-18T05:33Z (seat post #18883) covering the ruling's steps, the #18723 collision, the H17 hold, the fold set and the
Clause-②: nogrounds. ⇒ Read that before re-deriving any of it. It is more complete than anything this round produced, and my only contribution above it is the 10:57Z re-read confirming PR #18723 is still open and still writing the file.Re-check before dispatch: (1) has PR #18723 landed; (2) does
scripts/sdui-manifest.record.jsonstill carry the shape step 1 rewrites; (3) are #18627 / #18633 / #18632 still open, since the ruling folds them in and a fold whose members have moved is not the fold that was ruled.Generated by Claude Code
os-litant commentedon Sep 20, 2026
Deferred this round, and the pit recorded at the moment of deferral — ⛔ not claimed, ⛔ no label written
domain:specseat 1 (seat post #6017,session_01LvwGppdonww4zGLWZo5rho), at 2026-09-20T08:45Z,origin/main=1739f71879f.By the take order this card was next after #19237: it is the oldest
bugatpriority:p2in this lane's dispatchable queue. It was not dispatched, and the charter says the pit goes on the card the moment that happens rather than into a seat's memory. Two reasons, in the order they bind.1. The thread owes a full read — first-hand, and it is the blocking one
This card carries 12 comments and a partial landing already on it (PR #18608, squash
681ebe4246, landed by this same seat earlier in this shift). The charter requires the whole thread read before every dispatch, and this seat's own recorded failure family is exactly 「writing before reading」 — twice in this shift it called a ruling pending that had already landed. ⇒ a half-read dispatch here is the known-bad move, and the seat took the slower one.⇒ What the next taker owes first: read all 12 comments and establish what PR #18608 actually discharged, before pricing anything. This seat did not establish that in this act and is ⛔ not asserting it.
2. A file-surface collision that may be a hard serial —⚠️ REPORTED, ⛔ NOT MEASURED BY THIS SEAT
This card's body names a fourth prose site in
packages/spec/scripts/check-generated.ts(theEXTERNAL_INPUT_REQUIREDwhystring).check-generated.ts,lib/sharded-artifacts.tsandbuild-api-surface.ts. This seat did not re-measure that file list in this act and is quoting it. ⛔ Do not treat it as a reading — re-take it. If it holds, thecheck-generated.tshalf of this card is under 「同文件单跨轮硬串行」 behind a PR the maintainer lands by hand, and the remaining subject (the parity gate inpackages/spec/scripts/check-react-blocks-declaration-parity.ts) may still be separable.Restart criterion, stated so the next round does not re-derive it: re-measure #19024's file list. If it does not hold
check-generated.ts, there is no serial and this card is dispatchable at full scope once the thread is read. If it does, the parity-gate half is still takeable on its own — but say out loud that it is a split, and leave the fourth prose site named.⛔ What this comment does not do
⛔ No label written, ⛔ no assignee, ⛔ nothing claimed, ⛔ no state changed. This card stays
pm:queueand free for any seat — including a seat that gets to the thread read before this one does.Generated by Claude Code
os-warren commentedon Sep 21, 2026
Serial let-pass — this card's gate file is held by PR #19270 and declared by in-flight card #19346. ⛔ No state change; this is a sorting reading, not a dependency.
domain:specexecution seat 2, sessionsession_01UDXER3sdqfeVYpEWZs5mZx, 2026-09-21T06:21Z. The card stayspm:queue, unassigned,priority:p2— ⛔ nothing here moves a label, sets an assignee, or hangs aBlocked-by:. It records why the seat passed over a card that had reached the head of this lane's road order (p2 ·Bug· 2026-09-12, second only to #16695) so the next round does not re-derive it.The hold-down. This card's deliverable lands on
packages/spec/scripts/check-react-blocks-declaration-parity.ts— the gate whosemanifestInputs()defines the whole basis the card measures. Census re-taken in this act over all 15 open PRs (207 file rows, 0 unreadable):and card #19346 (in flight, another seat, claim
5755448129) declarespackages/spec/scripts/check-react-blocks-declaration-parity.*pluspackages/spec/scripts/lib/in its own file surface. PR #19270 is "make the declaration-parity ratchet able to fail on a spec row with no …" — the same gate, changing the very verdict machinery this card asks a question about. ⇒ Two writers ahead of it on one file, and the second one is changing what the card's answer would mean.The single-writer path is clear, and is not the reason.
.objectui-sha— the one path in the single-claim set, and the one this card was queued behind through PR #19398 — is held by ZERO open PRs as of this reading, and so is the rootsdui.manifest.json. That wait is over; this is a different and later one.Order. #17735 sits behind PR #19270, and behind #19346 if that card lands on the gate too. ⛔ Nothing needs an unlock act: both are ordinary in-flight work that closes on its own, and this card returns to its place in the road order the moment the gate file is free. The next seat to reach the head of this queue can re-run the census rather than trust this line — it is dated, and the board moves.
Generated by Claude Code
os-support-ai commentedon Sep 22, 2026
Fence re-measured at the head of the take order: one of the two is GONE, the other has a chain behind it nobody is holding. ⛔ No state change.
domain:specexecution seat 1 (seat post #6017,session_013RDBh5DqXd2xnLwvHLgLFr), R7 at 2026-09-22T23:47Z. The card stayspm:queue, unassigned,priority:p2— ⛔ no label, no assignee, noBlocked-by:written here. This updates the two standing let-pass notes (5728959777,5756239563) rather than repeating them.The census — ruling 丙's whole surface, not one file
All 21 open PRs, 367 file rows, 0 unreadable, at 2026-09-22T23:47Z. Lit control: 93
packages/spec/rows across the same PRs.scripts/sdui-manifest.record.json.objectui-shascripts/gen-sdui-manifest-node.mjsscripts/gen-sdui-manifest.shsdui.manifest.jsonscripts/check-sdui-manifest.mjspackages/spec/scripts/check-generated.tspackages/spec/scripts/check-react-blocks-declaration-parity.ts⇒ os-steve's fence is gone.
5728959777passed this card back for PR #18723 holding step 1'sscripts/sdui-manifest.record.jsonand.objectui-sha. PR #18723 is closed and NOT merged; both paths read CLEAR above. ⛔ Nothing of step 1 is fenced today.⇒ os-warren's fence stands, and it is now the only one:
5756239563named PR #19270 on the parity gate, and it is still the single holder — 2 files, the gate and its test, exactly what ruling 丙 step 2 deletes.What is behind that one fence — the part that is new since
5756239563PR #19270 is not idle by neglect. It is parked by a later maintainer ruling: batch #197 item 1 letter A (
5749267307on card #18407, 2026-09-20T10:35Z, 「同意」) — 「PR #19270 stays draft … D is the waiting posture, not a terminal state」. Card #18407 ispm:blocked, body lineBlocked-by: objectstack-ai/objectui#10064, assignee kept by that ruling. Its unlock criterion, in the ruling's own words, is 「.objectui-shamoved past the objectui fix (pin-consumed repo: pin moved = installable), ⛔ not merely merged in objectui; the bump queues behind PR #18723」.Measured here, because the two halves of that criterion now point opposite ways:
objectstack-ai/objectui#10064is closed completed (2026-09-21T03:41:50Z), by objectui PR fix(spec): one voice on an undeclared view key, and one report per record #10192, merge commitc131d9e69e0b380b0287991cc9a616f138816d76..objectui-shaonorigin/main2bdb81f8ad610472b7cb48fc7b3669039f3c1f61is87af769e9a3ee28ace099fdd653d3ebd79fe82e2. objectui'scompareputs that pin 27 commits BEHIND the fix (status: behind,ahead_by 0,behind_by 27); the reverse direction readsahead_by 27/behind_by 0, so the instrument distinguishes the two directions rather than answering 「behind」 to everything. ⇒ [finding] the trackedsdui.manifest.jsonhas noobject-treeentry althoughplugin-treeregisters the renderer — the newobject-treespec row gets no parity comparison at all #18407 is correctly still blocked; ⛔ the unlock scan must not read 「10064 closed」 as the criterion..objectui-sha(CLEAR above). So the one action that unblocks the chain has a vacated queue position and no carrier.⇒ the chain under this card, stated once so it is not re-derived: #17735 ← PR #19270 ← #18407 ← the
.objectui-shabump ← nothing scheduled. A note naming this for #18407's owner and for the pin-bump sweep is left on that card.What this seat does NOT conclude
⛔ Not 「PR #19270 is moot」, although the temptation is on the page. Ruling 丙 step 2 (batch #151, 2026-09-18) deletes exactly the two files #19270 edits; ruling batch #197 letter A (2026-09-20, two days LATER) keeps #19270 in draft as the waiting posture. Both are the maintainer's, the later one governs the posture, and whether #197 was presented with #151's step 2 in view is ⛔ not something this seat read. What is certain is only this: executing step 2 deletes #19270's entire diff, so the two cannot both land as written. That ordering is the maintainer's call — ⛔ not a seat's to settle by dispatching over it, in either direction.
⛔ Not a
pm:blockedtransition here.5756239563read this as a sorting reading rather than a dependency and this seat does not overturn another seat's reading of its own act; what it adds is the chain above, so the next seat spends a comment read rather than a 21-PR census.Generated by Claude Code
os-support-ai commentedon Sep 23, 2026
Maintainer re-affirms ruling 丙 over ruling #197 A's PR #19270 path — the declaration-parity ratchet retires, and #19270 closes unmerged
domain:specexecution seat 1 (session_013RDBh5DqXd2xnLwvHLgLFr, seat post #6017), 2026-09-23T08:51Z, carrying the maintainer's word with provenance:session_013RDBh5DqXd2xnLwvHLgLFr.5724940904: 「the declaration-parity ratchet is retired」) against ruling batch chore(deps)(deps-dev): bump vite from 5.4.21 to 7.3.1 #197 item 1 letter A (5749267307on [finding] the trackedsdui.manifest.jsonhas noobject-treeentry althoughplugin-treeregisters the renderer — the newobject-treespec row gets no parity comparison at all #18407, two days later: PR fix(spec): make the declaration-parity ratchet able to fail on a spec row with no manifest component #19270 fixes that same ratchet and lands after the pin bump). The two cannot both be executed as written. The seat's own words to the maintainer: 「丙(关掉 fix(spec): make the declaration-parity ratchet able to fail on a spec row with no manifest component #19270,门禁退役)还是 A(保留,等指针升级后合入)」. Before asking, the seat gave its evaluation: the gate is internal-only, its one live catch (object-tree) is already fixed upstream, and it does not guard the property-level direction that hurts an AI author.⇒ 丙 governs. #197 A's objectui half (objectui#10064, done) and its pin-bump half (#19503) stand. Its PR #19270 half is superseded: #19270 closes unmerged in this act, with a pointer here.
What this does to this card
packages/spec/scripts/check-react-blocks-declaration-parity.tsand its test, the files step 2 deletes.scripts/sdui-manifest.record.jsonand regeneratessdui.manifest.jsonat the pin. The in-flight pin bump Bump .objectui-sha — the console pin (87af769e9a) is behind objectui#10153 (fail-closedrecord:quick_actions.requiredPermissions), so the shipped console still fails open; the pin bump is the unlock of #19186 #19503 (p1,domain:devx) moves.objectui-shaand rewrites that same record file on its branch. ⇒ this card is taken after Bump .objectui-sha — the console pin (87af769e9a) is behind objectui#10153 (fail-closedrecord:quick_actions.requiredPermissions), so the shipped console still fails open; the pin bump is the unlock of #19186 #19503 lands, and its round regenerates at whatever pin Bump .objectui-sha — the console pin (87af769e9a) is behind objectui#10153 (fail-closedrecord:quick_actions.requiredPermissions), so the shipped console still fails open; the pin bump is the unlock of #19186 #19503 leaves. ⛔ No state change is written here. This is a sorting reading, and the card stayspm:queue.Generated by Claude Code
os-support-ai commentedon Sep 23, 2026
Claim: PM loop — execute ruling 丙 (
5724940904, re-affirmed5791879338): M1 becomes the standing producer ofsdui.manifest.json, the declaration-parity ratchet retires, and the browser dump retires only if one byte comparison is identical, dispatched at 2026-09-23T18:30ZSession:
session_013RDBh5DqXd2xnLwvHLgLFrBranch:
claude/issue-17735-sdui-manifest-one-producerWorktree:
objectstack-issue-17735Domain:
domain:specSeat:
domain:spec#1File surface, ruling 丙 steps 1–3 exactly:
scripts/gen-sdui-manifest-node.mjsscripts/sdui-manifest.record.jsonscripts/check-sdui-manifest.mjs(presence check, self-test seed and header prose re-keyed)sdui.manifest.json(regenerated at the pin)scripts/build-console.shpackages/spec/scripts/check-react-blocks-declaration-parity.ts, its test andreact-declaration-parity.baseline.json(deleted)check:react-declaration-parityscript entry, thelint.ymlstep and the cut-rc parity steppackages/spec/scripts/check-generated.ts(theEXTERNAL_INPUT_REQUIREDprose)AGENTS.md(the pin-move sentences) anddocs/adr/0082-*(one D4 status line, an amendment and ⛔ not a rewrite)docs/releases-maintenance.mdcmpis identical):scripts/gen-sdui-manifest.sh,pnpm sdui:manifestand cut-rc's Playwright install step retire, andbuild-console.shcopies the tracked artefact.⛔ Step 4's "stays" list is untouched.
Container & model:
L,mode:subagent,model: opus (default judgment tier)Clause-②: no
Thread-read: 5791879338
Serial constraints cleared: census over all 32 open PRs at 2026-09-23T18:30Z (333 file rows). Every path above is CLEAR. The two fences this card carried are gone:
5791879338);record:quick_actions.requiredPermissions), so the shipped console still fails open; the pin bump is the unlock of #19186 #19503, now closed.The round regenerates at whatever
.objectui-shaorigin/mainholds.Step 1 rewrites
AGENTS.mdsentences, and step 2 amends ADR-0082. ⇒ The PR is built and reviewed here and stays draft. ⛔ This seat never readies it, enqueues it, or arms auto-merge on it without an authorized approval on record. Folded cards per ruling item 5: #18627, #18633 and #18632 close with a pointer here when the PR lands.Generated by Claude Code
objectstack-fleet commentedon Sep 23, 2026
os-dev-report
{
"issue": 17735,
"status": "done",
"branch": "claude/issue-17735-sdui-manifest-one-producer",
"pr": "#19921",
"session": "session_013RDBh5DqXd2xnLwvHLgLFr",
"premise_still_valid": true,
"summary": "Ruling 丙 (5724940904, re-affirmed 5791879338) is executed as steps 1-3, and step 3's cmp was IDENTICAL. Step 1: scripts/gen-sdui-manifest-node.mjs takes no arguments and derives .cache/objectui-SHA12/apps/console from .objectui-sha. It refuses, naming pnpm objectui:build, when the tree is missing, when its HEAD is not the pin, or when it is unbuilt. The npm-install default is deleted, and the runner goes to a mkdtemp dir. The record now carries source: built-tree, modulesRoot and objectuiWorkspaceVersion, and check-sdui-manifest.mjs is re-keyed (new self-test row, floor 12). Every npm-route sentence is rewritten, and the artefact is regenerated at pin 62597c5: 57 to 59 components (box, object-tree), 66,910 to 85,726 bytes, sha256 22c83c9ec701. Step 2: the parity gate, its test, its baseline, its only helper manifest-prescription.ts, the package script, the lint.yml step and the cut-rc step are gone, and ADR-0082 D4 gains one status line. Step 3: both producers ran over one built tree and gave cmp exit 0, byte-identical at 85,726 bytes. So build-console.sh now copies the tracked manifest into packages/console/dist, and gen-sdui-manifest.sh with its three tests, pnpm sdui:manifest and cut-rc's Playwright step retire. A @objectstack/console patch changeset is added. Measured premise correction to ruling step 6's changeset parenthetical: the published console tarballs 17.0.0, 17.3.0 and 17.4.0 carry 0 sdui.manifest.json (control: dist/index.html 1 each), so the file is new to the tarball, not already shipped. #14490 re-measure: actionType is on action:button and action:icon, and no type input remains. Assignee was not touched. Labels are the seat's call: the ruling routes skip-changeset for the scripts and ADR, and the PR also carries the console changeset.",
"tests": "All on head b7d0b36 (git rev-parse --short HEAD after the final commit). GATE UNION: dispatch-gates --repo objectstack-ai/objectstack --commands derived 155. All 155 ran, each exit code captured by redirect before any pipe, and all 155 exited 0. That includes check:pm-dispatch-gates (1905 cases, run detached because it exceeds the foreground cap) and check:dual-build-cjs-loads, check:lean-entry-closure and check:type-check-debt after a full turbo build of ./packages/* and ./packages// (72/72, VERDICT command-exit 0). --ran reconciliation exited 0: 155 derived, 155 run, 0 NOT-MEASURED, 0 UNRUN. An earlier union at bd8ae97 had check:pm-skill-ratchet exit 1 (AGENTS.md L1091 at 125B, over the 120B budget), fixed in b7d0b36, plus two exit-3 prerequisites that the full build then cleared. STEP-3 MEASUREMENT: pnpm objectui:build VERDICT command-exit 0 (630s, shared box). node scripts/gen-sdui-manifest-node.mjs exit 0, wrote 59 components, 85726 bytes, sha256 22c83c9ec701; a second run is cmp-identical. PLAYWRIGHT_BROWSERS_PATH=scratch bash scripts/gen-sdui-manifest.sh VERDICT command-exit 0, wrote 59 public blocks. cmp gave CMP_EXIT=0, both sha256 22c83c9ec70163559c2bd8f7b1613174d8660ad9949d15ed483a4189b7857c9a. TESTS: @objectstack/lint vitest run: 108 files, 4121 passed. Before the ledger shrink the production-witness test failed on exactly 3 STALE rows (jsx-not-a-container flex 14/12/6), and after it 5/5 passed. spec targeted run (check-generated-ledger, published-projection-choke-point, publish-smoke-port-collision, publish-smoke-boot-failure, verbose): 38 passed, 0 skipped. vitest-filter-preflight config-wiring-sweep: 65 passed. @objectstack/spec typecheck (tsc, scripts, test layer) exit 0. Self-tests: bump-objectui 20/20, guard-process-kill 69/69, os-verify-lock pass, check-sdui-manifest 12 cases. With the objectui oracle, check-sdui-manifest --require-objectui exit 0 (17.6.0 is the version the pin declares). LINT: narrowed eslint --no-inline-config --format json over the 12 changed lintable files reported 12 files, 0 errors, 0 warnings. Its population is the files eslint reported. It is invariant because eslint.config.mjs enables no type-aware linting (no parserOptions.project) and nothing imports a deleted file. The repo-wide pnpm lint is CI's. ABLATION: committed first, then scripts/ablation-replace.mjs on scripts/check-sdui-manifest.mjs, reverting RECORD_FIELDS to objectuiSha/sha256/components (anchor 1 to 0, blob b6484613ce99 to 0b7d75ac4a19). The self-test went red on exactly the new row, 'a record from the retired npm-install route is RED — expected RED, got GREEN', exit 1. Restore brought the blob back to HEAD b6484613ce99, and git diff HEAD is empty. There is no build/dist leg because it is a plain node script. PROBES on a scratch copy of the generator, each exit 1 with nothing written: an argument, no tree, a tree at the wrong HEAD, and a pinned but unbuilt tree. build-console.sh's copy block ran on fixtures: fresh (copied), stale record pin (copied with the regeneration warning), missing artefact (exit 1). NOT MEASURED, as derived: the 10 workflow-valued families, the 6 CI jobs scheduled by these paths (Test Core, Temporal Conformance, Dogfood Regression Gate, Dogfood Verify CLI, Build Core, Console Pin Gate), and the workspace, examples and downstream type-check programs. These are CI's. CI on the PR head: not awaited, per contract.",
"mcp_calls": "0 — no MCP GitHub tool was called",
"api_writes": "2 relay writes plus 5 git pushes. (1) POST /repos/objectstack-ai/objectstack/dispatches (fleet-write relay, run 35910868299, success), which executed pr_create = POST /repos/objectstack-ai/objectstack/pulls with draft=true and opened #19921 as objectstack-fleet[bot]. The body was read back byte-identical, 15,043 bytes, with one footer. (2) this os-dev-report comment, via scripts/pm/post-stamped.mjs to POST /repos//issues/17735/comments. The git pushes all went through write-pace to the feature branch: the empty probe, then c77331c, f211ae3, bd8ae97 and b7d0b36, never forced. No label write, no PATCH, no draft/ready flip.",
"open_questions": [],
"deviations": [
"packages/lint/src/sdui-jsx-baseline.json was shrunk by 3 rows although the dispatch listed it as untouched. Ruling step 1's regeneration gives flex isContainer: true, so the 32 jsx-not-a-container warnings no longer fire. The unedited witness test failed with 'STALE ledger rows ... delete these rows ... in this same PR'. The rows were deleted, none added, no count raised. The witness test file itself is untouched.",
"Comment-only edits outside the claim's file surface, made because the dispatch asked for no dangling reference: .claude/hooks/guard-process-kill.sh and its selftest (Tier S; 'live in two tracked scripts' named the deleted one), scripts/pm/os-verify-lock.sh, scripts/publish-smoke.sh, scripts/check-sdui-lockstep.mjs, scripts/check-pnpm-filter-targets.mjs, scripts/pnpm-filter-targets.mjs (FOREIGN_SCOPES reason string), packages/spec/src/ui/react-blocks.ts (a line comment naming the deleted baseline) and docs/audits/2026-06-react-blocks-conformance.md (retirement note).",
"Beyond the ruling's step-2 list, the gate's only helper packages/spec/scripts/manifest-prescription.ts was deleted, because its two importers are the deleted gate and test. scripts/objectui-changeset-digest.mjs's self-test assertion was re-keyed from 'pnpm sdui:manifest' to the new NEXT STEP text. check:cross-package-test-inputs dispositions were applied: the unheld scripts/gen-sdui-manifest.sh glob was dropped from the declaration and turbo.json, and check-generated-ledger.test.ts left vitest.repo-tests.json.",
"Kept on purpose as history, not pointers: packages/spec/CHANGELOG.md; ADR-0082 body and addenda; docs/protocol-upgrade-guide.md; the packages/spec/src narratives in component.zod.ts (x3), conversions/registry.ts, migrations/registry.ts and retired-keys/17.ui__RecordDetailsProps__layout.ts; past-tense comments in publish-smoke.sh, publish-smoke-port-collision.test.ts, scaffold-e2e-boot-probe.test.ts and lib/docs-import-surface.ts; fixture strings in check-agent-test-spelling.mjs and pm/ci-failure.mjs.",
"Dispatch-contract conflict: the harness attribution reminder asks for a model-named Co-Authored-By trailer and a different PR footer. AGENTS.md's model-free trailer pair and the session-URL footer were used instead, as the dispatch requires."
],
"out_of_scope_findings": [
"class: a · The CLI's console manifest fallback can never resolve. packages/cli/src/utils/sdui-manifest.ts resolveSduiManifest() calls createRequire(import.meta.url).resolve('@objectstack/console/dist/sdui.manifest.json'), but packages/console/package.json exports only './package.json'. Probe (scratch node_modules copying the console package.json): that resolve throws ERR_PACKAGE_PATH_NOT_EXPORTED. Controls: the same subpath resolves on a package with no exports map, and '@objectstack/console/package.json' resolves. The try/catch swallows the throw, so the declared fallback ('the manifest shipped inside @objectstack/console') is dead code, and it becomes observable once this PR's console copy ships. Fix belongs at the producer (the console exports map or the resolver's lookup), not a lenient consumer fallback. Dedupe words: console exports map sdui.manifest.json, ERR_PACKAGE_PATH_NOT_EXPORTED resolveSduiManifest, CLI console manifest fallback unreachable, @objectstack/console dist subpath export.",
"noted, not filed — carrier: the spec seat, or the next PR touching packages/spec/src/ui/component.zod.ts · TSDoc near the object-* section still says check:react-declaration-parity 'carries the spec↔objectui parity burden going forward', and ObjectTreePropsSchema's TSDoc says it 'reports it as missing'. Both are forward-looking claims about a retired gate on published spec source. Left alone to avoid a spec docs regeneration inside this PR.",
"noted, not filed — carrier: none · The unedited production-witness test's title still says '57-component public tier' (it asserts a length above 0; the artefact now has 59). Also, packages/sdui-parser/src/tests/dashboard-widget-options.test.ts's comment says there is no sdui.manifest.json in the tree, which has been false since the artefact was tracked.",
"noted, not filed — carrier: PM · AGENTS.md is now 1104 lines against a pm-skill-ratchet ceiling of 1116 (headroom 12, freed by deleted content). The ceiling can be lowered."
]
}
Generated by Claude Code
objectstack-fleet commentedon Sep 24, 2026
Landed — PR #19921 →
28ce61260bonorigin/main, verified by contentdomain:specexecution seat 1 (session_013RDBh5DqXd2xnLwvHLgLFr), 2026-09-24T15:56Z.Path.
AGENTS.mdanddocs/adr/**, Tier H), so it landed by the maintainer's hand.5306301677) on headb7d0b3693aat 2026-09-24T15:08Z, flipped the PR to ready, and enabled auto-merge.28ce61260b0ac03be468f5caf83b8d59a8af2265, with parentccccdcc35e.d61d8131ecequals the merge-group tree that CI measured.Re-measured on
origin/main(tip276d96dd23, which has the squash as an ancestor), parent against squash:scripts/gen-sdui-manifest.shexists (the browser dump)packages/spec/scripts/check-react-blocks-declaration-parity.tsexists (the ratchet)packages/spec/react-declaration-parity.baseline.jsonexists"sdui:manifest"in rootpackage.jsonplaywrightmentions in.github/workflows/cut-rc.yml(case-insensitive)sdui.manifest.jsonmentions inscripts/build-console.shscripts/gen-sdui-manifest-node.mjsexists (M1, the standing producer) — dark controlsdui.manifest.jsonexists — dark controlplaywrightmention left incut-rc.ymlis the retirement comment at line 412, "the Playwright browser it needed, are retired". No step invokes Playwright.sdui.manifest.jsononorigin/mainhashes to sha25622c83c9ec70163559c2bd8f7b1613174d8660ad9949d15ed483a4189b7857c9a. That is the digest the PR body's step-3 byte comparison recorded for both producers.Card state.
pm:dispatchedis removed and the assignee is cleared (fleet-write relay run36023712992; read back as 3 labels, 0 assignees). GitHub closed the card ascompletedthroughFixes #17735.feat(spec): govern connector + analytics_cube in the liveness ledger …
docs(spec): correct the expired browser-only manifest premise in two …
fix(scripts): relate the recorded @object-ui version to the objectui …
docs(scripts): keep the plain-Node manifest reading, drop its dead ob…
fix(scripts): the manifest generator defaults its @object-ui version …
feat(pm): a class-(b) finding names its seam — the `Seam:` line on os…
fix(sdui-manifest): one producer from objectui's built tree; retire t…