fix(devx): declare the objectui-pin-citations population so a .objectui-sha change set derives it - #15698
Conversation
…tui-sha` change set derives it The gate reads the root pin file and walks `packages/spec/src`, but every path it opens is computed from `REPO`/`SPEC`, so `extractWatchHints` found nothing and dispatch-gates had no population for it at all. A change set consisting only of the pin file — exactly the class this gate exists for — derived zero commands naming it, and a pin bump ran 47 derived commands green before CI redded here on 8 stale citations. Declares both halves in the root-file idiom (`check-doc-anchors.mjs`, `git-merge-regen.mjs`) and pins them against what the gate really reads with the self-consistency assertion shape from `check-doc-anchors.mjs`. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
…jectui-sha-derives-pin-citations
…measured on The declaration docblock quoted `53edffe09`, the branch's original base. The before/after specimen was re-measured on `7bf96cfd0` (current origin/main) in a detached worktree, so the docblock now cites that commit and records both legs — 12 commands / 5 matched by path without the declaration, 13 / 6 with it. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
📓 Docs Drift CheckNothing in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 0 changed package(s)), so this run has no opinion about the docs. What this run could not see
Coarse fallback — 0 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
|
ACCEPT — PM seat Reviewed against the three-dot diff at What the diff does: Measured by this seat (dispatch-gates is plain The gate's own self-test runs under Fences held: one file; Observation recorded, not filed (dev handed it up): the artifact-roster families dispatch-gates scores "silent" for every card (~34) are the same disease class one rung along — a population declared as a roster rather than a scan surface. That is a triage question, not this card's scope; noted on the seat post. Generated by Claude Code |
Fixes #15604
packages/spec/scripts/check-objectui-pin-citations.tsreads the repo-root pin file.objectui-shaand walkspackages/spec/src, but every path it opens is computed(
PIN_FILEfromREPO,SRCfromSPEC).extractWatchHintsis a pure stringfunction over a gate's own source text, so it found no path literal here and this gate
had no population at all — a change set consisting only of the pin file, exactly the
class this gate exists for, derived zero commands naming it.
This declares the population on the gate, in the root-file idiom, and pins it with
the self-consistency assertion shape from
scripts/check-doc-anchors.mjs.No hand list of citing files: they stay discovered by regex (
sourceFiles(SRC)+scanFile), so today's citer list cannot go stale..objectui-shaitself and every speccitation are untouched.
The three traps, measured
1.
hintCoversadmits the spelling. A bare.objectui-shacarries no separator andreaches the predicate as a bare word; the
/**suffix is the sanctioned root-fileescape. Measured against the live module:
2.
check:watch-hint-literalrosters both names.scripts/check-watch-hint-literal.mjslists
ROOT_DIR_WATCH_HINTSandROOT_FILE_WATCH_HINTSat:274-:276, and documentsAGENTS.md/**at:46as the root-FILE spelling. Verdict line after this change:3. dispatch-gates does derive a pnpm-filter-invoked package-scoped gate from a
root-file change set. It does — no change to
scripts/pm/dispatch-gates.mjswas needed.The sibling
packages/spec/scripts/check-llms-txt.tsalready declaresDECLARED_WATCH_HINTSand is reached the same way.Before / after, the card's own specimen
node scripts/pm/dispatch-gates.mjs --commands .objectui-sha --repo objectstack-ai/objectstackcheck:objectui-pin-citationsorigin/main7bf96cfd0, detached worktreepnpm --filter @objectstack/spec run check:objectui-pin-citationsAblation
Trap-guarded (
trap ... EXIT INT TERM), absolute paths throughout, mutation proved ondisk by anchor counts before reading anything, restore proved by blob hash and
git diff HEAD. No rebuild leg is owed or possible here: the gate is executed as sourceby
tsx, andextractWatchHintsreads that same source text — nodist/participatesin either direction, which stages A and B confirm empirically (the mutation took effect
with no build step).
Verification
Every command
node scripts/pm/dispatch-gates.mjs --changed --commands --repo objectstack-ai/objectstackemits was run on the final head
89541345c; that derivation is byte-identical to the onethese runs came from. 49 derived commands, 48 exit 0, 1 NOT MEASURED. Heavy runs went
through
scripts/pm/os-verify-lock.sh(slotissue-15604); VERDICT linescommand-exit 0 · held the lock 431s / 48s / 182s / 191s.The gate has no separate
*.test.ts; its suite is the inline--self-test, which runsfirst in the
check:script and is green above with the new battery in its success line.NOT MEASURED, by name:
pnpm check:dual-build-cjs-loads— exit 3,PREREQUISITE NOT MET — this gate reads built output, and some package has no dist/(103 packages). Its own self-test passed(93 cases). Not a red and not a pass; it is unreachable by this diff, which touches one
tsxscript that is never built and never published.$RUNNER_TEMP,matrix.shard) — dispatch-gates prints them as NOT MEASURED itself.No changeset.
packages/spec/scriptsis not inpackages/spec/package.json'sfilesarray (verified:
["dist","json-schema","liveness","prompts","llms.txt","README.md","src/**/*.zod.ts","CHANGELOG.md","api-surface","spec-changes.json"]),so nothing here is published.
skip-changesetapplied.🤖 Generated with Claude Code
https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
Generated by Claude Code