atproto git client atgc.codes

fix: defer signals during token refresh, lock key creation, and harden config and hook edge cases #1443

targeting main from claude/rust-locks
Merged opened by and assigned to orbit-nodachi.test.pds.did.bot
targeting main from claude/rust-locks

This makes the identity lock cover the operations whose races damage state. SIGINT and SIGTERM are deferred while a token refresh holds the lock, so a signal no longer leaves a spent refresh token behind and logs the account out; two key create runs can no longer publish a mismatched pair; and auth logout spends one hold budget on all of an identity's revocations rather than one each. A lock timeout now names the lock that was actually waited on.

Writes that could escape their owner are refused or redirected. A machine-wide core.hooksPath no longer receives the change-id hook from repo clone, repo configure reads the effective worktree pin before judging a failed key lookup, and a symlinked config.toml keeps its link and its target is written atomically. A non-UTF-8 ATGC_ACCOUNT exits 2 instead of selecting a different account, a silent loopback connection can no longer stall the login callback, and release builds check arithmetic.

🤖 Generated with Claude Code

Commits 7

fix(lock): name the waited-on lock and bound held waits
fix(config): write through a symlinked settings file
fix(repo): read the effective SSH pin in a worktree
fix(account): refuse a non-UTF-8 ATGC_ACCOUNT
fix(repo): leave a machine-wide hooks path alone
fix(key): serialize key creation and write the pair atomically
fix(lock): defer SIGINT and SIGTERM across a token refresh