Skip to content

[finding] Measured over all 139 Silent gate families: 49 read a packages/examples subtree their declaration never names — the Silent bucket is a class, not a bucket of cleared gates #14325

Description

@claude

Measured by the os-dev seat working #14131 (PR #14323), whose triage made the census
the first deliverable: "那 127 个里有多少是同一形状 —— 声明了几个字面量、真实人口却是一
整棵子树? ⛔ 这个数没人量过,而它决定本卡是「修一个门」还是「修一个类」."
Filed
unassigned and ungradeddomain:*, priority and type are triage's.

Answer: it is a class. ⛔ Not a claim that all of them want the same repair — see the
refusals at the bottom, and the two subsets already carrying their own cards.

Method, stated so the number is checkable rather than believed

Static classification was tried first and is not good enough: a gate's corpus walk is
usually a recursive helper (walk(dir)) whose seed root is somewhere else in the file, so
a source scan either misses the root or invents one. The population was measured
instead, at origin/main@a39b02a6b:

  1. node scripts/pm/dispatch-gates.mjs --residue packages/metadata-protocol/src/protocol.ts
    lists the Silent bucket — 139 families today (the 127 in [finding] check-system-context-census declares 29 literals but never the packages/** subtree it censuses — a diff that SHIFTS a cited line derives green and reds in CI #14131 was 24h ago).
  2. Every one of the 139 was run with an fs-tracing preload
    (NODE_OPTIONS=--require trace.cjs) that logs the repo-relative path of every
    readFileSync / readdirSync / openSync and every git ls-files argument list.
  3. Each trace was compared against the literals extractWatchHints reads out of that
    family's own sources, judged with the derivation's own hintCovers.

Counted as population: content reads of tracked files
(readFileSync/readFile/openSync/createReadStream). statSync/existsSync probes
are excluded, and pnpm's own 5-path footprint is subtracted.

The census

bucket families
read 20+ tracked files under packages/ or examples/ that no declared literal covers 49
read 20+ undeclared tracked files anywhere 53
read 1..19 undeclared files 83
declaration covers every file read, or nothing tracked was read 3
of the 139, exited non-zero — partial trace, so they UNDER-count 22

⭐ So check-system-context-census is not special: it sits eleventh by undeclared
reads. Head of the list, declared literals then undeclared reads:

family declared undeclared reads
pnpm check:nul-bytes 2 7815
node scripts/check-closing-keyword-parity.mjs 6 7811
node scripts/check-self-test-workflow-commands.mjs 7 6360
node scripts/check-position-name-fold-loaders.mjs 7 6251
pnpm check:refd-timer-probe 5 5661
node scripts/check-comment-mask-corpus.mjs 1 5661
pnpm check:vendor-version-stamps 2 5660
pnpm check:skill-identifier-liveness 17 5495
pnpm check:parse-guard 2 5449
pnpm check:watch-hint-literal 1 5447
pnpm check:engine-double-contract 1 5410
node scripts/check-system-context-census.mjs (repaired by PR #14323) 29 5387
pnpm check:error-code-casing 23 5161
node scripts/check-tenant-audit-census.mjs 24 4177
pnpm check:query-options-erasure 8 3903
pnpm check:type-check-coverage 10 3122
pnpm check:type-check-debt 10 3122
pnpm check:examples-live-imports 2 3051
pnpm check:dispatcher-error-vocabulary 28 2199
pnpm check:authz-resolver 4 2176
pnpm check:runtime-services-index 2 2165
pnpm check:error-status-conformance 4 2159
pnpm check:route-envelope 28 2126
pnpm check:cli-command-ids 4 2084
pnpm --filter @objectstack/spec run check:error-code-provenance 3 2005

(the remaining members of the 53 trail off from 760 down to 34)

Four were confirmed by reading the source, not just the trace, and all four are exactly
#14131's shape — declared literals name artifacts, the walk names a subtree:

  • check:engine-double-contractSCAN_ROOTS = ['packages', 'examples'], ONE declared literal
  • check:error-code-casingSCAN_ROOTS = ['packages'], 23 literals, all of them baseline rows
  • check:route-envelopewalk(join(ROOT, 'packages')), 28 literals, all of them route files it cites
  • check:error-status-conformancewalk(SCAN_ROOT) over packages, 4 literals

⚠️ What this number is NOT

Reads are an upper bound on the verdict-bearing population. A gate that opens every
package.json to build a workspace list reads far more than can ever red it, and the trace
cannot tell those apart. ⇒ ⛔ Do not read "49" as "49 gates need a ROOT_DIR_WATCH_HINTS
line". The honest claim is narrower and still decisive: the shape #14131 describes is
common, and the Silent bucket is not a bucket of cleared gates.

Two more limits, stated rather than buried: 22 of the 139 exited non-zero (missing build
artifacts, a CI-only prerequisite), so their traces are partial and their numbers are floors;
and three families exceeded the container's foreground ceiling and were cut at 75s.

⛔ Already carried elsewhere — not re-filed here

So the residue this card is FOR is the ~40 families that are neither whole-tree nor already
repaired: gates whose real population is a specific subtree (packages, packages/spec,
skills, content/docs) that their declaration does not name.

⚠️ The derivation-side half is NOT free-standing work today

scripts/pm/dispatch-gates.mjs is held by #14013. Anything here that turns out to be a
derivation change — a channel for "my population is the whole tree", or a rule that makes an
artifact-only declaration visibly different from a population declaration — queues behind it.
The per-gate half (a declaration in the gate's own module body, pinned in its own self-test)
needs no derivation change and is what PR #14323 and PR #14188 both did.

Re-check

node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack \
  --residue packages/metadata-protocol/src/protocol.ts    # the Silent list, re-derived
node scripts/check-engine-double-contract.mjs             # a confirmed member, ~30s
grep -n "SCAN_ROOTS" scripts/check-engine-double-contract.mjs

⚠️ scripts/pm/dispatch-gates.mjs moves several times a day and the bucket sizes move with
it — ⛔ re-derive rather than quoting this card.

Refs

Generated by Claude Code


Generated by Claude Code

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions