Repository navigation
test(spec): the first system/ file group's test titles state each cited decision in words instead of a tracker number (stage 26) - #21987
Merged
Conversation
…ed decision in words instead of a tracker number (stage 26) Stage 26 of the spec lane's share of the runtime-string burn-down: the test strings shipped under packages/spec/src, the first name-ordered system/ group (auth-config.test.ts through metadata-form-declared-rows.pin.test.ts, with constants/system-names.test.ts in its path position). 91 literals in 18 files (83 test titles and 8 declared expect messages) lose 97 tracker ids: 23 literals now state the cited decision in words, 11 get their subject back in words, and 57 drop a number the title already explains. No needle sits in this group. Text only: one line per literal, no assertion, identifier, test count, code comment or file name changes. Claude-Session: https://claude.ai/code/session_01T9u38rswFp5Rw8DswRUReJ 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): |
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 26 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 first name-orderedsystem/group: the 18 id-bearing test files underpackages/spec/src/system/fromauth-config.test.tstometadata-form-declared-rows.pin.test.ts, withconstants/system-names.test.tsin its path position. Those files carried 91 messages and 97 tracker ids, citing 54 records. All 97 now either state what their record decided, in words (form D), or are dropped where the title already says it. No needle sits in this group. Text only: no assertion, identifier, test count or code comment changes, and no file is renamed.Census at the base (
dcf3eb494a)Instruments:
census10.cjs(md59d08602ab972b4b8643c90d64d40fa41),census.cjs(md56e42a45a926d375013c32d62f16a296e),census-wide.cjs(md5c98410a19529c439adb0afbfb00026a2) anddirtable.cjs(md5dda605c54745b4a60cc14c9a686e4eff), byte-identical to the copies stages 10 to 25 used. A literal counts as a test title when its folded message is argument 0 of adescribe/it/testcall,.each/.skip/.onlychains included. Everything else is an "other" string.The worktree was cut from
origin/mainatdcf3eb494a, the claim's base and stage 25's landing. Both instruments read 282 messages / 297 ids in 71 files, the seat's reading and stage 25's head reading.system/(this PR: 18 of its 34 files)src/)ui/ai/contracts/The group reads 91 messages / 97 ids in 18 files, the seat's figures file for file:
system/)auth-config.test.tsbook.test.tscache.test.tscollaboration.test.tscompliance-families-retirement.test.tsconstants/system-names.test.tscore-service-provider.test.tsdata-migration-flag-column-move.pin.test.tsdisaster-recovery.test.tsemail-config.test.tsemail-template-floor-locale-parity.pin.test.tsenvironment-artifact.test.tshttp-server.test.tsi18n-resolver.test.tsjob.test.tslogging.test.tsmessage-queue-retirement.test.tsmetadata-form-declared-rows.pin.test.tsTen more test files sit in the same name range and carry no id (
constants/platform-object-names,constants/platform-tool-names,core-services,deploy-bundle,doc,encryption,i18n-resolver.nav-label-identity,i18n-resolver.object-list-views,job-pull-organization,license). The eight "other" strings are expect failure messages, rewritten and declared to the text-only tool:compliance-families-retirement.test.ts:159(a template literal),:210and:494;message-queue-retirement.test.ts:87(a template literal) and:127;i18n-resolver.test.ts:3288(the second leaf of a+chain),:3299and:3303.system/metrics.test.ts(4 / 5) andsystem/translation.test.ts(12 / 12), outside the group, read the same at the base and at the head. Dark:i18n-resolver.test.tsreads 0 at the head while 47 of its lines still carry#plus digits: 45 comment lines and the two(batch #58)titles below. Planted in a scratch tree: an id put into the rewritteni18n-resolver.test.ts"per-component copy" title reads 1 / 1 (title:describe), and an id put into ajob.test.tscomment reads 0.#plus digits) reads the same as the gate pattern in 17 of the 18 files at the base. Ini18n-resolver.test.tsit reads two more::1744and:1757end in "(batch Query Protocol: Add comprehensive test coverage and documentation for aggregations, joins, and window functions #58)", a two-digit decision-batch label that the gate's three-to-five-digit pattern does not count. Neither literal carries a counted id, so both stay, in the form earlier stages kept batch labels (stage 21's批 17, stage 22's批 14/batch 13). At the head the wider pattern reads 0 in 17 files and those 2 ini18n-resolver.test.ts.system/reads 63 / 70 in 16 files, and no other file moved.How the area was chosen
system/is taken in path-ordered file groups near the ~100-id bound, the rule stages 20 to 25 used, withconstants/system-names.test.tssorting atconstants/. Stage 25's cut named this group at 97 ids, and this census reads 97, so no re-cut was needed.i18n-resolver.test.ts(56 ids; #21948 landed into it atbab76850cd, and its titles were read at this base) fits one PR and one text-only proof, so it is not split.Named for the next stages (cut from the head census, 191 / 200):
system/group:metadata-form-zod-reconciliation.test.tsthroughworker.test.ts, 16 files, 63 messages / 70 ids (45 / 49 titles, 18 / 21 other). Its first file alone carries 21 / 24, 17 of them "other" strings (its ledgerwhyentries).src/, 120, one stage.What each id became
Every cited record was fetched with all its comments through REST, and its decision was read from its ruling, ACCEPT and landing comments: a keyword digest of every record, and full reads wherever the new words carry a decision. 54 records are cited: 51 answer 200 (#15514 is a PR, merged as
bf1054a4c0) and 3 answer 404. The three that answer 404 were read from what landed, through the commits endpoint (this checkout is shallow), each found through its CHANGELOG entry or the file's own commit anchor:submitLabelcopy key lost its only declared carrier whenelement:formretired (#9249) — decide retire vs re-anchor #10926, fromd173125fb8(feat(spec): retire the component-translation submitLabel copy key (#10926, ADR-0049) #11438): the component-translationsubmitLabelcopy key is retired (maintainer ruling 2026-08-22, option A);translatePagestops at region-level components, so copy on components nested in another component'sproperties.childrenis authorable but never resolved — 4 KPI labels stay English on hotCRM's zh-CN landing page #12961, from901355c3bc(fix(spec): translatePage resolves copy for components nested in properties.children #13111):translatePagedescends into declaredproperties.children("Ruled 2026-08-29 (option A)"; region-level id wins a collision);translatePage's addressed-component walk is not exported, so the CLI extractor hand-mirrors its depth cap, cycle guard and collision arbitration — the copy hazard the key list closed, left open for the walk #13218, fromc45d8e6b4e(feat(spec,cli): export the addressed-component walk and consume it from both sides (#13218) #13641):walkAddressedPageComponentsis exported as the one addressed-component walk, consumed bytranslatePageand the CLI extractor alike.The same-id title stage 25 listed:
book.test.ts:413"ResolvedBookSchema is the book-tree response contract (#12038)". Its body parses the realresolveBookTree()output, accepts the honest-empty tree and pins each Zod schema type-identical to its interface: a describe-only transcription, which the five-part ruling's implementation plan names (5434804846). None of 1C · 2C · 3A · 4A · 5A is pinned, so no letter is named; the title already says the decision, and only the number goes."ruled:" appears in two titles, each on a record that carries a ruling:
data-migration-flag-column-move.pin.test.ts:72: "(ruled: one nullable datetime on the flag row)". driver-sql: store the file family (file/image/avatar/video/audio) as the baresys_fileid in a string column — dropFILE_REFERENCE_TYPESfromJSON_COLUMN_TYPES, per-deployment switch on theadr-0104-file-referencesflag (ruling on #15041, step 2) #15989's comment5556979386, headed "The four questions — ruled", answers Q1 with A: a new nullable datetime field onDataMigrationFlagSchema, whose failure mode is absence. spec(system): DataMigrationFlagSchema gains the nullable datetime that attests ADR-0104 step 3 ran on this deployment #16185's body restates it ("The mechanism was ruled on driver-sql: store the file family (file/image/avatar/video/audio) as the baresys_fileid in a string column — dropFILE_REFERENCE_TYPESfromJSON_COLUMN_TYPES, per-deployment switch on theadr-0104-file-referencesflag (ruling on #15041, step 2) #15989 as A").i18n-resolver.test.ts:4944: "(ruled: the authored label is the default-locale text)". [Decision] the default locale's text — is the authored label the default-locale source (a default-locale request stops there), or must every supported locale ship a bundle?os i18n checksays the former,localeChaindoes the latter; the resolver's literal['en']default rides on the answer #15711's maintainer ruling A, recorded in5549577889.Stated in words (23 literals):
system/)auth-config.test.ts:423invite_only/email_domain/open),invite_onlywhen undeclared, as the body records it ruled.cache.test.ts:336,collaboration.test.ts:1005,disaster-recovery.test.ts:235system/duration keys carry their unit in the key name, stage 25's #15677 reading.compliance-families-retirement.test.ts:210,:494(expect messages)5548577921): the three compliance-shaped families are retired whole; none is roadmapped.data-migration-flag-column-move.pin.test.ts:72data-migration-flag-column-move.pin.test.ts:126isDataMigrationFlagVerifiedis not touched; the new field is read in addition to the arbiter, never inside it.job.test.ts:881id, so a verbatim copy is accepted.message-queue-retirement.test.ts:127(expect message)i18n-resolver.test.ts:1207dashboards.NAME.globalFiltersbecomes a bundle group.:1573:2215c45d8e6b4e.:2652_tabs"objects.OBJECT._tabs.TAB.labelkey and a resolver.:3049_actionstranslations":3131label/help/optionsentries the response declares.:3308/i18n/localesreports the app's declared locales, not every loaded bundle.:3732,:4134flowsbundle group" / "resolveFlowScreenTitle — a screen title from theflowsbundle group"TranslationData.flows.:4726:4853en, at the resolver"fallbackLocale, not a hard-wired['en'].:4944:5011items.Subject back in words (11 literals):
ExternalDataSourceSchema.authentication(clientSecret/apiKey) andMessageQueueConfigSchema.sasl.password— census toward #7990's parked boundary-guard reopen trigger #8075" template messages become "after the families' retirement" / "after the family's retirement", stage 25's form;en) has no fallback floor: the resolver retries only the literalen-US, so every unlisted recipient locale dead-letters permanently #17614 — the published "must stay equal" claim" becomes "EMAIL_TEMPLATE_FLOOR_LOCALE — the published "must stay equal" claim", the constant whose docblock carries it;/meta/objectread — and neither do extension scalar overrides #8284" / "pre-i18n: a published org overlay on a packaged view label is served to a zh-CN reader as the catalog translation (进行中), not the edit — the view twin of #20680 #20731" control titles become "the behaviour before the override rule", the rule their describes name ("the catalog loses to an explicit override");translatePagestops at region-level components, so copy on components nested in another component'sproperties.childrenis authorable but never resolved — 4 KPI labels stay English on hotCRM's zh-CN landing page #12961 line left open, made by i18n: two surfaces a translation bundle cannot address at all —walkAddressedPageComponentsmisses a slotted page'sslotsand a tabs node'sitems[].children, anddashboards.NAMEhas noglobalFiltersgroup #16772" becomes "the contract call thechildren-descent ruling left open, made for tab and accordion panels": the 2026-08-29 ruling (901355c3bc) namedproperties.childrenonly, and i18n: two surfaces a translation bundle cannot address at all —walkAddressedPageComponentsmisses a slotted page'sslotsand a tabs node'sitems[].children, anddashboards.NAMEhas noglobalFiltersgroup #16772 made theitems[].childrencall.Dropped where already stated (57 literals, 60 ids). A number goes only where the title already says its decision. Examples:
[#15513]x2 and[#8075]retirement describes and[#4740]; the four other[#15711]prefixes, once the ruling is stated in the first; the tails(#18124),(#4667)x2,(#12038),(#4611),(#4451),(#5307),(#14865),(#4938),(#5295),(#16292),(#19085),(#20439),(#4854),(#21257),(#10926),(#12961),(#5775),(#20940)x3,(#16772)x4,(#5377)x2,(#5728)x2,(#3847)x2,(#7634)x4 (one title and three expect messages),(#8284),(#11745),(#14253)x6; theobjectstack#14972tail with its repository qualifier; the ADR-bearing tails(#4740, ADR-0049),(#20680, ADR-0029 D9.2a),(#20731, ADR-0029 D9.2a),(#14478, ADR-0087 …), which keep their ADR;pre-#4740before "v0 artifact"; and(#17782, #15939, #14478)on "logging duration keys → *Ms", whose title shows the rename. The two 404 numbers among them (#10926, #12961) go only where the title already states what landed.No file is renamed.
Readers
expect), none is an expected value. The three.pin.test.tsfiles read source text, and none reads an id:data-migration-flag-column-move.pin.test.tsreadsisDataMigrationFlagVerified's body forverified_at,blockingand the absence ofcolumns_moved_at;email-template-floor-locale-parity.pin.test.tsreadsDEFAULT_TEMPLATE_LOCALEand "must stay equal";metadata-form-declared-rows.pin.test.tsreads registered form rows.job.test.ts's@examplepin reads the anchor "@example Metadata Sync Job (Cron)". No title or message in the group is matched against a source docblock or another file's text.-t/--testNamePatternto vitest; the one vitest-thit is a README example underpackages/qa/dogfoodfiltering its own fixture.__snapshots__directory is tracked underpackages/spec, and none of the 18 files calls a snapshot matcher.compliance-families-retirement.test.tsandemail-template-floor-locale-parity.pin.test.tsare in therepoproject (packages/spec/vitest.repo-tests.json); the other 16 run inlocal. The base-versus-head run below takes both projects.git grepat the base, across the tracked tree outside its own file. No gate, doc, filter, snapshot, QA checklist entry orscripts/check-*.mjsself-test reads one. The 12 hits are sibling test titles: the three(#15679)titles in this group hit each other (all rewritten here) and the five(#15679)titles of the secondsystem/group (metrics,object-storage,registry-config,tracing,worker), which go with that stage.Text-only proof
Stage 10's scratch tool (
textonly10.cjs, md5d5e4801dbb4329ab1984da91e92fc47c) compares base and head file by file on three legs:#plus digits after. This stage declares the eight expect-message lines named above.+and-lines are exactly the 91 planned lines as multisets, and every file keeps its line count.it.eachrow given an id VIOLATION; an undeclared expect message changed VIOLATION; a title re-split into a+chain DIFF; a declared expect message reverted to base SAME; a declared template expect message given a new id VIOLATION; a declared+-chain leaf given a new id VIOLATION; a template-literal title given a new id VIOLATION..eachtitle and no$nameplaceholder changes. The two template literals change only their text after the${…}span.Test counts: the 18 files were run at the base, before the edit, and at the head, in the same worktree, with
--project local --project repo. Both sides read 783 tests in 18 files, all passed, with the same count and status sequence per file in 18 of 18. 354 full test names change, and each changed name equals the base name with the planned replacements applied: 0 mismatches. No full name repeats on either side. No head name carries a gate-pattern id (354 base names did); two head names carry the kept "(batch #58)". No source escape sits in a planned anchor, so the comparison tool met none.Changeset:
skip-changesetMeasured, not assumed:
npm pack --dry-runof@objectstack/speclists 2068 files. 0 of the 18 touched files are in it, and no*.test.tsat all (files[]shipssrc/**/*.zod.ts, not tests). The controlssrc/system/job.zod.ts,src/system/translation.zod.tsanddist/index.mjsare in it.dist/, two new phrases and an old one each read in 0 files. The controlUnrecognized keyreads in 42.So this PR publishes nothing, and no changeset is added.
Verification (at
ed2bc649f3)pnpm turbo run buildover all packages: 71 / 71, through the shared verify lock (turbo exit 0, recorded to a file;VERDICT batch-last-exit 0).@objectstack/spec:vitest run --project local: 619 files, 18485 passed, 1 todo.typecheck: exit 0, includingcheck:test-typecheck(52 files / 246 errors / 135 pinned signatures held). Its program holds all 18 group files, counted by path withtsc --listFilesOnly -p tsconfig.test.json.check:generated: all 15 generated artifacts up to date, against thedist/the build above wrote.dispatch-gates --commandsderived 79 families, the same 79 as stage 25. All 79 exit 0.--ranreconciles: 79 derived, 79 run, 0 NOT-MEASURED, 0 UNRUN, every family with its exit code recorded. The same 79 derive fromorigin/main4e4e881427with this diff applied. The five roster families marked as sharing a directory with this diff (check:meta-url-spelling,check:spec-changes,check:authz-resolver,check:error-code-casing,check:filter-alias-parity) each exit 0.--no-inline-configover the 18 files reads 0 errors and 0 warnings. The population comes from ESLint's own config: 18 configured, 0 ignored. No file setsparserOptions.projectorprojectService, so no untouched file's verdict can move.check-governed-merges --test: NOT governed, 182 changed lines (+91 / -91).mainsince the baseRe-fetched just before this PR opened,
origin/mainwas three commits past the base (4e4e881427: #21976, #21977, #21352). They touch 490 files, none of the 18 and none underpackages/spec/src/system/, somainwas not merged. The census of4e4e881427with this diff applied reads 191 / 200, file for file the same as the head.git merge-treeonto4e4e881427is clean, and none of the 5 open PRs touches any of the 18 files.Acceptance notes
(#15679)titles of the secondsystem/group,system/translation.test.ts's six (#16772,#6080,#10926,#21257,#11287,#4667) andstack-email-template-locale-floor.test.ts's four#17614titles.driver-sql13,cli12,objectql10,rest10,lint8,platform-objects6,plugin-auth6,core3,runtime3,service-i18n3, and one each inclient,plugin-approvals,qa/dogfoodandsdui-parser), each package's share under the [finding] runtime warnings outside the migration ledger print tracker numbers to authors and operators: theAutomationEngineresumeAuthority boot warning (#3801/#5561/#3823) and two objectql data-event warnings (#4639/#4626) #20513 lane children.i18n-resolver.test.ts:1744,:1757) stay: a two-digit decision-batch label outside the gate's pattern, with no counted id in the literal.// #18124 — step 3 of ruling A on #18115header inauth-config.test.ts, the[#16185]docblock indata-migration-flag-column-move.pin.test.ts, the[#17614]docblock inemail-template-floor-locale-parity.pin.test.tsand the// ─── [#8075]/[#15513]banners. Code comments are not this card's share.Generated by Claude Code