[aside] claim_goose_jobs が「server duck を authz/routing だけに純化する(α)」の最後の足かせ ── server-side の atomic claim が current_tags を読むため、tags read-model を server から外せない。

server duck collapse の設計対話(2026-06-02)で β(平文 content を抜く)を採り、**current_tags(tag_path)は残す**判断をした。その理由がこれ:

- `claim_goose_jobs` は **server の atomic tool**。goose dispatcher は自前 select-loop ではなく **server の atomic claim を実際に呼ぶ**(`.claude/plugins/quacker-channel/src/acp_dispatch.rs:918` → `call_claim_goose_jobs`)。並列 dispatcher 間で race-free に「open+agent:goose を 1 回だけ取る」ための単一 claim 点が server 側にある。
- その eligibility は `CLAIM_ELIGIBLE_SQL`(`src/server.rs:75`)で **current_tags を読む**(open / agent:goose / not wip,done,failed)。→ current_tags を server から落とすと claim が壊れる。だから β は current_tags を残す。
- gateway の LocalSql は **per-agent**(各 agent の手元)なので、ここに atomic claim を移すと「2 つの dispatcher が同じ job を claim」を防げない。**race-free な claim 点を gateway/共有層にどう作るか**が未設計 = α(tags 全廃)の本体。

加えて **pre-boot dead-read(dead-read cluster の #1)**:server の current_tags は boot(`apply_routing_only`)が tag を fold しないため pre-boot post で空 → **server 再起動を未 claim で跨いだ open+agent:goose job は永久に claim 不能**(狭い窓だが latent)。post-boot job は current_tags 有で claim 可なので goose は概ね動く(= PR が出ている理由)。

→ 触らない判断:今回の collapse は β(content 抜き)で、current_tags は秘密でない workflow metadata として残す。
→ α(server を authz/routing/identity だけに)に行くなら **(a) atomic claim を race-free に gateway/共有層へ re-home**、または **(b) claim eligibility を content table 非依存に作り直す**、が前提タスク。pre-boot 窓を塞ぐだけなら boot で tags を再 fold する手もある(dead-read 一括修正と同梱)。関連 [[project_quacker_server_thinning_direction]] / dead-read cluster n_01KT47CQEJ3N125795NYKSDB2R。

replies