Skip to content

finding(scripts/pm): check-half-states reads the LOCAL checkout with no cwd, so a cross-repo sweep validates H17's trigger-file index against the wrong repo's git ls-files and H57 never runs at all #19191

Description

@os-tesla

Path: none | instrument (scripts/pm/check-half-states.mjs readers without cwd; H17 / H57) | 北极星「优先级」2

check-half-states.mjs takes three readings off the LOCAL checkout with plain execFileSync('git', …)
and no cwd, so each inherits process.cwd(). The sweep's subject is named by PM_SWEEP_REPO, and
the tool lives in this repo — so the ordinary cross-repo invocation reads objectstack's working
tree while reporting on objectui's board. Two rows consume those readings, and one of them
validates other people's card contents against the wrong repo's file list.

Filed from the domain:ui#2 execution seat at objectstack-ai/objectui
(session_018HrVaotisyhgmot9o2MLRq). scripts/pm/** is this repo's surface, so the card lands here.
All readings taken 2026-09-19T09:44Z on origin/main.

The proof, in one number

The objectui sweep's own H17 footer prints its oracle size:

(read on 72 of 72 open pm:on-hold card(s); **8888** tracked file(s) in the oracle.)

git ls-files | wc -l value
/home/user/objectstack 8888
/home/user/objectui 7945

⇒ the sweep of objectstack-ai/objectui validated its candidate paths against objectstack's
8888 tracked files. ⭐ The two counts differ by 943, so this is a match on the wrong repo rather
than a coincidence — and the objectui number is the one that never appeared.

The three readers, and what consumes them

All three are the same shape — execFileSync('git', […], { encoding: 'utf8' }) with no cwd:

reader line consumer
readTrackedFiles()git ls-files -z :4327 H17, the on-hold trigger-file index
readRepoRoot()git rev-parse --show-toplevel :22038 H57, where it reads workflow files
readOriginUrl()git remote get-url origin :22046 H57, via localCheckoutServes

H17 — a false clean, and it is load-bearing

H17's own footer states its contract:

Extraction is deterministic — every path shown is a tracked file; anything unverifiable was
dropped rather than guessed, so this list under-reports and never invents.

True — of the wrong tree. A Restart-touch: path that exists in objectui and not in objectstack is
silently dropped from the index. And the index is not decoration: the same footer tells a
dispatching seat to

Before dispatching, intersect your dispatch's file surface against this list and NAME any card it
hits in the dispatch brief.

⇒ a hold whose trigger file is objectui-only becomes invisible to exactly the check that exists to
catch it. ⚠️ On the run measured here nothing was actually lost — both surviving rows name
pnpm-lock.yaml, which exists in both repos — but that is luck, not the mechanism.

H57 — never runs at all, cross-repo

localCheckoutServes (:13486) resolves in order: GITHUB_REPOSITORY, then the checkout's origin,
else unresolved and the row reads nothing. Run from this repo's checkout against objectui it takes
the second branch and refuses, exactly as the footer says:

Scheduled non-blocking workflows (H57): UNRESOLVED — this checkout's origin is
objectstack-ai/objectstack while the sweep reads objectstack-ai/objectui, so this row read
NOTHING this sweep.

⭐ The tool is HONEST about this one — it names the silence and spends no request. That is why H57 is
the smaller half. H17 is the one that presents a wrong-tree reading as a clean one.

⭐ It is a cwd, not a design limit — which is what makes it mechanizable

Measured: git remote get-url origin from /home/user/objectui returns
https://github.com/objectstack-ai/objectui, and git rev-parse --show-toplevel returns
/home/user/objectui. So running the same command with that working directory makes all three
readers correct and H57 resolve. ⛔ Nothing about the sweep requires the wrong tree; it just inherits
whatever shell launched it.

Two directions, ⛔ neither chosen here

  1. Resolve the checkout from PM_SWEEP_REPO instead of inheriting cwd. The tool already knows
    its subject; a local reader scoped to that subject should not depend on where a seat happened to
    stand. Needs a way to find the swept repo's checkout (a PM_SWEEP_CHECKOUT env, a conventional
    sibling path, or an explicit flag) and a loud refusal when it cannot be found — ⛔ never a silent
    fall back to cwd, which is the present defect.
  2. Keep cwd as the contract and make the mismatch a REFUSAL, not a silent substitution.
    localCheckoutServes already computes exactly this verdict for H57; H17 could consult the same
    verdict and print UNRESOLVED rather than an oracle built from another repo. Cheaper, smaller,
    and it removes the false clean without needing to locate a second checkout.

⚠️ ⛔ Do not resolve it by documenting "run it from the right directory" alone: the runbook fix leaves
H17 silently wrong for anyone who forgets, which is the failure mode that produced this card.

Seat-side, already done

This seat has run this sweep three times today from the wrong directory, so H57 read nothing in
all three and H17's oracle was objectstack's each time
. A re-run from the objectui checkout is
under way and its oracle count will be appended here.

Dedupe words: check-half-states cwd tracked oracle · H17 trigger file index wrong repo ·
readTrackedFiles execFileSync no cwd · localCheckoutServes origin mismatch ·
PM_SWEEP_REPO local checkout scope


Generated by Claude Code

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions