Uh oh!
There was an error while loading. Please reload this page.
Declare the scripts/ population two Silent gate families walk but never named - #14692
Conversation
`scripts/pm/dispatch-gates.mjs` builds every dispatch's gate list by scanning a gate's own source for the path literals it operates on, and "looks like a path" there means "carries a separator". Both gates below seed a recursive walk at the bare single-segment word `scripts`, which the extractor cannot see at all, so the only literals recoverable from either file named individual artifacts: the six scripts one gate's ledger cites by name, and two `owner/repo` action slugs plus sandbox filenames in the other. An artifact roster is not a population -- a list of the files that already exist can never contain the one added tomorrow -- so both families walked all of `scripts/` and appeared on no card that edited any of it. Each now declares that population in its own module body under the ROOT_DIR_WATCH_HINTS idiom, pinned in its own --self-test against the LIVE walk in both directions: nothing walked left uncovered, nothing covered left unwalked. One hint per admitted extension rather than the bare subtree, following check-ratchet-remedy-authority.mjs at this same root -- `scripts/**` would name both gates for the 91 JSON, Markdown and text files under the root that neither one opens. An extension the filter admits but the tree does not yet hold is deliberately absent, because a hint reaching nothing tracked is a dead lead the consumer reports as a population; the pins redden the day such a file lands. Measured on this tree with the derivation's own --residue, probe scripts/check-nul-bytes.mjs: 14 matched families -> 16, Silent 148 -> 146. With an outside probe (packages/metadata-protocol/src/protocol.ts) both stay Silent, so the declaration does not over-claim. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WLJQhde67SeTccsmnBVarV
…lent-gate-declarations-s1
⛔ merge queue 构建失败 — 先分诊,再决定要不要重排队列构建 33678836122 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集), 失败的 job(日志抽取,best effort):
跨 PR 相同签名(24h,按失败测试文件聚合):
历史信号:
分诊清单:
Generated by Claude Code · merge-queue-triage workflow (#4859) |
Uh oh!
There was an error while loading. Please reload this page.
…the sandbox-filename fix 12 of #14695's 14 unrecorded REFUSE-WIDE members are recorded in a new CENSUS_REFUSE_WIDE table in scripts/pm/bare-root-worklist.mjs, each with its own measured share and the base commit (2aa8456, the base #14325's own census used) it was measured at. A new table rather than new TRIAGE rows: TRIAGE is coupled to sweep(), which can only discover a bare-word population literal assigned to a POPULATION_CONSTANT-shaped name, and none of these families hold that shape (confirmed empirically: adding one to TRIAGE makes --self-test fail STALE immediately). Two of the fourteen ("the two packages/spec-filtered ones") are not recorded -- PR #14692's body, read in full, does not name them, and guessing would fabricate a measurement no one took. Also folds in the small second half: scripts/check-whole-set-label-write.mjs's three self-test sandbox filenames (scripts/w.mjs, scripts/writer.sh, .github/workflows/w.yml) existed in no tracked tree and, spelled as bare literals in a top-level export outside any selfTest()-shaped function, entered the gate's own declared-population hint set as dead leads. Renamed to three real, unrelated, already-tracked paths; no behaviour change to the gate's verdict. Fixes#14695 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WLJQhde67SeTccsmnBVarV
… 14) Follow-up to a36af67, which shipped 12 of 14 and left the two `packages/spec`-filtered members ("check:error-code-provenance", "check:objectui-pin-citations") as an open question -- the issue text's claim that they were named in PR #14692's body with their shares did not hold up against that body's actual text. The filing session's own sitting-1 census artifacts supplied the two names (both in its "root-wide, same class, no ledger row" bucket, members 13 and 14). Re-measured here by this table's own method rather than copied: strace openat tracing against a 2aa8456 worktree, run via `pnpm --filter @objectstack/spec run check:X` (tsx production leg). Both land within 1 file of the filing session's own sitting-1 counts (2070 vs 2069, and an exact 1192 vs 1192) -- corroborating the method a second time, now on a tsx-run gate rather than a plain node one. check:objectui-pin-citations (20.4%) lands below the issue's summarised 32-52% band; recorded as measured rather than forced into it. Fixes#14695 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WLJQhde67SeTccsmnBVarV
Part of #14325 — sitting 1 of the per-gate half. The card stays open: the residue is not exhausted, and this sitting's measurement changes what the rest of it is.
What landed
Two gate families now declare the
scripts/population they walk but never named, in their own module body under theROOT_DIR_WATCH_HINTSidiom, each pinned in its own--self-test— the shape PR #14188 and PR #14323 landed.node scripts/check-self-test-wired.mjsscripts/**/*.mjs,scripts/**/*.mts,scripts/**/*.shjoin(ROOT, 'scripts')— a bare single-segment word the extractor cannot see; its only other literals are the six scripts its ledger cites BY NAME (an artifact roster)scripts/check-nul-bytes.mjs; still Silent onpackages/metadata-protocol/src/protocol.tspopulation declaration, 7 cases, floor pinnednode scripts/check-whole-set-label-write.mjsscripts/**/*.mjs,scripts/**/*.ts,scripts/**/*.shROOTScarry a separator and were recovered; the third is the bare wordscripts. The rest of its literals are twoowner/repoaction slugs and fixture sandbox filenamesscripts/check-nul-bytes.mjs; still Silent onpackages/metadata-protocol/src/protocol.tsPOPULATIONcases inselfTest()Measured with the derivation's own
--residue, probescripts/check-nul-bytes.mjs: 14 matched families ⇢ 16, Silent 148 ⇢ 146. With an outside probe the verdict is unchanged, so neither declaration over-claims.One hint per admitted extension, not the bare subtree.
check-ratchet-remedy-authority.mjssets that precedent at this same root and its own self-test refuses the subtree spelling.scripts/**would name both gates for the 91 JSON, Markdown and text files under the root that neither one opens. The declared set is SET-EQUAL to each gate's live walk — 221 of 312 and 219 of 312 tracked files, nothing walked left uncovered, nothing covered left unwalked. An extension the filter admits but the tree does not yet HOLD (.js,.cjs,.yml,.yaml) is deliberately absent: a hint reaching nothing tracked is a dead lead the consumer reports as a population. The pins redden the day such a file lands.The card's own warning — reads are an upper bound — turns out to be the whole story, and the number is now measured rather than suspected.
Census re-derived on this branch's base (
2aa8456cf), method as the card specifies:--residuefor the Silent bucket, then every enumerating candidate run under an fs-tracing preload, compared against the literalsextractWatchHintsrecovers from its own sources and judged with the derivation's ownhintCovers. 202 families discovered, 132 Silent and non-self-test, 82 of those enumerate a directory, 49 read 5 or more undeclared tracked files.Of those 49:
check-closing-keyword-parity,check-self-test-workflow-commands,check:watch-hint-literal)scripts/pm/bare-root-worklist.mjsrecords a verdict for eachThe head of the residue is the
REFUSE-WIDEclass, and this repo has already adjudicated it.scripts/pm/bare-root-worklist.mjsis a maintained, self-tested ledger of exactly this species and reports 0 untriaged rows. Every one of the four members the card source-confirmed as the natural head of sitting 1 is either recorded there as refused, or is unrecorded but measures into the same class:check:engine-double-contract— REFUSE-WIDE on both roots (measured 90% / 84%), with the split refused by namecheck:error-code-casing— REFUSE-WIDE, "same trade as engine-double-contract"check:error-status-conformance— REFUSE-WIDE at 39%check:route-envelope— no ledger row; walksjoin(ROOT, 'packages')over non-test.ts, measured here at 2138 undeclared reads = 36.6% of the root. Same class ascheck:authz-resolver, which IS recorded REFUSE-WIDE at 39%.The ledger states the trade in its own words: a bare-root declaration there "would be TRUE, and is refused anyway: it names the gate for every card under a root the fleet already declares wholesale, so the matched column stops discriminating and restates 'run the farm', which CI does regardless." It also records the maintainer ruling of 2026-08-26 that split the spellable-but-undeclared rows by measured downstream pull — rows with a recorded consumer get the declaration, rows without stay deferred.
⇒ Sitting 2 cannot be "the next 8 by read count". Continuing down this order means declaring
packages/**on gates whose recorded verdict refuses exactly that, which is a re-decision of a maintainer-ruled map, not the mechanical repair this card scoped. Three honest routes, for triage rather than for a dev to pick:bare-root-worklist.mjsedit, so it belongs to a card that owns that file.⛔ None of these is taken here.
scripts/pm/dispatch-gates.mjsis untouched, as scoped.Artifact-only by design, recorded rather than declared
check-self-test-wiredandcheck-whole-set-label-writeeach ALSO name individual files — the ledger rows one cites, the action slugs and probe paths the other pins. Those stay as they are: they are artifacts the gate names, not a population it reads, and the new declaration sits beside them rather than replacing them. The 14 low-precision members above are the same shape at family scale and are recorded here, not declared.Verification
Union derived in this worktree by
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands(no paths passed — the script takes its own changeset), 17 commands, re-derived unchanged after mergingorigin/main. Run atbe6800e2f:check:watch-hint-literal(47 declarations across 4 rostered names),check:ratchet-remedy-authority,check:pm-dispatch-gates(VERDICT command-exit 0, dispatch-gates self-test 1240 cases pass), andnode scripts/pm/bare-root-worklist.mjs --self-test("none stale, none missing, none contradicted" — the new declarations create no fresh untriaged row and contradict no recorded verdict)node scripts/check-declared-population-live.mjs— "158 of 202 famil(ies) declare a path population, and every one of them reaches this tree's 8006 tracked file(s)"--self-testleg green;check-self-test-wiredprints "scope: 221 file(s) under scripts/", which is the declared set exactlynode scripts/check-test-completeness.mjsexits 3 = NOT MEASURED by its own design — it needs a CI test log and says so in its own output. Not a red.Ablation — the pins are proved able to go red. Five legs, each mutating the committed declaration, each proved on disk by counting the removed and injected text before reading any result, each restored via
git checkout HEADand verified bygit hash-objectagainst the HEAD blob (both MATCH):scripts/**/*.shscripts/**/*.json.map()spellingscripts/**/*.tsscripts/**perlreplacer failed to compile on the glob metacharacters and changed nothing. The on-disk proof step caught it and the readings were voided; the table above is the re-run with an exact-literal replacer. Had that step been skipped, five green self-tests would have read as five passing ablations.git diff --statagainst the base:2 files changed, 212 insertions(+), 1 deletion(-)— both underscripts/, soskip-changeset.Serial check: every open PR's file list was read before editing; neither gate file is held.
scripts/check-skills-token-ratchet.mjs(3 open PRs) andscripts/check-type-check-coverage.mjs(1) are held and were excluded from this sitting on that ground as well as on precision.🤖 Generated with Claude Code
https://claude.ai/code/session_01WLJQhde67SeTccsmnBVarV
Generated by Claude Code