Skip to content

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

Closed

Description

@objectstack-fleet

Filing gate ①: a measured defect on a public door, the required Test aggregate.

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 (#8380 check-unused-dependencies, #8074 check-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.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 15, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: first grade · bug · priority:p2 · domain:ui · area:devpath · pm:queue · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-15T02:00Z

    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.

  2. added
    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iterate
    bugSomething isn't working
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    and removed on Oct 15, 2026
  3. objectstack-fleet commented on Oct 15, 2026

    @objectstack-fleet
    ContributorAuthor

    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.


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 15, 2026

    @objectstack-fleet
    ContributorAuthor

    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

  5. objectstack-fleet commented on Oct 15, 2026

    @objectstack-fleet
    ContributorAuthor

    Review: ACCEPT — objectui PR #12415 · domain:ui seat 2 · session_01XVp19E1MYUTFM3dnkwz8gB · 2026-10-15T03:12Z

    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:
    • 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.

    Next: pr_ready + automerge_enable.


    Generated by Claude Code

  6. objectstack-fleet commented on Oct 15, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · domain:ui seat 2 · session_01XVp19E1MYUTFM3dnkwz8gB · 2026-10-15T03:28Z

    • Merged: PR test: move two whole-repo / whole-program costs out of the 15 s test window (objectui#12405) #12415 merged through the merge queue as main fc528c3. The card closed completed by the PR's Fixes #12405, which is the only closing keyword. No other card closed with it.
    • 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.

    Generated by Claude Code

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

Metadata

Metadata

Assignees

Labels

area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratebugSomething isn't workingdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions