Skip to content

tooling(pm): re-decide the declaration-mirrors row from REFUSE-UNSPELLABLE to DECLARED-NARROWER - #15934

Merged
os-project-manager merged 1 commit into
mainfrom
claude/issue-15602-declaration-mirrors-row-withdrawn
Sep 5, 2026
Merged

tooling(pm): re-decide the declaration-mirrors row from REFUSE-UNSPELLABLE to DECLARED-NARROWER#15934
os-project-manager merged 1 commit into
mainfrom
claude/issue-15602-declaration-mirrors-row-withdrawn

Conversation

@claude

@claude claude Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

Fixes #15602

The row for check-declaration-mirrors in scripts/pm/bare-root-worklist.mjs recorded REFUSE-UNSPELLABLE on a ground the tree has withdrawn. It named the EXTENSION filter as the thing no spelling of the idiom describes; that rested on the collapse #12300 retired for this shape, and the gate had already acted on it — PR #15601 put ['scripts/**/*.d.mts', 'scripts/**/*.mjs'] beside SCRIPTS_DIR under the ROOT_DIR_WATCH_HINTS idiom. The record therefore asserted that nothing honest was declarable while its own gate declared.

The verdict was decided, not inherited

⛔ The card's direction was not taken on trust. All four values were read off this map's own vocabulary against the tree at e581457b:

verdict why it is not this row
REFUSE-UNSPELLABLE asserts NO spelling of the idiom describes the population — the gate spells one in its own source, so the refusal is false at the one place it is checkable
SPELLABLE-UNDECLARED is defined as the row whose gate declares NOTHING for the population; nothing here is deferred
REFUSE-WIDE needs the population to BE the root; it is 223 of 336
DECLARED-NARROWER the gate took the escape at a strictly narrower subtree, and the bare root is still not covered — which is what this verdict says

⛔ The gate is NOT edited: it is correct, and the MAP is what went stale.

Every term re-measured together, at one commit

The file's own rule is that refreshing one term mints a ratio nothing ever measured. All quantities below came from ONE invocation at e581457b, and the sha is recorded in the why:

quantity row (old) filing card (ab5c01379) triage (5315098) here (e581457b)
mirror files the walk admits 2 4 4 5
tracked files under scripts/ 261 331 333 336
scripts/**/*.mjs reach 214 216 218

A FIFTH mirror pair has landed since triage. ⛔ None of the three earlier readings is carried forward; the previous 2 of 261 is superseded whole. The spread across three trees inside two days is the argument for taking the terms together, not a discrepancy.

What the row now records, measured: the walk discovers 5 declaration files by extension and the pair check imports the 5 modules beside them, so the gate opens 10 of the 336 tracked files under the bare root (3.0%). The mirror-side hint reaches 5 and the gate reads all 5 (100% precise); the module-side hint reaches 218 and the gate reads 5 (2.3%).

The 2.3% half, faced rather than assumed

Both the card and triage flagged this as something a fixer must decide head-on. It is recorded, not refused, and the reason is that it is not what the PRECISION pin measures: that pin asks whether the recorded claim and hintCovers admit the same files. They do — 0 over-named, 0 missed, 223 of 336 covered — so the union is LIVE, PRECISE, COMPLETE and a real narrowing. The declaration's imprecision against the WALK is the direction the driver package files entry already records for its subtree ("it names 30 files the gate neither opens nor stats"), and the gate's own docblock prices it at ~1.6 s of fleet compute per 36 cards and takes the trade deliberately.

The recorded set is SET-EQUAL in both directions to the array the gate declares at this root, so no hint is passed over and the row carries no omits.

Verification

The map is shrink-only and did not grow: 46 recorded verdicts before and after. What moved is exactly what should:

before: 21 record(s) carry a spelling … 15 distinct spelling(s) … 10 DECLARED-NARROWER record(s) held SET-EQUAL
after:  22 record(s) carry a spelling … 16 distinct spelling(s) … 11 DECLARED-NARROWER record(s) held SET-EQUAL

node scripts/pm/bare-root-worklist.mjs --self-test — exit 0.

Ablation (predicted RED, observed RED). Dropping the .mjs member from the recorded spelling, with the mutation proven on disk (anchor grep 1 → 0, blob hash 37f80f57140c1291) and the restore proven byte-identical (git diff HEAD empty, hash back to 37f80f57):

MUTATED EXIT=1
  x self-test: …and every hint that gate declares at scripts is either recorded by
    "scripts declaration mirrors and their modules" or named in the row's `omits` —
    DRIFT: declared and not recorded [scripts/**/*.mjs], named as omitted [none].
RESTORED EXIT=0

There is no build/dist leg: node executes this source file directly, with no package build and no exports resolution between the pin and the file under test.

Gates. All 30 commands from dispatch-gates.mjs --changed --commands --repo objectstack-ai/objectstack, re-derived on the final file list, ran green — 17 direct-node, 13 pnpm check:*. check-governed-merges.mjs --test on the final list: NOT governed, ordinary queue landing applies.

Scope

One file. skip-changeset: the diff publishes nothing from any released package (AGENTS.md — that label is for exactly that case), and repo tooling under scripts/ is the standing example.

⛔ Filed rather than fixed here — #15926: the declaration is read back out of a gate's source only for DECLARED-NARROWER rows and contradicted fires only on a REACHABLE row, so a REFUSE-* row whose gate declares a genuinely narrower hint is checked by nothing. That is the mechanism that should have caught this row. It is not a pin to bolt on: measured at e581457b, the naive form reds check-driver-conformance CASE_SETS_DIR packages too, and that row is correct — hints are declared per FILE and its sibling constant owns the declaration.


🤖 Generated with Claude Code

https://claude.ai/code/session_016vtdMao3dQS9EfQfpyWixd


Generated by Claude Code

…LABLE to DECLARED-NARROWER

The row recorded a refusal ground the tree has withdrawn: it named the EXTENSION
filter as the thing no spelling of the idiom describes, which is the collapse
retired for this shape, and the gate itself now declares both sides of the
mirror beside its constant. Re-decided under the recorded authorisation
sentence and no wider one, with every term of the reason re-measured together
on one tree and none carried forward from the reading it replaces.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016vtdMao3dQS9EfQfpyWixd
@github-actions github-actions Bot added the size/s label Sep 5, 2026
@claude claude Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 5, 2026
@os-project-manager
os-project-manager marked this pull request as ready for review September 5, 2026 15:22
@os-project-manager
os-project-manager added this pull request to the merge queue Sep 5, 2026
Merged via the queue into main with commit a2051fa Sep 5, 2026
36 checks passed
@os-project-manager
os-project-manager deleted the claude/issue-15602-declaration-mirrors-row-withdrawn branch September 5, 2026 15:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/s skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants