Amends 0103: the lock package gains fencing, renewal and a decorator.
Context
0103 set named server-side locks behind a driver. The owner’s locking answer LK1 (mem L868, 2026-10-20) says the default is a Postgres advisory lock, that Valkey is optional, and that locks must have a TTL, renew themselves, carry fencing tokens and be easy to use.Decision
- The default driver is a Postgres advisory lock. Valkey is an optional driver.
- Every lock has a TTL and renews automatically while its holder is alive.
- Every lock carries a fencing token, so a stale holder cannot write after its lock has expired and moved on.
@WithLocktakes a lock around a method, so authors do not call acquire and release by hand.- Locks emit metrics.
Consequences
- A stale worker cannot overwrite a newer write, because the store rejects a lower fencing token.
- Locks need no extra infrastructure on-prem, because Postgres is always there.
Enforcement
planned — the lock conformance suite checks TTL expiry, renewal and the fencing rule on each driver.Alternatives
- Valkey as the default: not chosen; it is optional.
- Locks without fencing: rejected, a lock alone cannot stop a stale write.
Supersedes and sources
Supersedes: none. Amends: 0103. Sources: owner locking answer LK1 (stackra-decisions-2026-10-19.md L868, 2026-10-20).