diff --git a/dev/dev-agent.sh b/dev/dev-agent.sh index 84fd345..25de680 100755 --- a/dev/dev-agent.sh +++ b/dev/dev-agent.sh @@ -740,11 +740,21 @@ case "${_MONITOR_LOOP_EXIT:-}" in else cleanup_worktree fi - rm -f "$PHASE_FILE" "$IMPL_SUMMARY_FILE" "$THREAD_FILE" + rm -f "$PHASE_FILE" "$IMPL_SUMMARY_FILE" "$THREAD_FILE" \ + "/tmp/ci-result-${PROJECT_NAME}-${ISSUE}.txt" + [ -n "${PR_NUMBER:-}" ] && rm -f "/tmp/review-injected-${PROJECT_NAME}-${PR_NUMBER}" ;; crash_recovery_failed) cleanup_labels ;; + done) + # Belt-and-suspenders: callback in phase-handler.sh handles primary cleanup, + # but ensure sentinel files are removed if callback was interrupted + rm -f "$PHASE_FILE" "$IMPL_SUMMARY_FILE" "$THREAD_FILE" \ + "/tmp/ci-result-${PROJECT_NAME}-${ISSUE}.txt" + [ -n "${PR_NUMBER:-}" ] && rm -f "/tmp/review-injected-${PROJECT_NAME}-${PR_NUMBER}" + CLAIMED=false + ;; esac log "dev-agent finished for issue #${ISSUE}" diff --git a/dev/phase-handler.sh b/dev/phase-handler.sh index 7dbe4fe..1e4ef78 100644 --- a/dev/phase-handler.sh +++ b/dev/phase-handler.sh @@ -517,7 +517,9 @@ Instructions: # Local cleanup agent_kill_session "$SESSION_NAME" cleanup_worktree - rm -f "$PHASE_FILE" "$IMPL_SUMMARY_FILE" "$THREAD_FILE" + rm -f "$PHASE_FILE" "$IMPL_SUMMARY_FILE" "$THREAD_FILE" \ + "/tmp/ci-result-${PROJECT_NAME}-${ISSUE}.txt" + [ -n "${PR_NUMBER:-}" ] && rm -f "/tmp/review-injected-${PROJECT_NAME}-${PR_NUMBER}" CLAIMED=false # Don't unclaim again in cleanup() # ── PHASE: failed ─────────────────────────────────────────────────────────── @@ -611,7 +613,9 @@ $(printf '%s' "$REFUSAL_JSON" | head -c 2000) CLAIMED=false # Don't unclaim again in cleanup() agent_kill_session "$SESSION_NAME" cleanup_worktree - rm -f "$PHASE_FILE" "$IMPL_SUMMARY_FILE" "$THREAD_FILE" + rm -f "$PHASE_FILE" "$IMPL_SUMMARY_FILE" "$THREAD_FILE" \ + "/tmp/ci-result-${PROJECT_NAME}-${ISSUE}.txt" + [ -n "${PR_NUMBER:-}" ] && rm -f "/tmp/review-injected-${PROJECT_NAME}-${PR_NUMBER}" return 1 else @@ -638,7 +642,9 @@ $(printf '%s' "$REFUSAL_JSON" | head -c 2000) else cleanup_worktree fi - rm -f "$PHASE_FILE" "$IMPL_SUMMARY_FILE" "$THREAD_FILE" + rm -f "$PHASE_FILE" "$IMPL_SUMMARY_FILE" "$THREAD_FILE" \ + "/tmp/ci-result-${PROJECT_NAME}-${ISSUE}.txt" + [ -n "${PR_NUMBER:-}" ] && rm -f "/tmp/review-injected-${PROJECT_NAME}-${PR_NUMBER}" return 1 fi diff --git a/review/review-poll.sh b/review/review-poll.sh index 1b0e584..645df8d 100755 --- a/review/review-poll.sh +++ b/review/review-poll.sh @@ -79,6 +79,20 @@ if [ -n "$REVIEW_SESSIONS" ]; then rm -rf "/tmp/${PROJECT_NAME}-review-${pr_num}" 2>/dev/null || true continue fi + + # Safety net: clean up sessions in terminal phases (review already posted) + current_phase=$(head -1 "$phase_file" 2>/dev/null | tr -d '[:space:]' || true) + if [ "$current_phase" = "PHASE:review_complete" ]; then + log "cleanup: killing session ${session} (terminal phase: review_complete)" + tmux kill-session -t "$session" 2>/dev/null || true + rm -f "$phase_file" "/tmp/${PROJECT_NAME}-review-output-${pr_num}.json" \ + "/tmp/review-injected-${PROJECT_NAME}-${pr_num}" + sed -i "/\t${pr_num}$/d" /tmp/review-thread-map 2>/dev/null || true + cd "$REPO_ROOT" + git worktree remove "/tmp/${PROJECT_NAME}-review-${pr_num}" --force 2>/dev/null || true + rm -rf "/tmp/${PROJECT_NAME}-review-${pr_num}" 2>/dev/null || true + continue + fi done <<< "$REVIEW_SESSIONS" fi diff --git a/review/review-pr.sh b/review/review-pr.sh index b37e1e1..581cdc3 100755 --- a/review/review-pr.sh +++ b/review/review-pr.sh @@ -878,6 +878,13 @@ log "DONE: ${VERDICT} (re-review: ${IS_RE_REVIEW})" case "$VERDICT" in APPROVE) echo "PHASE:review_complete" > "${PHASE_FILE}" + # Terminal phase: kill session, clean up all associated files + tmux kill-session -t "${SESSION_NAME}" 2>/dev/null || true + rm -f "${PHASE_FILE}" "${REVIEW_OUTPUT_FILE}" \ + "/tmp/review-injected-${PROJECT_NAME}-${PR_NUMBER}" + cd "${REPO_ROOT}" + git worktree remove "${REVIEW_WORKTREE}" --force 2>/dev/null || true + rm -rf "${REVIEW_WORKTREE}" 2>/dev/null || true ;; REQUEST_CHANGES|DISCUSS) printf 'PHASE:awaiting_changes\nSHA:%s\n' "$PR_SHA" > "${PHASE_FILE}" @@ -885,5 +892,12 @@ case "$VERDICT" in ;; *) echo "PHASE:review_complete" > "${PHASE_FILE}" + # Unknown verdict terminal phase: clean up like APPROVE + tmux kill-session -t "${SESSION_NAME}" 2>/dev/null || true + rm -f "${PHASE_FILE}" "${REVIEW_OUTPUT_FILE}" \ + "/tmp/review-injected-${PROJECT_NAME}-${PR_NUMBER}" + cd "${REPO_ROOT}" + git worktree remove "${REVIEW_WORKTREE}" --force 2>/dev/null || true + rm -rf "${REVIEW_WORKTREE}" 2>/dev/null || true ;; esac