Repository navigation
Commit bcb64fa
Part of #19129
> **Seat note (skills seat 1, record 5774727539):** this PR delivers the
lane grading's direction ① only (the `node` command head, the docblock,
the pins). Direction ② — the H9 row naming the channel it read — stays
on #19129 as its remainder: the dev measured that
`h9OnHoldNoRestartWhen` receives comment bodies as strings and the ids
never reach it, so naming the channel is a change to the shared comment
cache and ~30 pinned call sites, not a sentence in one function. At
MERGED the card returns to the queue with that reading; ⛔ this PR does
not close it.
`classifyRestartWhen` in `scripts/pm/check-half-states.mjs` decides
whether a `Restart-when:` value is fireable from its FIRST WORD alone,
against `RESTART_WHEN_COMMAND_HEADS`. `node` was not on that list, so a
runnable `node -e` predicate classified `prose` — the class the H9 row
calls "a `manual` in disguise, waiting on an actor nothing schedules" —
while the same predicate re-headed `pnpm exec node -e …` classified
`command`. `node` is the head every tool in this repo is invoked with,
so the row reported a schedulable exit as unschedulable and its remedy
sentence pointed at the wrong defect.
## What changed
- `node` joins `RESTART_WHEN_COMMAND_HEADS`, with its corpus provenance
in the docblock: the live objectui#9868 hold, whose `Restart-when:` is
an installed-surface probe a seat re-headed at 2026-09-18T22:00Z to
clear a row this list should never have fired.
- The docblock now states what the head-word test CAN and CANNOT tell.
It decides whether some mechanism could run the line at all, which is
H9's only question; it cannot tell whether running it means anything,
because `node -e "process.exit(0)"` fires on the spot and answers
nothing. It records the `pnpm exec` prefix as a workaround for this hole
and ⛔ never as a sanctioned spelling.
- The head set stays CLOSED and measured. `node` is in because this
repo's own tools are invoked with it and a live hold spells a predicate
that way. `bash`, `sh` and `gradle` are NOT added — nobody measured them
on a hold — and all three are pinned as `prose` controls so the list
cannot drift into a guess at command-shaped words.
- A new floored self-test battery `H9 node command head` (10 cases
registered, pin 9) carries the card's four controls plus the closed-list
and whole-word controls. `SELF_TEST_BATTERY_FLOOR` rises 8 to 9 and the
five sibling pins that assert the roster size move with it, per this
file's own floor discipline (a battery deleted from the roster must take
its floor with it).
## Evidence
**Red first**, on the dispatch base `7e1b048a1d`, the card's four
controls in one command:
```text
HEADS git|npm|npx|pnpm
SUBJECT node -e "…" exits 0 -> prose (UNFIREABLE)
CONTROL pnpm exec node -e "…" exits 0 -> command (FIREABLE)
CONTROL git grep -q foo -- bar -> command (FIREABLE)
CONTROL closed #19049 -> closed-ref (FIREABLE)
CONTROL someone gets around to it -> prose (UNFIREABLE)
```
**Green**, on this branch — the subject moves and the three controls are
byte-identical:
```text
HEADS git|node|npm|npx|pnpm
SUBJECT node -e "…" exits 0 -> command (FIREABLE)
CONTROL pnpm exec node -e "…" exits 0 -> command (FIREABLE)
CONTROL git grep -q foo -- bar -> command (FIREABLE)
CONTROL closed #19049 -> closed-ref (FIREABLE)
CONTROL someone gets around to it -> prose (UNFIREABLE)
```
**Ablation**, through `scripts/ablation-replace.mjs` in wrap mode, run
from the COMMITTED fix so the restore has a real restore point.
Predicted direction: RED.
```text
ablation-replace: anchor x1 -> x0
ablation-replace: blob 6d9f2f3 -> 4351fce172b838ffc2b4d46eee92f4679ead1b7b
ablation-replace: ok mutation landed: anchor 1 -> 0, blob 6d9f2f3 -> 4351fce172b8
✗ check-half-states self-test: 5 of 5170 case(s) failed.
ablation-replace: blob after restore 6d9f2f3
ablation-replace: blob at HEAD 6d9f2f3
ablation-replace: git diff HEAD empty
ablation-replace: ok restored: blob == HEAD (6d9f2f3) and `git diff HEAD` is empty
```
The five reds are the two starred subject pins, the two heads-list pins
and the gathering-policy pin. Every control in the battery stayed GREEN
under the mutation — the `prose` specimens, the closed-list controls and
the `pnpm exec` twin — which is what keeps the battery from being a
widening nobody can fail. Restore was independently re-read afterwards:
worktree blob equals the HEAD blob and `git status --porcelain` is
empty.
No `dist/` preflight applies: the subject is a standalone `.mjs` that
`node` runs directly, with no build step between the edit and the run.
**Gates**, all on the merged head `d953fabbd`:
- `node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack
--commands` derived 42 families on this tree; all 42 were run and all 42
exited 0. `--ran` reconciles: "42 derived famil(ies) accounted for — 42
run, 0 NOT-MEASURED (a DERIVED zero — all 42 recorded an exit code and
none of them is 3)." The family set was re-derived after merging
`origin/main` and is identical to the pre-merge one.
- `pnpm check:pm-half-states` exit 0 — 5170 cases pass (5160 at base;
the 10 new ones are this battery), batteries line ends `H9 node command
head 10/9`.
- `pnpm check:nul-bytes` exit 0, plus a manual control-byte scan of the
edited file with zero hits.
- `pnpm lint` (the repo-wide `eslint . --no-inline-config`) exit 0 — the
full scan, so no narrowing is being declared.
- Outside the derivation, the roster gates whose roster sits under a
directory this path is in were also run: `check-published-list-mirrors`
and its self-test, `check-dts-references --self-test`,
`check:pm-label-desc-cap`, `check:console-injection`,
`check:i18n-stale-fill` — all exit 0. `pnpm
check:published-readme-exports` exits **3**, its own PREREQUISITE NOT
MET code: this worktree has no `dist/` because this card builds nothing.
Recorded as NOT MEASURED — ⛔ not a pass and ⛔ not a finding.
Exit codes throughout were captured into a file and read back before any
pipe.
**Changeset:** `skip-changeset`, measured rather than assumed — the root
manifest is `private: true`, and of the 75 package manifests in the
workspace none carries a `files[]` entry naming `scripts`.
`scripts/pm/**` is a repo-root tool directory that ships in nothing.
**Line budget:** +54 / -8, net +46 over one file, against the dispatch's
suggested net +30. The overrun is the battery discipline the dispatch
itself requires: the roster entry with its rationale, ten pinned cases,
and the docblock stating why each candidate head is in or out.
## Acceptance notes
- **The card's second, separable reading is NOT addressed here** — the
one asking that the H9 row name the channel it read (the body, or the
comment id). The lane's first-touch grading directed it as the same PR
on the reasoning that both findings are one function's output; that
reasoning does not survive measurement. `h9OnHoldNoRestartWhen` receives
`commentBodies` as an array of STRINGS, and the ids never reach it: the
shared comment cache that H4, H9 and H17 all ride stores what
`commentsFor` returns, which is bodies. Naming an id means changing the
shape of that cache and the signature every one of roughly thirty pinned
call sites uses — a ripple through three rows, not a sentence in one
function. This PR's dispatch scopes the file surface to the command-head
defect, and the card itself offers the split ("split it if the lane
prefers"). Recommendation: file it as its own card against the same
file. Dedupe words: `H9 row channel`, `commentsFor bodies`,
`Restart-when comment id`, `h9OnHoldNoRestartWhen signature`.
- No other finding was turned up in this file while working on it.
---
_Generated by [Claude
Code](https://claude.ai/code/session_01Wnstp2kTth7sGXfr8fXypc)_
---
_Generated by [Claude Code](https://claude.ai/code)_
Co-authored-by: Claude <noreply@anthropic.com>
1 parent fb59fb5 commit bcb64fa
1 file changed
Lines changed: 54 additions & 8 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
3084 | 3084 | | |
3085 | 3085 | | |
3086 | 3086 | | |
| 3087 | + | |
| 3088 | + | |
| 3089 | + | |
| 3090 | + | |
3087 | 3091 | | |
3088 | 3092 | | |
3089 | 3093 | | |
3090 | 3094 | | |
3091 | 3095 | | |
3092 | 3096 | | |
| 3097 | + | |
| 3098 | + | |
| 3099 | + | |
| 3100 | + | |
| 3101 | + | |
| 3102 | + | |
| 3103 | + | |
| 3104 | + | |
| 3105 | + | |
| 3106 | + | |
3093 | 3107 | | |
3094 | | - | |
| 3108 | + | |
3095 | 3109 | | |
3096 | 3110 | | |
3097 | 3111 | | |
| |||
25097 | 25111 | | |
25098 | 25112 | | |
25099 | 25113 | | |
| 25114 | + | |
| 25115 | + | |
| 25116 | + | |
| 25117 | + | |
| 25118 | + | |
| 25119 | + | |
| 25120 | + | |
25100 | 25121 | | |
25101 | 25122 | | |
25102 | 25123 | | |
25103 | | - | |
| 25124 | + | |
25104 | 25125 | | |
25105 | 25126 | | |
25106 | 25127 | | |
| |||
26485 | 26506 | | |
26486 | 26507 | | |
26487 | 26508 | | |
26488 | | - | |
| 26509 | + | |
26489 | 26510 | | |
26490 | 26511 | | |
26491 | 26512 | | |
| |||
26522 | 26543 | | |
26523 | 26544 | | |
26524 | 26545 | | |
| 26546 | + | |
| 26547 | + | |
| 26548 | + | |
| 26549 | + | |
| 26550 | + | |
| 26551 | + | |
| 26552 | + | |
| 26553 | + | |
| 26554 | + | |
| 26555 | + | |
| 26556 | + | |
| 26557 | + | |
| 26558 | + | |
| 26559 | + | |
| 26560 | + | |
| 26561 | + | |
| 26562 | + | |
| 26563 | + | |
| 26564 | + | |
| 26565 | + | |
| 26566 | + | |
| 26567 | + | |
| 26568 | + | |
| 26569 | + | |
| 26570 | + | |
26525 | 26571 | | |
26526 | 26572 | | |
26527 | 26573 | | |
| |||
28300 | 28346 | | |
28301 | 28347 | | |
28302 | 28348 | | |
28303 | | - | |
| 28349 | + | |
28304 | 28350 | | |
28305 | 28351 | | |
28306 | 28352 | | |
| |||
29439 | 29485 | | |
29440 | 29486 | | |
29441 | 29487 | | |
29442 | | - | |
| 29488 | + | |
29443 | 29489 | | |
29444 | 29490 | | |
29445 | 29491 | | |
| |||
31086 | 31132 | | |
31087 | 31133 | | |
31088 | 31134 | | |
31089 | | - | |
| 31135 | + | |
31090 | 31136 | | |
31091 | 31137 | | |
31092 | 31138 | | |
| |||
35904 | 35950 | | |
35905 | 35951 | | |
35906 | 35952 | | |
35907 | | - | |
| 35953 | + | |
35908 | 35954 | | |
35909 | 35955 | | |
35910 | 35956 | | |
| |||
36247 | 36293 | | |
36248 | 36294 | | |
36249 | 36295 | | |
36250 | | - | |
| 36296 | + | |
36251 | 36297 | | |
36252 | 36298 | | |
36253 | 36299 | | |
| |||
0 commit comments