Lean on review_now: the dev asks when ready, instead of the cron re-reviewing every push nf-09tx ← Beads

closed priority 2 task unassigned activesession:review-cadence

Twinned from https://github.com/cfsh/ninefold/issues/702 by tools/beads/import_github.py's reconcile pass.

@aedanpope, 2026-08-07: *"the cleaner long-term soln is to lean into review_now, and ask devs to only review when they are fully ready for next review."*

Measured saving

From dispatch.log: 76 completed reviews across 26 PRs (58 CONVERGED, 17 GAPS, 1 PASS). Counting a review as earning its cost if it returned GAPS or was the final CONVERGED that certified the merge, and everything else as a re-review of an already-converged PR:

36 of 76 avoidable — 47%. Worst: #596 and #647 at 7 reviews each (5 avoidable), #665 at 6 with zero GAPS (5 avoidable), #654 at 7 (4 avoidable).

Two anchors: 11 runs logged unchanged — restamp only — identical verdict, pure waste. And #613 is the counter-example — 4 reviews, 3 returned GAPS, zero avoidable, because the dev only returned when something had actually changed.

⚠️ 47% is an upper bound. Batching three fixes into one review still costs one review, and some intermediate CONVERGEDs genuinely unblock a dev. Realistic: 25-35% of runs.

review_now is already 28 of 150 review runs (~19%) — on-demand deliberately stamps no heartbeat, so it does not appear in dispatch.log. This is a shift from 19% to most, not a cold start.

The thing this must not break

⚠️ #586 is the reason the cron re-reviews every push. rev:pass certifying a head the reviewer has not seen is the hazard; re-reviewing on every push is the current, expensive answer to it. Replacing that with dev discipline means the freshness guarantee now rests on a convention, and a convention does not fail closed. Whatever lands here has to answer #586, not sit beside it — a stale rev:pass is the #389 shape.

The cron should stay as the safety net @aedanpope described on #576 — *"only running in the background for anything that slips through / to maintain the state machine"* — but its cadence and its re-review trigger are what this issue changes.

Neighbours, all open

#586 (freshness — the blocker above) · #679 (poll wakes only on GAPS) · #467 (45-min lock suppresses silently) · #483 (81 MB of logs, ~16 MB/day, no rotation — the same waste as disk) · #585 and #581 (review_now hardening, load-bearing once devs depend on it).

Dependencies

None.

Comments

No comments.

Add a comment