D15 · gpulease
gpulease is a machine-wide advisory lease so that at most one GPU-heavy process
(e.g. a -metal modelbench that uploads gigabytes to unified memory) loads a model at a
time. A process Acquire()s the lease before loading and holds it until exit; concurrent
launches queue instead of stacking residency and overrunning physical RAM (the
2026-06-18 jetsam/watchdog cascade this module exists to prevent — see lease.go:1-16).
The lease is an OS-level flock on one lockfile, so it coordinates unrelated processes
and is released automatically if the holder dies (the kernel drops the flock when the fd
closes).
This is a regime D (decision-procedure soundness) module: “correct” means the
lock-grant decision is sound — it never grants two live holders machine-wide (mutual
exclusion), it fails closed for a busy lock (ErrBusy / queue, never a spurious
grant), and its lifecycle operations are well-defined: Release is idempotent and a
crashed holder’s lease is reclaimable. The two theorems below discharge exactly those
properties against the real code, each with a deterministic Go test actually run on this
node.
Theorem 1 — at most one holder machine-wide (mutual exclusion)
THEOREM. At any instant at most one process holds the lease. While one Acquire’s
Lease is live, a second Acquire on the same lockfile cannot obtain a Lease: with
NoWait it returns ErrBusy, otherwise it queues; the second succeeds only after the
first Release.
REGIME. D — decision-procedure soundness (the grant decision admits ≤ 1 holder and fails closed when busy).
PROOF. The grant is an exclusive, non-blocking flock:
syscall.Flock(int(f.Fd()), LOCK_EX|LOCK_NB) at lock_unix.go:12 (Windows mirror:
LockFileEx(EXCLUSIVE|FAIL_IMMEDIATELY) at lock_windows.go:25-42). Acquire’s loop
returns a &Lease{...} only when tryLock returns nil (lease.go:95-104); a busy
lock with NoWait set returns ErrBusy (lease.go:110-112) and otherwise polls until the
deadline (lease.go:114-131). Because an exclusive flock is granted by the kernel to at
most one open fd at a time, no two Acquire calls (in the same or different processes) can
simultaneously be holding a Lease. flock is per-fd, so two separate Acquire opens of
one file in a single process contend exactly as two processes would (witness comment,
lease_test.go:13-17).
WITNESS.
go test ./internal/gpulease/ -count=1 -timeout 120s -run 'TestNoWaitBusyThenFree' -v
TestNoWaitBusyThenFree (lease_test.go:18-37) holds lease a, asserts a second
NoWait Acquire returns ErrBusy, then after a.Release() asserts the second Acquire
succeeds. TestWaitTimesOut and TestWaitThenSucceed cover the blocking-queue branches
(timeout-honored / wait-then-win).
VERDICT. PROVEN — 2026-06-20, native darwin/arm64 (the macOS fleet node,
go test ran green: PASS: TestNoWaitBusyThenFree; ok ... 0.273s). Honest scope: this
is the in-process witness; the active-hold cross-process direction rests on the same
kernel flock primitive, and the cross-process reclaim direction is independently
witnessed by Theorem 2’s TestReleaseOnProcessExit. A full data-race-freedom proof of the
advisory lock is the named Gobra upgrade path (00-METHOD.md §6) and is SCOPED-OUT, not
claimed.
DOS. bound at ship.
Theorem 2 — release is idempotent; a crashed holder’s lease is reclaimable
THEOREM. Release is idempotent — a second Release, and a Release on a nil
*Lease, are no-ops that do not panic — AND a lease held by a process that exits without
calling Release is reclaimable by a subsequent Acquire (the OS drops the flock at fd
close on process death).
REGIME. D — lifecycle soundness of the gate (well-defined release; crash-safe reclaim).
PROOF. Idempotence. Release (lease.go:136-143) returns early when l == nil or
l.f == nil (lease.go:137-139); on the live path it unlocks, Closes, and sets
l.f = nil (lease.go:140-142). A second call therefore hits the nil-f guard — no
double-unlock, no double-close, no panic — and a nil-receiver call is caught by the same
l == nil guard. Crash-reclaim. The lease holds the lock purely via the open fd’s
flock (lock_unix.go:12); when the holding process exits, the kernel closes the fd
and drops the flock automatically (documented at lease.go:13-15), so the next Acquire
succeeds with no explicit Release. unlock (lock_unix.go:19-21, LOCK_UN) is only on
the explicit-Release path.
WITNESS.
go test ./internal/gpulease/ -count=1 -timeout 120s -run 'TestReleaseIdempotent|TestReleaseOnProcessExit' -v
TestReleaseIdempotent (lease_test.go:132-142) acquires, calls Release() twice, then
Release() on a nil *Lease — none panic. TestReleaseOnProcessExit
(lease_test.go:100-129) re-execs the test binary as a child (GPULEASE_HELPER_PATH set)
that Acquires (prints ACQUIRED) and os.Exit(0) without Release; the parent
confirms the child held it, then asserts its own NoWait Acquire succeeds — proving the
flock did not leak past process death.
VERDICT. PROVEN — 2026-06-20, native darwin/arm64 (PASS: TestReleaseIdempotent,
PASS: TestReleaseOnProcessExit; ok ... 0.273s). Both halves are witnessed by a real
test; the reclaim half is a genuine cross-process re-exec, not an in-process proxy.
DOS. bound at ship.
Reproduce
go test ./internal/gpulease/ -count=1 -timeout 120s
Native on this macOS arm64 node (uname: Darwin ... arm64); on the Windows host run
through WSL via .\fak\test.ps1 ./internal/gpulease/ (root CLAUDE.md).