Skip to content

test(spec): the first root-level test file group's titles state each cited decision in words instead of a tracker number (stage 28) - #22342

Merged
objectstack-fleet[bot] merged 2 commits into
mainfrom
claude/issue-20749-test-strings-s28
Oct 8, 2026
Merged

objectstack-fleet[bot] merged 2 commits into
mainfrom
claude/issue-20749-test-strings-s28

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Part of #20749
Clause-②: no

Stage 28 of this card: the next area of class (e), the test strings shipped under packages/spec/src, as ruled in 5902360492 on #20513. This stage takes the first name-ordered group of the test files directly in packages/spec/src/: 20 files, assembled-package-body.test.ts through inline-grid-column-carriers.test.ts. 18 of them carried 61 tracker ids in test titles. All 61 now either state what their record decided, in words (form D), or drop the number where the title already says it. No declared string or expect message in the group carries an id, so no needle is in play. Text only: no assertion, identifier, test count, code comment, file name or non-test file changes. The card stays open for the second group.

Census (re-taken first)

The census instruments of stages 10-27 are not on disk in this container, so census28.cjs (md5 31d8488b5194b8d3048e3fcaec0efaed) was rebuilt from the definition those stage reports give: an AST walk over the packages/spec/src test 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 (each, skip, only chains included), comments never read. It was calibrated against two published readings before it was trusted: 128 messages / 130 ids in 37 files at stage 27's landing f7b8a5932b, and 191 / 200 in 53 files (titles 162 / 168, other 29 / 32) at aa09db58c9. Both reproduce exactly.

reading messages / ids files
the group, base 28bff18d0 61 / 61 (all titles) 18
class (e) whole, base 28bff18d0 134 / 137 (titles 122 / 125, other 12 / 12) 42
class (e) whole, this head 73 / 76 (titles 61 / 64, other 12 / 12) 24
the group, this head 0 / 0 0
files directly in src/, base then head 118 / 120 in 30 files, then 57 / 59 in 12

The group reads 61, the claim's figure: no re-cut. The whole class reads 6 messages / 7 ids above stage 27's landing reading (128 / 130) because five new files outside this group landed since, all in subdirectories: api/meta-item-response-shapes, automation/builtin-node-config (2 / 3), kernel/manifest, ui/action-description and ui/view-submit-redirect-url.

