docs(devx): the port-pin rationale in check-bash32-floor.mjs described a retired field - #8697
Conversation
…retired field `scripts/check-bash32-floor.mjs` carried a ~40-line section arguing why this port is not registered in `scripts/upstream-port-pin.json`. Every load-bearing clause rested on `pin.upstream.ref`, a single ledger-wide field, and objectui#8288 retired it: `ref` is now a required key on each `files[]` entry, `validatePin` REFUSES a pin that still carries `upstream.ref`, and `resyncedPin` writes only the re-synced entry's own `ref` and digest. A reader following that prose went looking for a field that would be rejected if written. The rewrite states that the structural blocker is gone, that registration is still owed, and what it costs (per-file work: the upstream blob at a named ref, its digest, and every divergence declared as an exact text pair with a `why`). The one clause that was still true is kept: this file has NO drift gate until it is registered. No revision is written into the new prose. That section had already gone stale twice by the same mechanism -- objectui#7749 moved the global ref out from under the sentence describing it, and objectui#8288 then deleted the field the sentence named -- so the new wording points at the pin file, where each entry now carries its own `ref`. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FhBNJcLRZLe8M87VcUgpKr
ACCEPT — objectui#8385 / PR objectui#8697,
|
| claim | this seat's reading | verdict |
|---|---|---|
| prose only | scripts/check-bash32-floor.mjs +41 −30, and every added and removed line is a comment line |
✅ |
| ⭐ ⛔ no SHA in the new prose | 0 SHA-like tokens among the added lines | ✅ |
| ⭐⭐ and that zero is a READING | in-class control on origin/main: the same pattern finds 11 SHA-carrying lines elsewhere in that very file ⇒ the pattern can match here |
✅ |
| scope held to item 1 | 2 files: the docblock and one changeset. ⛔ The pin ledger is not in the diff | ✅ |
| items 2 and 3 filed, ⛔ not done | objectui#8694 and objectui#8696 — both bare: ⛔ no labels, ⛔ no assignees | ✅ |
draft, Fixes #8385 |
✅ | ✅ |
⭐ The card named three false clauses; the dev found EIGHT and enumerated each
Including the one this seat would most likely have let stand: the section's closing claim that "this file has NO drift gate … That is a real cost and it is accepted here rather than paid for by weakening either gate." ⭐ The consequence is still true and was kept; its justification was false. It became: "That cost was once accepted because paying it meant weakening a gate; it is now simply unpaid, and the work to pay it is ordinary."
⇒ ⭐ that is the difference between a prose fix and a prose repair: the sentence that was true-by-accident got a true reason instead of being deleted or left alone.
⭐ And the heading moved ## Why this port is not pinned … → ## Why this port is not **YET** pinned …, which is the whole finding in one word.
⭐ The blocker question, answered without touching the ledger
The brief asked whether the structural blocker is in fact gone, ⛔ while forbidding any pin. Answer: yes, on four independent readings — the global field is gone; resyncedPin leaves non-matching entries structurally untouched; two distinct refs already coexist in the ledger; and scripts/** is not governed, so --resync needs no flag there. .claude/hooks/** half the blocker is likewise gone, with one residual cost, ⛔ not a blocker: .claude/** is governed, so --resync refuses without --rewrite-governed-file.
⇒ ⛔ nothing was pinned, and both ledger-changing items left as bare cards. ⭐ Exactly the boundary the dispatch drew.
⭐⭐ A new trap, and it applies to every dev in this fleet
A zero-reading came back contaminated: hunting a build log with the alternation bash32-floor|8385 returned 56 hits — every one the literal 8385 inside the worktree PATH /home/user/objectui-issue-8385/. Re-run with bash32-floor alone: 0. The first reading was discarded.
/home/user/objectui-issue-<N>, so any pattern containing the issue number matches its own working directory. ⭐ That is a false-positive twin of the docblock trap, and this seat is adding it to the standing corrections — found by the dev, on itself.
⭐ It also discarded a TAB control as invalid, on the grounds that \x09 is deliberately outside the hunted class — the second dev today to refuse a control that was not in the class being controlled.
⭐ And a red it refused to read as a red
check:node-esm-load exits 1 in the worktree — "2 of 37 entries REFUSED … the load leg does not grade what this tree did not produce", both ERR_UNKNOWN_FILE_EXTENSION on a node_modules .css import with the build leg unrun. ⇒ reported as NOT MEASURED, ⛔ not red, and checked: grep -c 'bash32-floor' over its 9k-line output is 0, so it names nothing in this diff.
⚠️ And it answered the brief's standing invitation honestly
"brief_corrections: None" — every coordinate this brief gave was re-measured and found accurate. ⭐ That is the right answer when the brief happens to be right, and it is only worth anything because two devs this shift said the opposite and were correct.
Next
ci-wait on a1fdcc5d3, then flip, post-flip guard, arm SQUASH, enqueue from the timeline event.
Landing probe, scoped now: on a re-fetched origin/main, the section heading reads not YET pinned; the section contains 0 SHA-like tokens; ⭐ firing control — the same pattern still finds SHA-carrying lines elsewhere in that file (it was 11), so the 0 stays a reading, ⛔ not a dead pattern; scripts/upstream-port-pin.json is unchanged; nonsense control exits 1.
Generated by Claude Code
Armed — objectui#8697, 2026-09-08T23:29Z
Landing probe, restated before the merge:
Generated by Claude Code |
Queue status at 2026-09-09T00:35Z — ⛔ this PR's delay is not its own diffEnqueued at 23:29Z, still unmerged 66 minutes later. Establishing why, so the next reader does not re-derive it:
Control: this PR's 2 files touch nothing under ⇒ nothing to fix here and ⛔ nothing to re-run — a re-run buys one more coin flip and another ~50 minutes of shared queue time. This PR stays enqueued. The queue-level exposure is filed as objectui#8715; the test defect is objectui#8688. Generated by Claude Code |
⭐ LANDED — objectui#8385 / PR #8697, merged
|
| leg | reading | verdict |
|---|---|---|
heading reads not YET pinned |
:162 — ## Why this port is not YET pinned in \scripts/upstream-port-pin.json`` |
✅ |
| ⭐ 0 SHA-like tokens inside that section | section spans :162–:214 (next heading ## Population at :215); the file's 4 remaining SHA-carrying lines are at :8, :41, :223, :1382 — all outside it |
✅ |
| ⭐ firing control | the same pattern on the pre-merge blob (6621cf39b^) finds 11 SHA-carrying lines — exactly the number the Armed note recorded — and still finds 4 elsewhere in the post-merge file |
✅ the zero is a reading, not a dead pattern |
scripts/upstream-port-pin.json unchanged |
git diff 6621cf39b^ 6621cf39b -- scripts/upstream-port-pin.json → 0 lines; the commit's own stat carries exactly 2 files (the changeset and the script) |
✅ ⛔ this card fixed prose, it did not pin |
| nonsense control | exits 1, no match | ✅ |
⭐ And the section now carries its own recurrence guard, which is more than the card asked for: :191 reads "⛔ Do not write a revision into this prose. A port's ref lives on that port's entry in scripts/upstream-port-pin.json; read it from there." — followed by the two occasions it went stale before (objectui#7749 moved the global ref out from under the sentence; objectui#8288 deleted the field the sentence named). That is the defect's cause written down where the next author will hit it, not just the instance repaired.
Generated by Claude Code
⛔ Correction to my queue-status note above — the mechanism I gave was wrong
PR #8683 ( The ⭐ My method error, since it is the reusable part: GraphQL Full account on objectui#7010 ( Generated by Claude Code |
Fixes #8385
This is prose with no gate over it — the diff is the evidence
Nothing in this repository reads the text of this section. Measured, with a control in the same class and same run:
scripts/__tests__/bash32-floor-wiring.test.tsuses the file only as a path and a spawn target (GATE,node ${GATE} --self-test,import(GATE)); no pin reads its docblock. So no check can turn red or green on this change — read the diff. What the checks below prove is only that the docblock edit did not break the parse.What was wrong
The section's whole argument rested on
pin.upstream.ref, a single ledger-wide field. objectui#8288 retired it. Onorigin/mainda5e4f69e:pin.upstream.ref), one per pin and not one per file"scripts/upstream-port-pin.json→upstream: {repo}only.refis a required key on eachfiles[]entry (check-upstream-port-parity.mjs:typeof f.ref !== 'string' || !HEX40.test(f.ref)→bad(...)), andvalidatePinrefuses a pin that still carriesupstream.ref.--resyncrewrites it for the whole ledger (pin.upstream.ref = ref;)"resyncedPinmapsfilesand touches only the matching entry:f.ported === portedPath ? { ...f, ref, upstreamSha256 } : f.bf10deb"⇒ this was not prose "about to go stale". A reader following it went looking for a field that would be rejected if they wrote it.
⛔ Why the new wording names no revision
This is the load-bearing constraint on the rewrite, and the reason it exists:
That section had already gone stale twice by the same mechanism — objectui#7749 moved the global ref out from under the sentence describing it, then objectui#8288 deleted the field the sentence named. Both times the prose stayed confident and wrong. Restating a SHA now would make it stale a third time, by that exact mechanism, inside the paragraph explaining that mechanism.
So the new text points at
scripts/upstream-port-pin.json, where each entry now carries its ownrefthat--resynckeeps correct, and adds a ⛔ note telling the next editor not to write one back in. Verified, hunt and in-class control in one run:What is kept
Triage flagged one clause as the real reason the section exists, and it survives:
Kept, with "until that registration lands" added, and the trade-off sentence corrected: that cost was once accepted because paying it meant weakening a gate; it is now simply unpaid.
Scope
Item 1 of objectui#8385 only, as triage narrowed it. Items 2 and 3 are filed and not touched here — they change the pin ledger, which is not a prose fix:
scripts/check-bash32-floor.mjsinscripts/upstream-port-pin.jsonat its own ref — item 2 of objectui#8385, unblocked by objectui#8288 #8694 — registercheck-bash32-floor.mjsat its own ref..claude/hooks/**files against the per-fileref, per file rather than as one batch — item 3 of objectui#8385 #8696 — re-triage objectui#7953's ported.claude/hooks/**files per file (governed surface;--resyncneeds--rewrite-governed-filethere).The pin ledger is unchanged by this PR (
scripts/upstream-port-pin.jsonis not in the diff).Checks
Run on
a1fdcc5d3:node scripts/check-bash32-floor.mjs --self-test✓ check-bash32-floor self-test: 160 cases pass.— the parse proofnode scripts/check-bash32-floor.mjs✓ check-bash32-floor: 13 tracked shell file(s) … name no bash 4+ construct …vitest run scripts/__tests__/bash32-floor-wiring.test.tsTest Files 1 passed (1) · Tests 9 passed (9)(under the shared verify lock,VERDICT command-exit 0)node scripts/check-upstream-port-parity.mjs✓ … 3 ported file(s) match … each at its own pinned ref (2 distinct: …)— also the live evidence for the new prosenode scripts/check-control-bytes.mjs✅ check-control-bytes: OK (scanned 6881 tracked text file(s))node scripts/check-changeset-presence.mjsNo source or published contract of a released package changed … no changeset is owednode scripts/check-changeset-no-major.mjs✅ No changeset declares amajorbump.node scripts/check-pre-install-import-graph.mjs✅ … 26 pre-install step(s) … every non-relative leaf a node builtinnode scripts/check-governed-queue-guard.mjs --self-testOK … 132 cases passeslint --no-inline-config --format jsonon the 2 changed files.mdreports "File ignored because no matching configuration was supplied")Exit codes were captured before any pipe.
Not measured, and why:
check:node-esm-loadexits 1 in this worktree with✗ 2 of 37 entries REFUSED—@object-ui/plugin-dashboardand@object-ui/plugin-map, bothERR_UNKNOWN_FILE_EXTENSIONon a.cssimport fromnode_modules. The gate says in those words that it "does not grade what this tree did not produce": the build leg was not run here.grep -c 'bash32-floor'over its 9k-line output is 0, so the refusal names nothing in this diff. CI runs it after a build.Changeset
.changeset/8385-bash32-floor-port-rationale.md, empty frontmatter — AGENTS.md §9's first-class "declare once, release nothing" form. Nothing here is published source of a released package and nopackage.jsonpublish-contract field moved;check-changeset-presenceagrees none is owed, and the declaration is added anyway so the reason is on record.维护者速读(草稿)
改了什么 —
scripts/check-bash32-floor.mjs顶部 docblock 里那一节「为什么这个 port 没有登记进 pin 台账」的散文,约 40 行重写为 53 行。加一个空 frontmatter 的 changeset。⛔ 没有改任何代码、没有改 pin 台账、没有改门禁行为。为什么改 — 那段论证的整个前提是
pin.upstream.ref这个全局字段。objectui#8288 已经把它退役,并且validatePin现在会主动拒绝还带着它的 pin。所以那段散文不是「将来会过时」,它现在就是错的,而且是最坏的错法:照它去理解的人,会去找一个写进去就会被拒的字段。风险与代价(含回滚) — 风险接近零:改的是注释,没有任何门禁读它的文本,门禁跑绿只证明
.mjs没被改坏。回滚 = revert 这一个 commit,不影响任何别的东西。代价是这一节现在不再声称「没有 drift gate 是可接受的」——它现在如实说这笔债是欠着的,并指向 #8694 去还。席位意见 — (留空,待定稿)
你要做的 — 读 diff 本身(没有门禁能替你读)。特别请确认两件事:① 新措辞里一个 SHA 都没有,是故意的硬约束,因为这一节已经因为写死 SHA 过时过两次;② 拆出去的 #8694 / #8696 是刚被 #8288 解锁的真实工作,不要随本卡一起关掉。
🤖 Generated with Claude Code
https://claude.ai/code/session_01FhBNJcLRZLe8M87VcUgpKr
Generated by Claude Code