Files
waggle-os/benchmarks/results/manifest-v4-lock-semantics-clarification.md
Oleg Maslov 0c3e2ead3b
Some checks failed
Installer Smoke / installer-smoke (push) Has been cancelled
moving
2026-09-02 10:10:29 +02:00

2.0 KiB
Raw Permalink Blame History

Manifest v4 — §7.4 Lock Semantics Clarification

Date: 2026-04-24 · Branch: feature/c3-v3-wrapper · Target: PM-RATIFY-LOCK-SEMANTICS gate.

PM interpretation — CONFIRMED with code evidence

concurrent_runners: FORBIDDEN (manifest v4 §8) covers cross-process threats only — two independent npx tsx scripts/run-mini-locomo.ts calls. Intra-wrapper spawning via --parallel-concurrency N IS allowed.

Code evidence at HEAD 373516c:

  • runner.ts:852 hardcodes a single global sentinel benchmarks/results/.benchmark-runner, with comment "any two runner invocations contend regardless of their --output paths" — cross-process rail.
  • runner-lock.ts:77112 is check-then-write (readExistingLock → throw if age<60 s → fs.writeFileSync). Two intra-wrapper children each pass the check before either writes (TOCTOU race); overwrite-semantics → last-writer wins. Both heartbeat; first unlinks, second ENOENTs silently.
  • Gate D halt log: pids 4984 + 65668 both logged [bench:lock] acquired within 3 s; file retained pid=65668 (overwriter).

Net: intra-wrapper parallel coexists via fail-open race. A third independent invocation sees a fresh mtime and refuses. Cross-process threat model intact.

Path L-1 (preferred) — ratify, no code change

Observed semantics match PM intent. Manifest v4 anchor dedd698 stays valid. Recommended PM waiver text:

§7.4 applies only to cross-process invocations. Intra-wrapper parallel spawns under --parallel-concurrency N are exempt. HEAD 373516c behaviour satisfies the intent.

Path L-2 (rejected): per-cell sentinel naming edits runner.ts / runner-lock.ts — both frozen per §11. Triggers manifest v5. Not warranted when L-1 waiver is defensible.

Task 2.6 carry-over

Ticket bench-lock-exclusive-create (defensive, Stage-3-independent): swap fs.writeFileSync for fs.openSync(path, 'wx') (O_EXCL) in runner-lock.ts; per-cell sentinel in runner.ts:852; parallel-acquire unit test (exactly one succeeds).