fix: dev-poll spawns duplicate agents — no tmux session guard (#371)
Add tmux has-session check before spawning dev-agent.sh at all four spawn points (orphan REQUEST_CHANGES, orphan CI fix, stuck-PR REQUEST_CHANGES, stuck-PR CI fix). If a tmux session already exists for the issue, log and skip instead of spawning a duplicate agent. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
86070ceef7
commit
4feb1fba97
1 changed files with 32 additions and 12 deletions
|
|
@ -347,19 +347,29 @@ if [ "$ORPHAN_COUNT" -gt 0 ]; then
|
||||||
# Do NOT gate REQUEST_CHANGES on ci_passed: act immediately even if CI is
|
# Do NOT gate REQUEST_CHANGES on ci_passed: act immediately even if CI is
|
||||||
# pending/unknown. Definitive CI failure is handled by the elif below.
|
# pending/unknown. Definitive CI failure is handled by the elif below.
|
||||||
elif [ "${HAS_CHANGES:-0}" -gt 0 ] && { ci_passed "$CI_STATE" || [ "$CI_STATE" = "pending" ] || [ "$CI_STATE" = "unknown" ] || [ -z "$CI_STATE" ]; }; then
|
elif [ "${HAS_CHANGES:-0}" -gt 0 ] && { ci_passed "$CI_STATE" || [ "$CI_STATE" = "pending" ] || [ "$CI_STATE" = "unknown" ] || [ -z "$CI_STATE" ]; }; then
|
||||||
|
SESSION_NAME="dev-${PROJECT_NAME}-${ISSUE_NUM}"
|
||||||
|
if tmux has-session -t "$SESSION_NAME" 2>/dev/null; then
|
||||||
|
log "issue #${ISSUE_NUM} already has active session ${SESSION_NAME} — skipping"
|
||||||
|
else
|
||||||
log "issue #${ISSUE_NUM} PR #${HAS_PR} has REQUEST_CHANGES — spawning agent"
|
log "issue #${ISSUE_NUM} PR #${HAS_PR} has REQUEST_CHANGES — spawning agent"
|
||||||
nohup "${SCRIPT_DIR}/dev-agent.sh" "$ISSUE_NUM" >> "$LOGFILE" 2>&1 &
|
nohup "${SCRIPT_DIR}/dev-agent.sh" "$ISSUE_NUM" >> "$LOGFILE" 2>&1 &
|
||||||
log "started dev-agent PID $! for issue #${ISSUE_NUM} (review fix)"
|
log "started dev-agent PID $! for issue #${ISSUE_NUM} (review fix)"
|
||||||
|
fi
|
||||||
exit 0
|
exit 0
|
||||||
|
|
||||||
elif ! ci_passed "$CI_STATE" && [ "$CI_STATE" != "" ] && [ "$CI_STATE" != "pending" ] && [ "$CI_STATE" != "unknown" ]; then
|
elif ! ci_passed "$CI_STATE" && [ "$CI_STATE" != "" ] && [ "$CI_STATE" != "pending" ] && [ "$CI_STATE" != "unknown" ]; then
|
||||||
if handle_ci_exhaustion "$HAS_PR" "$ISSUE_NUM"; then
|
if handle_ci_exhaustion "$HAS_PR" "$ISSUE_NUM"; then
|
||||||
# Fall through to backlog scan instead of exit
|
# Fall through to backlog scan instead of exit
|
||||||
:
|
:
|
||||||
|
else
|
||||||
|
SESSION_NAME="dev-${PROJECT_NAME}-${ISSUE_NUM}"
|
||||||
|
if tmux has-session -t "$SESSION_NAME" 2>/dev/null; then
|
||||||
|
log "issue #${ISSUE_NUM} already has active session ${SESSION_NAME} — skipping"
|
||||||
else
|
else
|
||||||
log "issue #${ISSUE_NUM} PR #${HAS_PR} CI failed — spawning agent to fix (attempt ${CI_FIX_ATTEMPTS}/3)"
|
log "issue #${ISSUE_NUM} PR #${HAS_PR} CI failed — spawning agent to fix (attempt ${CI_FIX_ATTEMPTS}/3)"
|
||||||
nohup "${SCRIPT_DIR}/dev-agent.sh" "$ISSUE_NUM" >> "$LOGFILE" 2>&1 &
|
nohup "${SCRIPT_DIR}/dev-agent.sh" "$ISSUE_NUM" >> "$LOGFILE" 2>&1 &
|
||||||
log "started dev-agent PID $! for issue #${ISSUE_NUM} (CI fix)"
|
log "started dev-agent PID $! for issue #${ISSUE_NUM} (CI fix)"
|
||||||
|
fi
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
@ -436,17 +446,27 @@ for i in $(seq 0 $(($(echo "$OPEN_PRS" | jq 'length') - 1))); do
|
||||||
# CI to settle. Definitive CI failure (non-pending, non-unknown) is handled by
|
# CI to settle. Definitive CI failure (non-pending, non-unknown) is handled by
|
||||||
# the elif below, so we only spawn here when CI has not definitively failed.
|
# the elif below, so we only spawn here when CI has not definitively failed.
|
||||||
if [ "${HAS_CHANGES:-0}" -gt 0 ] && { ci_passed "$CI_STATE" || [ "$CI_STATE" = "pending" ] || [ "$CI_STATE" = "unknown" ] || [ -z "$CI_STATE" ]; }; then
|
if [ "${HAS_CHANGES:-0}" -gt 0 ] && { ci_passed "$CI_STATE" || [ "$CI_STATE" = "pending" ] || [ "$CI_STATE" = "unknown" ] || [ -z "$CI_STATE" ]; }; then
|
||||||
|
SESSION_NAME="dev-${PROJECT_NAME}-${STUCK_ISSUE}"
|
||||||
|
if tmux has-session -t "$SESSION_NAME" 2>/dev/null; then
|
||||||
|
log "issue #${STUCK_ISSUE} already has active session ${SESSION_NAME} — skipping"
|
||||||
|
else
|
||||||
log "PR #${PR_NUM} (issue #${STUCK_ISSUE}) has REQUEST_CHANGES — fixing first"
|
log "PR #${PR_NUM} (issue #${STUCK_ISSUE}) has REQUEST_CHANGES — fixing first"
|
||||||
nohup "${SCRIPT_DIR}/dev-agent.sh" "$STUCK_ISSUE" >> "$LOGFILE" 2>&1 &
|
nohup "${SCRIPT_DIR}/dev-agent.sh" "$STUCK_ISSUE" >> "$LOGFILE" 2>&1 &
|
||||||
log "started dev-agent PID $! for stuck PR #${PR_NUM}"
|
log "started dev-agent PID $! for stuck PR #${PR_NUM}"
|
||||||
|
fi
|
||||||
exit 0
|
exit 0
|
||||||
elif ! ci_passed "$CI_STATE" && [ "$CI_STATE" != "" ] && [ "$CI_STATE" != "pending" ] && [ "$CI_STATE" != "unknown" ]; then
|
elif ! ci_passed "$CI_STATE" && [ "$CI_STATE" != "" ] && [ "$CI_STATE" != "pending" ] && [ "$CI_STATE" != "unknown" ]; then
|
||||||
if handle_ci_exhaustion "$PR_NUM" "$STUCK_ISSUE"; then
|
if handle_ci_exhaustion "$PR_NUM" "$STUCK_ISSUE"; then
|
||||||
continue # skip this PR, check next stuck PR or fall through to backlog
|
continue # skip this PR, check next stuck PR or fall through to backlog
|
||||||
|
else
|
||||||
|
SESSION_NAME="dev-${PROJECT_NAME}-${STUCK_ISSUE}"
|
||||||
|
if tmux has-session -t "$SESSION_NAME" 2>/dev/null; then
|
||||||
|
log "issue #${STUCK_ISSUE} already has active session ${SESSION_NAME} — skipping"
|
||||||
else
|
else
|
||||||
log "PR #${PR_NUM} (issue #${STUCK_ISSUE}) CI failed — fixing (attempt ${CI_FIX_ATTEMPTS}/3)"
|
log "PR #${PR_NUM} (issue #${STUCK_ISSUE}) CI failed — fixing (attempt ${CI_FIX_ATTEMPTS}/3)"
|
||||||
nohup "${SCRIPT_DIR}/dev-agent.sh" "$STUCK_ISSUE" >> "$LOGFILE" 2>&1 &
|
nohup "${SCRIPT_DIR}/dev-agent.sh" "$STUCK_ISSUE" >> "$LOGFILE" 2>&1 &
|
||||||
log "started dev-agent PID $! for stuck PR #${PR_NUM}"
|
log "started dev-agent PID $! for stuck PR #${PR_NUM}"
|
||||||
|
fi
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue