Repository navigation
test(spec): the first ui/ file group's test titles state each cited decision in words instead of a tracker number (stage 20) - #21895
Merged
Conversation
…ecision in words instead of a tracker number (stage 20) The 32 test files directly under packages/spec/src/ui/ from action-confirm-params-guard.test.ts through component-record-block-field-security.test.ts: 94 test titles and two expect messages. Where the cited record decided something the title did not already say, the title now says it in words; where the title already said it, the number is dropped. Text only: no identifier, assertion, comment or non-test file changes. One id stays: component-props-unknown-members.pin.test.ts:322, the `ruling` value the in-file assertion at :417 matches by the id. 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 20 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-orderedui/group: the 32 test files directly underpackages/spec/src/ui/fromaction-confirm-params-guard.test.tstocomponent-record-block-field-security.test.ts. Those files carried 97 messages and 102 tracker ids, citing 65 records. 101 of those ids now either state what their record decided, in words (form D), or are dropped where the title already says it. One id stays, because an assertion in the same file reads it (below). Text only: no assertion, identifier, test count or code comment changes, and no file is renamed.Census at the base (
e085a8c3be)Instruments:
census10.cjs(md59d08602ab972b4b8643c90d64d40fa41),census.cjs(md56e42a45a926d375013c32d62f16a296e),census-wide.cjs(md5c98410a19529c439adb0afbfb00026a2) anddirtable.cjs(md5dda605c54745b4a60cc14c9a686e4eff), byte-identical to the copies stages 10 to 19 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 base is
e085a8c3be, stage 19's landing and the claim's base. Both instruments read 860 messages / 908 ids in 190 files, the seat's reading and stage 19's head reading.ui/(this PR: 32 of the 84 files)api/system/src/)ai/contracts/The group reads 97 messages / 102 ids in 32 files, the seat's figures file for file:
ui/)action-confirm-params-guard.test.tsaction-description.test.tsaction-dispatch-contract.test.tsaction-doubled-redirect.test.tsaction-newtaburl-pair.test.tsaction-on-success.test.tsaction-param-carryover.test.tsaction-param-default-value.test.tsaction-params.test.tsaction-requires-confirmation-docblock.pin.test.tsaction-row-update.test.tsaction.test.tsapp-nav-expanded-alias.test.tsapp-nav-target-exclusivity-export.test.tsapp-strictness-batch19.test.tsapp.test.tsaria-carrier-tombstones.test.tsassembled-view-artifact-type.test.tsassembled-views.test.tsbulk-action.test.tscalendar-config-allday-prescription-17054.test.tschart-aggregate.test.tschart.test.tscomponent-action-element-rows-20371.test.tscomponent-action-row-endpoint-21005.test.tscomponent-element-navigation-17987.test.tscomponent-form-custom-fields-sections-typed.pin.test.tscomponent-object-grid-default-filters.pin.test.tscomponent-object-grid-export-options-members.pin.test.tscomponent-object-grid-pagination-accept-set.pin.test.tscomponent-props-unknown-members.pin.test.tscomponent-record-block-field-security.test.tsThe three "other" strings are
action-requires-confirmation-docblock.pin.test.ts:168and:175(twoexpectmessages) andcomponent-props-unknown-members.pin.test.ts:322. The claim calls the third one anexpectmessage too; it is therulingvalue of a ledger entry. 12 more test files in the same name range carry no id and are not touched.ui/component.test.ts, outside the group, reads 70 ids at the base and at the head. Dark:action-requires-confirmation-docblock.pin.test.tsreads 0 at the head while 4 of its comment lines still carry a number. Planted in scratch copies of head files: an id put into anapp-nav-expanded-alias.test.tstitle reads 1 / 1, and an id put into abulk-action.test.tscomment reads 0.#plus digits) reads the same as the gate pattern in 29 of the 32 files at the base. The other three differ only by 16 hex colour literals ('#0070F3'inapp.test.ts,'#8B5CF6'inbulk-action.test.ts, thecolorsarrays inchart.test.ts), which this PR does not touch.:322),ui/reads 300 / 318, and no other file moved.How the area was chosen
ui/has no subdirectory, so it is taken likedata/, in name-ordered file groups near the ~100-id bound. Stage 19'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, 764 / 807):
ui/318 ids in 53 files, about three stages. The next group nearest 100 runs fromcomponent-record-blocks.test.tstodashboard.test.ts: 7 files, 103 messages / 109 ids (98 titles / 103 ids, 5 other).component.test.tsalone carries 70. Cutting one file earlier gives 88. That group holds five "other" strings:dashboard-chart-structure-refusal.test.ts:94(two ids) anddashboard.test.ts:124(two ids), which read like placeholders (#111,#222), anddashboard.test.ts:205(drillDown是 objectui 读的活能力,却不是 spec 声明的任何键 —— #3752 的迁移处方曾指向它 #5022).api/201, two stages.system/165, two. The files directly insrc/, 120, one.ai/build-progress.test.ts×2,contracts/approval-service.test.ts×1), one stage, with an at-tier review. The id this PR keeps (component-props-unknown-members.pin.test.ts:322) fits there too.The three "other" strings: two rewritten, one kept
action-requires-confirmation-docblock.pin.test.ts:168and:175are not needles. Each one is the failure message (the second argument ofexpect(value, message)) of an assertion whose expected value carries no id:.toEqual([])over the docblock's positiveconfirmTextclaims, and.not.toMatch(/confirmText/)over the classifier's body. Nothing compares the message text. Both are rewritten and declared to the text-only tool.component-props-unknown-members.pin.test.ts:322is kept. Itsruling: 'decision card #21704, fork 4, letter B (record 5979239990)'is the expected value of the assertion at:417in the same file,expect(reason.kind === 'opaque' && reason.ruling, key).toMatch(/#21704/), and therulingslot is typed as naming the record that holds the member (:188). Removing the id turns:417red, and moving that regex would change assertion text, which this stage does not do. It is not a docblock needle, since it reads a value in its own file, but it is held the same way. It is reported for the needle stage.What each id became
confirmText+paramsPAIR at authoring time, once the 20 shipped sites have migrated toaction.description#7428 pair rule".Every cited record was read with its comments through REST: 62 answer 200 and 3 answer 404. Three citations are cross-repo (
objectui#3139,objectui#3382,objectstack-ai/objectui#11610); all three were read from objectui and answer 200. Where a record answers 404, or answers 200 without the decision, the decision was read from what landed:defaultFromRowhas no non-editable carry-over #11753 (404): its ruling, recommendation A, is quoted in its spec-half card spec:ActionParamcarry-over declaration — carried from the row, rendered read-only, submitted verbatim (#11753 ruling, spec half) #11992.ComponentPropsMaprefusesnavigationby name on theobject-kanbanandobject-calendarelement faces while objectui's renderers read and honour it — andobject-timelinehas no entry at all (spec half of objectui#8652) #17987 (404): the landing commite233db9dbb("declare element-levelnavigationon object-kanban / object-calendar and give object-timeline its ComponentPropsMap row"), executing objectui#8652's ruling B.dependsOnbe authorable on a bulk action param?BulkActionParamSchemais not strict, so its accept is a null reading — andtoBulkParamnever consults the field defs, so the one spelling the renderer honours cannot reach the surface #18177 (404): the landing commitadabccf5fb("BulkActionParamSchema is strict and declares dependsOn"), decision batch Release v0.3.3 #146 item 4, letter A.POST /data/sharing/rules绕过SharingRuleSchema:criteria缺失或拼错静默变成"共享该对象全部记录",与 ADR-0049 "never seeded as a permissive match-all" 直接冲突 #3896 (200): the record is a sharing-rule REST defect, closed with no comment. The "close-out" the title names is what landed under that citation: theaction-inert-keys-removedconversion inconversions/registry.ts("capability claims nothing enforced") and theshortcut/bulkEnabledtombstones inui/action.zod.ts.<ObjectChart>aggregate result-column naming is undefined, so its axis bindings cannot be validated #3701 (200, closed with no comment): the convention asui/chart-aggregate.tswrites it down.Stated in words:
ui/)action-confirm-params-guard.test.ts:148confirmTextand carry the question as the param dialog's description, one decision in one dialog.action-description.test.ts:35descriptionjoins the action contract, shaped likelabel, as the param dialog's description line.action-dispatch-contract.test.ts:43,:77bulkActionDefs' own vocabulary"executionvocabulary, and a view that wires it the other way is refused at validate.action-doubled-redirect.test.ts:24precedencefield.action-on-success.test.ts:13onSuccesskey (navigate+openIn) for both types.action-on-success.test.ts:141;action.test.ts:1365bodyoffscriptis refused at publish"action-param-carryover.test.ts:17action-param-default-value.test.ts:250timevalue — a time of day is a zone-less wall clock"ClockTimeValueSchemanarrowed to the zone-less wall clock.action-params.test.ts:139_selectedIdswhen the caller sentselectedIds— the declared channel for a selection"params._selectedIdsis the working declared channel; the reported gap was not one.action-params.test.ts:294roles→positionswith a deprecation window in which the runtime emits both keys.action-requires-confirmation-docblock.pin.test.ts:128,:150,:168,:172,:175confirmText— only declared semantics classify"; "… reopen the declared-semantics ruling before the docblock …" (message)actionLooksDestructiveclassifies on declared semantics only (mode,variant), never on UI copy. #13865 retired the docblock sentence that still namedconfirmText.action.test.ts:85,:141reference, the FieldSchema spelling"; "… atreference, the one key an author writes"ActionParamSchemagainsreference, named asFieldSchema.referenceso the spelling authors already write is the legal one.action.test.ts:217sourceto evaluate, not at the lowering"source.action.test.ts:1116action.aria: no action surface reads it.action.test.ts:1513global_navis retired — it rendered nowhere"global_nav, which rendered nowhere in the running app.action.test.ts:1612action.test.ts:1650visibleWhenis declared,color/default/icon/disabledstay refused.app-strictness-batch19.test.ts:99verifycheck …"assembled-views.test.ts:51bulk-action.test.ts:20z.any()"z.record(z.any()).calendar-config-allday-prescription-17054.test.ts:106allDayFielddid NOT open"CalendarConfigSchemadeclaresallDayField.chart-aggregate.test.ts:45chart.test.ts:271ChartConfigSchema.aria.chart.test.ts:476chart.test.ts:631drillDownwith only the keysObjectChartreads.objectui#3382, #5435chart.test.ts:721ObjectChartgained'navigate', so the union gained the member.objectui#11610component-form-custom-fields-sections-typed.pin.test.ts:496component-object-grid-pagination-accept-set.pin.test.ts:172component-record-block-field-security.test.ts:174requiredPermissionsis declared on the three blocks as a capability set (instruments A and B)"Subject back in words (13 literals): "#7428 —" becomes "the
confirmText+paramsguard" or "the pair guard" (action-confirm-params-guard.test.ts:130,:171), and "the #7428 pair rule" becomes "theconfirmText+paramspair rule" (action-row-update.test.ts:280); "the surfaces #7367 …" becomes "the surfaces the actiondescriptionkey …"; two#17319 —prefixes become "executionon an action" and "dispatch-contract default"; "the pre-existing probes (#9474)" becomes "the spellings tried beforeonSuccessexisted"; "the bare filter #14175 declared" becomes "the bare filter the facade was first typed with"; "#14092 — boundaries" becomes "the declarative row update — boundaries"; "#17631's shape" becomes "the never-parsing gate it once built"; "§6 #21464 is closed out" becomes "§6 thez.unknown()member sweep is closed out"; and two#18159 —prefixes become "the three record blocks" and "the field-security pair".Dropped where already stated (47 literals, 47 ids). A number goes only where the title already says its decision. Examples: "ActionSchema — newTabUrl requires opensInNewTab: true (#11842)"; "ActionSchema — the
executealias is REMOVED (#3855)"; the#15124 —,#15117 —and#5779 —prefixes, each in front of the rule it names; the four[#17987]prefixes oncomponent-element-navigation-17987.test.ts; "— the shape is closed, so its accept means something (#18177)"; "retired fail-open area gates (#4651)".(ADR-0049),(ADR-0066 D4)and(ADR-0078)stay: they cite decision records by number, not tracker ids.No file is renamed. Four file names carry a number (
calendar-config-allday-prescription-17054,component-action-element-rows-20371,component-action-row-endpoint-21005,component-element-navigation-17987); they are not this card's.Readers
-t/--testNamePattern.__snapshots__directory is tracked underpackages/spec, and none of the 32 files calls a snapshot matcher.repoproject:action-requires-confirmation-docblock.pin.test.tsis listed inpackages/spec/vitest.repo-tests.json, because it readspackages/runtime/src/action-execution.ts. The other 31 run inlocal.git grepat the base, across the tracked tree outside its own file. No gate, doc, filter, snapshot orscripts/check-*.mjsself-test reads one. The 11 hits:ui/component.zod.tscitingobjectstack-ai/objectui#11610, and one inai/agent.test.ts:193("POST /data/sharing/rules绕过SharingRuleSchema:criteria缺失或拼错静默变成"共享该对象全部记录",与 ADR-0049 "never seeded as a permissive match-all" 直接冲突 #3896 close-out");content/docs/releases/v17/17-0.mdx:326;runtime(action-engine-facade-find-envelope.test.ts:80, "finding(spec):ActionEngineFacade.find'sFilterConditionslot still admits the ObjectQL envelope{ where: … }at compile time — closing the bar is a vocabulary claim (no field namedwhere) the spec does not declare #15124 — …").None reads a spec test title.
scripts/check-parse-guard.mjsreads a code line ofapp.test.ts,packages/spec/test-typecheck-debt.jsonkeysapp.test.tsandchart.test.tson error signatures, andvitest.repo-tests.jsonlists the docblock pin.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 two lines,action-requires-confirmation-docblock.pin.test.ts:168and:175.+and-lines are exactly the 96 planned lines, and every file keeps its line count.it.eachrow given an id VIOLATION; an undeclaredexpectmessage changed VIOLATION; a title re-split into a+chain DIFF; a declared message given an id back VIOLATION; the kept:322ruling value edited VIOLATION.component-object-grid-pagination-accept-set.pin.test.ts:172) changes only after its${label}span. No.eachtitle,%s/$nameplaceholder or table row changes.Test counts: the 32 files were run at the base, in a separate base worktree, and at the head, with
--project local --project repo. Both sides read 959 tests in 32 files, all passed, with the same count and status sequence per file in 32 of 32. 513 full test names change, and no full name repeats on either side. Each changed name equals the base name with the planned replacements applied. The comparison script flags one name: its plan entry spells’as the source does, and the printed name carries the decoded character. With the escape decoded, that name matches too.Changeset:
skip-changesetMeasured, not assumed:
npm pack --dry-runof@objectstack/speclists 2068 files. 0 of the 32 touched files are in it, and no*.test.tsat all. The controlssrc/ui/action.zod.tsanddist/index.mjsare in it.dist/, a new phrase and an old literal each read in 0 files. The controlUnrecognized keyreads in 42.So this PR publishes nothing, and no changeset is added.
Verification (at
fa39bcf62e)pnpm turbo run buildover all packages: 71 / 71, through the shared verify lock (VERDICT command-exit 0).@objectstack/spec:vitest run --project local: 616 files, 18426 passed, 1 todo.typecheck: exit 0, includingcheck:test-typecheck(52 files / 246 errors / 135 pinned signatures held). Its program holds all 32 touched files, counted 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 19, 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 32 files reads 0 errors and 0 warnings. The population comes from ESLint's own config: 32 configured, 0 ignored. No file setsparserOptions.projectorprojectService, so no untouched file's verdict can move.check-governed-merges --test: NOT governed, 192 changed lines (+96 / -96).mainsince the baseRe-fetched just before this PR opened,
origin/mainwas two commits past the base (67c544ccca: #21887, #21891). Neither touches any of the 32 files, and neither touchespackages/spec: their 9 files are inservice-datasource,qa/dogfood, the QA checklist and one changeset. Somainwas not merged.git merge-treeonto67c544cccais clean. None of the 13 open PRs touches the 32 files.Acceptance notes
component-props-unknown-members.pin.test.ts:322, read by:417) is held for the needle stage, as above.packages/spec/srccite ids this PR handled, 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/job.test.ts:836("retired job.id (清空剩余 6 条 authorWarn 死键 —— book ×2 / job.id / translation.validationMessages / app.homePageId / app.areas[].order(ADR-0049,v17 限时) #4667)"),ui/view-strictness-batch18.test.ts:91("未知键静默剥离仍是全仓默认:把 #3405 的 strict 收紧从一个 schema 推广到整个可授权面(ADR-0078 完整性闸门) #4001 批 18 — …"),ui/view.test.ts:3144("(POST /data/sharing/rules绕过SharingRuleSchema:criteria缺失或拼错静默变成"共享该对象全部记录",与 ADR-0049 "never seeded as a permissive match-all" 直接冲突 #3896 close-out)") andui/component.test.ts:3518("(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)").ui/view.test.ts:3386citesobjectui#5435, a different record.describe/it/testlines outsidepackages/spec/srcfinds 44 lines citing ids this PR handled, in 11 packages:lint16 (6 files),runtime9 (6),cli5 (3),plugin-approvals3 (2),spec/scripts3 (2),objectql2 (2),plugin-security2 (2), and one each inplugin-sharing,qa/dogfood,restandservice-automation. Examples:runtime/src/action-execution-destructive.test.ts:86("(actionLooksDestructivekeys destructiveness offconfirmText— the exact signal #7278/#7309 are migrating away, and 6 of 14 actions flip #7828 Option A)"),lint/src/validate-react-page-props.test.ts:1008("since objectui#3382 (ChartDrillDownSchema.target少一个成员:objectui 的 ObjectChart 现在兑现'navigate',而 #5022 定型的联合按「chart 不读它」把它排除了 #5435)"),cli/test/i18n-extract-action-description.test.ts:26("(Adddescriptionto the action contract (ActionSchema + actionTranslationSchema + i18n extractor) — the maintainer-ruled mechanism for #7278/#7309 #7367)"). Some of the#3896hits there (plugin-sharing,qa/dogfood) cite the sharing-rule record itself.[#13865]header of the docblock pin, the#20323comment aboveaction.test.ts:1116and theobjectstack-ai/objectui#11610comments inui/component.zod.ts. Comments are not this card's share, and none is touched here.Generated by Claude Code