Repository navigation
test budget (domain:spec): 26 test file(s) over 10 s of wall in the hourly full battery (Part of #23151) #23180
Description
Filing gate ③, a maintainer-ruled duty: #22949 ruling E item 3 (6125775640) and #22998's test-budget rule, "a test file over 10 s of wall is a card for the owning lane". This is one lane's share of #23151, which asks triage to split its reading per owning lane.
Filed by the triage seat (seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U. ⛔ Not a claim. Part of #23151.
Reader who acts: the domain:spec seat. The packages below are this lane's in the pm-dispatch domain table.
The reading
From #23151, which takes it from the refresh run 38340176409 (measure-test-shard-timings --diff) over 20 hourly full-battery runs. Each row gives the file's slowest executed run in that window. Re-check: the next refresh PR's own list.
| package | files | slowest | file → seconds (run) |
|---|---|---|---|
@objectstack/spec |
24 | 902.1 s | scripts/build-schemas-check-mode.test.ts (repo) 902.1 s (38228297391)scripts/liveness/check-liveness.test.ts (local) 493.4 s (38332198724)src/contracts/scoped-context.test.ts (local) 91.1 s (38332198724)scripts/dist-freshness-adoption.test.ts (repo) 55.6 s (38319885190)src/integration/connector-author-shape.test.ts (local) 49.5 s (38332198724)src/shared/alias-integrity.test.ts (local) 40.8 s (38228297391)scripts/def-key-collisions.test.ts (repo) 40.7 s (38319885190)scripts/strictness-ledger-doc.test.ts (repo) 34.4 s (38228297391)src/eager-entry-import.test.ts (local) 25.7 s (38228297391)scripts/openapi-self-consistency.test.ts (local) 24.9 s (38332198724)scripts/dist-freshness.test.ts (repo) 20.2 s (38228297391)scripts/upgrade-guide-docs.test.ts (local) 19.8 s (38325245250)src/api/rest-api-config-dead-keys-retirement.test.ts (repo) 17.8 s (38332198724)src/data/cube-member-inner-name-retirement.test.ts (repo) 17.6 s (38332198724)src/system/compliance-families-retirement.test.ts (repo) 14.6 s (38228297391)scripts/conversions-major18-merge.test.ts (repo) 14.6 s (38228297391)src/qa/requires-plugins-retirement.test.ts (repo) 12.4 s (38332198724)src/shared/retired-key-migrate-sentence.test.ts (repo) 12.1 s (38332198724)src/integration/connector-resilience-keys-retirement.test.ts (repo) 11.9 s (38319885190)src/data/cube-refresh-key-retirement.test.ts (repo) 11.9 s (38332198724)scripts/projection-cli.test.ts (local) 11.4 s (38228297391)src/kernel/metadata-type-registry-allow-org-override-absence.test.ts (repo) 11.4 s (38228297391)src/ui/view.test.ts (local) 10.9 s (38228297391)src/ui/app.test.ts (local) 10.8 s (38228297391) |
@objectstack/lint |
2 | 19.2 s | src/runtime-lazy-deps.test.ts 19.2 s (38314183560)src/lazy-deps.test.ts 18.0 s (38267594064) |
What done looks like
- Each file named above runs under 10 s of wall. The fix is to the test, or to what it waits on.
- ⛔ No deletion without a named duplicate (skills(ci): two-speed CI — fast set on PR and merge-queue runs, full battery hourly on main and before a release, main-red stops the lane, four required contexts plus the guard, timing gates report-only, test budgets not deletions #22998). ⛔ No timeout raise. ⛔ No move to a slower or skipped project to hide it.
- Pin: the next refresh PR's list no longer names the file.
- One PR per file or one per package, whichever the seat measures smaller. Each PR says which rows it closes.
Grade (triage)
tooling · priority:p2 · domain:spec · area:devpath, into pm:queue. It is maintainer-directed (#22949 ruling E), so the product-only queue rule's exemption applies.
- Why p2 here, not p3: two files in this lane (
build-schemas-check-mode.test.tsat 902 s,check-liveness.test.tsat 493 s) dominate the full battery's wall time. They are the largest input to the shard-timing drift that has turned the hourly run red before (hourly full run: red on main (CI) #23107).
Activity
objectstack-fleet commentedon Oct 14, 2026
Claim: PM loop round 3 · 2026-10-14T18:09Z · the two dominant rows only (
Part of #23180; the card stays open for its other rows)Session:
session_0121ooBYRmS8ziFXm9ai5YHmAccount:
sunhaolin(the seat's linked user asGET /useranswers it; this card's assignee)Branch:
claude/issue-23180-spec-slowest-twoWorktree:
objectstack-issue-23180Domain:
domain:specSeat:
domain:spec#4(seat post #18917)File surface:
packages/spec/scripts/build-schemas-check-mode.test.ts(902.1 s) and what it waits on inpackages/spec/scripts/build-schemas.ts;packages/spec/scripts/liveness/check-liveness.test.ts(493.4 s) and what it waits on inpackages/spec/scripts/liveness/check-liveness.mts;.changeset/23180-*.md, or the repo's no-release path if nothing publishes.⛔ The card's prohibitions: no deletion without a named duplicate (skills(ci): two-speed CI — fast set on PR and merge-queue runs, full battery hourly on main and before a release, main-red stops the lane, four required contexts plus the guard, timing gates report-only, test budgets not deletions #22998), no timeout raise, no move to a slower or skipped project. The other 24 rows are not in this round. Stop on a breach and explain it in the report.
Container & model:
M,mode:subagent,model: default tier.Clause-②: no
Responsibility: n/a — not a defect card (a maintainer-ruled test-budget duty, ci: merge-queue
Test Corereds on the new suite-duration ceiling —@objectstack/cloud-connectionmeasured 177.5 s and 200.3 s vs its 163.89 s ceiling, in two groups of PRs that do not touch it (live since1bd612bd6) #22949 ruling E item 3)Thread-read: none
Ruling-ref: ci: merge-queue
Test Corereds on the new suite-duration ceiling —@objectstack/cloud-connectionmeasured 177.5 s and 200.3 s vs its 163.89 s ceiling, in two groups of PRs that do not touch it (live since1bd612bd6) #22949 ruling E item 3 (6125775640). The test-budget rule is skills(ci): two-speed CI — fast set on PR and merge-queue runs, full battery hourly on main and before a release, main-red stops the lane, four required contexts plus the guard, timing gates report-only, test budgets not deletions #22998's.Serial constraints cleared: no open PR touches either test or its subject script (every open PR's file list was read in this act), and no in-flight claim names them.
objectstack-fleet commentedon Oct 14, 2026
os-dev-report
{
"issue": 23180,
"status": "needs_decision",
"branch": "claude/issue-23180-spec-slowest-two",
"pr": null,
"session": "session_0121ooBYRmS8ziFXm9ai5YHm (subagent: the dispatching PM's session id, as the harness Claude-Session line names it)",
"premise_still_valid": false,
"summary": "The dispatch's section-2 stop rule fired for BOTH rows, so no PR is opened and nothing lands this round. build-schemas-check-mode.test.ts: each of its 88 cases runs the real generator on its own fixture (72 run() and 24 runBox() call sites, about 96 runs). One warm generator run costs 8.5 to 9.0 s, most of it Zod toJSONSchema over about 1,700 schemas (about 4 s CPU), git (1.1 s) and rewriting the output tree (0.9 s). The median case alone is 9.07 s, so the file's floor is far above 10 s unless the 3,923-line generator is redesigned into an in-process library with a shared emission. That is the test-only seam the file's header rejects, and it is not a fix to the test. check-liveness.test.ts: 63 of 71 cases spawn the full gate (about 66 spawns). A measured incidental cost was cut on the branch: each gate run re-read every cited file per citation (2,367 reads, 455.8 MB, rest-server.ts 142 times). A per-run memo in check-liveness.mts reads 30.5 MB and leaves the default and --json output byte-identical. The file drops from 190.5 to 255.3 s to 87.1 to 90.0 s locally, and one gate run from 3.84 to 4.20 s to 1.23 to 1.34 s. That is still about 9x over budget. The faithful floor is about 43 distinct one-cause fixtures times one gate evaluation. Spawned, that is about 1.3 s each. In-process, a scratchpad prototype measured a warm median of 147 ms with every read cached across runs, about 7.4 s locally with zero margin. CI ran this file 1.9 to 2.6x slower than local, so the in-process floor estimates at 14 to 19 s in the battery (NOT MEASURED there), and the route rewrites the file's stated spawn-the-real-gate design. The read memo is on the branch at f6bcfe9, ready as option A below.",
"tests": "All readings were local, through bash scripts/pm/os-verify-lock.sh -c with OS_VERIFY_LOCK_SLOT=issue-23180-dev, each VERDICT command-exit 0. They are SHARED-BOX seconds: the lock excludes only locked runs. Per-file command: env -u AI_AGENT -u CLAUDECODE -u CLAUDE_CODE -u CURSOR_AGENT NODE_OPTIONS=--max-old-space-size=4096 pnpm --filter @objectstack/spec exec vitest run --project PROJECT --maxWorkers=2 FILE --reporter=default --reporter=json --outputFile.json=OUT. The number below is the vitest module line, which is what the battery records.\n- check-liveness.test.ts, before (gate at BASE 0be162c): 190502 ms, 255342 ms, 251260 ms, 71/71 pass each. Run 1 was in the branch worktree before any edit; runs 2 and 3 were in a detached worktree at BASE.\n- check-liveness.test.ts with the read memo (f6bcfe9): 87140 ms, 87354 ms, 90006 ms, 71/71 pass each, the same assertions unchanged.\n- build-schemas-check-mode.test.ts, before: 900602 ms (process wall 908.0 s), 88/88 pass, one run. Per case: min 1809 ms, median 9071 ms, max 25161 ms, none under 1 s, sum of cases 890409 ms. CI reading for comparison: 902.1 s in run 38228297391.\n- Single gate runs (tsx scripts/liveness/check-liveness.mts), 3 each: BASE 3.844, 3.838 and 4.198 s; memo 1.344, 1.260 and 1.227 s.\n- Single generator runs (OS_EAGER_SCHEMAS=1 tsx scripts/build-schemas.ts --check, in place): 12.0 s cold, 8.5 s warm, 9.0 s warm unprofiled. Under --cpu-prof the main process spent 3.9 s in zod, 1.1 s in spawnSync (git), 0.6 s in writeFileUtf8 and 0.3 s in unlink.\n- Read census through an fs-counting --import preload: BASE 2,367 repo reads, 455.8 MB, 828 paths; memo 879 reads, 29.5 MB repo (30.5 MB in all).\n- Equivalence of the memo: the BASE gate (a temporary untracked sibling copy, deleted after, porcelain clean) and the memo gate gave byte-identical output. Default mode: 6514 bytes, exit 0 on both. --json mode: 55633 bytes, exit 0 on both.\n- In-process floor prototype: scratchpad only, the unmodified gate re-imported per run with argv, exit and output captured and reads cached across runs, 21 runs under the lock. Cold 1053 ms; warm median 147 ms, min 129 ms, max 181 ms.\n- Ablation: NOT MEASURED. Nothing lands this round. Whichever round lands option A owes one, for example caching readCited by basename and watching the anchor, line-bound and key-mention cases go red.\n- After readings for the landed state: NOT MEASURED, because nothing landed.",
"gates": "Derived at f6bcfe9 with node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack: 55 commands. Change set: 1 path, +21/-6. Run locally, each exit captured before any pipe: pnpm --filter @objectstack/spec run check:liveness exit 0; pnpm check:nul-bytes exit 0 ('no raw ASCII control bytes'); pnpm check:issue-citations exit 0; node scripts/check-issue-citations.mjs exit 0 ('no issue citations added against 0be162c'); pnpm check:doc-authoring exit 0. The --ran reconciliation reads '55 derived, 5 run, 0 NOT-MEASURED, 50 UNRUN'. The 50 UNRUN is a declared narrowing: no PR is opened, so CI runs none of them on this branch, and whichever round lands the commit re-derives and runs them. PR check-runs: none, no PR. check:dev-prereqs and check:skill-frame-freshness: not run, because the diff touches neither the packages/spec build nor the four-axis frame files.",
"mcp_calls": "0",
"api_writes": "1 relay action through scripts/pm/with-fleet.sh --via dispatch as objectstack-fleet[bot]: comment, POST /repos//issues/23180/comments (this report). Plus git push of the branch, twice, which is not REST: the empty probe, then f6bcfe9. Zero pr_create, zero label writes.",
"deviations": [
"The stop rule fired for both files, so the round lands nothing: no pr_create, no changeset, no skip-changeset label. Clause-2 'no' and the 'Part of #23180' first line therefore have no PR body to go into. The read-memo commit f6bcfe9 stays on the pushed branch, unlanded, as option A.",
"Before-run count for build-schemas-check-mode.test.ts: 1, not 3. One run holds the shared lock 15 min, and the file is stopped, so its floor rests on the per-case histogram plus the CI reading. After-runs are NOT MEASURED for both files, because nothing landed.",
"The 43 distinct liveness fixtures is a count read off the test source, not instrumented. Identical states collapsed: 8 runs on the shipped ledgers, about 5 shipped --json runs, 8 verbatim copies, 4 identical typo fixtures, 3 identical dead samples.",
"A second, detached worktree at BASE (../objectstack-issue-23180-base) gave the two original-gate before-runs. It is removed at cleanup.",
"The harness attribution reminder asks for a model-carrying Co-Authored-By trailer. It was not followed: the commit carries AGENTS.md's model-free trailer pair."
],
"files_changed": [
"packages/spec/scripts/liveness/check-liveness.mts"
],
"open_questions": [
{
"question": "Neither of the card's two dominant spec rows can reach 10 s of wall within the card's own prohibitions (no deletion without a duplicate, no timeout raise, no project move) without weakening what the file proves. What should the spec lane do with these two rows?",
"options": [
"A: land the read memo alone (f6bcfe9, 1 file, +21/-6, gate output byte-identical) as a Part-of PR that closes no row. Optionally add sharing of the about 23 identical-state gate runs inside check-liveness.test.ts (not built, estimate about 30 s more off locally). Readings: the liveness file 190.5 to 255.3 s down to 87.1 to 90.0 s locally; every CI check:liveness run 3.84 to 4.20 s down to 1.23 to 1.34 s. Both rows stay over budget and the card stays open for them. Four axes. Business need: measured pull, the hourly battery plus the check:liveness step of every lint run. Long-term soundness: a per-run memo over a tree nothing writes during the run, no seam, no workaround. Preventing AI mistakes: no tolerance added, verdicts unchanged, byte-identical output. Startup focus: the smallest change, no new gate, the rows honestly left open. Cost: one small PR plus an ablation.",
"B: re-architect check-liveness.test.ts to evaluate the unmodified gate in process: re-import it per case with argv, exit and output captured, share file reads across runs, and keep one spawn case pinning CLI equivalence. Measured prototype floor about 7.4 s locally with zero margin, estimated 14 to 19 s in the battery from the observed 1.9 to 2.6x CI ratio (NOT MEASURED there). Four axes. Business need: the same pull as A, a bigger saving, but likely still over the line. Long-term soundness: it reverses the file's stated spawn-the-real-gate design and breaks the premise of its own hook-budget block (runGate reaching spawnSync). Preventing AI mistakes: weaker, because exit/argv/console interception and module state shared across evaluations are new places where the test and CI can differ. Startup focus: it expands harness surface for a target it probably misses. Cost: a large test rewrite plus an equivalence pin.",
"C: for build-schemas-check-mode.test.ts, split the 3,923-line generator into an emission phase computed once and a ratchet phase run in process per fixture. Four axes. Business need: the 900 s is a real cost. Long-term soundness: a multi-thousand-line restructuring of the gen:schema producer for a test budget, and it is exactly the test-only seam the file's header rejects. Preventing AI mistakes: a seam in the generator is where the gate and its test drift apart. Startup focus: a large expansion. The floor is still bounded below by per-case git and output rewrites (1.1 s and 0.9 s per run in place; the sandbox share is NOT MEASURED).",
"D: a ruling on the per-file line for gate self-tests that spawn the real gate once per one-cause fixture by design: an exemption class, or a measured per-file ceiling recorded beside the window's readings. Four axes. Business need: without it the refresh lane re-lists two rows every window that no seat can close. Long-term soundness: honest about a class, owned by the ruling that set the 10 s line (objectstack#22998, #22949 ruling E). Preventing AI mistakes: it removes the incentive to 'fix' by batching causes into shared runs or by splitting files, both of which game the metric while weakening or hiding the cost. Startup focus: no new gate, a ruling-level edit only. Cost: one maintainer decision."
],
"recommendation": "A now, plus D for both rows; not B, not C. A is a pure, measured 2.2 to 2.9x on the liveness file and about 3x on every CI check:liveness run, with no behaviour change. B and C either still miss the line (B, zero local margin) or need the seam each file's header was written to refuse (C). Splitting the files was rejected outright: it would satisfy the per-file number while leaving the battery's wall unchanged. Only a ruling can move the 10 s line this class cannot meet."
}
],
"out_of_scope_findings": []
}
objectstack-fleet commentedon Oct 14, 2026
Collected · dev report
6176173059·domain:specseat 4 ·session_0121ooBYRmS8ziFXm9ai5YHm· 2026-10-14T19:13ZThe seat read the report against the branch. Neither dominant row can reach the 10 s line within this card's prohibitions without weakening what the file proves. The seat takes the dev's recommendation:
check-liveness.mts(f6bcfe9c91, 1 file, +21/-6, default and--jsonoutput byte-identical)Part of #23180PR that closes no row, with the ablation the report names as owed and the full derived gate set run. Readings the PR carries: liveness file 190.5–255.3 s → 87.1–90.0 s locally, one gate run 3.84–4.20 s → 1.23–1.34 scheck-liveness.test.tsState change: none on this card.
pm:dispatchedand the assignee stay while the option A PR is open, and the card stays open for both rows and the rest of its list. Until #23534 is ruled, the two rows remain listed over budget, and no seat closes them by splitting files or batching causes.objectstack-fleet commentedon Oct 14, 2026
os-dev-report
{
"issue": 23180,
"status": "done",
"branch": "claude/issue-23180-spec-slowest-two",
"pr": "#23535",
"session": "session_0121ooBYRmS8ziFXm9ai5YHm (subagent: the dispatching PM's session id, as the harness Claude-Session line names it)",
"premise_still_valid": false,
"summary": "Addendum round: the seat's option A is landed as draft PR #23535 (first line 'Part of #23180'; it takes NO row off the card). The card's 10 s premise stays falsified for both rows, as this card's first os-dev-report states, and both rows stay over budget. The PR is the read memo alone, in packages/spec/scripts/liveness/check-liveness.mts (+21/-6): one per-run read per cited file, keyed by the repo-relative path. On the head merged with origin/main b1cfa3d, the gate's default and --json output is byte-identical to origin/main's gate, and the self-test's 71 cases are unchanged and all pass. The liveness self-test drops from 190.5 to 255.3 s to 87.1 to 101.3 s locally, and one gate run from 3.02 to 4.20 s to 1.23 to 1.45 s. The ablation (memo keyed by basename) turns 24 of 71 cases red, and the restore is proven. Nothing publishes, measured on the packed tarball, so skip-changeset is on the PR. The optional sharing of identical-state runs was left out, because a case would read another case's run. build-schemas-check-mode.test.ts is untouched. Option D is the seat's own decision card.",
"tests": "All runs were local, through bash scripts/pm/os-verify-lock.sh -c with OS_VERIFY_LOCK_SLOT=issue-23180-dev, each VERDICT command-exit 0, in shared-box seconds.\n- Ablation, at f6bcfe9 merged with 989aa48 (head 6ec7a73). Command: node scripts/ablation-replace.mjs --file ABS/packages/spec/scripts/liveness/check-liveness.mts --anchor (the four readCited body lines) --replacement (the same lines keyed by p.split('/').pop()) -- bash abl-inner.sh.\n - Landed: anchor 1 to 0, blob 141dc51f5a62 to 835c251a41e2. On-disk counts: marker 1, removed 'citedText.set(p, text);' 0, mutated set 1.\n - Mutant self-test: vitest exit 1, 24 failed / 47 passed of 71.\n - Every green control exited 1. On the verbatim-copy control the gate printed '✗ 57 anchored citation(s) name a symbol the cited file does not contain' and '✗ 22 ... citation(s) name a file that never names the property'.\n - The anchor case 'FAILS when an anchored symbol is gone ...' missed its exact '✗ 1 anchored citation(s)' count.\n - Restore by the tool's trap: blob after 141dc51f5a62 == HEAD blob 141dc51f5a62, git diff HEAD empty, porcelain 0, marker count 0.\n - Expected direction: red. Observed: red.\n - No dist/ in the path: tsx runs the source.\n- Equivalence at head 62adc64 (merged with origin/main b1cfa3d). origin/main's gate (blob cae282b9fffb, a temporary untracked sibling, removed by trap) against HEAD's gate (blob 141dc51f5a62):\n - default: exit 0 on both, IDENTICAL, 6514 = 6514 bytes;\n - --json: exit 0 on both, IDENTICAL, 55633 = 55633 bytes.\n- Single gate runs at 62adc64: origin/main gate 3.488, 3.211 and 3.015 s; HEAD gate 1.454, 1.370 and 1.393 s.\n- Self-test after, at 62adc64. Command: env -u AI_AGENT -u CLAUDECODE -u CLAUDE_CODE -u CURSOR_AGENT NODE_OPTIONS=--max-old-space-size=4096 pnpm --filter @objectstack/spec exec vitest run --project local --maxWorkers=2 scripts/liveness/check-liveness.test.ts --reporter=default. Module line 97407 ms, 93762 ms, 101278 ms; 71/71 pass each.\n- Self-test before, from the first round, gate at 0be162c: 190502, 255342 and 251260 ms. With the memo at f6bcfe9: 87140, 87354 and 90006 ms.\n- pnpm --filter @objectstack/spec build: exit 0 in 114 s.\n- Publish measurement: pnpm pack of @objectstack/spec 18.0.0-next.1 gave 2091 files and no scripts/ path. Files containing each symbol: readCited 0, citedText 0, EVIDENCE_SCANNED_STATUSES 0; positive control listMetadataTypeSchemaTypes 14.",
"gates": "Derived at the final head 62adc64 with node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack: 55 commands. All 55 were run sequentially, each exit captured before any pipe into one log per command. --ran verdict: '55 derived famil(ies) accounted for — 53 run, 2 NOT-MEASURED (2 DERIVED from a recorded exit 3)', 0 UNRUN, exit 0.\n- 53 exit 0, including check:liveness, check:nul-bytes, check:issue-citations, check:doc-authoring, check:cross-package-test-inputs, check:test-source-alias, check:closing-keyword-parity, check:published-files and check:pm-dispatch-gates.\n- NOT MEASURED: pnpm check:dual-build-cjs-loads and pnpm check:lean-entry-closure, exit 3, PREREQUISITE NOT MET. They load built dist/ entries of other packages (hono, account, objectql), and only @objectstack/spec was built locally. Neither can read an unshipped file under packages/spec/scripts/; CI runs both.\n- Changeset readings beyond the derivation, all exit 0: pnpm check:changeset-gate-self-tests, node scripts/check-empty-changeset.mjs, node scripts/check-changeset-no-major.mjs --base origin/main, pnpm check:published-files.\n- PR #23535 check-runs on 62adc64, read once and not awaited: 42 runs.\n - success: Part-of PR must not also close its card; The card this PR closes must claim this branch; No other open PR may claim the same issue; No other open PR may claim the same single-writer path; Check PR Size; Check Documentation Links; Flag docs affected by code changes; Auto Label; filter; Dogfood Regression Gate.\n - skipped: Check Changeset (skip-changeset present), Build Docs, Dogfood, Console Pin Gate, Temporal Conformance, Packed-tarball smoke.\n - in_progress: Test Core 1-6/6, Build Core, the Type Check and Lint lanes, Governed Surface Queue Guard.",
"mcp_calls": "0",
"api_writes": "This round: 3 relay actions (4 REST requests) as objectstack-fleet[bot].\n- pr_create through scripts/pm/with-fleet.sh --via dispatch: POST /repos/objectstack-ai/objectstack/pulls (forced draft) and POST /repos//issues/23535/assignees [sunhaolin]. Read-back: 7220 bytes sent and stored, identical.\n- labels_add through scripts/pm/label-write.mjs: POST /repos//issues/23535/labels [skip-changeset]. Read-back MATCHES: size/s and skip-changeset, later also tooling from Auto Label.\n- comment through scripts/pm/with-fleet.sh --via dispatch: POST /repos//issues/23180/comments (this addendum).\nThe first round's 1 comment (6176173059) is unchanged. git push this round: 2 (the merge commits 6ec7a73 and 62adc64), not REST.",
"deviations": [
"origin/main moved twice during the round, so the branch carries two merge commits (6ec7a73, 62adc64) with git's default message. The pre-push trailer check accepted both. The second merge was taken before the PR opened, because the new main commits touched packages/metadata-protocol/src/protocol.ts, a file the liveness ledgers cite.",
"The optional sharing of identical-state gate runs was not built: it would make a case read another case's run, which the seat's condition excludes.",
"Two derived gates are NOT MEASURED (exit 3, PREREQUISITE NOT MET) rather than run green. A full workspace build was not taken under the shared lock for gates that cannot read this diff.",
"The harness attribution reminder asks for a model-carrying Co-Authored-By trailer and a different PR footer. Neither was used: AGENTS.md's model-free trailer pair and session-URL footer were.",
"The worktree ../objectstack-issue-23180 was recreated for this round and removed after the PR (node_modules first, no --force)."
],
"files_changed": [
"packages/spec/scripts/liveness/check-liveness.mts"
],
"open_questions": [],
"out_of_scope_findings": []
}
objectstack-fleet commentedon Oct 14, 2026
ACCEPT → PR #23535 comment 6176907250 ·
domain:specseat 4 ·session_0121ooBYRmS8ziFXm9ai5YHm· 2026-10-14T19:46ZOption A is the per-run read memo,
Part of #23180, and it takes no row off this card. The seat lands it once every check on62adc640c1is green or skipped by design. The card stays open withpm:dispatcheduntil that landing is recorded.objectstack-fleet commentedon Oct 14, 2026
Landed · PR #23535 (
Part of #23180) ·domain:specseat 4 ·session_0121ooBYRmS8ziFXm9ai5YHm· 2026-10-14T20:44Z51b9990f47origin/main51b9990f47(this merge).readCited, the per-run read memo, is inpackages/spec/scripts/liveness/check-liveness.mtstheregh-readonly-queue/main/pr-23535-*ref remainsRelease:
session_0121ooBYRmS8ziFXm9ai5YHmreleases its claim6175077909, because the round's premise was measured false: neither dominant row can reach 10 s within this card's prohibitions (report6176173059). The release follows the partial-landing rule.pm:dispatched→pm:queueand the assignee is cleared in this act.check-liveness.test.tsdropped from about 190–255 s to about 94–101 s locally, and onecheck:livenessrun from about 3–4 s to about 1.4 s. It is still over the 10 s line, so no row comes off.build-schemas-check-mode.test.ts,check-liveness.test.ts) wait on decision card [Decision] The 10 s per-file test budget (#22949 ruling E item 3) and gate self-tests that spawn the real gate once per one-cause fixture: an exemption class, or a measured per-file ceiling beside the window's readings #23534. A seat that takes this card does not re-dispatch them before [Decision] The 10 s per-file test budget (#22949 ruling E item 3) and gate self-tests that spawn the real gate once per one-cause fixture: an exemption class, or a measured per-file ceiling beside the window's readings #23534 is ruled.Resume-from:none. The branch's only commit landed with this PR.71 remaining items
objectstack-fleet commentedon Oct 16, 2026
Claim: PM loop round 18 (second shift,
batch 2) · 2026-10-16T17:59Z · the twopackages/specrows ruling6212133431item 3 hands back to this card:scoped-context.test.tsandconnector-author-shape.test.tseach declare// test-budget: <n> — compiles the package type graph once: <reason>(Part of #23180)Session:
session_01LFqdRsuM5nkqoJdHd5ztVk(the seat; the dev is anos-devsubagent of this session)Account:
os-bill(the seat's linked user asGET /useranswers it; always the card's assignee)Branch:
claude/issue-23180-type-graph-budgetsWorktree:
objectstack-issue-23180-tgDomain:
domain:specSeat:
domain:spec#2(seat post #18549)File surface (paths on
origin/mainadce192974or later; stop on a breach and explain it in the report): one header line each inpackages/spec/src/contracts/scoped-context.test.tsandpackages/spec/src/integration/connector-author-shape.test.ts. ⛔ No other test file, ⛔ notscripts/measure-test-shard-timings.mjs(#23897 landed its class), ⛔ no assertion, timeout or project change (ruling6181973363item 5).Container & model:
S,mode:subagent,model: default tier(dispatch-gates --tier: no path-derived mandate)Clause-②: no
Responsibility: n/a — a ruled test-budget declaration, not a defect card
Thread-read: 6219811708
Ruling-ref: ruling
6212133431on #23821, letter A, the maintainer's 「同意」, item 3 verbatim: "packages/spec/src/contracts/scoped-context.test.tsandpackages/spec/src/integration/connector-author-shape.test.ts(onets.createProgram(each,:116and:130), each one header line// test-budget: <n> — compiles the package type graph once: <reason>at that day's CI reading × 1.25". Item 2 of ruling6181973363sets the number: the measured CI reading × 1.25, rounded up to the next 10 s.Serial constraints cleared:
batch 2: this seat's other session is packages API: the served installed-package row declares no origin. Declare a closedsource(code / marketplace / authored); objectui's Packages Source column joins the undeclaredwritablewith a second read today #23972 (claim6220830814). PR docs(permissions): name where a high-privilege anchor binding is refused; spec patch changeset for the anchor docblock #24006 (spec(identity): PR #23780'sposition.zod.tsdocblock shipped withskip-changesetthough@objectstack/specpublishes it;authorization.mdx:69-70says anchor bindings refuse high-privilege sets "at the data layer" #23887 and Add the @objectstack/spec patch changeset PR #23780 owed: its position.zod.ts anchor docblock ships in dist/*.d.ts (contract review 6214176883 FAIL on the changeset; merged by the maintainer, follow-up recognised) #23935) is landing; its dev has finished.measure-test-shard-timings.mjs.e9301e8a9f) has landed, and its Release6219811708names these two rows as waiting on [Decision] Two spec test files compile the package's type graph once and read 14-18 s on CI: a third test-budget class, or they stay listed #23821, which is now closed by feat(scripts): a third test-budget class, "compiles the package type graph once" #23897 (0744f94366).objectstack-fleet commentedon Oct 16, 2026
os-dev-report
{
"issue": 23180,
"status": "done",
"branch": "claude/issue-23180-type-graph-budgets",
"pr": "#24015",
"session": "session_01LFqdRsuM5nkqoJdHd5ztVk (os-dev subagent of the domain:spec seat 2 session; claim 6221601113)",
"premise_still_valid": true,
"summary": "Draft PR #24015 (title has no closing keyword; body opens 'Part of #23180' / 'Clause-②: no'; skip-changeset; assignee os-bill) adds one header line at line 2 of packages/spec/src/contracts/scoped-context.test.ts and of packages/spec/src/integration/connector-author-shape.test.ts. Both read '// test-budget: 30 — compiles the package type graph once: ...', the third class from ruling 6212133431 item 3. The number follows ruling 6181973363 item 2. It is the slowest of 9 executed hourly Test Core (1/6) readings on 2026-10-16 x 1.25, rounded up to 10 s: 17.059 s (run 38865071010) → 21.32 → 30 for scoped-context, and 21.773 s (run 38904808867) → 27.22 → 30 for connector-author-shape. The reason in each line says why the file is in the class (one ts.createProgram over the spec entry barrels; the first read pays the type-graph resolution and every later probe reads the same program) and names the run and reading. Nothing else changed: +2/-0, every expect, timeout and project untouched. Each file still has exactly one 'ts.createProgram(' (now :117 and :131). The claim's newest Claim: line (6221601113) named this branch. The worktree was removed after the PR opened.",
"tests": "CI READINGS. Read with MCP get_job_logs, which returns the last 5000 of about 22,100 lines. The blob host answers 403 to gh api from this container. The source is the vitest module lines of '@objectstack/spec:test' (the local project) in Test Core (1/6), across all 18 hourly scheduled ci.yml runs on 2026-10-16 UTC from 00:02 to 17:01. EXECUTED (local 'Start at' inside the job window), connector-author-shape / scoped-context in s: 38833767749 16.796/14.652; 38838260718 15.907/14.039; 38848429828 18.135/16.711; 38858901527 12.557/10.868; 38865071010 20.361/17.059; 38877591164 12.925/9.848; 38891051243 18.068/16.502; 38904808867 21.773/16.454; 38936452003 17.193/15.575. REPLAYED, not used: 38827152315, 38853598892 and 38928622617 (replayed local 'Start at' 23:09:27 / 04:45:28 / 15:41:37, all before their jobs began); 38843417737 ('@objectstack/spec:test: cache hit, replaying logs'); 38912391826 and 38920490313 (the aggregator lists @objectstack/spec as cache-replayed, and check-liveness (local) reads 'replayed log'); 38870924976, 38884415435 and 38897680323 (local summary absent from the readable tail, which starts 1.2-1.4 min into the job, against an executed local wall of 349-530 s; PR #23937 also counted all three as replayed). LOCAL, at 15e9714. (1) The PR #23897 one-line readTestBudget check on each file exits 0 and prints { seconds: 30, cls: 'compiles the package type graph once', line: 2, reason: the full text }. declaredBudgetInTree('@objectstack/spec', FILE) returns {seconds:30, cls:'compiles the package type graph once', line:2} for both. (2) node scripts/measure-test-shard-timings.mjs --self-test: 'measure-test-shard-timings: self-test OK', exit 0. (3) Under os-verify-lock, 'pnpm --filter @objectstack/spec exec vitest run --project local --maxWorkers=2' on the two paths: 'Test Files 2 passed (2)', 'Tests 19 passed (19)' (8 + 11, the CI counts), 'VERDICT command-exit 0'. (4) pnpm --filter @objectstack/spec typecheck under the lock: VERDICT command-exit 0, 'check:test-typecheck: OK — ... 52 file(s) / 242 error(s) / 132 pinned signature(s) held'. (5) npm pack --dry-run for @objectstack/spec 18.0.0-next.2: 2094 files, 0 .test.ts, both changed files absent, controls src/integration/connector.zod.ts and dist/index.js present. No ablation: the diff adds comment lines only and changes no tested behaviour.",
"gates": "LOCAL. 'node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack' at 15e9714 (repo assertion held; merge base 61a6809; 2 paths, +2/-0) derived 76 commands. Each ran sequentially from a script, and each exit was written to ran.list before any pipe. First pass: 73 exited 0 and 3 exited 3. 'pnpm --filter @objectstack/lint run check:doc-formula-expressions' (lint unbuilt) and 'pnpm check:lean-entry-closure' (objectql unbuilt) both exited 0 when re-run after 'pnpm --workspace-concurrency=2 --filter @objectstack/objectql... --filter @objectstack/lint build' under the lock (VERDICT command-exit 0). 'pnpm check:dual-build-cjs-loads' stays exit 3 and NOT MEASURED: it needs every package's dist and reads no test file; CI runs it. --ran printed '✓ dispatch-gates --ran: 76 derived famil(ies) accounted for — 75 run, 1 NOT-MEASURED (1 DERIVED from a recorded exit 3).', exit 0. check-governed-merges --branch: '0 of 2 path(s) hit the register', NOT governed, 2 changed lines. Local-only families: check:dev-prereqs --self-test is in the derived list and exited 0; the check:dev-prereqs scan and check:skill-frame-freshness were not run. Both changed files are .test.ts outside the spec build inputs, and no four-axis frame file is in the diff. CI, read once at report time on head 15e9714: 42 check-runs, 15 success, 10 skipped, 17 in_progress, 0 failure. Check Changeset success (opened run, label re-read live) plus one skipped (labeled run). Governed Surface Queue Guard success. Spec property liveness success. Build Core, Test Core 1-6/6 and every Lint and Type Check lane in_progress. Not waited on.",
"mcp_calls": "23 — all read-only: get_job_logs x23 (Test Core (1/6) of 18 runs, one of them read 3 times while probing the tool's size limit and URL mode; the Test Core aggregator of 3 runs: 38936452003, 38912391826, 38920490313). No MCP write tool was called.",
"api_writes": "3 — all through the fleet-write relay as objectstack-fleet[bot], each one POST /repos/objectstack-ai/objectstack/dispatches. (1) pr_create, relay run 38949088592: POST /repos/objectstack-ai/objectstack/pulls (draft) plus POST /repos//issues/24015/assignees [os-bill]; the read-back stored 6490 bytes identical to those sent. (2) label-write --add skip-changeset, relay run 38949201147: POST /repos//issues/24015/labels; read-back size/xs + skip-changeset, MATCHES. (3) this os-dev-report comment: POST /repos//issues/23180/comments. There were also two git pushes: the empty-branch probe, then 15e9714.",
"files_changed": [
"packages/spec/src/contracts/scoped-context.test.ts (+1: header line 2)",
"packages/spec/src/integration/connector-author-shape.test.ts (+1: header line 2)"
],
"line_budget": "n/a — no skills/ or ratcheted ledger in the diff; +2/-0 total",
"deviations": [
"Declared narrowing: the full @objectstack/spec 'pnpm test' (local project, about 500 s on CI) and test:repo (about 900 s) were not run locally. Only the two changed files were run, as the dispatch ordered. The diff is one comment line per file. CI Test Core runs both projects.",
"The first scoped build ('pnpm --filter @objectstack/lint^... --filter @objectstack/spec build', 3 projects, VERDICT command-exit 0, 100 s) ran without --workspace-concurrency=2. The second build carried it.",
"npm pack --dry-run --ignore-scripts still ran the spec prepare script (gen:migration-registry). It printed 'src/migrations/registry.ts is current', and git status stayed clean.",
"Attribution: the harness reminder asked for a model-named Co-Authored-By trailer and a different PR footer. Per AGENTS.md and os-dev.md, the commit carries the model-free pair (Claude-Session + Co-authored-by: Claude) and the PR body ends with the session-URL footer. The pre-push check:commit-card-trailers passed.",
"Report shape: this dispatch asked for keys beyond the os-dev.md template (files_changed, line_budget, deviations). They are included alongside the template keys."
],
"open_questions": [],
"out_of_scope_findings": [
"class: a · reach: named real producer — the hourly Test Core aggregator in run 38912391826 (job 117023980098) printed 'scripts/build-schemas-check-mode.test.ts (repo) 620.87 replayed log' and listed @objectstack/spec as cache-replayed. Yet Test Core (1/6) of the same run (job 117011261332) shows '@objectstack/spec:test:repo: Start at 14:03:04' and 'Duration 633.75s', printed at 14:13:37 inside the job window 14:01:23-14:13:54: a live execution. Only the spec local task replayed. · evidence: scripts/report-test-timings.mjs:549-550 on origin/main marks file rows replayed per PACKAGE ('replayedHere = new Set(pkgRead.cached); f.replayed = replayedHere.has(f.pkg)'), but @objectstack/spec runs two turbo test tasks, test and test:repo. @objectstack/runtime's rows carry [local]/[repo] tags too, which suggests the same. When one task is a HIT, the other task's executed rows are labelled 'replayed log'. The refresh's windowFiles drops replayed rows (as PR #23937 states), so real readings leave the per-file budget window, and the window maximum can only read LOW. This is the failure direction that under-declares a budget. The same split, with repo executed and local replayed, shows in 8 of today's 18 runs: 00:02, 05:01, 08:01, 10:01, 12:01, 14:01, 15:01 and 16:01. I filed nothing and did not touch the tool, which is outside this card. · dedupe words: report-test-timings replayed per package; test:repo replayed log; two turbo test tasks one cache hit; windowFiles drops executed rows; spec repo project measured here"
]
}
Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
Landed · PR #24015 →
cf31c34823(Part of, the two type-graph rows) ·domain:specseat 2 ·os-bill· sessionsession_01LFqdRsuM5nkqoJdHd5ztVk· 2026-10-16T19:46Zcf31c34823on parent9e797a8976origin/maingit merge-base --is-ancestor cf31c34823 origin/main→ exit 0git diff 9e797a8976 cf31c34823, and the reviewed head15e9714ffdover its merge base61a6809564, sharegit patch-id --stablec172a135(ACCEPT6222402803)gh-readonly-queue/main/pr-24015-*ref remainsPart of #23180and no closing keyword; this card is still open, as intendedsuccessorskipped, includingTest Core1–6Release: session
session_01LFqdRsuM5nkqoJdHd5ztVk· because PR #24015 landed this claim's slice (6221601113), and the card stays open for the rest · topm:queuefor the next claimant, assignee cleared in this act. Theos-devsubagent's run ended with its report (6222377522).What this slice did.
src/contracts/scoped-context.test.tsandsrc/integration/connector-author-shape.test.tseach declare// test-budget: 30 — compiles the package type graph once: …. That is the third class, from ruling6212133431item 3. The number comes from ruling6181973363item 2: the slowest of 9 executed hourly readings on 2026-10-16, × 1.25, rounded up.What remains on this card (none of it attempted here):
openapi-self-consistency.test.ts, the three rows PR test(spec): three src/ test-budget rows trimmed, two at a one-program floor left listed #23819 trimmed, andcompliance-families-retirement.test.ts.packages/lint's vitest inlines the linked@objectstack/specdist, so the first test file to import a lint entry pays ~10 s of cold transform — externalising it measured the package's test hold at 60 s against 98 s #23900, thepackages/lintvitest-config lever.spec:testlabels the executedtest:reporows replayed, so they drop out of the test-budget window #24017 (open, filed by this seat).scripts/report-test-timings.mjsmarks file rows "replayed" per package, not per turbo task. So an executed@objectstack/spectest:reporow reads replayed whenever the package'stesttask hit the cache. Read those rows'Start atagainst the job window before taking a row as replayed.Generated by Claude Code
objectstack-fleet commentedon Oct 18, 2026
Transition:
pm:queue→pm:on-hold·domain:specseat 2 ·zhuangjianguo· sessionsession_019oFY6Hi35J7atvgVFnmoaK· 2026-10-18T07:55Z⛔ Not a claim. This is a seat parking: the card has no row a dev can take until the next refresh list lands.
6219811708and6223412690):openapi-self-consistency.test.ts;compliance-families-retirement.test.ts.packages/lint's vitest inlines the linked@objectstack/specdist, so the first test file to import a lint entry pays ~10 s of cold transform — externalising it measured the package's test hold at 60 s against 98 s #23900 (thepackages/lintvitest-config lever).origin/main93b4acb57e, the newest commit touchingscripts/test-shard-timings.jsonis still121847a7d(chore(ci): refresh the Test Core shard-timings dataset #23141, 2026-10-13).shard-timings-refresh.ymlruns on its Monday 05:30Z schedule, so the next list is due 2026-10-19.Part ofshape. The prohibitions stand: no deletion without a named duplicate, no timeout raise, no move to a slower or skipped project.Restart-when:
git log --oneline 121847a7d..origin/main -- scripts/test-shard-timings.jsonprints at least one commit (the next Test Core shard-timings refresh has landed)Restart-touch: scripts/test-shard-timings.json
Generated by Claude Code