atproto git client atgc.codes

fix(read): keep search results at Bobbin's cap, page comments, fall back to the knot, and refuse account DIDs as repos #1440

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

search now stops before Bobbin's 10,000-hit paging window instead of walking past it and turning a partial result into a 400. What it found is returned, with a stderr note that the search was cut at the cap; a 400 after a non-empty walk is treated as the end. Hits are de-duplicated across pages, and the same cap bounds search --repo walks. Filters for non-comment collections were already sent server-side, so only comment-capable searches filter locally.

--repo DIDs are checked as repo DIDs on the way into pr list, issue list, search and every other command that takes the flag: an account DID is refused with exit 2 and the same atgc repo list hint repo view gives. Comment threads walk the cursor up to 50 pages, and --json says on stderr when a thread is still a prefix. Single-ticket reads now fall back to the knot when Bobbin is warming, unreachable, or still failing after retries, while listings add retry with --source knot to the exit-6 error. issue list prints null for a failed knot comment walk, keeps the record's raw title in --json, and accepts --source knot --author like pr list.

pr diff treats git's patch as bytes: no UTF-8 decode, written to stdout unchanged, with a lossy conversion only where a string is unavoidable. Tests cover a committed Latin-1 file, the search cap and overlap, comment pagination, the new fallbacks, and the listing consistency fixes.

🤖 Generated with Claude Code

Commits 3

fix(pr): write patch bytes as git emitted them
fix(read): page comments, fall back to the knot, check repo DIDs
fix(search): stop at Bobbin's paging window and de-duplicate hits