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
- 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.
- 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
Path: none | instrument (
scripts/pm/check-half-states.mjsreaders withoutcwd; H17 / H57) | 北极星「优先级」2check-half-states.mjstakes three readings off the LOCAL checkout with plainexecFileSync('git', …)and no
cwd, so each inheritsprocess.cwd(). The sweep's subject is named byPM_SWEEP_REPO, andthe 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#2execution 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:
git ls-files | wc -l/home/user/objectstack/home/user/objectui⇒ the sweep of
objectstack-ai/objectuivalidated its candidate paths against objectstack's8888 tracked files. ⭐ The two counts differ by 943, so this is a match on the wrong repo rather
than a coincidence — and the
objectuinumber is the one that never appeared.The three readers, and what consumes them
All three are the same shape —
execFileSync('git', […], { encoding: 'utf8' })with nocwd:readTrackedFiles()—git ls-files -z:4327readRepoRoot()—git rev-parse --show-toplevel:22038readOriginUrl()—git remote get-url origin:22046localCheckoutServesH17 — a false clean, and it is load-bearing
H17's own footer states its contract:
True — of the wrong tree. A
Restart-touch:path that exists in objectui and not in objectstack issilently dropped from the index. And the index is not decoration: the same footer tells a
dispatching seat to
⇒ a hold whose trigger file is objectui-only becomes invisible to exactly the check that exists to⚠️ On the run measured here nothing was actually lost — both surviving rows name
catch it.
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'sorigin,else
unresolvedand the row reads nothing. Run from this repo's checkout against objectui it takesthe second branch and refuses, exactly as the footer says:
⭐ 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 mechanizableMeasured:
git remote get-url originfrom/home/user/objectuireturnshttps://github.com/objectstack-ai/objectui, andgit rev-parse --show-toplevelreturns/home/user/objectui. So running the same command with that working directory makes all threereaders correct and H57 resolve. ⛔ Nothing about the sweep requires the wrong tree; it just inherits
whatever shell launched it.
Two directions, ⛔ neither chosen here
PM_SWEEP_REPOinstead of inheritingcwd. The tool already knowsits 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_CHECKOUTenv, a conventionalsibling 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.cwdas the contract and make the mismatch a REFUSAL, not a silent substitution.localCheckoutServesalready computes exactly this verdict for H57; H17 could consult the sameverdict and print
UNRESOLVEDrather than an oracle built from another repo. Cheaper, smaller,and it removes the false clean without needing to locate a second checkout.
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 scopeGenerated by Claude Code