[done] 鍵 challenge ログイン (②a, additive) — @rail44.dev PR #276 https://github.com/rail44/quacker/pull/276

owner が seed 由来 :v1 Ed25519 で server の nonce に署名 → server が owner_identity の updateKey で verify_strict → quacker_session 発行。秘密鍵は browser を出ず署名+公開 nonce のみ送出。ATProto OAuth は無改修(②b で撤去)。

- server: POST /owner/login/challenge (nonce, consume-once, TTL 300s) + /owner/login/verify。両 route は Optional で anonymous 到達可。署名対象は domain-separated prefix で did:webvh proof への replay 遮断。principal = registered_by_did (interim did:plc)。
- SPA: signWithIdentityKey + 鍵ログイン経路、ATProto と並置。cookie 取得後は未変更の MCP token フローへ chain。
- test: challenge→sign→verify で principal=registered_by_did / replay・不正鍵・未登録 owner reject / 秘密鍵不送出を code+test で担保。cargo nextest 290 / fmt / clippy -D / pnpm typecheck・biome・build・test 257 全 green。atrium-* 未削除。

判断点(frozen spec の委任分、commit message に記載): nonce store は single-instance 前提の in-memory(multi-instance なら shared へ)/ updateKey は validated log の active_update_keys[0] を 0xed01 strip / burn-on-attempt。