Skip to content

test(spec): kernel test titles state each cited decision in words instead of a tracker number (stage 11) - #21736

Merged
objectstack-fleet[bot] merged 2 commits into
mainfrom
claude/issue-20749-test-strings-b
Oct 4, 2026
Merged

objectstack-fleet[bot] merged 2 commits into
mainfrom
claude/issue-20749-test-strings-b

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Part of #20749
Clause-②: no

Stage 11 of this card, and the second area of class (e): the test strings shipped under packages/spec/src, as ruled in 5902360492 on #20513. This stage takes the whole kernel/ directory. Its 102 test-title and test-message literals carried 106 tracker ids citing 69 records. Each id now either states what its record decided, in words (form D), or is dropped where the title already says it. Text only: no assertion, fixture value, test count or code comment changes.

Census at the base (3fa850cf00, the claim's base)

Instrument: stage 10's census10.cjs (md5 9d08602ab972b4b8643c90d64d40fa41) and stage 9's census.cjs (md5 6e42a45a926d375013c32d62f16a296e), both byte-identical to the copies stage 10 used. A literal counts as a test title when its folded message is argument 0 of a describe / it / test call, .each / .skip / .only chains included. Everything else is an "other" string.

Both instruments read 1696 messages / 1807 ids in 405 files at the base, which is stage 10's reading at its head exactly. kernel/ reads 102 / 106, also stage 10's figure.

directory files messages / ids titles other
data/ 95 468 / 501 445 / 475 23 / 26
ui/ 81 392 / 415 374 / 397 18 / 18
api/ 40 189 / 201 181 / 193 8 / 8
system/ 34 154 / 165 128 / 138 26 / 27
(files directly in src/) 30 118 / 120 117 / 119 1 / 1
kernel/ (this PR) 36 102 / 106 92 / 96 10 / 10
shared/ 21 85 / 95 73 / 81 12 / 14
contracts/ 25 63 / 74 59 / 70 4 / 4
conversions/ 9 34 / 34 34 / 34 0
security/ 8 28 / 28 28 / 28 0
ai/ 9 18 / 20 13 / 15 5 / 5
identity/ 6 15 / 15 14 / 14 1 / 1
integration/ 4 14 / 14 13 / 13 1 / 1
migrations/ 2 9 / 12 9 / 12 0
marketplace/, meta-spelling/, studio/ 5 7 / 7 7 / 7 0
total 405 1696 / 1807 1587 / 1692 109 / 115
  • Controls. Lit, a title: kernel/capability-metadata-kind.test.ts:66 reads one message with capability 无 DEFAULT_METADATA_TYPE_REGISTRY / schema 条目 —— PUT /api/v1/meta/capability/:name 接受任意 JSON 且 /meta/types 报 allowRuntimeCreate:true(与 #5271 的 api 同形) #5961. Lit, a template-literal expect message: kernel/cli-command-contribution-retirement.test.ts:74 reads one message. Dark: the // ─── [#17178] … comment at kernel/execution-context.test.ts:205 reads 0 (the file's messages sit at :72, :167, :219, :233 and :237). Planted in a scratch copy: an id added to a title reads 1 / 1, and an id in an added comment reads 0.
  • A wider pattern (any # plus digits) reads 107 / 111 under kernel/ at the base. The five extra hits are hex colours (#94A3B8, #0f0) in functional-completeness.test.ts and one §3.10 #3 section reference in manifest.zod.ts, a non-test file. None is a tracker id. At the head the wider pattern reads only those five, and the gate pattern reads 0 / 0.
  • At the head: 1594 messages / 1701 ids in 369 files. kernel/ reads 0 / 0. Nothing else moved.

How the area was chosen

Stage 10's rule, applied before any card was read: rank whole first-level directories by ids, and take the busiest one within about 10% of the ~100-id bound. The four busiest each exceed the bound alone: data/ (501), ui/ (415), api/ (201) and system/ (165). The files directly in src/ (120) are 20% over. kernel/ (106) is the busiest whole directory within the bound, and its census reads exactly stage 10's 106, so the rule needed no second pass.

Named for the next stages: data/ (about five stages, by subdirectory or file group; data/driver/ alone is 52), ui/ (about four), api/ (two), system/ (two), the files directly in src/ (one, 120), shared/ (one, 95), contracts/ with conversions/ (one, 108), and security/, ai/, identity/, integration/, migrations/, marketplace/, meta-spelling/ and studio/ together (one, 96).

What each id became

Of the 106 ids, 32 now state a decision in words, in 31 literals. 74 are dropped where the title already explains them; two of those (#14478) sit in literals that also gained words for another id. Every record was read with its comments through REST. 58 answer 200. Ten answer 404, and their decisions were read from what landed. One is in a repository not attached to this session.

record ids result
#12007, #11825, #12340, #4914, #15932, #11846, #16059 10 of 20 Every expect message that read "must have zero holders after #N" or "must not be exported after #N" now reads "after its retirement": each record retired the names it lists. The other 10 sit in describe / it titles that already say what was retired, and were dropped. #11846 answers 404; its retirement was read from the CHANGELOG entry for landing 0c2334f.
#7280 1 "the ADR-0069 gate posture is a declared field": authGate is declared on ExecutionContextSchema, not spread behind an as any.
#17178 1 "SEED_WRITE_EXECUTION_CONTEXT — one spelling of the seed posture": one exported constant replaced the private copies.
cloud#687 1 "(the founding case: a roll-up that reads 0 forever)". The cloud repository is not attached to this session (403). The decision was read from ADR-0078's "Surfaced by" line and the CHANGELOG paragraph on the founding case: a bare { type: 'summary' } field read 0 forever, and the rule now flags it as an error.
#14192 (404) 4 "(the silent-drop measurement, inverted)", where the title said "the card's measurement". Dropped from 3 titles that state the refusal. Decision read from landing 4d0d944: ManifestSchema goes strict and refuses unknown keys inside manifest:.
#10726 (404) 2 "removed for the http.server mount, maintainer-ruled 2026-08-22", where the title said "Option B". Read from landing bc56e18 and PR #12417's body: Option B removes contributes.routes and points authors at the imperative http.server mount. Dropped once.
#4148 1 "the object/field unknown-key warnings survive the generalization", where the title said "the #4148 behaviours".
#4001 3 "(the evidence base for the strict tiers)", where the title said "#4001 evidence phase". Dropped from 2 titles that state the pinned rule.
#4167, #8687 3 "top-level stack keys (named, then refused at parse)": #4167 made an undeclared top-level key say so instead of vanishing, and #8687 ruled Shape B, a strict top level. Dropped once more for #8687.
#15624 2 "cache.ttl → deleted (the unread outer block is retired)". Dropped once.
#14478 3 Dropped. The → ttlMs / → timeoutMs renames and "carry their unit" already state the rule: the unit lives in the key name.
#15939 1 "RuntimeConfig.resourceLimits.timeout → timeoutMs (its unit was named in JSDoc only)", where the title said "ruling A". Ruling A renames the keys whose unit was named only in JSDoc, per file.
#5086 2 "(PUT /meta refuses the inlet)": a code-only kind's create is refused with 403 NOT_CREATABLE before anything persists.
#7743 1 "UNCHANGED, the field overlay refusal stays", where the title said "#7743's overlay refusal".
#8154 1 "(the consumer contract of the per-type redaction hook)".
#21120 1 "stored metadata ROWS — the family-wide seam every exit routes through". This says only what the card's public summary says: one shared seam, which every surface routes through or refuses.
#6245 1 "the bound-but-unregistered fence, pinned": schemas are bound for those kinds WITHOUT registering them.
#11263 1 "PLATFORM_PLUGIN_WIRED_RUNTIMES — runtimes wired by plugins[], not by a token": a sibling roster was added, and no token was minted.
#3366 1 "classifyRequiredCapability — preflight for an installable provider in this edition".
#17676 1 "package-registry carve-out — its persistence is always-on core, split from marketplace", where the title said "ruling A′".
#16365 1 "accepts %s, which the regex refused before the SemVer widening", where the title said "the pre-#16365 regex". The %s values do not change.
#17227 1 "dashboard.header.actions stays titled — the first carrier given item-level names".
dropped only (live) 45 #3308 (2), #3433, #3760, #3786, #4212, #4509, #4587, #4657, #4741, #4834, #4939, #5488, #5961, #6881, #6931, #7893, #8586, #10039 (2), #11169, #12032, #12428, #13613, #15678 (7), #16328, #16334, #16449, #17232 (2), #17445, #17780, #18124 (2), #18791 (3), #19630, #20102: each title already states the pinned decision.
dropped only (404) 8 #10194 (landing 2306a76: each bound entry is its stack collection's schema), #10338 (d2619fd: target optional, the gate holds the flow requirement), #10724 (be21955: the nine dead members tombstoned), #11330 (a9ee98992: the trust-tier text tells the truth), #11332 (dce5cd4: the three dead containers retired), #13135 (9e0ba21: the paper customization protocol retired), #17147 (2, aaacf1d5c: the granted set is registered and refuses nothing, said truthfully). Each title already carries what landed.

Readers

  • Test-name filters: none. A tracked-tree search for -t and --testNamePattern finds only packages/qa/dogfood/README.md:142 (-t "owner-scoped"), which is unrelated.
  • Snapshots: none. kernel/ has no __snapshots__, and no .snap file is tracked under packages/spec.
  • Titles by substring: every old title, plus a window around each id (256 needles), was searched across the tracked tree outside its own file. No gate, doc or script matches one. At the head, 8 hits remain: three sibling titles in other lanes' or stages' files (metadata-protocol/src/protocol.capability-write-door.test.ts:183, spec/src/api/contract.test.ts:813, spec/src/system/auth-config.test.ts:520), three released packages/spec/CHANGELOG.md entries, and one code comment in kernel/metadata-authoring-lint.ts:268, which belongs to the comment lane.

Text-only proof

Stage 10's scratch tool (textonly10.cjs, md5 d5e4801dbb4329ab1984da91e92fc47c) compares base and head file by file on three legs:

  1. Skeleton: the full AST, with string pieces masked. It must be identical.
  2. Comments: every comment, byte-equal.
  3. Strings: each string leaf that changed must sit in a test-call title position, or on one of the 10 declared lines. Those are the expect messages at cli-command-contribution-retirement.test.ts:74 and :86, plugin-lifecycle-advanced-retirement.test.ts:103, :124 and :141, plugin-loading-retirement.test.ts:125, plugin-security-scan-result-retirement.test.ts:123, preview-mode-retirement.test.ts:193 and startup-orchestrator-retirement.test.ts:85 and :106. Each changed leaf must carry a tracker id before and no # plus digits after.
  • Result: 36 of 36 files SAME, 102 changed (92 title, 10 declared), on all three legs.
  • Diff hunks: exactly the 102 planned lines, with every file keeping its line count.
  • Controls (10 of 10 as predicted, on scratch copies, each anchor hit once): identifier rename DIFF; numeric literal DIFF; comment edit COMMENT DIFF; a non-title string with an id VIOLATION; a rewritten title given a new id VIOLATION; a title that was id-free at base edited VIOLATION; one title reverted to base SAME; a declared string keeping an id VIOLATION; an undeclared expect message changed VIOLATION; a title re-split into a + chain DIFF.

Test counts: the 36 files were run at the base (in a separate base worktree) and at the head: 841 / 841 tests on both sides, with the same count and status sequence per file in 36 of 36. 388 full test names change, and each equals the base name with the planned replacements applied.

Changeset: skip-changeset

Measured, not assumed:

  • npm pack --dry-run of @objectstack/spec lists 2068 files under files[]. 0 of the 36 touched files are in it, and 0 *.test.ts at all. The controls src/kernel/manifest.zod.ts and src/kernel/execution-context.zod.ts are in it.
  • In dist/, three new phrases and three old ones each read in 0 files. The control Plugin compatibility ranges (ADR-0025 reads in 20.

So this PR publishes nothing, and no changeset is added.

Verification (at e0ad8f50af)

  • pnpm turbo run build over all packages: 71 / 71 (at the first commit), then @objectstack/spec rebuilt at e0ad8f50af.
  • @objectstack/spec: vitest run --project local, 613 files and 18215 passed, 1 todo. typecheck exit 0, including check:test-typecheck, whose program holds all 36 touched files.
  • Gates: dispatch-gates --commands derived 79 families at e0ad8f50af, and all 79 exit 0. --ran reconciles: 79 derived, 79 run, 0 NOT-MEASURED, 0 UNRUN.
  • ESLint, a proven narrowing: --no-inline-config over the 36 files, 0 errors and 0 warnings. The population comes from ESLint's own config: 36 configured, 0 ignored. No parserOptions.project or projectService, so no untouched file's verdict can move.
  • check-governed-merges --test: NOT governed, 204 changed lines.

Acceptance notes


Generated by Claude Code

claude added 2 commits October 4, 2026 11:12
…tead of a tracker number (stage 11)

Class (e) of the spec lane's share, the second area: the 102 test strings
under packages/spec/src/kernel that carried a tracker id (106 ids, 69
records). Each id is either replaced by the decision its record made,
stated in words, or dropped where the title already says it. Text only:
no assertion, comment or non-test file changes.

Claude-Session: https://claude.ai/code/session_01T9u38rswFp5Rw8DswRUReJ
Co-authored-by: Claude <noreply@anthropic.com>
… not "already titled" twice

Claude-Session: https://claude.ai/code/session_01T9u38rswFp5Rw8DswRUReJ
Co-authored-by: Claude <noreply@anthropic.com>
@github-actions github-actions Bot added the size/m label Oct 4, 2026
@objectstack-fleet objectstack-fleet Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Oct 4, 2026
@github-actions github-actions Bot added the tests label Oct 4, 2026
@github-actions

github-actions Bot commented Oct 4, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

Nothing 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): node scripts/docs-audit/affected-docs.mjs --json 316be321ef2405a12e8d016f07b25fad7039b4f9 → packageMentionDocs.

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 4, 2026 13:05
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 4, 2026 13:05
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 4, 2026
Merged via the queue into main with commit 72b6333 Oct 4, 2026
41 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-20749-test-strings-b branch October 4, 2026 13:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/m skip-changeset PR has no user-facing published change; bypasses the changeset gate tests

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants