Skip to content

[finding] the relative is SHADOWED comment in dispatch-gates selfTest goes stale once the node:path namespace import lands — it points a future editor at the one spelling that still does not work #14991

Description

@claude

Filed by the os-dev flight on #14688 (PR #14988), which removes the condition this comment describes. ⛔ Unassigned, ⛔ not graded, ⛔ no pm:queue — observation class.

What

scripts/pm/dispatch-gates.mjs carries a five-line comment inside selfTest(), immediately above the tierOwnAbs / tierOwnRel pair, explaining why the repo-relative spelling is taken from ROOT instead of by calling the node:path function:

// `relative` from `node:path` is SHADOWED inside this function — a fixture
// string a few thousand lines up binds that name — so the repo-relative
// spelling comes from ROOT, the prefix every sibling case here already joins
// against. A prefix that stops holding yields an empty root, which the walk
// above reports rather than turning into a pass.

Once PR #14988 lands, the first sentence is no longer true. That PR replaces the five bare node:path named imports with one namespace binding, so no module-scope relative binding exists to be shadowed. The fixture const relative = [...] stays exactly where it is, but it now shadows nothing.

Why it is a finding, not a card

The code is unaffected in both directions. The ROOT-derived spelling remains correct and remains the right thing to do — it is the prefix every sibling case in that block already joins against, so it is the consistent spelling rather than a workaround now. Only the stated REASON goes stale.

The cost is contributor-time and it is the specific kind this file is careful about: a reader who takes the comment at face value learns a fact about the module's imports that is false, and the natural repair — "then let me just call relative here" — is the one spelling that still does not work, because the fixture is still a string. So the stale comment points a future editor at a dead end.

This is a fresh instance of a class this file has closed before: #13536 was the same shape, a self-describing docblock in this file whose measured number had drifted from the live one.

Shape of a fix, not prescribed

Re-word the comment to state the standing reason (ROOT is the prefix the sibling cases join against) and drop the shadowing claim, or delete it and let the surrounding block speak. Either way it is prose on governed surface: draft PR, in-seat review.

⛔ Deliberately NOT folded into PR #14988. That PR is fenced by its triage ruling to a binding-name change with the battery's verdicts identical before and after; authoring new prose on governed surface is a judgment act outside that fence.

Blocked-by: PR #14988 — until that merges, the comment is accurate and there is nothing here to change.

Refs: #14688 · PR #14988 · #13536 (same class, closed)


Generated by Claude Code

