test(spec): automation test titles state each cited decision in words instead of a tracker number (stage 10) - #21713
Conversation
… instead of a tracker number The 105 test-title and test-message literals under packages/spec/src/automation that carried a tracker id (110 ids, 55 records) now either state what the cited record decided, or drop a citation the title already explains. Text only: no assertion, fixture value, test count or code comment changes. Claude-Session: https://claude.ai/code/session_01T9u38rswFp5Rw8DswRUReJ Co-authored-by: Claude <noreply@anthropic.com>
vitest prints a table row's `$name` truncated past about forty characters, so the rewritten row now states its decision in a name that prints whole. Claude-Session: https://claude.ai/code/session_01T9u38rswFp5Rw8DswRUReJ Co-authored-by: Claude <noreply@anthropic.com>
📓 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): |
⛔ merge queue 构建失败 — 先分诊,再决定要不要重排队列构建 37195380707 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集), 失败的 job(日志抽取,best effort):
跨 PR 相同签名(24h,按失败测试文件聚合):
历史信号:
分诊清单:
Generated by Claude Code · merge-queue-triage workflow (#4859) |
Part of #20749
Clause-②: no
Stage 10 of this card, and the first area of class (e): the test strings shipped under
packages/spec/src, as ruled in5902360492on #20513. This stage takes the wholeautomation/directory. Its 105 test-title and test-message literals carried 110 tracker ids citing 55 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 (
7e0066af7a, the claim's base)Instrument: stage 9's
census.cjs(md56e42a45a926d375013c32d62f16a296e, byte-identical), plus one added classification pass. 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.Reference: the same instrument reads 1803 messages / 1919 ids in 425 files at
9b8c7f38d7, stage 9's reading exactly. Since then, #21699 added 1 / 1 (ui/component-props-unknown-members.pin.test.ts:143) and #21700 moved 3 / 3 (the two reader literals it re-anchored), which gives 1801 / 1917 at the base.data/ui/report.test.ts3 / 3api/system/job.test.ts4 / 4src/)automation/(this PR)kernel/shared/contracts/conversions/security/ai/identity/integration/migrations/marketplace/,meta-spelling/,studio/system/job.test.tscarriesCronScheduleSchema.timezonein packages/spec is an unvalidatedz.string()— the authoring tier for a job cron zone does not use the membership predicate its own package exports #16292 (:92), spec: duration-shaped number keys carry their unit in describe prose only — twottlkeys with different units in one block, baretimeoutkeys, unit-less tenant timeouts #14478 (:471), 清空剩余 6 条 authorWarn 死键 —— book ×2 / job.id / translation.validationMessages / app.homePageId / app.areas[].order(ADR-0049,v17 限时) #4667 (:836) and [finding]JobSchema's own TSDoc@exampleopens with the keyid, retired in 17.0.0 — the example is refused when copied verbatim #19184 (:881), andui/report.test.tscarries [finding] a joined report'schart— container andblocks[].chart— parses and is never drawn, while the liveness ledger names the joined branch as its reader #20161 (:233), [17.0.0-rc.0] Matrix report date columns are unordered — no server-side ordering, no ORDER BY in aggregate SQL, and the report schema offers no sort declaration #3916 (:334) and ReportSchema 的filter别名指向filters—— 一个 ReportSchema 同样拒绝的键(#4001 战役自己的假处方,第 5 例) #5013 (:426). All seven sit in titles. They wait for a later stage, after [finding]JobSchema.body's published describe still saysos package installexcepts everypulljob, which PR #21683 now refuses when its mapping does not bind #21703 and [finding] spec(report): atype: 'joined'report whose blocks bind nodatasetparses and passesobjectstack validate, while ReportSchema's own refinement comment and reports.mdx say "each block dataset-bound" #21702.automation/approval.test.ts:135reads one title with 审批节点「处理人 Value」应改为记录 lookup(现查 metadata 端点→只能手填);附 approver value 语义核实 + queue 未实现 #3508. Lit, multi-line:api/discovery-environment-subset.pin.test.ts:63-66, a+chain, reads as ONE message with its id on:65. Dark: the// #3508comment atautomation/approval.test.ts:131reads 0. Planted in a scratch copy of the head file: an id in a title reads 1 / 1, and an id in a comment reads 0.#plus digits, so two-digit and six-digit numbers too) reads the same 105 / 110 inautomation/at the base, and 0 / 0 at the head.automation/reads 0 / 0. Nothing else moved.How the area was chosen
The directories are ranked by id count, and a stage takes whole directories up to about 100 ids. The four busiest each exceed that bound alone:
data/(501),ui/(415),api/(201) andsystem/(165). The files directly insrc/(120) are 20% over.automation/(110) is the busiest whole directory within about 10% of the bound, so it is this stage. The rule picked it before any card was read.Its 55 records (53 in this repository, 2 in objectui) were all readable in one pass. 54 answer 200. #6362 answers 404, and its decision was read from its landing commit
b5404f496.Named for the next stages (by directory, from the table):
data/(about five stages, by subdirectory or file group;data/driver/alone is 52),ui/(about four),api/(two),system/(two), the files directly insrc/(one),kernel/(one),shared/(one),contracts/withconversions/(one, 108), andsecurity/,ai/,identity/,integration/,migrations/,marketplace/,meta-spelling/andstudio/together (one, 96). The seven excluded ids joinsystem/andui/once their owners land.What each id became
38 literals (40 ids) now state a decision in words. 67 literals (70 ids) drop a citation the title already explains. Each record was read with its comments through REST, and where a record has no comments, from what landed.
APPROVER_VALUE_BINDINGS: "an approver value is picked from the records the engine resolves".APPROVER_VALUE_SOURCES(the follow-up): "where each picker finds its candidates, published on the wire".requiredis enforced.match-everything write.eb4204b).defaultValue: "a declared variable is bound on every path" (ruling A). Dropped once.flow.zod.ts's tombstone records it). Dropped twice.a648e96).31e0be9).4bfd455). Dropped once.conditionis pointed at the out-edges, NOT given the one-edit rename" (one working routing model, landed5293114).inclusive).assignment). Dropped twice.fields.*value slots added exactly two rows". Dropped three times.ast-only envelope — admitted at first, refused once an evaluated slot required asource". Dropped from 2 titles that state the rule.endnode contract: it may refuse the run with a message" (ruling 2′). Dropped three times.failedis the fold INCLUDING what a delegating node rolled up from its child — it answers what the run caused" (ruling option 1). Dropped three times.b5404f496(webhookwas measured, and all seven keys survive).Readers
-tand--testNamePatternfinds onlypackages/qa/dogfood/README.md:142(-t "owner-scoped"), which is unrelated.automation/has no__snapshots__and notoMatchSnapshot.identity/,security/andautomation/siblings, a later stage's lot. There are also two code comments inflow.zod.tsandflow-function.zod.ts, which belong to the comment lane.packages/lint/src/validate-expressions.test.ts:4442/4445andpackages/services/service-automation/src/decision-branch-expression-absent.test.ts:61/64repeat theflow-decision-branch-expression-absenttable's row names. Nothing compares them mechanically: the "same table" parity is prose in the headers, and it covers assertions, not names. They are outside this stage's surface (see Acceptance notes).Text-only proof
A scratch tool (
textonly10.cjs) compares base and head file by file on three legs:flow-decision-branch-expression-absent.test.ts:63and:66, tablenamevalues that feed$nametitles;sync-retirement.test.ts:120and:158, expect messages). It must carry a tracker id before and no#plus digits after.+chain DIFF.Test counts: the 21 files run at the base (in a separate base worktree) and at the head: 801 / 801 tests on both sides, with the same count and status sequence per file in 21 of 21. 560 full test names change, and each equals the base name with the planned replacements applied.
Changeset:
skip-changesetMeasured, not assumed:
npm pack --dry-runof@objectstack/speclists 2068 files, underfiles[](dist,src/**/*.zod.tsand the rest). 0 of the 21 touched files are in it, and 0*.test.tsat all. The controlsrc/automation/flow.zod.tsis in it.dist/, three new phrases and three old ones each read in 0 files. The controlA predicate slot holds BARE CEL TEXTreads in 2.So this PR publishes nothing, and no changeset is added.
Verification (at
f3dc3fab03)pnpm turbo run buildover all packages: 71 / 71.@objectstack/spec:vitest run --project local, 612 files and 18185 passed, 1 todo.typecheckexit 0, includingcheck:test-typecheck, whose program holds all 21 touched files.dispatch-gates --commandsderived 79 families, and all 79 exit 0.--ranreconciles: 79 derived, 79 run, 0 NOT-MEASURED, 0 UNRUN.--no-inline-configover the 21 files, 0 errors and 0 warnings. The population comes from ESLint's own config: 21 configured, 0 ignored. NoparserOptions.projectorprojectService, so no untouched file's verdict can move.check-governed-merges --test: NOT governed, 210 changed lines.Acceptance notes
the #19961 shapeandthe #17493 controlrow names, and their twindescribetitles keep their ids. The lint copy is this card's own later share (thepackages/linttest strings). The service-automation copy belongs to that package's lane.approval.test.ts:56,:69and:131). They are the comment lane's, untouched here.origin/mainmoved three commits past the base before this PR opened (fix(objectql): droppedFields on a create names only keys the caller sent, never a middleware fill (#21682) #21701, fix(service-automation): flow write-node family refusal ends on the shared prescription sentence (#21624) #21707, fix(metadata-protocol)!: the save door refuses every hook with nobody, including one with neither abodynor ahandler(#21689) #21706). None touchespackages/spec, so nothing was merged.Generated by Claude Code