Controls: lit, outside the group, at base and head: ai/build-progress.test.ts 2 / 2, stack-artifact-crossref.test.ts 11 / 12 and stack-inline-action-crossref.test.ts 13 / 13. Lit at base and dark at head, inside the group: the three stage-27 controls, assembled-package-body.test.ts 4 / 4, compose-key-dispositions-export.pin.test.ts 5 / 5 and compose-stacks-action-collision-shape.test.ts 3 / 3 (identical to stage 27's readings of them). Dark: five stage-27 files under system/ read 0 while their comment lines still carry ids, and the 20 group files read 0 at head while 84 comment lines in them still carry ids (a wider pattern, any # plus digits, reads only the (stack #0) index positions of composeStacks refusal text, unchanged). Planted, in a scratch tree: ids in a describe title, a plus-chain title, an expect message, an it.each row name, a template title and a declared string each read once; a comment, a six-digit number, an HTML entity and a markdown heading read 0.

Per file, messages at base: assembled-package-body 4, compose-key-dispositions-export.pin 5, compose-stacks-action-collision-shape 3, compose-stacks-action-echo 4, compose-stacks-action-key-collision 2, compose-stacks-collection-pipe-arm 5, compose-stacks-concat-shape-refusal 1, compose-stacks-i18n-merge 2, compose-stacks-key-loss 8, compose-stacks-manifest-preserve 7, compose-stacks-merge-collection-refusal 1, compose-stacks-objects-shape-refusal 1, compose-stacks-refusal-envelopes 1, cron-typed-positions-retirement 5, define-stack-non-strict-actions-shape-refusal 3, define-stack-non-strict-objects-shape-refusal 1, eager-entry-import 1, inline-grid-column-carriers 7. compose-stacks.test.ts and compose-stacks-merge-config-object-refusal.test.ts carry ids only in comments.

What changed

61 title literals, one line each, in 18 files: +61 / -61.

  • 8 state the decision in words: the assembled body "declared apart from the authoring manifest" and "the mismatch that is the reason two declarations exist" (assembled-package-body 125 and 168), "defineStack's scope-qualified action-key refusal" in place of a rule number (compose-stacks-action-echo 176 and 224), "the 'merge' collection refusal, not an action-key collision" (compose-stacks-action-key-collision 222), "as read before the pipe arm took the authored side" (compose-stacks-collection-pipe-arm 211), "the inbound rate limiting config" (compose-stacks-key-loss 64), and "the export-job family, ScheduleState, the connector DataSyncConfig" (cron-typed-positions-retirement 347).
  • 8 get their subject back where the number was the only subject: the five "compose-key dispositions export, pin N" describes and the three "composition rule N" describes.
  • 45 drop a number the title already explains, with its connector: a #N — prefix, a [#N] prefix, or a trailing (#N).

Cited records

24 distinct ids. 23 answer 200 and were read with every comment the API serves. #14686 answers 404; its decision was read from its landing commit 279431e7a3 and that commit's changeset: defineStack refuses two actions that resolve to one scope-qualified runtime key. The comments counter of three records exceeds what the comments endpoint and the timeline serve (#5051 serves 2 of 5, #14848 7 of 8, #19150 5 of 6); everything served was read. What each record decided, as the titles now say it: #4910 the server key carries the inbound rate limiting config; #5005 the three composition rules (same value passes, a conflict throws a prescriptive error, an undeclared key warns); #5051 i18n joins them (option A, no last-wins); #14242 option B, the assembled body gets its own declaration (option C refused); #14512 a multi-package artifact carries its collections once in the package bodies, and keeps the flattened copy where the bodies cannot reproduce it; #14847 a bound standalone action appears once in the composed object; #14848 ruling 4, objectConflict: 'merge' refuses a differing collection; #14877 ruling 1, the compose-key table is a frozen public export; #15219 ruling A, plugins and devPlugins are envelope keys; #16075 option 1, the refusal extends to fixed-shape config objects; #16320 the seven cron-typed positions are deleted; #16348 composeStacks conflict refusals carry ADR-0112 envelopes; #17158 ruling A, the export-job family retires whole; #18239 ruling B, a non-array objects is refused with the envelope; #19150 a pipe is read on its authored side; #19784 ruling C, a non-array concat key is refused; #19785 and #19799 the non-strict defineStack door refuses a non-array objects and a malformed actions with the envelope; #19816 the collision pass skips a malformed actions and step 7 refuses it; #19930 every published entry imports first under OS_EAGER_SCHEMAS=1; #20901, #20928 and #21142 each inline grid column carrier references InlineGridColumnSchema.

Readers

184 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 -F over the tracked tree at the base outside the 20 files, with a lit control (a known string, hit) and a dark control (a nonsense string, no hit). 7 needles hit, 24 lines: prose, changelog and code-comment lines elsewhere that share a short phrase, two // comment lines in migrations/ that quote the old #20901 header, and one twin title. No gate, doc table, -t filter, snapshot, currentTestName read or self-test reads a rewritten title. The twin: stack-artifact-packages.test.ts:355 carries the same old title as compose-stacks-manifest-preserve.test.ts:308. It belongs to the second name-order group; to keep the pair equal its rewrite should read does not warn about an undeclared composition rule.

Text-only proof

  • textonly28.cjs (md5 957eff6b3837d762b8e03d070155930a), 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, carried an id at base and carries no # plus digits at head. 20 / 20 files SAME; 61 changed tokens, all titles, 0 declared; per-file counts exactly as predicted in writing at 2026-10-08T17:34:10Z, before the edit.
  • 14 / 14 controls on scratch copies of the head files behave as predicted on the first run: an identifier rename, a numeric literal, a comment edit, a non-title string given an id, a rewritten title given a new id, a title that was id-free at base edited, one rewritten title reverted to base (SAME, 0 changed), an it.each row given an id, an expect message changed, a title re-split into a plus chain, a template title given an id, a test added, an id appended to a key-loss title, and an untouched file (SAME, 0 changed).
  • git diff -U0: 61 plus and 61 minus lines, each the planned line; 0 added lines carry # plus digits; every file keeps its line count.

Tests

  • The 20 files with --project local --project repo and the JSON reporter, at the base (same worktree, before the edit) and at the head 437b4778f: 594 / 594 passed in 20 files, 146 suites each side; per-file test count and status sequence identical in 20 / 20; 409 full names changed, 0 mismatches against the plan; 0 duplicate full names either side; names with # plus digits 409 at base, 0 at head.
  • spec vitest run --project local: 626 files passed, 18720 tests passed | 1 todo, exit 0.
  • spec typecheck: exit 0 (VERDICT command-exit 0); check:test-typecheck 52 files / 246 errors / 135 pinned signatures held, unchanged; tsc --listFilesOnly -p tsconfig.test.json holds 20 of 20 group files.
  • turbo build of all packages: Tasks: 71 successful, 71 total. Heavy runs went through scripts/pm/os-verify-lock.sh (slot dev-20749-s28).
  • No reverse verification or ablation applies: no assertion, gate or reader moved.

Gates

All at 437b4778f. The dispatch list (77 commands, derived at fe98cc63a) equals the list re-derived from the real change set at this head, 18 paths against merge base 28bff18d0: nothing added, nothing dropped. All 77 exit 0 and dispatch-gates --ran reads "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) and check:generated ("All 15 generated artifacts are up to date"). ESLint, narrowed and proven: 20 files linted with --no-inline-config, 0 errors, 0 warnings; the population read from ESLint's own config is 20 configured, 0 ignored; no file has parserOptions.project or projectService, so type-aware linting is not enabled and this diff cannot move the verdict of a file it did not touch.

Packaging and landing

  • No changeset: skip-changeset. npm pack --dry-run --json --ignore-scripts in packages/spec lists 2069 files, none of the 18 changed files and no *.test.ts; controls src/stack.zod.ts, dist/index.mjs and package.json are present; an old and a new title phrase read 0 files in dist/, the control Unrecognized key reads 42.
  • Not governed: check-governed-merges --test on the 18 paths reads 0 of 18; 122 changed lines.
  • git merge-tree onto origin/main e36ee5351: clean. None of the 19 open PRs touches any of the 20 files (file lists read; 7 of them touch packages/spec/src, so the reader sees them).

Acceptance notes

  • The next group is root-entry-migrations-split.pin.test.ts through stack.test.ts, 12 files, 57 messages / 59 ids at this head, with the one "other" string at stack-cross-reference-envelope.test.ts to be needle-checked there. The five new subdirectory files named above carry 6 messages / 7 ids; the cutting seat decides where they go.
  • Code comments in these files still carry live ids (84 lines across the 20 files). Comments are not this card's share. Carrier: none.
  • Same-id titles in other packages were not re-measured here; stage 27's list stands.

Generated by Claude Code

…cited decision in words instead of a tracker number (stage 28)

Stage 28 of the runtime-strings burn-down, class (e): 18 of the 20 test
files directly in packages/spec/src from assembled-package-body.test.ts
through inline-grid-column-carriers.test.ts carried 61 tracker ids in
test titles. Each title now states what its record decided, in words, or
drops the number where the title already says it. Text only: no
assertion, identifier, test count or code comment changes.

Claude-Session: https://claude.ai/code/session_01DhTqaEHqPVSVnAkjG3jywn
Co-authored-by: Claude <noreply@anthropic.com>
@objectstack-fleet objectstack-fleet Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Oct 8, 2026
@github-actions

github-actions Bot commented Oct 8, 2026 •

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

Nothing 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): node scripts/docs-audit/affected-docs.mjs --json 5ff7cbe364f939a55633a04891650163c9e8884e → packageMentionDocs.

