Repository navigation
feat: squabble board (estate needs-me board) and squabble inbox-sweep - #123
Merged
Merged
Conversation
`board` enumerates every non-archived repo of each owner, reads the merge gate (rulesets ∪ classic protection) and open PRs of repos that have any, and places each PR in one bucket: needs you / agent work / landing by itself / stale. Renders Markdown under the 65536-byte issue body limit and, with --publish owner/repo#N, rewrites that issue's body (never comments) and checks the stored body equals the one sent. A whole-batch failure (502, no data) is split and retried down to one repo; listing pages retry transport failures. Exit 6 = incomplete, with the unreadable repos named at the top of the board. `inbox-sweep` lists every notification thread still in the inbox, resolves PR/issue state in GraphQL batches, and clears (unsubscribe, then mark done) only threads whose subject is merged or closed. Dry run by default; --apply writes, stops at a REST reserve, and names every due thread it left. Unknown state and non-PR/issue subjects are kept. Live board 2026-10-01: 398+50 repos, 458+54 open PRs, all placed, 0 unreadable; counts reconcile with `gh search prs` (the one remaining difference is a PR in an archived repo). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0196aKTfvS6vPQVp2LPoXbjP
hyperpolymath
enabled auto-merge (squash)
October 1, 2026 14:25
Contributor
|
Navigate logical layers of code changes, visualize relationships, and explore their blast radius. Note Currently processing new changes in this PR. This may take a few minutes, please wait... ⚙️ Run configurationConfiguration used: Organization UI Review profile: ASSERTIVE Plan: Advanced Run ID: 📒 Files selected for processing (11)
✨ Finishing Touches📝 Generate docstrings
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
hyperpolymath
added a commit
that referenced
this pull request
Oct 1, 2026
Follow-up to #123. ## Why `GET /notifications?all=true` also lists threads that are already **done**, and the REST notification object has no done field. I measured this live on `hyperpolymath/HOL`: - `inbox-sweep --apply --repo hyperpolymath/HOL` cleared 4 of 4 due threads, and both DELETEs returned 204. - PR #7's subscription went `true` → 404, while open PR #11 stayed subscribed. - The **web inbox** for that repo then showed only #11 (the positive control). The other four were gone. - But `all=true` still listed all five threads unchanged three minutes later. Without memory, every hourly run would therefore re-clear the same ~640 threads: about 1300 REST writes against a 5000/h budget that other sessions share. ## What `--state <path>` stores `{thread id: updated_at}`: - An entry is recorded only after both DELETEs return 204. The file is written atomically (temp file + rename). - A thread whose `updated_at` is unchanged is skipped before any GraphQL read or REST write. - New activity, which GitHub uses to bring a done thread back to the inbox, makes it eligible again. - Entries for threads that are no longer listed are pruned, so the file stays bounded. - A missing file means empty state. A corrupt file exits 2: an empty state would silently re-clear everything. ## Evidence - `just quality`: exit 0, 310 passed, 0 failed. - New tests: a second sweep using the saved state performs **zero** writes; a bumped `updated_at` is re-cleared; stale entries are pruned; the state file round-trips and a corrupt one is refused. - Mutant: replacing the skip predicate with `false` fails 2 of the new tests. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_0196aKTfvS6vPQVp2LPoXbjP Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
hyperpolymath
added a commit
that referenced
this pull request
Oct 1, 2026
Resolve crates/squabble-cli/src/main.rs as a union: main added `board`/`inbox-sweep` (exit 6, #123/#124) where this branch added `verify-satisfied` (exit 5, #119). Both modules, dispatch arms, usage lines and exit-code docs are kept; codes listed in numeric order. cargo fmt --check, clippy -D warnings and cargo test --workspace (279) pass. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W5CoaksP2Bg21HpDCgFgwS
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Two new subcommands, so the owner sees only what needs them: no paging through hundreds of merged-PR notifications, and no hunting for the few PRs that are really blocked.
squabble boardhyperpolymathandmetadatastician.Ref.rulesomits classic protection. It also reads every open PR.squabble-core::board).--publish owner/repo#Nrewrites that issue's body: it never comments, so it sends no notifications. It then checks that the stored body equals the one sent, because rc=0 is not evidence.squabble inbox-sweepGET /notifications?all=true, paginated). It resolves PR and issue state in GraphQL batches.--applywrites, stops at a REST--reserveread from the response header, and names every due thread it left (as a set, not a count). Exits 6 if any were left.notificationsscope; an App token cannot read notifications.Evidence
just quality: exit 0, 302 tests passed, 0 failed (fmt-check, clippy-D warnings, test).one_heavy_repo_does_not_sink_its_batchfail.gh search prs: 458 = 458, and 55 = 54 + 1 PR in an archived repo, which the board excludes by design.Not in this PR
inbox-sweep --apply, thenboard --publish. It lives in the owner'sdeveloper/scripts, outside this repo.🤖 Generated with Claude Code
https://claude.ai/code/session_0196aKTfvS6vPQVp2LPoXbjP