You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
fix(devx): declare check:merge-driver's manifest population, and re-measure the bounded-subtree walk specimen (#15538)
Two cards on the dispatch derivation, folded because both land in
`scripts/pm/dispatch-gates.mjs`. Card relations are declared once in the PR
body; this branch squashes, so no commit here carries a closing keyword.
## The manifest population (#15501)
`git-merge-regen --self-test` refuses a generator with no recorded merge
disposition, and the population that refusal sweeps is the MANIFESTS: the root
`package.json` plus every workspace member's, read for their `gen:` / `check:`
rows. What the family declared to `scripts/pm/dispatch-gates.mjs` was the
artifact paths `scripts/regen-artifacts.mjs` carries, imported one level down —
the generators ALREADY routed. So the one class of card the refusal exists to
catch (a card that ADDS a generator, touching a manifest and a new
`scripts/*.mjs`) was the one class the derivation could not name, and the gate
fired a cycle late, in CI, on every card of that shape.
Measured on 615fac3, before:
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack -- package.json
→ 0 lines naming check:merge-driver
and after: `pnpm check:merge-driver` is listed, for the root manifest and for a
member manifest alike.
The repair is the population declaration, in the idiom the derivation already
supports and beside the read it describes — `ROOT_FILE_WATCH_HINTS` for the root
manifest in the subtree spelling `hintCovers` accepts, `DECLARED_WATCH_HINTS`
for the member manifests as full-path glob literals, both following
`check-workspace-manifest-cycles.mjs`, which declares the identical population.
No hand list of generator names (that ledger is `regen-artifacts.mjs`'s, and
this gate already reconciles it two ways), and no self-test case edited to pass.
A twelfth self-test callee, `reconcileManifestPopulation`, holds both
declarations against the enumerator's LIVE answer in both directions — every
member manifest covered, no declared pattern covering zero, the root literal's
collapsed form equal to the path the gate opens for the root owner — with its
roster entry and floor (11 → 12), since nothing else in the repo can redden when
a declaration read by another tool goes stale.
Two dispatch-gates self-test cases per direction, pinned against the LIVE tree
through the same discovery pass `derive` runs: a change set touching the root or
a member manifest derives the gate, an unrelated brand-new `scripts/*.mjs` does
not, and an in-place ablation shows it is the manifest declaration doing it.
## The bounded-subtree walk specimen (#15510)
Two sentences cited `check-self-test-workflow-commands.mjs` as the LIVE specimen
for `repoRootWalkSpelling`'s negative direction. The outcome they report is
re-measured and unchanged — the limbs select five of the six candidates, and
that gate is selected by none — but the REASON was written as the shape of that
gate's walk, and a gate can stop holding a walk without the census moving. The
census sentence now states the population (a bounded subtree, `scripts/`), which
is what the remedy turns on; its limb attribution is corrected too, measured:
three by limb A, one by B, one by C, not "limbs A/B".
The fixture-side comment now names two measured specimens at two different walk
roots — `check-self-test-wired.mjs` (`walkScripts`, seeded at `scripts/`) and
`check-spec-parsed-alias.mjs` (`walkZodFiles`, seeded at `packages/spec/src`) —
and two LIVE cases read them off their real source, so the claim cannot rot back
into prose pointing at a file with no walk in it.
Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
Co-authored-by: Claude <noreply@anthropic.com>
0 commit comments