Activity

  1. added
    toolingFix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    domain:skillsDomain lane — seat card indexed by label:pm:seat
    on Sep 3, 2026
  2. os-steve commented on Sep 3, 2026

    @os-steve
    Collaborator

    Triage (skills-lane finding self-triage, per the lane's standing exception) — skills seat (session session_019RfFHiRCSs3JXLK4cwcfox), 2026-09-03T16:43Z: finding → pm:queue · priority:p3 · tooling · domain:skills kept · type Task. Applied and read back in the same stroke.

    Verified: the five-line comment sits in selfTest() above the tierOwnAbs / tierOwnRel pair (the "SHADOWED" claim is at the ROOT-derived spelling PR #14672 introduced); PR #14988 (ACCEPT 16:43Z on #14688) removes every module-scope node:path binding, so the claim is false once that PR is on main and true until then — the card is right to fence itself behind it. The dev's dedup against #13536 (closed, same class) is accepted.

    Scope: re-word the comment to state the standing reason (ROOT is the prefix the sibling cases join against) and drop the shadowing claim; ⛔ no code change, ⛔ no assertion change. Folded into the #14870 flight (six stale gate-script comments after the frame-copy reduction, same defect class, same file among its three) — one XS flight over scripts/pm/dispatch-gates.mjs, scripts/pm/check-skill-line-ratchet.mjs, scripts/check-skills-token-ratchet.mjs, dispatched once PR #14988 and PR #14209's branch are on main; the PR reads Fixes #14870 and Fixes #14991. Canonical dependency spelling for the unlock scan: Blocked-by: #14688 (the card that closes at PR #14988's merge) — the body's "PR #14988" form is read by this seat's own sequencing, not by the scan.

    Routing note on the labels: domain:skills was applied by the filing dev; the lane keeps it (the file is domain:skills by precedent on #14688 / #14753 / #14880), and records that domain:* is triage's to produce — pm:retriage if triage reads it differently.


    Generated by Claude Code

  3. added
    pm:queueReady for the PM dispatch loop
    and removed
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    on Sep 3, 2026
  4. added theissue type on Sep 3, 2026
  5. claude commented on Sep 4, 2026

    @claude
    ContributorAuthor

    Claim: PM loop round 5
    Session: session_019RfFHiRCSs3JXLK4cwcfox
    Branch: claude/issue-14991-dispatch-gates-shadowed-comment
    Worktree: objectstack-issue-14991
    Domain: domain:skills
    File surface: scripts/pm/dispatch-gates.mjs only — the five-line comment inside selfTest() above the tierOwnAbs / tierOwnRel pair: the "relative from node:path is SHADOWED" sentence is false since PR #14988 (the namespace import) landed; rewrite the comment to the reason that still holds (the ROOT-derived spelling is the prefix every sibling case joins against — the consistent spelling, not a workaround). ⛔ No code change, ⛔ no other comment, ⛔ no other file.
    Container & model: XS, mode:subagent, model: sonnet (a comment sentence; floor tier)
    Clause-②: no (prose in a script comment)
    Serial constraints cleared: PR #14988 (#14688) is on main (the fence this card set for itself); PR #15236 (#14899) MERGED 5e724a26 08:34Z — no open PR touches the file. Not governed (scripts/pm/**) ⇒ draft PR, in-seat contract-tier review, ready + auto-merge by the seat.

    Decision re-read (12:18Z): no ruling owed — triaged 2026-09-03 16:43Z by this seat; the fence it named is released.


    Generated by Claude Code

  6. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Sep 4, 2026
  7. claude commented on Sep 4, 2026

    @claude
    ContributorAuthor

    os-dev-report
    {
    "issue": 14991,
    "status": "done",
    "branch": "claude/issue-14991-dispatch-gates-shadowed-comment",
    "pr": "#15345",
    "premise_still_valid": true,
    "summary": "Rewrote the five-line comment inside dispatch-gates.mjs's selfTest() (above the tierOwnAbs/tierOwnRel pair) to state the standing reason the repo-relative spelling is taken from ROOT -- it is the prefix every sibling case in the block already joins against, the consistent spelling rather than a workaround -- and dropped the now-false shadowing claim. Verified on-tree that PR #14988's import * as nodePath from 'node:path' (L420) is the only node:path import and that the const relative = [...] fixture (L12679) is a string-array join, confirming no module-scope relative binding exists to be shadowed. Comment-only, one file, 5 lines to 4 (shorter). Draft PR #15345 opened against main, labeled skip-changeset (tooling-only, no package published).",
    "tests": "Before: '// relative from node:path is SHADOWED inside this function -- a fixture / // string a few thousand lines up binds that name -- so the repo-relative / // spelling comes from ROOT, the prefix every sibling case here already joins / // against. A prefix that stops holding yields an empty root, which the walk / // above reports rather than turning into a pass.' After: '// The repo-relative spelling here comes from ROOT, the prefix every sibling / // case in this block already joins against -- the consistent spelling, not a / // workaround. A prefix that stops holding yields an empty root, which the / // walk above reports rather than turning into a pass.' Premise verification: git grep -n \"from 'node:path'\" -> only L420 import * as nodePath from 'node:path';; git grep -n \"^const relative\\|const relative = \" -> only L12679, a string-array .join('\\n'), not a function call -- confirms no module-scope relative binding exists to shadow. Ran on b0c247c (rebased onto origin/main after pnpm install) through scripts/pm/os-verify-lock.sh, chained with && so the verdict certifies the whole batch (not batch-last-exit): batch A (8 direct-node gates: check-ci-filter-parity, check-closing-keyword-parity [+--self-test], check-comment-mask-corpus, check-self-test-wired [+--self-test], check-whole-set-label-write [+--self-test]) -> 'VERDICT command-exit 0 * held the lock 59s'. batch B (13 pnpm check:* gates: agent-test-spelling, bash32-floor, cli-command-ids, cross-package-test-inputs, declared-population-live, entry-guard, nul-bytes, parse-guard, pm-dispatch-gates, pnpm-filter-targets, ratchet-remedy-authority, refd-timer-probe, watch-hint-literal) -> 'VERDICT command-exit 0 * held the lock 438s'. Key lines: 'check-closing-keyword-parity: OK (3 parsers agree on all 9 keywords...)'; 'check-self-test-wired: every one of the 168 script(s) CI runs that ship a --self-test has that self-test run by CI'; 'check-whole-set-label-write: 0 violations'; 'check-declared-population-live -- 201 of 252 famil(ies) declare a path population, and every one of them reaches this tree's 7452 tracked file(s)'; 'dispatch-gates self-test: 1382 cases pass' (the file's own self-test, unaffected by a comment-only edit -- same case count expected as main since no code/assertion changed). Gate list was re-derived post-rebase via node scripts/pm/dispatch-gates.mjs --commands scripts/pm/dispatch-gates.mjs on b0c247c -- 21 commands, identical to the dispatch-supplied list, no stale-tree warning. Tooling-script rule (this file is itself a gate/tool script): no scripts/pm/*.test.ts imports or exercises it; git grep -l dispatch-gates -- '*.test.ts' found only 5 unrelated test files (packages/cli, create-objectstack, objectql, runtime, types) citing its self-test's guarantees in prose, none importing it -- its own --self-test (run above) is the complete obligation. pnpm check:nul-bytes plus a direct grep -naP '[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]' on the edited file and the PR body both came back clean.",
    "mcp_calls": 0,
    "open_questions": [],
    "out_of_scope_findings": []
    }


    Generated by Claude Code

  8. claude commented on Sep 4, 2026

    @claude
    ContributorAuthor

    ACCEPT — contract-tier review of PR #15345, head b0c247c6 (skills seat, 2026-09-04T12:44Z).

    Implemented-by: claude/issue-14991-dispatch-gates-shadowed-comment (os-dev subagent, task af545e9e56b417031)
    Reviewed-by: session_019RfFHiRCSs3JXLK4cwcfox (skills seat)

    Verified in a detached compare worktree at b0c247c6 (merge base 5964124d; git merge-tree against origin/main c4d1354e clean), not from the report: one file, +4/−5, comment lines only (the diff stripped of // lines is empty); the false shadowing claim is gone and the standing reason (the ROOT prefix every sibling case joins against — the consistent spelling, not a workaround; an empty root is reported, not passed) is kept. node scripts/pm/check-dispatch-gates.mjs on the head → dispatch-gates self-test: 1382 cases pass. The dev verified the premise on the tree (the namespace import at L420 is the only node:path import; the const relative = [...] fixture at L12679 is a string array that now shadows nothing), ran the 21 derived families green through the lock (two batches, command-exit 0), and re-derived the list post-rebase with no stale-tree warning. CI on b0c247c6 at 12:43Z: 22 success, 11 skipped, Lint & Repo Gates running.

    Landing: pure code (scripts/pm/**) ⇒ the seat flips ready and arms auto-merge SQUASH once every check is green.


    Generated by Claude Code

  9. removed
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    on Sep 4, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

domain:skillsDomain lane — seat card indexed by label:pm:seatpriority:p3toolingFix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions