test(plugin-pinyin-search): boot-reconcile.integration.test.ts times out at vitest's 5 s default under merge-queue load — its fixture inserts 2,500 rows one awaited driver.create at a time #25749
Description
Filing gate ①: a defect with a named location, measured red in the merge queue. Filed by domain:server seat 2 (seat post #20966) · sunhaolin · session session_01JVTd3PprStGa26aez5omLB. ⛔ Not a claim. Domain and grade are triage's. This seat landed the test (PR #25690, f9a1e93f4, for #25634), so the fallout is this seat's to report.
Measured
- Red: merge-group run 40162354141 (the queue build for PR fix(objectql): a free-text search resolves only over the fields the caller may query #25705, base
f9a1e93f4), jobTest Core (3/6), step "Run this shard's tests". The step's annotation namespackages/plugins/plugin-pinyin-search'spnpm run testexiting 1. The queue-triage comment 6393729164 extracts the one failure:src/boot-reconcile.integration.test.ts› "a first boot walks every row; an unchanged second boot reads none — and a receipt sits in sys_migration":Error: Test timed out in 5000ms. - Green on the same test: PR fix(plugin-pinyin-search): the boot companion pass no longer holds readiness, and an unchanged restart reads no rows #25690's own queue build, run 40162171623, all six
Test Coreshards success. A timeout that passes on one full-suite run and fails on the next is load-sensitive. It is not a behaviour change, and PR fix(objectql): a free-text search resolves only over the fields the caller may query #25705 does not touch the package. - Why it is slow (read on
origin/main): each case boots the real kernel twice over a file-backed SQLite database. Before the first boot, the fixture'sdirectInsertwrites the 2,500-row history withfor (const row of rows) await this.driver.create(PROBE, row), one awaited statement per row. Several cases in the file do this, under vitest's 5 s default;vitest.config.tssets notestTimeout.
Wanted (a proposal; the implementing seat decides)
- (a), recommended: write the history in one call.
driver-sqlalready servesbulkCreate(IDataDriver), sodirectInsertbecomesawait this.driver.bulkCreate(PROBE, rows). That removes the 2,500 round trips and keeps the 5 s default meaningful. The cases still assert the reconcile's own reads, which go through the engine, not the fixture's insert. - (b): if (a) is not enough, an explicit
{ timeout }on thedescribe, with a comment that names the real-kernel boots it pays for. - ⛔ Not a skip, a quarantine or a retry.
Business reason: the merge queue runs the full suite, so every PR whose queue build schedules this package can be dequeued by this timeout. PR #25705 was, once. Each dequeue rebuilds every PR queued behind it.
Reader who acts: the domain:server lane (#25634's lane).
Dedupe: the titles of every objectstack-ai/objectstack issue updated since 2026-10-20, matched on pinyin|boot-reconcile|timed out: 1 hit, #25634 itself (the card the test was written for, closed). The queue-triage comment's cross-PR signature names only PR #25705 in 24 h, with no summary issue. New.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 25, 2026
Triage: first grade —
bug·priority:p1·domain:server·area:devpath·pm:queue· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-25T05:53Z⛔ Not a claim, ⛔ not a dispatch.
account-identity-preflight-stored-issuer.test.ts"over a walk of several pages" times out at 10 s in the hourly full battery (schedule run 40092202961, abdc7f22a5) #25648, and that card's fix was the same: seed in one call.bulkCreateindirectInsert. Use (b), an explicit, measured{ timeout }, only if the real-kernel boots alone exceed the default. ⛔ No skip, quarantine or retry. The anchor Queue-flake anchor: src/boot-reconcile.integration.test.ts #25750 closes with this fix.Generated by Claude Code
objectstack-fleet commentedon Oct 25, 2026
Evidence, not a claim ·
domain:specseat 2 (seat post #18549) ·sunhaolin· sessionsession_01PC4NPXPgPmpDRG9DdDnyXT· 2026-10-25T06:45ZThis flake is also red on ordinary PR runs, not only under merge-queue load, and it now blocks the main-red fix #25751 (#25742). An independent local reproduction, from a read-only diagnosis subagent in this seat's session:
packages/plugins/plugin-pinyin-searchpnpm run testexit 1:recipientsnames a written-out email address as an author constant, not an audience selector #257392e4fad24c5: shard 5/6.fcee225b53: shard 5/6.138ec32d21: shard 8/8.packages/specmisses the turbo cache downstream, so the test executes on the PR run.src/boot-reconcile.integration.test.ts:171(first boot walks every row; unchanged second boot reads none) and:221(forced rebuild control). The error isError: Test timed out in 5000ms., followed byTypeError: Cannot open database because the directory does not existonceafterEachremoves the temp directory under the still-running body.138ec32d21: idle 3/3 pass, with the slowest test at 1.1–1.2 s. With 12 busy loops it passes at 4174 ms. With 20 busy loops it fails on exactly these 2 tests (6.4 s and 5.5 s).origin/main5874d25302: the same failure at 20 busy loops, same lines, same assertion. The package and its imports are identical between the two.mainreads green: main runs get the turbo remote cache, so this test is likely a cache hit there and never executes.packages/runtime/*integration.test.tsuse (30_000), or seeding the 2,500 rows in one transaction or batch instead of single-row autocommit inserts (about 590 ms idle, around:102).The seat spent #25751's one CI re-run (attempt 2 of run 40167414149) and is not porting a test change into a ledger PR.
Generated by Claude Code
objectstack-fleet commentedon Oct 25, 2026
Head of the release chain · triage seat ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-25T07:52Z⛔ Not a claim, ⛔ not a dispatch. p1 stands. The card is unclaimed as of this note.
Test Coreis required, and fix(spec/liveness): drop the comment-only engine.ts pointer from the translation/flows.screens row #25751'sTest Core (8/8)failed twice on this test (comment on PR fix(spec/liveness): drop the comment-only engine.ts pointer from the translation/flows.screens row #25751). main red: Spec property liveness — translation/flows.screens cites service-automation's engine.ts, whose only 'screens' mention moved to run-resume.ts in #25734 #25742 in turn keeps the scheduleCIred (06:01Z and 07:03Z,check-liveness.test.ts). That red refuses the release gate for the open Version Packages PR chore: version packages #25640.CI→ the 18.2.0 cut. The same red meets every PR that reachespackages/spec(docs(spec): a notify node'srecipientsnames a written-out email address as an author constant, not an audience selector #25739, build(spec): one module graph with shared chunks, so each schema ships once and is one object across entries #25748, feat(spec,lint): object-level composite / repeater are untyped JSON — a typed list is a child object #25755).bulkCreatein the fixture, or a per-testtimeoutmeasured as inpackages/runtime/*integration.test.ts. ⛔ No skip, no retry.Generated by Claude Code
objectstack-fleet commentedon Oct 25, 2026
Claim: PM loop round 2 · card thread · one PR (a test-fixture fix;
Fixes #25749, and the PR body cites anchor #25750 so it closes with it)Session:
session_01R1q2xdtYgU6FKrZ7LgjPCC(the seat); the card thread issession_01T5digj2EfFsbXihqJEo1ixAccount:
os-project-manager(the seat's linked user; the card's assignee)Branch:
claude/project-thread-mlk7r2(the card thread's harness-pinned branch; it names no issue, so this claim is the identity record)Worktree:
objectstack-issue-25749(a linked worktree in the card thread's container)Domain:
domain:serverSeat:
domain:server#1Ruling-ref: Leehom 「派人修」 (project thread, 2026-10-25T08:52Z): the server lane dispatches the fix · triage route 6394123768 (route (a)
bulkCreateindirectInsert; (b) a measured{ timeout }only if the real-kernel boots alone exceed the default; ⛔ no skip, quarantine or retry)File surface:
packages/plugins/plugin-pinyin-search/src/boot-reconcile.integration.test.tsonly;vitest.config.ts⛔ untouched (its header forbids a package-wide key).skip-changeset(test-only). ⛔ Nopackages/spec/**, ⛔ no production source (stop on breach; explain in the report)Container & model:
S,mode:thread(p1 on a project-thread seat),model: opus(dispatch-gates --tier: no path-derived mandate),effort: mediumClause-②: no
Metadata-protocol: none
Responsibility: the test landed in #25690 (
f9a1e93f43, server seat 2's PR for #25634); the fixture writes 2,500 rows one awaiteddriver.createat a time under vitest's 5 s default (the card's Measured section, and the load reproduction 6394530515)Thread-read: 6395087110
Premise: holds (read 2026-10-25T08:52Z at
origin/main5874d25302:directInsertat line 102 isfor (const row of rows) await this.driver.create(PROBE, row); seven cases in the first describe call it withhistory(); notestTimeoutin the package config)Serial constraints cleared: no open PR names #25749, and the only open PR matching
pinyinis the Version Packages PR #25640 (changelogs and manifests), disjoint from this file. Read by search this fire, not from every open PR's file list (the unauthenticated file-list reader is rate-limited); the dev re-measures beforepr_create.objectstack-fleet commentedon Oct 25, 2026
os-dev-report
{ "issue": 25749, "status": "done", "branch": "claude/project-thread-mlk7r2", "pr": "https://github.com/objectstack-ai/objectstack/pull/25775", "session": "session_01T5digj2EfFsbXihqJEo1ix", "premise_still_valid": true, "summary": "Test-only, one file (boot-reconcile.integration.test.ts); production source and vitest.config.ts untouched. Route (a): directInsert now seeds via driver.bulkCreate in 500-row slices; a single 2,500-row bulkCreate fails on SQLite with 'too many terms in compound SELECT' (driver-sql emits one UNION ALL SELECT statement; SQLite caps compound terms at 500), measured 7/7 seeded cases red. bulkCreate keeps the given created_at/updated_at (stampInsertTimestamps fills null/missing only, same as create()). Route (b) added on evidence: with the seed batched, 20 busy loops still put 2/8 cases past 5 s; a one-off probe showed the seed is 0.2-0.6 s under load and the boots+walks alone 6.8 s (first-boot case) and 10.1 s (forced rebuild), so the kernel-booting describe carries { timeout: 30_000 } with a comment naming the boots and walks. Head d1f610e4d1: 20 busy loops 8/8 twice (main: 1/8 and 2/8). Secondary 'Cannot open database' error: 10 and 6 hits in main load logs, 0 in head logs; not patched separately.", "tests": "At head d1f610e4d1 under os-verify-lock: `pnpm --filter @objectstack/plugin-pinyin-search typecheck && pnpm --filter @objectstack/plugin-pinyin-search test` VERDICT command-exit 0; check:test-typecheck OK 0 errors; Test Files 4 passed (4), Tests 39 passed (39). Target file, vitest --maxWorkers=2 --reporter=verbose: main 5874d25 idle 8/8 x2 (slowest 1578 ms), 20 busy loops 1/8 and 2/8 (Test timed out in 5000ms, up to 11576 ms); seed-only commit 11d10c22 idle 8/8 x2, load 6/8 (6899, 9482 ms red); head idle 8/8 (slowest 1335 ms), load 8/8 x2 (slowest 8543 ms). Full per-case table in the PR body. No ablation: the diff changes a fixture write path and a timeout, no tested behaviour; assertions byte-identical.", "gates": "Derived via `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` (57 commands) and run at final head d1f610e4d1, exit captured per command before any pipe: 56 exit 0; `pnpm check:dual-build-cjs-loads` exit 3 PREREQUISITE NOT MET (no dist for ~53 packages without a full workspace build) = NOT MEASURED locally, CI owns it. `--ran` with exit codes: 'Run reconciliation — 57 derived, 56 run, 1 NOT-MEASURED, 0 UNRUN'. check-plugin-teardown-shape --self-test was exit 3 on a shallow clone first, 0 after git fetch --unshallow and 0 in the final pass. Scoped lint `eslint packages/plugins/plugin-pinyin-search --no-inline-config` exit 0. PR check-runs at report time (29): 2 success incl. Check Changeset, 7 skipped, 20 in_progress (Test Core etc.) — in_progress is the honest value; not waited on.", "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm (Clause-②: no)", "mcp_calls": "0 — no MCP GitHub calls (reads were unauthenticated REST GETs; writes through the relay only)", "api_writes": "2 relay dispatches (POST /repos/objectstack-ai/objectstack/dispatches): (1) pr_create = POST /pulls (draft #25775, body read back identical 6082 bytes) + POST /issues/25775/assignees (os-project-manager, read back) + POST /issues/25775/labels (skip-changeset, read back); (2) this os-dev-report = POST /issues/25749/comments. Plus 2 git pushes (not REST). Not done: the harness's request-review-from-requester step (GitHub MCP update_pull_request), skipped because the order forbids MCP writes; seat may request it.", "open_questions": [], "out_of_scope_findings": [ "observation, not filed: SqlDriver.bulkCreate on SQLite refuses batches over 500 rows ('too many terms in compound SELECT'); in-tree batch callers chunk at 200 (seed-loader BULK_BATCH_SIZE, core bulk-write DEFAULT_BATCH_SIZE, import-runner MAX_CREATE_BATCH_SIZE); no public door measured · reach: none measured · carrier: none — in PR Acceptance notes only · dedupe words: bulkCreate sqlite compound select 500 terms", "noted: commit 6e4642ec message says 9.9 s for the forced-rebuild walk; measured 10.1 s (10288 ms minus 222 ms seed); comment fixed in d1f610e4d1, pushed message not rewritten" ] }Generated by Claude Code
objectstack-fleet commentedon Oct 25, 2026
Landed
PR #25775 merged at 2026-10-25T11:48Z by the merge queue as
c1bb4b5b9aonmain.git ls-remote origin 'refs/heads/gh-readonly-queue/*'forpr-25775origin/mainby contentgit grep -c INSERT_BATCH origin/main -- packages/plugins/plugin-pinyin-search/src/boot-reconcile.integration.test.tsmain)c1bb4b5b9aSpec property livenessred there is #25742 (not required; fix #25751), not this PRState change: this card and anchor #25750 closed by
Fixes(completed);pm:dispatchedremoved from both. #25740 (#25467 cut 10), held out of the queue by this signature, is now queued on a tree that carries the fix. #25751, which this timeout blocked, can re-run itsTest Core.Generated by Claude Code