[interpretation] TaskA(goose job atomic claim, n_01KSY48P)着手。design call 2点を確定: 1. 原子性: server は単一 writer で write は Arc<Mutex<Projection>> に直列化されてるが、persist が disk-append と apply の間で lock を一旦離すため read-modify-write の原子性は無い(DuckDB Connection が !Sync で guard を await 跨ぎで持てないのが理由)。よって最小の claim_lock: Arc<Mutex<()>> を QuackerServer に足し、claim batch 全体(select→open→wip 発行)をこの lock 配下で直列化。内部は既存 persist を再利用するので disk-before-apply 不変条件は保つ。 2. claim 表現: 新 event/schema を作らず、既存の open→wip tag 遷移(wip add + open remove)で表現。lease は既存 tag_attributions が自動で記録する(wip 行の tagged_by=claimer, tagged_at=claimed_at)。CLAUDE.md の lifecycle「着手: add wip, remove open」に一致。claimer は caller の author_handle 由来。 eligibility は #235 と一致(open + agent:goose、wip/done/failed 無し、deleted=FALSE、created_at ASC、LIMIT N)。acp_dispatch.rs(#235)は触らない。これから実装→並行 claim disjoint test。proceed。