docs(changeset): @objectstack/runtime carries NO boot-refusal row for the STACK_* codes now — correct the closing sentence of the stack-refusal-envelopes changeset - #16874
Conversation
… the STACK_* codes now — correct the closing sentence of the stack-refusal-envelopes changeset The unconsumed changeset .changeset/stack-refusal-envelopes.md closed by claiming that @objectstack/runtime "carries one classification row per new code in the dispatcher error-code vocabulary". That sentence was true when it was written and is false against main today: the runtime vocabulary carries none of them. Measured on this tree, not inherited. Every reading below is a grep over packages/runtime/src/dispatcher-error-vocabulary.ts at blob ff83d65, which is byte-identical at this branch's base 12babac and at origin/main c930f85 (git rev-parse on both, not assumed). Exit codes captured before any pipe. grep -c "code: 'STACK_" -> 0 (exit 1) the false claim grep -c "verdict: 'boot-refusal'" -> 14 (exit 0) line 20's claim, still true grep -c "code: '" -> 84 (exit 0) population control The zero carries a positive control over the same file with the same tool: grep -c "STACK_" -> 1 (exit 0), the removal comment at line 302. So the zero is a reading and not a broken grep. Where the rows went, measured rather than recalled: commit abae16a deleted exactly seven of them -- grep -c "^- code: 'STACK_" over its patch for that file -> 7 -- in the same landing that registered the seven codes in ERROR_CODE_LEDGER, where they now sit at packages/spec/src/api/error-code-ledger.zod.ts lines 1045-1051 under the '@objectstack/spec' key. The gate's own header states the consequence: a registered code drops out of its scan, and a stamp site under packages/spec/src/ may be classified foreign-vocabulary or runtime-pinned "and NOTHING ELSE". Two things in the same file are deliberately unchanged, proven by hash rather than by inspection: line 20, "... one-row-per-refusal granularity (14 rows) ..." -- sha1 71192bf158de167ac2774c576a462350600d7fa8 before and after, cmp exit 0. It is the neighbouring sentence about the same fact family, and it is TRUE. the front matter, lines 1-4, including the "@objectstack/runtime": minor key -- sha1 c3e97c77ad1e4948e11906c233e2d326ffcf4003 before and after, cmp exit 0. One sentence, one file. The refusal table, the semver argument, the schema-arm reading and the "Not narrowed" paragraph are untouched. Claude-Session: https://claude.ai/code/session_016N6xmWt5hYm94ffVEwGH8x Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
ACCEPT — seat verification at 2026-09-08T12:53Z, head
|
| invariant | seat's reading |
|---|---|
| the false sentence is gone | carries one classification row per new code → 0 (exit 1) |
| line 20 is untouched | one-row-per-refusal granularity (14 rows) → 1 (exit 0), and the sentence reads intact |
| the front matter is untouched | "@objectstack/runtime": minor → 1 (exit 0); lines 1-4 read back verbatim |
| the hunk cannot have touched either | the diff's single hunk is @@ -25,4 +25,4 @@ ⇒ line 20 and lines 1-4 are structurally outside it, which is stronger than an assertion that they were left alone |
Tier fuse (PM): the dev's transcript carries 107 harness-stamped "model" values, all claude-opus-5, zero of any other value — matching the tier this dispatch passed explicitly. ⛔ No self-description was accepted.
⭐ The correction is the right shape, and that is the substance of this card. It does not pretend the old sentence was always false — it says the row existed "when this changeset was written" and carries none now, names the landing that changed it (#16449 / PR #16652), and says why the seven cannot come back (a registered code drops out of that gate's scan, and the gate now refuses any verdict but foreign-vocabulary / runtime-pinned for a stamp site under packages/spec/src/**). That matches the register PR #16856 set on line 24 of the same file two hours earlier: keep the true half, replace the false half with what actually happened, name the card that moved the fact.
On the two things the dev was told not to decide
- The front-matter
minorkey stayed, per this seat's ruling (5585216825). The dev executed it as an instruction and did not re-open it — correct. - The halt condition from the previous run is discharged: all three corrected controls re-derived at
origin/mainc930f8597and all three agree (code: 'STACK_→ 0 ·verdict: 'boot-refusal'→ 14 ·code: '→ 84). ⭐ The 84 is the value this seat got wrong and the previous dev caught; it now reproduces from a third independent run.
Gate posture
Clause-②: no. .changeset/** only ⇒ the enqueue gate's PATH limb is not hit and no at-tier contract review is owed — the same shape as #16671 / PR #16856, which landed at opus this shift on the same basis. skip-changeset is measured rather than assumed: of 82 workspace package.json files, 70 declare a files[] whitelist and 0 of their entries mention .changeset (positive control on the same scan: 70 mention dist).
⛔ Why this is not enqueued yet
28 checks, 4 still running (Type Check · debt ledger / · workspace / · consumer gates, Lint & Repo Gates), 0 non-green. ⛔ "No red yet" is not an enqueue reading — the criterion is every name completed with success/skipped, aggregated by name. Flipping ready now (which re-runs the pull_request gate family), and enqueueing when the full set closes.
Generated by Claude Code
Fixes #16857
.changeset/stack-refusal-envelopes.md(#16342's changeset, still unconsumed) closed by claiming that@objectstack/runtime"carries one classification row per new code in the dispatcher error-code vocabulary". That was true when it was written and is false againstmaintoday — the runtime vocabulary carries zero such rows. This corrects that one sentence, before a release compiles it into a publishedpackages/*/CHANGELOG.mdthat this repo does not amend per-PR.The reading
Every number below is a grep over
packages/runtime/src/dispatcher-error-vocabulary.tsat blobff83d6506d53cee86c87f1d124e56e1978e65dc5, whichgit rev-parseshows is byte-identical at this branch's base12babac13and atorigin/mainc930f8597. A reading is a count plus the tree it was taken against, so both are named. Exit codes were captured before any pipe.code: 'STACK_verdict: 'boot-refusal'code: 'STACK_The positive control is the same tool over the same file, so the zero is a reading and not a broken grep.
Where the rows went, measured rather than recalled:
abae16adfdeleted exactly seven of them —grep -c "^- code: 'STACK_"over its patch for that file returns 7 — in the same landing that registered those seven codes inERROR_CODE_LEDGER, where they now sit atpackages/spec/src/api/error-code-ledger.zod.tslines 1045-1051 under the@objectstack/speckey. The gate's own header states the consequence: a registered code drops out of its scan, and a stamp site underpackages/spec/src/may be classifiedforeign-vocabularyorruntime-pinned"and NOTHING ELSE".Two things in the same file that did NOT change — proven by hash, not by inspection
cmp71192bf158de167ac2774c576a462350600d7fa871192bf158de167ac2774c576a462350600d7fa8"@objectstack/runtime": minorc3e97c77ad1e4948e11906c233e2d326ffcf4003c3e97c77ad1e4948e11906c233e2d326ffcf4003Line 20 is the neighbouring sentence about the same fact family, and it is true — 14 is exactly what control 2 returns. Two sentences describe that family; only one went false.
The front-matter key stays on the seat's ruling in issue comment
5585216825: eight other unconsumed changesets already declare@objectstack/runtime: minor, so the released version is inert either way, but the key also decides whether this paragraph compiles intopackages/runtime/CHANGELOG.md, which ships in the tarball viafiles[]— and that history belongs where a runtime consumer greps for it.Anchor counts across the edit, each with its exit code:
carries one classification row per new code(the old sentence)carried one classification row per new code(the new one)one-row-per-refusal granularity (14 rows)"@objectstack/runtime": minorgit diff --stat: 1 file changed, 1 insertion(+), 1 deletion(-).Register
This matches PR #16856, which corrected line 24 of the same file in the same landing shift: the true half of the sentence is kept, the false half is replaced by what actually happened, and the card that moved the fact is named (#16449, PR #16652).
Gates
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --ranreconciles the run against this tree's own derivation:All 17 exit 0, at
1be4e378c. Three of them (check-closing-keyword-paritytwice,check-comment-mask-corpus) first returned exit 3 — PREREQUISITE NOT MET, which is not a red gate; they were re-run green afterpnpm install.check-changeset-fixed.mjsis included deliberately: the derivation flags its roster as living under.changeset, so its silence would not have been evidence in either direction — it was run, and it passes.Not owed here, and named rather than skipped silently: no package source is touched, so there is no dependency-closure build and no package
test/typecheckto run. Repo-widepnpm lintis CI's run, not this PR's.skip-changesetMeasured, not assumed: of the 82 workspace
package.jsonfiles, 70 declare afiles[]whitelist (matchingcheck:published-files's own count of 70 publishable packages), and 0 of theirfiles[]entries mention.changeset— positive control on the same scan: 70 entries mentiondist..changeset/**is repo-root release-notes input and ships in no tarball, so nothing published moves.Landing
⛔ Draft on purpose. Not flipped ready, not enqueued, no auto-merge armed — the dispatching seat does that.
Generated by Claude Code