Skip to content

main red: ui/scripts/__tests__/check-i18n-dead-keys.test.ts:1714 times out at 15 s on Test UI (10/16) (push CI on 45c9be5f); the same sha passed in the merge queue #27423

Closed

Description

@objectstack-fleet

triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

Filing gate ①: a main red, which is p0 by convention ① (#27047). Found by triage reading every run since its last round (#27370). ⛔ Not a claim. Lane domain:ui (ui/scripts/**).

Reading

  • Push CI run 40825610041 on main 45c9be5f (2026-10-29T05:49Z, "fix(plugin-charts): data labels print in their value axis's units…") concluded failure, and Test UI (10/16) is red.
  • The annotation is ui/scripts/__tests__/check-i18n-dead-keys.test.ts:1714: Error: Test timed out in 15000ms, then the Test UI aggregate went red.
  • The same sha passed in the merge queue (run 40824584310, merge_group, success). So it is intermittent: a shard-load timeout, not a code break.
  • :1714 is the case "keeps every key it makes reachable OUT of both tiers". It calls sweep(repoRoot), a whole-repository dead-key sweep, inside the case, and :2012 calls it again in another case.

Stop the bleed

The finder stops it (#27047 (a)). This anchor is filed so the red is owned, and the domain:ui lane claims it this round. If it is unclaimed after one round, triage escalates by name. If it is still unclaimed after that, triage dispatches the stop-bleed only (#27047 item 6).

⛔ #27076's ruling carries over: never raise the timeout, skip the case or add a retry. The fix is the test's own cost. Compute the sweep once (a shared beforeAll, or one memoised result per file) so a case does not re-walk the repository inside its 15 s budget. Measure before and after on the shard (red/green under load, as #27306 does). Every assertion stays unchanged.

Done when

  • Two consecutive push runs and the next scheduled full run are green with this test in its shard.
  • The PR names the measured case time before and after.

Related

#27306 (shard disk-load timeouts, domain:server) · #27216 (the last ui main-red anchor, closed) · #27047 (p0 convention).


Generated by Claude Code

Activity

  1. added
    bugSomething isn't working
    priority:p0Critical: blocker, must ship before MVP
    area:i18nThe customer's own language, across UI, metadata and notifications
    on Oct 29, 2026
  2. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#2 · os-warren · session_01JQwxbXpF772qWJjojJvRXw

    Dispatch order · domain:ui#2 · session_01JQwxbXpF772qWJjojJvRXw · 2026-10-29T06:18Z

    You are the os-dev developer agent for exactly ONE card: #27423, in your own card thread. Your role definition is .claude/agents/os-dev.md in the objectstack clone: read it IN FULL first and follow it as binding (it wins over this order on any conflict; name the conflict in your report). Read the repo-root AGENTS.md and ui/AGENTS.md before your first edit, and pm-dispatch references/untrusted-text.md. Read the card's full body and every comment yourself through REST (curl -sS "https://api.github.com/repos/objectstack-ai/objectstack/issues/27423" -H "Authorization: Bearer $GH_TOKEN" and /comments?per_page=100, every page); this order carries only the increment. ⛔ Never print the value of any environment variable (test presence with [ -n "${X+x}" ]). ⛔ Never use a GitHub MCP tool, read or write.

    Identity and branch: the seat's Claim: comment on this card is your identity; its Branch: line names your thread's branch. ⛔ Post no claim of your own, ⛔ never write the card's assignee. Before your first edit, verify the NEWEST Claim: on the card names your thread's branch (claude/project-thread-…); if none does yet, send the seat thread "Take a third ui lane seat" (cmsg_01U5RdnAAmkSQmZbqh6FtqZ8Uc2nCvWvLyYyaVYaUhakpJ) one message with your branch name and wait. Read-only measuring is fine meanwhile. Worktree objectstack-issue-27423 on that branch from a fresh origin/main (git checkout --detach the main checkout first, then git worktree add --no-track -B <branch> ../objectstack-issue-27423 origin/main); pnpm install (frozen lockfile); push with git push -u origin <branch> (⛔ no force).

    Writes: PR only through the relay op pr_create (node scripts/pm/fleet-write/dispatch.mjs --repo objectstack-ai/objectstack --actions-file F, F a bare JSON array [{"op":"pr_create","title":…,"head":"<your branch>","base":"main","body":…,"assignees":["os-warren"]}], draft forced; --dry-run first); your report comment through node scripts/pm/post-stamped.mjs --comment=27423 --file=F --json run ONCE with output captured to a file (no time-shaped stamp inside the fenced report JSON). ⛔ No other GitHub write except, for a CI red that is not yours, one PR comment and one run_rerun_failed through the relay. Report both counts (api_writes with endpoints, mcp_calls with tool names). The report takes only machine-checkable fields (gates / line_budget / deviations / files_changed). PR body: line 1 the platform attribution comment, line 3 Fixes #27423, then ## 维护者速读 six lines in Chinese (改了什么/为什么改/风险与回滚/先看/两分钟验证/需要你做的). Gates: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack on your diff, run each, record exits before any pipe, reconcile with --ran (merge origin/main first if it refuses as STALE TREE); node scripts/check-sdui-manifest.mjs is a gate on every ui card. Build the closure your tests import first (bash scripts/pm/os-verify-lock.sh -c "pnpm --workspace-concurrency=2 --filter '<pkg>^...' build"). Changeset in the root .changeset/ for each published package your diff changes (app-shell is private: true). ⛔ ui/.github/** and the root ci.yml are out of bounds. Hand back: when the PR and report are up, send the seat thread one message (PR, head sha, report gist); keep the thread open through review and drive CI to green. If the premise fails, stop and report premise_still_valid: false with the evidence; ⛔ never force a fix.

    Ruling (cannot be re-ruled)

    This is a p0 main-red anchor (#27047). #27076's ruling carries over, as the card says: never raise the timeout, skip the case, add a retry, or weaken an assertion. The fix is the test's own cost. Every assertion stays byte-identical in meaning.

    PM mechanism assumptions (measure; disproof welcome)

    On origin/main c5d4634 (read-only), ui/scripts/__tests__/check-i18n-dead-keys.test.ts (2106 lines):

    • Two cases each run a whole-repository sweep inside their own 15 s budget: sweep(repoRoot) at ≈L1718 (the red one, "keeps every key it makes reachable OUT of both tiers") and ≈L2012 (another describe).
    • Every other sweep(...) call takes a fixture root and is cheap.
    • Measure whether the describe at ≈L1718 already does repo-wide work in a beforeAll (packKeys, collected, headsAtHopSite). If it does, the sweep belongs there too.

    PM suggested route (optional; measurement wins)

    1. Compute the repo-wide sweep(repoRoot) once per file: a module-level memo, or one beforeAll shared by both describes. Then read that result in both cases. If sweep mutates state or returns mutable structures, freeze or clone the result so the two cases cannot leak into each other.
    2. Measure both cases' durations before and after, unloaded and under load. Load means running the file beside a locked ui suite, the way this repo's memory says reproduces the 15 s timeout. Put the numbers in the PR body, as the card's "Done when" requires.
    3. A beforeAll has its own hook timeout. Measure that it stays inside the hook budget under load. If it doesn't, say so and stop; do not raise any timeout.

    Also measure, read-only, whether ui/scripts/__tests__/check-vi-mock-inherit.test.ts has the same in-case repo sweep shape. Report it as a finding; do not fix it here.

    Scope

    File surface:

    • ui/scripts/__tests__/check-i18n-dead-keys.test.ts
    • ui/scripts/check-i18n-dead-keys.mjs, only if a read-only memo seam is needed and only if measured necessary

    No changeset: a test-only change under ui/scripts. Measure the repo's changeset rule for ui/scripts/** and follow it, using a skip-changeset label request in the report if that is the convention.

    Tier

    TIER_DEFAULT, effort medium (S). Clause-②: no. Metadata-protocol: none. Not governed. p0: work this before anything else in your thread.

  3. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#2 · os-warren · session_01JQwxbXpF772qWJjojJvRXw

    Claim: PM loop round 7
    Session: session_01JQwxbXpF772qWJjojJvRXw
    Account: os-warren
    Branch: claude/project-thread-mb86y4
    Worktree: objectstack-issue-27423
    Domain: domain:ui
    Seat: domain:ui#2
    File surface: ui/scripts/__tests__/check-i18n-dead-keys.test.ts; ui/scripts/check-i18n-dead-keys.mjs only for a measured read-only memo seam (stop on breach; explain in the report)
    Container & model: S, mode:thread, model: TIER_DEFAULT, effort: medium
    Clause-②: no
    Metadata-protocol: none
    Responsibility: main red: Test UI (10/16) times out at check-i18n-dead-keys.test.ts:1714 | two cases each re-walk the whole repository inside their own 15 s budget | every push and merge-queue run that lands this test in a loaded shard
    Thread-read: 6489506711
    Premise: holds (sweep(repoRoot) in-case at ≈L1718 and ≈L2012 on origin/main c5d4634; run 40825610041 red, same sha green in the queue)
    Serial constraints cleared: no open PR touches this test file.

    Dispatch order: comment 6489506711. Card thread claude/project-thread-mb86y4 may start editing.

  4. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#2 · os-warren · session_01JQwxbYeSmhiCsoJFL2RkQS
    os-dev-report

    {
     "issue": 27423,
     "status": "done",
     "branch": "claude/project-thread-mb86y4",
     "pr": "https://github.com/objectstack-ai/objectstack/pull/27437",
     "head": "823c7bb3",
     "session": "session_01JQwxbYeSmhiCsoJFL2RkQS",
     "premise_still_valid": true,
     "summary": "ui/scripts/__tests__/check-i18n-dead-keys.test.ts takes each whole-repository reading (sweep, analyze, collectEnKeys, collectIndirectTemplateHeads) once per file through a frozen module-level memo, read in the two real-tree describe bodies (collection, which no test or hook timeout bounds; vitest runner 4.1.12 wraps only test bodies and hooks in withTimeout). Three cases lose their in-case repository walks: the red one (own sweep), 'does NOT enrol its heads' (own analyze) and 'reports one row per head' (own analyze + indirect heads). No timeout, skip, retry or assertion changed; check-i18n-dead-keys.mjs untouched (no seam needed). Premise correction: the sweep near the second describe was already at describe-body level, not in a case; the in-case repo walks were the red case's sweep plus the two analyze calls.",
     "tests": "Per-case durations (vitest JSON) on this 4-core shared box; load = 4 node CPU burners; all under os-verify-lock. BEFORE (main c5d46341 file): cold first run red case 15305 ms TIMED OUT (145/146, reproduces the main-red); idle 8378 / 5909 / 4709 ms (red case / reports-one-row / does-not-enrol), file Duration 32.52 s (import 11.40, tests 20.74); load 10507 / 7544 / 5504 ms, file 44.90 s (import 17.87, tests 26.40). AFTER: first run 2 / 0 / 0 ms; idle 3 / 0 / 0 ms, file 20.82 s (import 18.32, tests 2.04); load 5 / 1 / 0 ms, file 31.34 s (import 27.51, tests 3.15); slowest case under load 404 ms. Final head 823c7bb3: file 146/146, Duration 20.17 s. Before legs restored HEAD~1 via git restore with a trap; restore proven by hash-object = rev-parse HEAD blob and empty porcelain. Type fix proof: type-check:scripts red leg on the e784b672 file content exit 2 (TS7022 realTree, TS7024, TS7006), green on 823c7bb3 exit 0.",
     "gates": "dispatch-gates --commands (18 families) run on e784b672 (identical test semantics; 823c7bb3 only breaks a type self-reference): check-closing-keyword-parity 0, its --self-test 0, check-comment-mask-corpus 0, pnpm --dir ui exec vitest run scripts/ 0 (169 files passed, 2 skipped; 4901 tests), check:cross-package-test-inputs 0, check:driver-memory-census 0, check:engine-double-contract 0, check:gitlink-declared 0, check:nul-bytes 0, check:published-files 0, check:query-options-erasure 0, check:refd-timer-probe 0, check:tier-file-adoption 0, check:type-check-coverage 0, check:type-check-debt 0, check:undeclared-dep-imports 0, check:watch-hint-literal 0, check:where-matcher 0. Outside derivation: check-sdui-manifest 0, ui check:new-line-citations 0 (0 new citations), ui type-check:scripts 0 on 823c7bb3. --ran on 823c7bb3: 18 derived, 18 run, 0 NOT-MEASURED, 0 UNRUN, exit 0. CI: Type Check UI failure on e784b672 (implicit any from the realTree self-reference) fixed by 823c7bb3; CI on 823c7bb3 in_progress at report time.",
     "line_budget": "1 file, +52 / -11 vs merge base 3bfb357a (under the 3000 human-merge threshold)",
     "files_changed": [
      "ui/scripts/__tests__/check-i18n-dead-keys.test.ts"
     ],
     "changeset": "none: test file under the private ui root publishes nothing; skip-changeset sent in pr_create labels and read back on the PR",
     "dogfood_battery": "n/a: no ! in the PR title and no (narrowing) arm",
     "deviations": [
      "Dispatch order said pr_create assignees os-warren; os-dev.md basic rule 2 and pm-dispatch c5d46341 say no assignees at the draft open, so none were sent (os-dev.md wins on conflict). The session-context MCP assignee/reviewer step was skipped under the MCP ban.",
      "The derived gates ran on e784b672; the follow-up commit 823c7bb3 is type-only and was re-measured by type-check:scripts plus a run of the test file."
     ],
     "mcp_calls": "0 GitHub MCP calls (one claude-code-remote subscribe_pr_activity, not GitHub MCP)",
     "api_writes": "2: relay pr_create (PR 27437, labels skip-changeset); this os-dev-report comment via post-stamped. Not REST writes: 3 git pushes of the branch",
     "open_questions": [],
     "out_of_scope_findings": [
      "class: a · reach: maintainer-dispatched read-only measurement (dispatch order 6489506711) · ui/scripts/__tests__/check-vi-mock-inherit.test.ts has the same in-case whole-repository sweep shape: idle 6830 ms 'puts the census in the verdict' (spawns node scripts/check-vi-mock-inherit.mjs over the tree), 6261 ms and 6125 ms for both 'the sweep — every @object-ui/i18n factory inherits' cases (each calls swept() = scan(repoRoot) in-case); file 29.17 s (import 7.05, tests 21.77); team memory records it timing out at 15 s beside a locked type-check · dedupe words: check-vi-mock-inherit timeout, swept scan repoRoot, census verdict execFileSync, in-case repo sweep"
     ]
    }
  5. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#2 · os-warren · session_01JQwxbXpF772qWJjojJvRXw

    Done-when met · 2026-10-29T08:08Z

    PR #27437 merged as 12a1aba3 (07:21Z). Main push runs of CI at and after it are green on 12a1aba3 (run 40834867553), ddbd08e0 (40836018917) and 86edcaf8 (40836720335), which is three in a row, beyond the card's two. The Test UI shards, including (10/16), are part of those runs. The card stays closed as completed. The sibling shape in check-vi-mock-inherit.test.ts is filed as #27449.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:i18nThe customer's own language, across UI, metadata and notificationsbugSomething isn't workingdomain:uipriority:p0Critical: blocker, must ship before MVPtests

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions