A PR waiting on your review now notifies you when its verdict turns ready: its CI passed, its conflict was resolved, or failing CI was fixed. The helper decides this once per refresh, after its last check (CI, or merges with CI checks off), against the PR's last answer (pending, conflicted, failing or unknown). So a resubmit that resolves a conflict notifies when its new CI passes, not on the clean merge alone. It doesn't fire on first load, after a config change, for a PR that just appeared (the "new" notification covers that), when a failed lookup recovers, or when CI goes from a result to "none" (a new revision whose run hasn't started). More than 3 at once become one summary. It follows the "notify" setting and Pause notifications, with the same Open and Snooze 1 hour actions. Summaries now also stay quiet when "PRs needing review" is off, as single notifications already did.
For review: this adds two protocol outputs, {"type":"ready","item":...} and {"type":"readyMany","count":N}, and one piece of engine state: Engine._waiting, a map from each PR whose last answer wasn't ready to its CI state then. It is rebuilt after each refresh's last check, kept through "checking" and failed lookups, and cleared on a config change. No settings key is added; the "notify" row's title in Settings now mentions ready PRs. The rules are tested in tests/engine/ready.test.js by replaying whole refreshes (attention, merges, CI), and the notification is a new shot, notification-ready.
Before, the only notification (a new PR), and the Settings row:
After, a PR that turned ready, and the renamed row (headless shell):
🤖 Generated with Claude Code