From 902646a96550195b6564b50057f8aff45872064b Mon Sep 17 00:00:00 2001 From: wren-nutthouse Date: Mon, 16 Mar 2026 22:34:17 +1100 Subject: [PATCH 1/2] chore(kickoff): start #28 workstream --- plans/issue-kickoff/issue-28.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 plans/issue-kickoff/issue-28.md diff --git a/plans/issue-kickoff/issue-28.md b/plans/issue-kickoff/issue-28.md new file mode 100644 index 0000000..9559fd4 --- /dev/null +++ b/plans/issue-kickoff/issue-28.md @@ -0,0 +1,15 @@ +# Issue #28 kickoff + +Title: automation: handle stale CHANGES_REQUESTED gate after bot re-review + +## Goal +Implement and ship issue #28 with tests and docs. + +## First slice (next PR updates) +- [ ] Reproduce/validate current behavior +- [ ] Implement minimal end-to-end path +- [ ] Add tests for success + failure cases +- [ ] Update docs/changelog/versioning per policy + +## Blockers +- None yet (kickoff PR) From 936188b3f7d90604d2b1fa160441dd03984a04c8 Mon Sep 17 00:00:00 2001 From: wren-nutthouse Date: Mon, 16 Mar 2026 23:31:16 +1100 Subject: [PATCH 2/2] docs: refine kickoff plan for issue #28 stale review gate --- plans/issue-kickoff/issue-28.md | 39 +++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/plans/issue-kickoff/issue-28.md b/plans/issue-kickoff/issue-28.md index 9559fd4..7dfc537 100644 --- a/plans/issue-kickoff/issue-28.md +++ b/plans/issue-kickoff/issue-28.md @@ -1,15 +1,32 @@ -# Issue #28 kickoff +# Issue #28 kickoff — stale `CHANGES_REQUESTED` gate handling -Title: automation: handle stale CHANGES_REQUESTED gate after bot re-review +Issue: https://github.com/nutthouse/tutti/issues/28 -## Goal -Implement and ship issue #28 with tests and docs. +## Problem framing +Merge orchestration can deadlock when GitHub keeps `CHANGES_REQUESTED` from an older review even after follow-up commits and green checks. -## First slice (next PR updates) -- [ ] Reproduce/validate current behavior -- [ ] Implement minimal end-to-end path -- [ ] Add tests for success + failure cases -- [ ] Update docs/changelog/versioning per policy +## Focused implementation slices +1. **Readiness evaluator** + - Add a helper that compares: + - latest actionable review timestamp + - latest head commit timestamp + - required-checks all-green state +2. **Stale-review rule** + - Mark stale when: + - checks are green + - latest commit is newer than latest actionable review + - no newer actionable comments/reviews exist +3. **Orchestrator handling** + - Trigger one re-review request/ping path + - Add bounded wait + poll loop + - Terminal fallback: `needs-human-unblock` +4. **Operator-visible output** + - PR summary line includes stale-review diagnosis and chosen action. -## Blockers -- None yet (kickoff PR) +## Acceptance mapping +- Distinguish unresolved feedback vs stale review lock ✅ +- Terminal status includes merged/needs-human-unblock ✅ +- Deterministic summary comment path ✅ + +## Next code change in this branch +- Implement readiness decision enum + tests for stale/non-stale scenarios.