You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
tests: on a slow CI runner two export-to-react-compiles tests (and two check-object-metadata-write-doors tests) cross the 15 s testTimeout, so a slow leg that finishes still ends red #12405
reach: the required Test aggregate on objectui PRs and in the merge queue, whenever a leg lands on a slow runner. objectui#12384's reading measured slow runners at 1.6x to 2.0x per file on 2026-10-14.
Measured (the reading 6181333653 on objectui#12384, and the build report 6181669972)
Job 116029528393 (PR fix(fields): draw a text-valued formula as text, not monospace (objectui#12357) #12383, Test (shard 1/12), a slow VM): two tests in packages/vscode-extension/src/__tests__/export-to-react-compiles.test.ts failed at 17,283 ms and 17,648 ms against testTimeout: 15000, one second before that leg was cancelled. Its same-head re-run, job 116040360598, ran the same two tests at 8,992 ms and 10,049 ms.
Two tests in check-object-metadata-write-doors.test.ts run 8,533 ms and 8,540 ms on a normal VM, with no per-test override. At the measured 1.6x to 2.0x they cross 15 s.
With the 16-leg plan, a slow leg no longer hits the 20-minute cap. So these tests become the failure a slow runner produces: a leg that finishes red, not cancelled.
Acceptance (proposed, for triage to confirm)
Root-cause each test's cost: what it compiles or spawns, and whether that work is needed per test. Make the test cheap enough to hold a ≥2x margin under the existing testTimeout.
⛔ No testTimeout raise, ⛔ no skip, ⛔ no quarantine, ⛔ no retry (objectui AGENTS.md, the test discipline section: find the race, do not tune the timeout).
Dedupe
MCP search_issues on objectstack-ai/objectui, closed included: export-to-react-compiles test timeout slow runner testTimeout 15000 → 4 hits, all closed. Two are the same class on other files (#8380check-unused-dependencies, #8074check-i18n-call-site-keys, each fixed for its own test). #7862 is about Export to React's output, and #6768 about mocks. None covers these two files.
Dedupe words: testTimeout; export-to-react-compiles; slow runner; near budget; check-object-metadata-write-doors.
Read fresh. On a slow runner (measured at 1.6–2.0x), two export-to-react-compiles tests crossed the 15 s testTimeout, at 17.3 s and 17.6 s, and passed at 9–10 s on the re-run. Two check-object-metadata-write-doors tests sit at 8.5 s with no margin. With #12384's 16-leg plan landed (PR #12399), a slow leg no longer hits the job cap, so these tests become how a slow runner turns a green PR red.
Admitted through the fleet-velocity door, with one named instance: job 116029528393, a false red, cured by a same-head re-run.
Lane domain:ui. The direction is the card's: root-cause each test's cost to a 2x or wider margin under the existing timeout. ⛔ No timeout raise, skip, quarantine or retry.
Claim: PM loop round 1
Session: session_01XVp19E1MYUTFM3dnkwz8gB
Account: baozhoutao (the seat's linked user as GET /user answers it; the card's assignee)
Branch: claude/issue-12405-slow-test-cost
Worktree: objectui-issue-12405
Domain: domain:ui
Seat: domain:ui#2
File surface: packages/vscode-extension/src/__tests__/export-to-react-compiles.test.ts, scripts/__tests__/check-object-metadata-write-doors.test.ts, and scripts/check-object-metadata-write-doors.mjs only if its own cost is the root cause, plus a .changeset/ entry. A cost rooted in packages/vscode-extension/src/ itself: stop and report (stop on breach; explain in the report)
Container & model: S, mode:subagent, model: opus (default tier; dispatch-gates --tier --repo objectstack-ai/objectui reads no path-derived mandate). The governed sweep over these paths reads NOT governed
Clause-②: no
Responsibility: objectui's own tests, whose per-test work sits within 2x of the 15 s testTimeout | none: objectui AGENTS.md's test discipline forbids a timeout raise, skip, quarantine or retry | every objectui PR and merge-queue run whose Test leg lands on a slow runner
Thread-read: 6182680091
Dispatch: held for a free batch slot (batch 3 is full at claim time); the dev order goes out when one frees.
Serial constraints cleared: objectui#12384 (PR #12399, the shard plan) merged at 2026-10-15T01:35Z and touched .github/workflows/, not these files (corrected in place at 2026-10-15T02:28Z; the first text said it was still awaiting the maintainer). In flight: objectui#12402, objectui#12397 and objectui#12398, all in packages/app-shell, apps/console or packages/data-objectstack, disjoint.
{
"issue": 12405,
"status": "done",
"branch": "claude/issue-12405-slow-test-cost",
"pr": "https://github.com/objectstack-ai/objectui/pull/12415",
"session": "session_01XVp19E1MYUTFM3dnkwz8gB",
"premise_still_valid": true,
"summary": "Each test's cost is rooted in the test, not in packages/vscode-extension/src or in the gate script. Export to React: each objectui#11515 test built a whole TypeScript program over @object-ui/types' source, about 280 files, costing about 2.7 s of parse and 4.0 s of check per program. Both tests parsed the identical on-disk files. Write-doors: both 'this repository' tests ran the identical analyze(repoRoot) walk over 1,698 files. Parse is about 80% of that walk (3.2 s parse, 0.4 s spellings), so the script is unchanged. The fix follows the #8380/#8074 precedent and AGENTS.md's test discipline: the costs move to module scope (the import phase, governed by no timeout), and the Export to React host shares parsed on-disk SourceFiles per (options, file) across programs. Each compile still gets its own program and checker. No assertion changed, and nothing was raised, skipped or retried. Commit trailers are the model-free pair from objectui AGENTS.md: the harness reminder's model-named trailer was amended away before the first push. The PR footer uses the role file's session-URL form, not the reminder's footer.",
"tests": "Head 56802f1bf. A3, 3 runs each, medians, shared box. Before, in ms: write-doors is-green 6697 (5690/6697/7033), finds-three-doors 5911 (5237/5911/5962), e2r compiles-documented-sample 6735 (6632/6735/7164), e2r no-node-refused 5641 (5612/5641/6563). After: 0 (0/0/1), 0 (0/0/0), 0 (0/0/0), 1 (1/1/1). Per-test margin: at most 2 ms against 15000 ms, so under 10 ms at a 2x slow runner. Where the cost went: both files together went from 'import 1.28-1.37s, tests 23.92-27.29s', wall 13.88-15.35s, to 'import 17.32-17.66s, tests 0.24-0.25s', wall 11.42-11.61s. Aggregate work is down about 9 s. Each file alone after: e2r import 10.66s, tests 197ms; write-doors import 6.59s, tests 36ms. Gates, exit codes captured by redirect: vscode-extension 'pnpm run type-check' (tsc --noEmit && tsc -p tsconfig.test.json, script echoed) 0; 'vitest run packages/vscode-extension/' 0, 4 files, 29 tests; 'vitest run scripts/__tests__/' 0, 187 passed and 2 skipped files, 5658 passed and 2 skipped tests. Root eslint --no-inline-config on the 2 changed files: 0, with --format json reading 2 files, 0 errors, 0 warnings. Narrowing proof for that run: both files resolve under --print-config, and eslint.config.js sets no parserOptions.project or projectService, so linting is not type-aware and the diff moves no verdict on an untouched file. check:phantom-deps, self-import, unreferenced-sources, doc-example-readers, handler-key-reads, side-effects-array, element-data-source-declaration, spec-symbols, action-forward-parity, designer-field-key-parity, icon-record-names, i18n-keys, i18n-drift, i18n-designer-parity, control-bytes and metadata-write-doors: all 0. check-changeset-fixed 0, check-changeset-presence 0. check:spec-floors 1, the known red on main (objectui#12334), recorded and not touched. Ablation: none run. The in-file positive controls still execute on the shared results: the no-node schema yields exactly one TS2322 at the const-schema line, read from the second program, which reused the first one's parsed files.",
"mcp_calls": "0",
"api_writes": "1 relay write: fleet-write dispatch of pr_create (POST /repos/objectstack-ai/objectui/pulls, draft, plus POST /repos/objectstack-ai/objectui/issues/12415/assignees with baozhoutao; read-back identical, 5536 bytes). This os-dev-report comment is the second write. git push is not a REST write. Labels: zero writes, because the dispatch named none and objectui path labels belong to labeler.yml.",
"gates": {"type-check:vscode-extension": 0, "vitest:export-to-react-compiles+write-doors": 0, "vitest:packages/vscode-extension/": 0, "vitest:scripts/__tests__/": 0, "eslint(narrowed,2 files)": 0, "check:phantom-deps": 0, "check:self-import": 0, "check:unreferenced-sources": 0, "check:doc-example-readers": 0, "check:handler-key-reads": 0, "check:side-effects-array": 0, "check:element-data-source-declaration": 0, "check:spec-symbols": 0, "check:action-forward-parity": 0, "check:designer-field-key-parity": 0, "check:icon-record-names": 0, "check:i18n-keys": 0, "check:i18n-drift": 0, "check:i18n-designer-parity": 0, "check:control-bytes": 0, "check:metadata-write-doors": 0, "check-changeset-fixed": 0, "check-changeset-presence": 0, "check:spec-floors": 1},
"files_changed": ["packages/vscode-extension/src/__tests__/export-to-react-compiles.test.ts", "scripts/__tests__/check-object-metadata-write-doors.test.ts", ".changeset/12405-slow-test-cost.md"],
"line_budget": "not applicable (no skills/** or governed ledger touched)",
"deviations": ["The vscode-extension type-check was rerun outside os-verify-lock. The first, locked attempt used pnpm --filter object-ui-vscode, which matched zero projects; the package name is object-ui, and the zero-match exit 0 was discarded, not read as a pass. The rerun was a direct 'pnpm run type-check' in the package dir: two small tsc programs, not locked.", "The narrowed lint ran root eslint on the two changed files, not 'pnpm lint' (turbo run lint). The repo-wide run belongs to CI."],
"open_questions": [],
"out_of_scope_findings": []
}
Reviewed on GitHub at head 56802f1, against triage's direction (6182680091) and the claim (6182989295), not against the dev's report.
Shape: the PR is a draft against main. Its body opens Fixes #12405, the only closing keyword, followed by Clause-②: no. The governed sweep reads NOT governed, 81 lines (+73 / −8), 3 files: the two test files and the changeset. packages/vscode-extension/src/ and scripts/check-object-metadata-write-doors.mjs are untouched.
Root cause, per test:
Each Export to React test built a whole TypeScript program over @object-ui/types' source (about 280 files; about 2.7 s parse plus 4.0 s check), and both tests parsed the same on-disk files.
Both write-doors "this repository" tests ran the same analyze(repoRoot) walk over 1,698 files. About 80% of that walk is parse, so the script itself is not the cost.
The fix follows the repo's own rule, not a workaround:
The whole-program and whole-repo work moves to module scope, and the Export to React host shares parsed on-disk SourceFiles per (options, file). Each compile still gets its own program and checker.
Aggregate work drops: both files went from about 14–15 s wall to about 11.5 s.
No assertion changes, and nothing is raised, skipped or retried, as ruled.
Margin: the four tests' medians went from 5.6–6.7 s to 0–2 ms. That is far past the ≥2x margin the card asks for, at any measured slow-runner factor.
Changeset: empty frontmatter with one true sentence, objectui's form for a test-only change.
Evidence: the vscode-extension type-check exits 0. vitest run packages/vscode-extension/ gives 29 tests, and scripts/__tests__/ gives 5658 passed and 2 skipped. eslint on the 2 files has 0 errors and 0 warnings; the battery and check:metadata-write-doors exit 0. No ablation was run: the positive controls still execute on the shared results (the no-node schema still yields exactly one TS2322, read from the second program).
CI at head: 34 success, 3 skipped, 0 failures (filter=latest), all 12 test shards included.
Verified by content: on origin/main, all 3 files the PR touches are blob-identical to the accepted head 56802f1. They are export-to-react-compiles.test.ts, check-object-metadata-write-doors.test.ts and .changeset/12405-slow-test-cost.md (empty frontmatter).
Label:pm:dispatched is removed in the same stroke as this comment.
Activity
objectstack-fleet commentedon Oct 15, 2026
Triage: first grade ·
bug·priority:p2·domain:ui·area:devpath·pm:queue· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-15T02:00ZRead fresh. On a slow runner (measured at 1.6–2.0x), two
export-to-react-compilestests crossed the 15 stestTimeout, at 17.3 s and 17.6 s, and passed at 9–10 s on the re-run. Twocheck-object-metadata-write-doorstests sit at 8.5 s with no margin. With #12384's 16-leg plan landed (PR #12399), a slow leg no longer hits the job cap, so these tests become how a slow runner turns a green PR red.priority:p2: one measured red, plus the predicted next failure mode after ci: on 2026-10-14 fiveTest (shard N/12)jobs were cancelled at the 20-minute job limit while still passing tests, though their sibling shards finish in 7–13 minutes, so a green PR reads red until a re-run #12384. This is not p1 like ci: on 2026-10-14 fiveTest (shard N/12)jobs were cancelled at the 20-minute job limit while still passing tests, though their sibling shards finish in 7–13 minutes, so a green PR reads red until a re-run #12384, which hit the release PR and caused dequeues.domain:ui. The direction is the card's: root-cause each test's cost to a 2x or wider margin under the existing timeout. ⛔ No timeout raise, skip, quarantine or retry.findingleaves on grading.objectstack-fleet commentedon Oct 15, 2026
Claim: PM loop round 1
Session:
session_01XVp19E1MYUTFM3dnkwz8gBAccount:
baozhoutao(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-12405-slow-test-costWorktree:
objectui-issue-12405Domain:
domain:uiSeat:
domain:ui#2File surface:
packages/vscode-extension/src/__tests__/export-to-react-compiles.test.ts,scripts/__tests__/check-object-metadata-write-doors.test.ts, andscripts/check-object-metadata-write-doors.mjsonly if its own cost is the root cause, plus a.changeset/entry. A cost rooted inpackages/vscode-extension/src/itself: stop and report (stop on breach; explain in the report)Container & model:
S,mode:subagent,model: opus(default tier;dispatch-gates --tier --repo objectstack-ai/objectuireads no path-derived mandate). The governed sweep over these paths reads NOT governedClause-②: no
Responsibility:
objectui's own tests, whose per-test work sits within 2x of the 15 s testTimeout | none: objectui AGENTS.md's test discipline forbids a timeout raise, skip, quarantine or retry | every objectui PR and merge-queue run whose Test leg lands on a slow runnerThread-read: 6182680091
Dispatch: held for a free batch slot (batch 3 is full at claim time); the dev order goes out when one frees.
Serial constraints cleared: objectui#12384 (PR #12399, the shard plan) merged at 2026-10-15T01:35Z and touched
.github/workflows/, not these files (corrected in place at 2026-10-15T02:28Z; the first text said it was still awaiting the maintainer). In flight: objectui#12402, objectui#12397 and objectui#12398, all inpackages/app-shell,apps/consoleorpackages/data-objectstack, disjoint.Generated by Claude Code
objectstack-fleet commentedon Oct 15, 2026
os-dev-report
{ "issue": 12405, "status": "done", "branch": "claude/issue-12405-slow-test-cost", "pr": "https://github.com/objectstack-ai/objectui/pull/12415", "session": "session_01XVp19E1MYUTFM3dnkwz8gB", "premise_still_valid": true, "summary": "Each test's cost is rooted in the test, not in packages/vscode-extension/src or in the gate script. Export to React: each objectui#11515 test built a whole TypeScript program over @object-ui/types' source, about 280 files, costing about 2.7 s of parse and 4.0 s of check per program. Both tests parsed the identical on-disk files. Write-doors: both 'this repository' tests ran the identical analyze(repoRoot) walk over 1,698 files. Parse is about 80% of that walk (3.2 s parse, 0.4 s spellings), so the script is unchanged. The fix follows the #8380/#8074 precedent and AGENTS.md's test discipline: the costs move to module scope (the import phase, governed by no timeout), and the Export to React host shares parsed on-disk SourceFiles per (options, file) across programs. Each compile still gets its own program and checker. No assertion changed, and nothing was raised, skipped or retried. Commit trailers are the model-free pair from objectui AGENTS.md: the harness reminder's model-named trailer was amended away before the first push. The PR footer uses the role file's session-URL form, not the reminder's footer.", "tests": "Head 56802f1bf. A3, 3 runs each, medians, shared box. Before, in ms: write-doors is-green 6697 (5690/6697/7033), finds-three-doors 5911 (5237/5911/5962), e2r compiles-documented-sample 6735 (6632/6735/7164), e2r no-node-refused 5641 (5612/5641/6563). After: 0 (0/0/1), 0 (0/0/0), 0 (0/0/0), 1 (1/1/1). Per-test margin: at most 2 ms against 15000 ms, so under 10 ms at a 2x slow runner. Where the cost went: both files together went from 'import 1.28-1.37s, tests 23.92-27.29s', wall 13.88-15.35s, to 'import 17.32-17.66s, tests 0.24-0.25s', wall 11.42-11.61s. Aggregate work is down about 9 s. Each file alone after: e2r import 10.66s, tests 197ms; write-doors import 6.59s, tests 36ms. Gates, exit codes captured by redirect: vscode-extension 'pnpm run type-check' (tsc --noEmit && tsc -p tsconfig.test.json, script echoed) 0; 'vitest run packages/vscode-extension/' 0, 4 files, 29 tests; 'vitest run scripts/__tests__/' 0, 187 passed and 2 skipped files, 5658 passed and 2 skipped tests. Root eslint --no-inline-config on the 2 changed files: 0, with --format json reading 2 files, 0 errors, 0 warnings. Narrowing proof for that run: both files resolve under --print-config, and eslint.config.js sets no parserOptions.project or projectService, so linting is not type-aware and the diff moves no verdict on an untouched file. check:phantom-deps, self-import, unreferenced-sources, doc-example-readers, handler-key-reads, side-effects-array, element-data-source-declaration, spec-symbols, action-forward-parity, designer-field-key-parity, icon-record-names, i18n-keys, i18n-drift, i18n-designer-parity, control-bytes and metadata-write-doors: all 0. check-changeset-fixed 0, check-changeset-presence 0. check:spec-floors 1, the known red on main (objectui#12334), recorded and not touched. Ablation: none run. The in-file positive controls still execute on the shared results: the no-node schema yields exactly one TS2322 at the const-schema line, read from the second program, which reused the first one's parsed files.", "mcp_calls": "0", "api_writes": "1 relay write: fleet-write dispatch of pr_create (POST /repos/objectstack-ai/objectui/pulls, draft, plus POST /repos/objectstack-ai/objectui/issues/12415/assignees with baozhoutao; read-back identical, 5536 bytes). This os-dev-report comment is the second write. git push is not a REST write. Labels: zero writes, because the dispatch named none and objectui path labels belong to labeler.yml.", "gates": {"type-check:vscode-extension": 0, "vitest:export-to-react-compiles+write-doors": 0, "vitest:packages/vscode-extension/": 0, "vitest:scripts/__tests__/": 0, "eslint(narrowed,2 files)": 0, "check:phantom-deps": 0, "check:self-import": 0, "check:unreferenced-sources": 0, "check:doc-example-readers": 0, "check:handler-key-reads": 0, "check:side-effects-array": 0, "check:element-data-source-declaration": 0, "check:spec-symbols": 0, "check:action-forward-parity": 0, "check:designer-field-key-parity": 0, "check:icon-record-names": 0, "check:i18n-keys": 0, "check:i18n-drift": 0, "check:i18n-designer-parity": 0, "check:control-bytes": 0, "check:metadata-write-doors": 0, "check-changeset-fixed": 0, "check-changeset-presence": 0, "check:spec-floors": 1}, "files_changed": ["packages/vscode-extension/src/__tests__/export-to-react-compiles.test.ts", "scripts/__tests__/check-object-metadata-write-doors.test.ts", ".changeset/12405-slow-test-cost.md"], "line_budget": "not applicable (no skills/** or governed ledger touched)", "deviations": ["The vscode-extension type-check was rerun outside os-verify-lock. The first, locked attempt used pnpm --filter object-ui-vscode, which matched zero projects; the package name is object-ui, and the zero-match exit 0 was discarded, not read as a pass. The rerun was a direct 'pnpm run type-check' in the package dir: two small tsc programs, not locked.", "The narrowed lint ran root eslint on the two changed files, not 'pnpm lint' (turbo run lint). The repo-wide run belongs to CI."], "open_questions": [], "out_of_scope_findings": [] }Generated by Claude Code
objectstack-fleet commentedon Oct 15, 2026
Review: ACCEPT — objectui PR #12415 ·
domain:uiseat 2 ·session_01XVp19E1MYUTFM3dnkwz8gB· 2026-10-15T03:12ZReviewed on GitHub at head
56802f1, against triage's direction (6182680091) and the claim (6182989295), not against the dev's report.main. Its body opensFixes #12405, the only closing keyword, followed byClause-②: no. The governed sweep reads NOT governed, 81 lines (+73 / −8), 3 files: the two test files and the changeset.packages/vscode-extension/src/andscripts/check-object-metadata-write-doors.mjsare untouched.@object-ui/types' source (about 280 files; about 2.7 s parse plus 4.0 s check), and both tests parsed the same on-disk files.analyze(repoRoot)walk over 1,698 files. About 80% of that walk is parse, so the script itself is not the cost.AGENTS.md's test discipline prescribes. It forbidsbeforeAllwarm-up, becausehookTimeout(10 s) is narrower than thetestTimeoutit replaces. The two precedents do the same:check-unused-dependencies.test.ts(finding(tests):check-unused-dependencies.test.tswhole-repo scan flakes on the 15s defaulttestTimeoutunder container load #8380) andcheck-i18n-call-site-keys.test.ts(finding(test-infra):check-i18n-call-site-keys.test.ts's whole-corpus factory-drift test runs past the 15s default and times out under container load — a second instance of the class in #8062 #8074).vitest run packages/vscode-extension/gives 29 tests, andscripts/__tests__/gives 5658 passed and 2 skipped. eslint on the 2 files has 0 errors and 0 warnings; the battery andcheck:metadata-write-doorsexit 0. No ablation was run: the positive controls still execute on the shared results (the no-node schema still yields exactly one TS2322, read from the second program).filter=latest), all 12 test shards included.Next:
pr_ready+automerge_enable.Generated by Claude Code
objectstack-fleet commentedon Oct 15, 2026
Landed ·
domain:uiseat 2 ·session_01XVp19E1MYUTFM3dnkwz8gB· 2026-10-15T03:28Zmainfc528c3. The card closedcompletedby the PR'sFixes #12405, which is the only closing keyword. No other card closed with it.origin/main, all 3 files the PR touches are blob-identical to the accepted head56802f1. They areexport-to-react-compiles.test.ts,check-object-metadata-write-doors.test.tsand.changeset/12405-slow-test-cost.md(empty frontmatter).pm:dispatchedis removed in the same stroke as this comment.Generated by Claude Code