Re-run of CI for stage 28: the Temporal Conformance job timed out on the
previous head before any test body ran.

Claude-Session: https://claude.ai/code/session_01DhTqaEHqPVSVnAkjG3jywn
Co-authored-by: Claude <noreply@anthropic.com>
@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 8, 2026 20:23
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 8, 2026 20:23
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 8, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Oct 8, 2026
@github-actions

github-actions Bot commented Oct 8, 2026

Copy link
Copy Markdown
Contributor

⛔ merge queue 构建失败 — 先分诊,再决定要不要重排

队列构建 37839445948 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集),
所以失败的测试可能在本 PR 没碰过的包里 —— 那不是重排能修的。每次盲目重排都会让排在后面的所有 PR 重建一轮。

分类:failure —— 按下面的日志分诊。

失败的 job(日志抽取,best effort):

  • Test Core (6/6) — 失败步骤: Check this shard's timing drift(日志不可读,点进 job 看)

↳ 失败原因 是判读的关键:超时(Test timed out in … / Hook timed out in …)多半是负载/时序,不是本 PR 的回归;
断言(AssertionError: …)才指向真实的行为改变。两者的 FAIL 行长得一模一样,只有这一行能区分。

⚠️ 断言这一侧有一类例外,判据是断言在测什么,不是它是不是 AssertionError。 断言的对象是产品行为(一个值、一个形状、一次拒收)⇒ 照上面读:真实的行为改变,去查,⛔ 不要重排掉;
断言的对象是这次实验自身的有效性前提(跑完的耗时、负载下的先后、任何只在时间预算内才成立的条件)⇒ 它跟超时是同一类,同样对负载敏感,重排一次是合法的判别手段。
识别是机械的:断言的消息或它比较的值本身点名了一段时长、一个时间戳、一个耗时计数。实测过的一对 —— AssertionError: SecurityPlugin.init() ran: expected false to be true 测的是产品行为(真回归);
AssertionError: this run took over a second, so second-precision stamps could have differed too: expected 1006 to be less than 1000 测的是实验前提:它守护的那条不变式当时是绿的,同一个 head 原样重排一次即成功。
穿着 AssertionError 外衣的时间测量,仍然是时间测量。(⛔ 这只改「怎么读一次红」,不改「哪些测试可以重排」——后者由别处管。)

跨 PR 相同签名(24h,按失败测试文件聚合):

  • ⚠️ 本次没有可用的聚合签名(日志里没有能解析出测试文件名的 FAIL 行)—— 这不是「没有同签名的其他 PR」,是这一轮没测到。跨 PR 聚合本次不可用,请手工比对其他 PR 的同类评论。
  • ⚠️ 24h 评论账本没读完(超过 5 页仍未读到窗口尽头),所以上面的「不同 PR 数」是下界,不是全量。

历史信号:

  • 本 PR 过去 24h 无队列失败记录(首次)。
  • 过去 24h 队列共有 4 个失败构建(不含本次)。

分诊清单:

  1. 失败测试在本 PR 改动的包里 → 真回归,修 PR。
  2. 失败测试与本 PR 无关 → 看上面的「跨 PR 相同签名」;已有汇总 issue ⇒ flaky/环境问题实锤,去那张 issue 上谈,修好前重排只会再烧一轮全队列。
  3. 两者都不是 → 可能与同组 PR 语义冲突;等前面的 PR 落地或失败出队后再重排一次即可,不要连续重排。

Generated by Claude Code · merge-queue-triage workflow (#4859)

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Queue ejection, triaged: not this PR's failure; one re-queue · domain:spec seat 2 (#18549) · session_01DhTqaEHqPVSVnAkjG3jywn · 2026-10-08T21:03Z


Generated by Claude Code

@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 8, 2026
Merged via the queue into main with commit b7e01fb Oct 8, 2026
37 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-20749-test-strings-s28 branch October 8, 2026 21:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/m skip-changeset PR has no user-facing published change; bypasses the changeset gate tests

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants