test(spec): the third ui/ file group's test titles state each cited decision in words instead of a tracker number (stage 22) - #21931
Merged
Conversation
…ecision in words instead of a tracker number (stage 22) Stage 22 of the spec lane's share of the runtime-string burn-down: the test strings shipped under packages/spec/src, the third name-ordered ui/ group (dataset-filter-nested-relation-list.test.ts through view-inline-object-binding.test.ts). 94 literals in 29 files (89 test titles and 5 declared strings: four expect messages and one door name that becomes a describe title) lose 100 tracker ids: 24 literals now state the cited decision in words, 22 get their subject back in words, and 48 drop a number the title already explains. Two needles stay: notification.test.ts:123 slices the source tombstone at its '// [#4610]' anchor, and strictness-batch14.test.ts:395 asserts that two source modules cite '#5015'. 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 22 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 third name-orderedui/group: the 29 id-bearing test files directly underpackages/spec/src/ui/fromdataset-filter-nested-relation-list.test.tstoview-inline-object-binding.test.ts. Those files carried 96 messages and 102 tracker ids, citing 52 records. 100 of those ids now either state what their record decided, in words (form D), or are dropped where the title already says it. Two stay: they are needles, ids that an assertion reads in another file's text (below). Text only: no assertion, identifier, test count or code comment changes, and no file is renamed.Census at the base (
be97cf3c93)Instruments:
census10.cjs(md59d08602ab972b4b8643c90d64d40fa41),census.cjs(md56e42a45a926d375013c32d62f16a296e),census-wide.cjs(md5c98410a19529c439adb0afbfb00026a2) anddirtable.cjs(md5dda605c54745b4a60cc14c9a686e4eff), byte-identical to the copies stages 10 to 21 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/mainatbe97cf3c93, four commits past the claim's3dbd084209. At the claim's base both instruments read 665 messages / 702 ids, the seat's reading and stage 21's head reading. Atbe97cf3c93they read 665 / 704 in 154 files: the two extra ids are insystem/metadata-form-zod-reconciliation.test.ts(22 to 24 ids), a ledgerwhystring that #21901 rewrote. Noui/file moved.ui/(this PR: 29 of the 48 files)api/system/src/)ai/contracts/The group reads 96 messages / 102 ids in 29 files, the seat's figures file for file:
ui/)dataset-filter-nested-relation-list.test.tsdoor-reachability.testkit.test.tsexpression-scope-app-root.pin.test.tsform-layout-inline-grid-retired.test.tsform-option-enum-derive.test.tsi18n-label-resolver.test.tsi18n.test.tsinline-action-type.test.tsinline-action.test.tsinteraction-config-retirement.test.tsjoined-report-block-type.test.tsmaster-detail-detail-sort-field-retirement.test.tsnotification-embed-retirement.test.tsnotification.test.tspage.test.tsreact-blocks.test.tsreport-joined-block-dataset.test.tsreport.test.tsresponsive.test.tssection-group-reference.test.tsstrictness-batch14.test.tsview-authoring-wire-split.test.tsview-console-round-trip-keys.test.tsview-field-order-composition.pin.test.tsview-filter-rule-value-shape.test.tsview-filter-rule-wire-id.test.tsview-form-features-root.test.tsview-gantt-tree-config-closed-15469.test.tsview-inline-object-binding.test.tsSeventeen more test files sit in the same name range and carry no id. The seven "other" strings are the two needles below and five strings rewritten and declared to the text-only tool: the expect messages at
door-reachability.testkit.test.ts:216,i18n.test.ts:166-167(the id is on:167),interaction-config-retirement.test.ts:148and:189, and the door name atform-layout-inline-grid-retired.test.ts:61, whichdescribe(door.name, …)prints as a title.ui/view.test.ts, outside the group, reads 43 ids at the base and at the head. Dark:view-authoring-wire-split.test.tsreads 0 at the head while 11 of its comment lines still carry a number. Planted in scratch copies of head files: an id put into aninline-action-type.test.tstitle reads 1 / 1, and an id put into areport.test.tscomment reads 0.#plus digits) reads the same as the gate pattern in all 29 files at the base.ui/reads 107 / 113, and no other file moved.How the area was chosen
ui/has no subdirectory test file with an id, so it is taken in name-ordered file groups near the ~100-id bound. Stage 21's re-cut named this group at 102 ids, and this census reads 102, so no re-cut was needed.Named for the next stages (cut from the head census, 571 / 604):
ui/113 ids. 106 sit in the last group, the 16 files fromview-item-config-type.test.tstowidget.test.ts(100 messages / 106 ids;view.test.tsalone 43,view-strictness-batch18.test.ts11,view-overlay-viewkind-arm.test.ts10). The other 7 are kept items: stage 20'scomponent-props-unknown-members.pin.test.ts:322, stage 21's four colour literals, and this stage's two needles.api/201, two stages.system/167, two. The files directly insrc/, 120, one.ai/build-progress.test.tsx2,contracts/approval-service.test.ts), the kept:322, and this stage's two. One stage, with an at-tier review.The two needles, kept
notification.test.ts:123,source.indexOf('// [#4610]'). The./ui notification tombstonepins readui/notification.zod.tsand slice it at this anchor, the comment that opens the tombstone atui/notification.zod.ts:94;:134then asserts the slice starts with it. The id is the anchor text of a source comment, so it can only leave together with that comment.strictness-batch14.test.ts:395,expect(source).toContain('#5015'). It readsui/notification.zod.tsandui/sharing.zod.tsand asserts that both record the retirement by citing the record. Those citations sit in source comments atui/notification.zod.ts:48and:103, andui/sharing.zod.ts:22and:106.The five other "other" strings are failure messages of assertions whose expected values carry no id, plus one door name. None is a needle.
What each id became
Every cited record was read with its comments through REST: 51 answer 200 and 1 answers 404. Three citations are cross-repo,
objectui#3907,ui#6206-Bandobjectui#6262, and were read from objectui. Two records closed with no comment, #3916 and #4413; their decisions were read from what landed:f752ee3("give reports a sort declaration") witha831df1("report.orderis live"), andebb209c("withdraw therecord:*blocks from the react tier — no renderer read the props it published"). #11284 answers 404; it was read from its landing commit5383fa6(PR #11695) and that commit's CHANGELOG entry.Where a record's first decision was later corrected, the title follows the corrected one:
ListViewSchema.fieldOrder— declare thecolumns × hiddenFields × fieldOrdercomposition in the contract, with pins, and re-cite the liveness row (ruling B, 2026-09-11; supersedes the 2026-09-04 retirement ruling whose premise was measured false) #15184: its first ruling retiredfieldOrder; ruling B superseded it on a measured false premise (keep the key, declare thecolumnsxhiddenFieldsxfieldOrdercomposition). The title reads "the list-view field composition is declared, not implied", which is ruling B.ViewFilterRuleSchemaaccepts two shapes every consumer refuses, andObjectGridProps.defaultFiltersisz.unknown()so nothing gates it at all — the protocol half of objectui#9050's ruling C′ #19514: [finding][spec] ViewFilterRuleSchema.value 不按算子约束形状 —— 集合算子配标量在发布期通过,直到运行时才拿到 400 #6227 recordedequals+ array as accepted; finding(spec):ViewFilterRuleSchemaaccepts two shapes every consumer refuses, andObjectGridProps.defaultFiltersisz.unknown()so nothing gates it at all — the protocol half of objectui#9050's ruling C′ #19514 reversed that on measurement. The two titles say so, in that order.:147pins), so the census describe names what the census records, not "every key is declared".Stated in words:
ui/)dataset-filter-nested-relation-list.test.ts:1165825670610): the two analytics carriers refuse the list when the filter is saved, not when it is charted; the sharedFilterConditionSchemastays as ruled.door-reachability.testkit.test.ts:156door-reachability.testkit.test.ts:216(expect message)KNOWN BOUNDpin is the record.expression-scope-app-root.pin.test.ts:84appas an expression-scope root — the renderer no longer mounts it"app, and the engine'sSCOPE_ROOTSis the contract.i18n-label-resolver.test.ts:281packages/spec; #6765 is that resolver, held topickLocalized's rule.objectui#3907i18n-label-resolver.test.ts:340pickLocalizedgained the own-property check and the string filter on every limb.i18n.test.ts:99key, which used to parse as a locale map"{ key }parsed as a map for a language calledkey; it is refused by name, under the retired key-reference ruling.inline-action.test.ts:225paramsprescribes per action type — its url meaning is retired, not re-keyed"interaction-config-retirement.test.ts:60,:189(expect message)master-detail-detail-sort-field-retirement.test.ts:489sortField, a key the grid widget declares"object-formruntime form field declares the grid widget's eight camelCase keys,sortFieldamong them.notification.test.ts:78Notificationbelongs to ./api alone"./uinames were deleted;./api'sNotificationis the live contract.page.test.ts:494responsive, which no renderer read"ui#6206-B, #15442page.test.ts:696filter— one filter orthography platform-wide, the ViewFilterRule array"dataSource.filterconverges onViewFilterRule[].react-blocks.test.ts:92ebb209c: therecord:*blocks are withdrawn from the react tier.react-blocks.test.ts:1475383fa6: the react tier adopts the metadata-tier spelling. #14791 in the same literal is dropped: the title names its retirement.report.test.ts:334f752ee3: the time axis is ordered by default, and a report gets its own sort declaration.section-group-reference.test.ts:86,:181deriveFieldGroupLayout.strictness-batch14.test.ts:206compareToconverges on the executor's{ kind, dimension? }. #4001 becomes its subject, the strictness campaign.view-authoring-wire-split.test.ts:105view-filter-rule-value-shape.test.ts:249view-filter-rule-wire-id.test.ts:107view-form-features-root.test.ts:208source, so it is refused one layer up"source.Subject back in words (22 literals): "#5056 premise" becomes "the derived-clone bridge premise"; "the #5068 props gate" becomes "the props gate"; "the #19331 shape" becomes "as its form row writes it" (
object.form.ts's labelledsharingModelselect); "the producer call shape #6761 needs" becomes "… the dataset compiler needs"; "the one departure objectui#3907 did NOT touch" becomes "… the objectui map-limb fix did NOT touch"; "the calls that caused #6761" becomes "the calls behind the dropped dataset label"; "retired at #4988" becomes "retired with the interaction-config family"; "after #4988" becomes "after the family retirement"; "#4738 left it to ./ui alone" becomes "the connector-side rename left it to ./ui alone"; "the #4610 note" becomes "the tombstone note"; "(#5015 took the other half)" becomes "(EmbedConfig, the other half, was retired)"; "#4721, the silently REVERSED sort" becomes "it once parsed as a silently REVERSED sort"; the four#5599 —titles become "the identity precondition …" / "identity precondition — …" where the title needs the subject (:272,:278,:298); "the census record (#20456)" becomes "the census record of the keys the console reads back"; "#6227 — the reported shape" becomes "the reported shape — a set operator carrying a scalar —"; "recorded as ACCEPTED at #6227" becomes "recorded as ACCEPTED by the first value-shape rule"; "#6227 — the refinement" becomes "the value-shape refinement"; "the card's probe … (#15469)" becomes "the probe that found the gap"; "the #14471 typo" becomes "thecolourFieldtypo", the key the test writes; "#6391's union membership" becomes "its union membership".Dropped where already stated (48 literals, 49 ids). A number goes only where the title already says its decision. Examples: the three
#20080 §2/§3/§4prefixes (the§nmarkers stay: the file's own header numbers its sections with them); "[#19920] InlineAction is an inline action body, not unknown"; "… the retired arms are refused with the prescription (#20221)"; "InlineActionSchema —bodyExtrais the payload key,paramsis not (#5777)"; "ListView: objectName / viewType are RETIRED — … (#14791)"; the six#5074 —prefixes beyond the first; the four[#7741]/#5114 —prefixes; "what stays accepted (the #5685 side: never stricter than the runtime)", which keeps "(never stricter than the runtime)", #5685's ruling in words. The batch labels批 14,批 16and(batch 13)stay in the earlier stages' form, andADR-0089 D3astays as a decision-record citation.No file is renamed.
view-gantt-tree-config-closed-15469.test.tskeeps its name; its four title strings are rewritten.Readers
-t/--testNamePattern(the 31 hits aremapfile -t,docker build -t,type -t, acreate-objectstack -ttemplate flag and a self-test's probe strings).__snapshots__directory is tracked underpackages/spec, and none of the 29 files calls a snapshot matcher.master-detail-detail-sort-field-retirement.test.tsis in therepoproject (packages/spec/vitest.repo-tests.json:50); its base and head runs below include it. The other 28 run inlocal.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 4 hits are two code comments that quote thepage.test.ts:494title verbatim:ui/dashboard.test.ts:585andui/responsive.test.ts:14, both reading ("[ADR-0049 enforce-or-remove:page.components[].responsiveis wired into no renderer — and four shipped author-facing texts redirect authors to it as the live alternative (cloud leg unmeasured) #11027] PageComponentSchema — retiredresponsive"). Code comments are not this card's share. The new title keeps "PageComponentSchema — retiredresponsive" as its prefix, so a reader following either comment still finds it.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 five lines:door-reachability.testkit.test.ts:216,form-layout-inline-grid-retired.test.ts:61,i18n.test.ts:167, andinteraction-config-retirement.test.ts:148and:189.+and-lines are exactly the 94 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 expect message given a new id VIOLATION; a kept needle edited VIOLATION; a kept needle's id dropped VIOLATION..eachtitle changes,view-filter-rule-value-shape.test.ts:255, a%stemplate (refuses %s — …): its placeholder and rows are untouched, and the printed names below match the plan. One template-literal title loses only its tail (form-layout-inline-grid-retired.test.ts:141).Test counts: the 29 files were run at the base, in a separate base worktree, and at the head, with
--project local --project repo. Both sides read 858 tests in 29 files, all passed, with the same count and status sequence per file in 29 of 29. 596 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.Changeset:
skip-changesetMeasured, not assumed:
npm pack --dry-runof@objectstack/speclists 2068 files. 0 of the 29 touched files are in it, and no*.test.tsat all. The controlssrc/ui/view.zod.ts,src/ui/report.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
612375dc0c)pnpm turbo run buildover all packages: 71 / 71, through the shared verify lock (VERDICT command-exit 0).@objectstack/spec:vitest run --project local: 619 files, 18471 passed, 1 todo.typecheck: exit 0, includingcheck:test-typecheck(52 files / 246 errors / 135 pinned signatures held). Its program holds all 29 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 set as stage 21, and all 79 exit 0.--ranreconciles: 79 derived, 79 run, 0 NOT-MEASURED, 0 UNRUN, every family with its exit code recorded. The five roster families whose rosters sit under a touched directory were also run, and each exits 0:check:meta-url-spelling,check:spec-changes,check:authz-resolver,check:error-code-casingandcheck:filter-alias-parity.--no-inline-configover the 29 files reads 0 errors and 0 warnings. The population comes from ESLint's own config: 29 configured, 0 ignored. No file setsparserOptions.projectorprojectService, so no untouched file's verdict can move.check-governed-merges --test: NOT governed, 188 changed lines (+94 / -94).mainsince the baseRe-fetched just before this PR opened,
origin/mainwas two commits past the base (faf8dce482: #21917, #21906). Neither touchespackages/specor any of the 29 files, somainwas not merged.git merge-treeontofaf8dce482is clean, and none of the 8 open PRs touches any of the 29 files.Acceptance notes
8e35895832) rewrote awhystring insystem/metadata-form-zod-reconciliation.test.ts, which now carries 24 ids where it carried 22. It is a ledger value, not a title, and it rides thesystem/stages.packages/spec/src, for exampleapi/api-error-code-type.test.ts:71("[[finding] four more exported spec types resolve tounknownwhile their TSDoc promises a shape —ViewMetadataParsed,InlineAction,AssembledViewArtifact,JoinedReportBlock(the #19871 class, other sites) #19920] …"),system/i18n-resolver.test.ts:2652("(spec: view tab labels (tabs[].label) have no translation key and no resolver — the list-page tab bar is untranslatable in every locale #5377)"),ui/view-metadata-schema.test.ts:215("identity precondition (view的 spec 校验闸门形同虚设:saveMetaItem({ item: { nope: 1 } })返回 success 并把{"nope":1}存成一个 active view #5599)"),ui/view-strictness-batch18.test.ts:364("[RESOLVED atViewItemSchema同时是授权形状和 Studio 往返的 wire 成员 —— 拆成两个 schema 还是保持宽松?(挡住 #4001 批 18 最后 2 站点) #5074] …") andui/view-union-diagnostics.test.ts:62("[spec/ui: ViewMetadataSchema 的 union 无判别式且容器成员未导出——消费方做失败诊断只能按成员序索引嵌套 errors #6391] …").lint8,objectql8,service-analytics7,cli4,metadata-protocol4,spec/scripts3,plugin-security2,plugin-sharing1,service-automation1), 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. Three of them cite#6262(objectql) and two cite#6206(plugin-security,plugin-sharing): those are objectstack records, different from the objectui records this group cites.[#4610]/[#5781]banners innotification.test.ts, the#5056section headers indoor-reachability.testkit.test.ts, and the two comments above that quote the oldpage.test.ts:494title. Code comments are not this card's share.Generated by Claude Code