fix: agents don't clean up tmux sessions and phase files on completion (#302)

review-pr.sh: After APPROVE verdict, kill tmux session, remove phase
file, review output, sentinel files, and review worktree. Same cleanup
for unknown verdicts. REQUEST_CHANGES keeps session alive per #300.

review-poll.sh: Add safety net in stale session cleanup loop — kill
sessions in terminal phase (PHASE:review_complete) even if review-pr.sh
cleanup was interrupted.

dev/phase-handler.sh: Add sentinel file cleanup (/tmp/ci-result-*,
/tmp/review-injected-*) to PHASE:done and PHASE:failed handlers.

dev-agent.sh: Add sentinel file cleanup to idle_timeout/idle_prompt
exit handler. Add belt-and-suspenders done) case to post-loop handler.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
openhands 2026-03-19 20:30:27 +00:00
parent 5d2b1c1186
commit eeb8d5450f
4 changed files with 48 additions and 4 deletions

View file

@ -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

View file

@ -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