/**
 * Current-code invariants asserted (2026-04-21, ses_006 Phase 1):
 *
 *   - `acquire(path, owner)` returns immediately when the file is
 *     unlocked; creates a lock with `lockId = lock_<uuid>`,
 *     `expiresAt = now + lockTimeoutMs`, emits `lock_acquired`.
 *   - `acquire` on a file already held by the SAME owner is idempotent
 *     — returns `{acquired: true, lock}` (the existing lock) and emits
 *     nothing.
 *   - `acquire` on a file held by a DIFFERENT owner emits `lock_denied`
 *     and then polls at `LOCK_ACQUIRE_POLL_INTERVAL_MS` (100ms) intervals
 *     until either the holder releases, the lock expires, or
 *     `acquireTimeoutMs` elapses. No FIFO queue; retries race.
 *   - When the holder releases before the deadline, the waiting acquire
 *     succeeds on its next poll.
 *   - When `acquireTimeoutMs` elapses, acquire returns
 *     `{acquired: false, holder, filePath}` — holder is the current
 *     lock holder's owner if the lock still exists, else empty string.
 *   - `maxLocksPerAgent` blocks further acquisitions by the same owner.
 *     The internal `tryAcquire` returns `{holder: owner}` (a
 *     "yourself" sentinel) but the public `acquire()` swallows that and
 *     keeps polling for `acquireTimeoutMs` (there's no short-circuit
 *     for cap-exceeded). When the deadline expires and no lock exists
 *     on the file, the final `holder` is `''` (empty `RunId`) because
 *     the fallback reads `this.locks.get(filePath)?.owner ?? ''`.
 *   - `release(path, owner)` deletes the lock + emits `lock_released`
 *     when the current lock's owner matches; cleans up the per-owner
 *     lock set (and prunes the set entry when it becomes empty).
 *     Returns false without emitting when no lock or owner mismatch.
 *   - `releaseAll(owner)` drops every lock owned by `owner`, emits
 *     `lock_released` per lock, returns the count, and prunes the
 *     per-owner set.
 *   - `isLocked(path)` + `getHolder(path)` auto-expire any stale lock
 *     they observe (and emit `lock_expired`) before returning the
 *     current state.
 *   - `expireStale()` sweeps every lock; expired ones are deleted and
 *     emit `lock_expired`; returns the count.
 *   - Re-acquiring a path after its lock expires succeeds and assigns
 *     a FRESH `lockId` (the old id is never reused).
 *   - Lock state is per-`RunId`; no tenant dimension (design.md §2.1
 *     aspirational).
 */
export {};
//# sourceMappingURL=lock.test.d.ts.map