This commit is contained in:
@@ -0,0 +1,45 @@
|
||||
# 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:77–112` 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).
|
||||
Reference in New Issue
Block a user