Repository navigation
test(spec): the second root-level test file group's titles state each cited decision in words instead of a tracker number (stage 29) - #22376
Merged
Conversation
… cited decision in words instead of a tracker number (stage 29) Stage 29 of the class (e) burn-down: the test strings shipped under packages/spec/src. The group is the 15 test files directly in src/, from root-entry-migrations-split.pin.test.ts through stack.test.ts; 12 of them carried 57 tracker ids in test titles and one declared label. Each title now either states the decision its record made, in words, or drops the number where the title already says it. Text only: no assertion, identifier, test count, code comment, file name or non-test file changes. Claude-Session: https://claude.ai/code/session_01DhTqaEHqPVSVnAkjG3jywn Co-authored-by: Claude <noreply@anthropic.com>
Contributor
📓 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): |
Contributor
Author
|
CI on
Generated by Claude Code |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Part of #20749
Clause-②: no
Stage 29 of this card: the next area of class (e), the test strings shipped under
packages/spec/src, as ruled in5902360492on #20513. This stage takes the second name-ordered group of the test files directly inpackages/spec/src/: 15 files,root-entry-migrations-split.pin.test.tsthroughstack.test.ts. 12 of them carried 57 tracker ids in test titles (59 ids), one of which sits in a declared describe label rather than a literal title. All 57 now either state what their record decided, in words (form D), or drop the number where the title already says it. Text only: no assertion, identifier, test count, code comment, file name or non-test file changes. No file directly insrc/carries an id in a string any more (type-alias-convention.pin.test.ts, which sorts after the group, reads 0); the card stays open for the subdirectory files named under Acceptance notes.Census (re-taken first)
The instrument is stage 28's
census28.cjs, byte-identical (md531d8488b5194b8d3048e3fcaec0efaed, the value stage 28 published): an AST walk over thepackages/spec/srctest files, one message per folded string (a lone literal, a template, or a plus chain) that matches the gate's id pattern, a title when the folded root is argument 0 of a describe / it / test / suite / bench call, comments never read. It was run against the three published readings before it was trusted, and all three reproduce exactly: 128 messages / 130 ids in 37 files at stage 27's landingf7b8a5932b, 191 / 200 in 53 files (titles 162 / 168, other 29 / 32) ataa09db58c9, and 73 / 76 in 24 files at stage 28's landingb7e01fbbd.43fc5005143fc50051The group reads 57 / 59, stage 28's landing figure: no re-cut. The census at
3f80f1716(the dispatch base) and at stage 28's landing read the same per file as at43fc50051.Per file, messages at base: root-entry-migrations-split.pin 1, stack-artifact-crossref 11 (12 ids), stack-artifact-packages 3, stack-cross-reference-envelope 2 (one title, one declared label), stack-dev-logins 4, stack-email-template-locale-floor 6, stack-inline-action-crossref 13, stack-json-stage-package-body 4, stack-refusal-envelopes 2, stack-requires 4 (5 ids), stack-top-level-strict 5, stack 2.
stack-conversions-record,stack-duplicate-action-keyandstack-provenancecarry no id in any literal.Controls:
describe(in 15 of 15 files, and a nonsense word in none; the census scanned 15 of 15.ai/build-progress.test.ts2 / 2 andui/dashboard.test.ts2 / 2.stack-artifact-crossref11 / 12,stack-inline-action-crossref13 / 13,stack-requires4 / 5 andstack-cross-reference-envelope2 / 2 each read 0.stack-conversions-recordhas no id anywhere;stack-duplicate-action-keyandstack-provenancecarry an id in one comment line each and read 0. The 15 group files read 0 at head while 55 of their comment lines still carry ids (112 id-bearing lines at base, comments included, 14 files).What changed
57 literals, one line each, in 12 files: +57 / -57. Every file keeps its line count.
objectNamerefusal" (stack-inline-action-crossref 399); and the declared label "hooks[].object (the hook-ownership rule)", the rule ADR-0130 states as "the split must follow hook ownership" (stack-cross-reference-envelope 91).#N —or#Nprefix, a[#N]prefix, or a trailing(#N). That includes the twin titlestack-artifact-packages.test.ts:355, which readdoes not warn about an undeclared composition rule (#5005 rule 3)and now readsdoes not warn about an undeclared composition rule, the same text stage 28 gave its copy atcompose-stacks-manifest-preserve.test.ts:308.Cited records
26 distinct ids. 25 answer 200 and were read: the body and the comment thread as the API serves it, with the rulings and landings that the rewritten titles state read in full. #10485 answers 404; its decision was read from its landing commit
35ad101bc(thethemescarrier retired under ADR-0049 enforce-or-remove;app.brandingis the one colour surface) and from the unknown-key strictness ledger, which records the maintainer's 2026-08-21 disposition as retiring the authorable surface, the phrase the title keeps verbatim. The comments counter of four records differs from what the comments endpoint serves (#14122 serves 21 of 22, #17614 5 of 6, #16449 0 of 5, #18056 5 against a counter of 4); everything served was read, and #16449's decision is in its body.What each record decided, as the titles now say it:
showcase_new_taskaction targets a PAGE, so the global_nav "New Task" command opens the home page in a dialog instead of creating a task #6739, ruling A (2026-08-09): atype: 'modal'target names a page, only; the object fallback is consumer leniency and enters retirement.os validateruns only the stack schema parse, so a config that exports a plain object (nodefineStack()call) skips every defineStack cross-field refusal and passes #20367, ruling B: one authoring shape;defineStackandcomposeStacksstamp a provenance mark andcomposeStacksrefuses an unmarked input withSTACK_PROVENANCE_MISSING/ 422.objectNameon an object-embedded action is inert AND unvalidated — the third arm PR for #7397 deliberately left open #7456, Option A: the embeddedobjectNamegets the registered rule's existence check, and only a dangling name newly refuses.packages: nullon a release artifact: the schema andcomposeStacksrefuse it, while every reader reads it as absent #19926, ruling A:packages: nullis malformed, not absent.permissions/datais not an array — the composed artifact is silently incomplete, which ruling 5690859601 forbids (follow-up C of #18239) #19784, ruling C: a non-array concat key is refused with the envelope.composeStackssilently drops every non-array top-level key —api:today,server:as of #4910 #5005 (2026-08-04): same value passes, a conflict throws a prescriptive error, an undeclared top-level key warns.objectstack validate --strictcannot catch it either (17.0.0 GA) #8687, Shape B: the top-level stack door is strict, and the lint yields to it.defineStack's per-stack cross-reference validation refusespermissions[].objectsanddata[].objectthat name an object owned by ANOTHER PACKAGE OF THE SAME ARTIFACT — so ADR-0130's co-owned artifact and the "permission sets stay whole in the app package" addendum cannot both hold once the app package owns objects #18202: one artifact carries N packages; the artifact-scoped permission and seed references resolve against the artifact, a stack that does not opt in is untouched.defineStack's action cross-reference validation entirely — a danglingtype: 'modal'target builds clean #6889 and [observation]config.objects[].actions[](object-embedded actions) may also bypass defineStack's cross-reference walk — unverified, same mechanism as #6889's row E #7397: inline page-element actions and object-embedded actions get the registered action rule's target cross-references.pagemember of the list-viewtypeenum and itspageNamemount — enforce-or-remove, the objectui render half was never built (maintainer 2026-09-09 「撤」) #17063: thetype: 'page'list-view mount is retired. Let an app contribute its own first-run credentials to the boot banner (devHint/devLogins[]) — the platform cannot know which of an app's audiences shows something, and only the app can #17556: an app declares its owndevHint/devLogins. [finding] An emailTemplates bundle tagged with the stack's own defaultLocale (e.g.en) has no fallback floor: the resolver retries only the literalen-US, so every unlisted recipient locale dead-letters permanently #17614 and [finding]packages/specgives two different rung counts for email-template locale resolution, and the floor guard has two silent early-returns that skip exactly the shapes it exists to catch #18056: the no-en-US-floor report and its declared scope. finding(spec):defineStack's cross-reference refusals are bareErrors — no ADR-0112code/status— so five REFUSED item classes in the ADR-0130 matrix are distinguishable only by message text #14552 and finding(spec): six of defineStack's seven refusals are still bare Errors — no ADR-0112 code/status — leaving one envelope among neighbours that have none #15963: everydefineStackrefusal carries an ADR-0112 envelope; spec: register every error code that ships indist— the nine unregistereddefineStack/ ownership / namespace codes enterERROR_CODE_LEDGER/StandardErrorCode(the ledger is the published face, per the #16404 ruling) #16449 registers each shipped code in the ledger. Unify optional-plugin loading: frameworkserve.tsand cloudobjectos-runtimeare parallel implementations with divergent capability tokens (ai-studiovsaiStudio) #3265 and Remove deprecatedaiStudio/aiSeatcapability aliases after one deprecation cycle (follow-up to #3265) #3308:requiresis validated at the producer and the camelCase aliases are removed.defineStackhard-errors on an undeclared hierarchy scope but is silent on an undeclared trigger capability — every autolaunched flow ships inert #14153 and [finding]requires: ['triggers']withoutautomationvalidates, but at boot the record-change trigger is not installed and every flow "will never run" #20332: trigger capability validation and itstriggerswithoutautomationpair. spec: the root entry stops carrying the migration and conversion registries (about 1 MB of prose), so a console first screen no longer downloads os migrate text (the upstream payback of objectui#11088 D1) #20646: the root entry stops carrying the migration registries. defineMapping artifacts are registered but never consumed — wire named mappings into REST import or de-scope from the stack #2611: named import mappings are wired into the import path.Readers
173 needles (each old literal, a 24-character window around each id, and the text left and right of each id) were searched with
git grep -Fover the tracked tree at the base outside the 15 files, with a lit control (composeStacksinstack.zod.ts, hit) and a dark control (a nonsense string, no hit). One needle hit, one line: a//comment inpackages/qa/dogfood/test/fixtures/override-composite-fixture.tsthat quotes the tail of one title with its id. It is a comment, not a reader. The only reader of the declared label is the file's owndescribe(row.label, ...). No group file reads a test name (currentTestName,expect.getState, snapshots: 0). The 15 file names appear elsewhere only in prose and comment lines, inpackages/spec/test-typecheck-debt.json(keyed by file and error text, not by title) and in twodispatch-gates.mjs/check-changeset-no-major.mjsfixtures that name a path or a changeset file. Every old literal occurs exactly once across the 15 files (its own site).Text-only proof
textonly28.cjs(stage 28's, md5957eff6b3837d762b8e03d070155930a), per file, base text against head text: both texts with every string token masked are byte-equal (code and comments), the string-token counts are equal, and every changed token sits in a describe / it / test title position or on a declared line, carried an id at base and carries no#plus digits at head. 15 / 15 files SAME; 57 changed tokens, 56 titles and 1 declared label (run with--declared 91); per-file counts exactly as predicted in writing at 2026-10-08T22:57Z, before the edit. The 3 untouched files read SAME with 0 changed.--declared(refused), the declared line plus another changed string (refused) and the declared line alone (SAME, 2 changed).git diff -U0: 57 plus and 57 minus lines, each the planned line; 0 added lines carry#plus digits; control-byte scan of the 12 files and of this body: 0 hits.Tests
--project local --project repoand the JSON reporter, at the base (same worktree, before the edit) and at the head65b42b7d1: 405 / 405 passed in 15 files, 108 suites each side; per-file test count and status sequence identical in 15 / 15; 229 full names changed, 0 mismatches against the plan (each head name equals the base name with the planned replacement applied); 0 duplicate full names either side; names with#plus digits 229 at base, 0 at head.vitest run --project local: 626 files passed, 18740 tests passed | 1 todo, exit 0.typecheck:VERDICT command-exit 0;check:test-typecheck52 files / 246 errors / 135 pinned signatures held, unchanged;tsc --listFilesOnly -p tsconfig.test.jsonholds 15 of 15 group files.Tasks: 71 successful, 71 total. Heavy runs went throughscripts/pm/os-verify-lock.sh(slotdev-20749-s29).Gates
All at
65b42b7d1. The dispatch list (77 commands, derived at3f80f1716) equals the list re-derived from the real change set at this head, 12 paths against merge base43fc50051(114 changed lines): nothing added, nothing dropped. All 77 exit 0 anddispatch-gates --ranreads "77 derived, 77 run, 0 NOT-MEASURED, 0 UNRUN". Also run, exit 0: the five roster families that share a directory with the diff (check:meta-url-spelling,check:spec-changes,check:authz-resolver,check:error-code-casing,check:filter-alias-parity) andcheck:generated("All 15 generated artifacts are up to date", measured against the dist the full build wrote at this head). ESLint, narrowed and proven: 15 files linted with--no-inline-config, 0 errors, 0 warnings; the population read from ESLint's own config is 15 configured, 0 ignored; no file hasparserOptions.projectorprojectService, so type-aware linting is not enabled and this diff cannot move the verdict of a file it did not touch.Packaging and landing
skip-changeset.npm pack --dry-run --json --ignore-scriptsinpackages/speclists 2069 files, none of the 12 changed files and no*.test.ts; controlssrc/stack.zod.ts,dist/index.mjsandpackage.jsonare present; an old and a new title phrase read 0 files indist/, the controlUnrecognized keyreads 42.check-governed-merges --teston the 12 paths reads 0 of 12; 114 changed lines.git merge-treeontoorigin/main6a53564b9: clean. None of the 17 open PRs touches any of the 15 files (file lists read; 6 of them touchpackages/spec/src, so the scan sees spec files).Acceptance notes
ui/9 / 9 in 7 files,automation/2 / 3 in 1,ai/2 / 2 in 1, andapi/,contracts/andkernel/1 / 1 in 1 each. Their plan is the cutting seat's: stage 27's landing sets the needles stage apart (one stage, with an at-tier review) and keepsui/'s four colour literals as decided, and this stage measured neither.api/meta-item-response-shapes.test.ts1 / 1 (a title, from feat(meta): the /meta item read serves the version token, If-None-Match: * pins a first write, and the 409 carries currentVersion #22126);automation/builtin-node-config.test.ts2 / 3 (two titles, from feat(spec)!: flow value slots refuse the{…}template dialect, naming the CEL spelling of each token (#19939, C half) #22259, which re-added ids to a title stage 10 had rewritten);kernel/manifest.test.ts1 / 1,ui/action-description.test.ts1 / 1 (titles) andui/view-submit-redirect-url.test.ts1 / 1 (anotherstring, to be needle-checked there), all three from fix(spec): author-facing describes and refusals drop service-interface names, ruling dates and foreign example ids #22125. Nothing regrew since stage 28's landing: the per-file census atb7e01fbbdequals the one at43fc50051. Test files are outsidecheck:doc-authoring's ledgered leg, so nothing refused these on arrival. Not edited here.origin/mainmoved from43fc50051to6a53564b9while this ran; one commit touchespackages/spec(api/error-code-ledger.zod.ts, none of the 15 files), so nothing was merged into the branch.Generated by Claude Code