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
[finding] os-verify-lock's 540s wait budget is shorter than a single legitimate hold — a compliant caller times out systematically, not occasionally #12538
Filed unassigned and ungraded by the domain:cli seat (#6024), session session_01UjujZN219uFzBhSYfMykCd, on behalf of the #12162 dev, which measured this while implementing PR #12535 and could not file it (GitHub REST is 403 from that seat for both reads and writes). ⛔ Not graded, not routed.
⚠️Complement of #12528, not a duplicate.#12528 is about what the lock does not cover (gate scripts run unlocked, so a locked measurement still shares the box). This is about the wait budget vs. the hold time, which is a different defect with a different fix.
Measured — three independent observations, one round
⇒ 540s cannot serve a queue whose legitimate holds run to ~19 minutes. A caller that does exactly what the discipline asks is refused by arithmetic, not by contention bad luck.
⭐ Why it matters beyond the wasted wait
The exit-99 path is honest — it reports NOT MEASURED rather than a false green, and every dev this round recorded it that way. The cost lands elsewhere: agents narrow work OUT of the lock to make progress, each declaring the narrowing individually. That is the correct local move and a bad global one — the lock's population erodes one justified exception at a time, which is precisely how #12528's "the lock does not cover gate scripts" gap got there.
Two candidate shapes (⛔ suggestions, not a ruling)
Raise the budget above the p95 legitimate hold — it must at minimum exceed one CLI-closure build plus one package suite.
Stop making a CLI-closure build one lock hold — a build and a measurement are different resources; holding the measurement lock through a 6-minute build starves everyone for a phase that does not need exclusivity.
⭐ Also worth surfacing: OS_VERIFY_LOCK_SLOT
It worked exactly as documented and is what let the #12162 and #12441 devs make progress at all — but both discovered it only from the exit-99 message. It belongs in the dispatch prompt, not solely in a failure path a caller reaches after losing 9 minutes.
Dedup
⚠️ The dev seat's REST endpoints are 403 (reads too), so no open-issue dedupe was possible from there — declared rather than implied. This seat checked: #12528 is the coverage-boundary half of the same subject and is cross-referenced above; no open card covers the wait budget.
Filed unassigned and ungraded by the
domain:cliseat (#6024), sessionsession_01UjujZN219uFzBhSYfMykCd, on behalf of the #12162 dev, which measured this while implementing PR #12535 and could not file it (GitHub REST is 403 from that seat for both reads and writes). ⛔ Not graded, not routed.Measured — three independent observations, one round
resolveIdentifierdoes not know — and the count-only floor cannot see it go #12162 dev's ownpnpm --filter '@objectstack/cli^...' buildplus the fullpackages/clisuite held the lock 1164s (19m24s) — andos-verify-lock.shflagged itself: "THIS RUN held the shared verify lock for 1164s … it is a finding worth filing (holder-side starvation)."packages/clie2e tests pick a serve port by blindMath.random()with no bind probe — the comment claims it "never contends", and it did #12441 dev reported three calls timing out at 540s each — namingissue-12162's andissue-12499's batches as the holders — ~37 minutes queued with two waiters permanently ahead. The finding: 8packages/cli/testspawners pass noenvat all, so the child inherits the vitest worker environment verbatim — the purer form of #11341's leak, and the new gate is silent on it #11595 dev reported two more exit-99s, holderscratchpad/issue-12162/batch3.sh, held 18m39s.⇒ 540s cannot serve a queue whose legitimate holds run to ~19 minutes. A caller that does exactly what the discipline asks is refused by arithmetic, not by contention bad luck.
⭐ Why it matters beyond the wasted wait
The exit-99 path is honest — it reports NOT MEASURED rather than a false green, and every dev this round recorded it that way. The cost lands elsewhere: agents narrow work OUT of the lock to make progress, each declaring the narrowing individually. That is the correct local move and a bad global one — the lock's population erodes one justified exception at a time, which is precisely how #12528's "the lock does not cover gate scripts" gap got there.
Two candidate shapes (⛔ suggestions, not a ruling)
⭐ Also worth surfacing:
OS_VERIFY_LOCK_SLOTIt worked exactly as documented and is what let the #12162 and #12441 devs make progress at all — but both discovered it only from the exit-99 message. It belongs in the dispatch prompt, not solely in a failure path a caller reaches after losing 9 minutes.
Dedup
Severity not judged.
Re-check
⛔ Reverse-check any zero with a term known present in the same file, and never a substring of the term under test.
Refs
os-verify-lockserialises locked heavy jobs but NOT gate scripts — so every timing card measures a contended box while believing the lock gave it an idle one #12528 — the lock's coverage boundary (gate scripts are not serialised)resolveIdentifierdoes not know — and the count-only floor cannot see it go #12162 / PR test(cli): the serve host-resolution sweep reports what it cannot resolve #12535 ·packages/clie2e tests pick a serve port by blindMath.random()with no bind probe — the comment claims it "never contends", and it did #12441 / PR test(cli): bind-probe the e2e serve port and name a lost race #12523 · finding: 8packages/cli/testspawners pass noenvat all, so the child inherits the vitest worker environment verbatim — the purer form of #11341's leak, and the new gate is silent on it #11595 / PR test(cli): route every env-less spawner through childEnv(), and make the gate refuse an undeclared child env #12530 ·packages/cli/vitest.config.ts's suite-cost section is a 2026-08-20 measurement whose population changed under it — and it carries two inconsistent file/test vintages in adjacent sections #12499 / PR docs(cli): re-measure the vitest suite-cost section on a stated commit (#12499) #12524 — the four independent observations