Compare commits

..

1 commit

Author SHA1 Message Date
Agent
718327754a fix: fix: dev-poll in-progress check blocks all agents — should only block on own assignments (#358)
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
ci/woodpecker/pr/ci Pipeline was successful
2026-04-07 16:25:08 +00:00

View file

@ -463,62 +463,65 @@ if [ "$ORPHAN_COUNT" -gt 0 ]; then
BLOCKED_BY_INPROGRESS=true BLOCKED_BY_INPROGRESS=true
fi fi
PR_SHA=$(curl -sf -H "Authorization: token ${FORGE_TOKEN}" \ # Only process PR if not abandoned (stale branch check above)
"${API}/pulls/${HAS_PR}" | jq -r '.head.sha') || true if [ "$BLOCKED_BY_INPROGRESS" = false ]; then
CI_STATE=$(ci_commit_status "$PR_SHA") || true PR_SHA=$(curl -sf -H "Authorization: token ${FORGE_TOKEN}" \
"${API}/pulls/${HAS_PR}" | jq -r '.head.sha') || true
CI_STATE=$(ci_commit_status "$PR_SHA") || true
# Non-code PRs (docs, formulas, evidence) may have no CI — treat as passed # Non-code PRs (docs, formulas, evidence) may have no CI — treat as passed
if ! ci_passed "$CI_STATE" && ! ci_required_for_pr "$HAS_PR"; then if ! ci_passed "$CI_STATE" && ! ci_required_for_pr "$HAS_PR"; then
CI_STATE="success" CI_STATE="success"
log "PR #${HAS_PR} has no code files — treating CI as passed" log "PR #${HAS_PR} has no code files — treating CI as passed"
fi
# Check formal reviews (single fetch to avoid race window)
REVIEWS_JSON=$(curl -sf -H "Authorization: token ${FORGE_TOKEN}" \
"${API}/pulls/${HAS_PR}/reviews") || true
HAS_APPROVE=$(echo "$REVIEWS_JSON" | \
jq -r '[.[] | select(.state == "APPROVED") | select(.stale == false)] | length') || true
HAS_CHANGES=$(echo "$REVIEWS_JSON" | \
jq -r '[.[] | select(.state == "REQUEST_CHANGES") | select(.stale == false)] | length') || true
if ci_passed "$CI_STATE" && [ "${HAS_APPROVE:-0}" -gt 0 ]; then
if try_direct_merge "$HAS_PR" "$ISSUE_NUM"; then
BLOCKED_BY_INPROGRESS=true
else
# Direct merge failed (conflicts?) — fall back to dev-agent
log "falling back to dev-agent for PR #${HAS_PR} merge"
nohup "${SCRIPT_DIR}/dev-agent.sh" "$ISSUE_NUM" >> "$LOGFILE" 2>&1 &
log "started dev-agent PID $! for issue #${ISSUE_NUM} (agent-merge)"
BLOCKED_BY_INPROGRESS=true
fi fi
# Do NOT gate REQUEST_CHANGES on ci_passed: act immediately even if CI is # Check formal reviews (single fetch to avoid race window)
# pending/unknown. Definitive CI failure is handled by the elif below. REVIEWS_JSON=$(curl -sf -H "Authorization: token ${FORGE_TOKEN}" \
elif [ "${HAS_CHANGES:-0}" -gt 0 ] && { ci_passed "$CI_STATE" || [ "$CI_STATE" = "pending" ] || [ "$CI_STATE" = "unknown" ] || [ -z "$CI_STATE" ]; }; then "${API}/pulls/${HAS_PR}/reviews") || true
log "issue #${ISSUE_NUM} PR #${HAS_PR} has REQUEST_CHANGES — spawning agent" HAS_APPROVE=$(echo "$REVIEWS_JSON" | \
nohup "${SCRIPT_DIR}/dev-agent.sh" "$ISSUE_NUM" >> "$LOGFILE" 2>&1 & jq -r '[.[] | select(.state == "APPROVED") | select(.stale == false)] | length') || true
log "started dev-agent PID $! for issue #${ISSUE_NUM} (review fix)" HAS_CHANGES=$(echo "$REVIEWS_JSON" | \
BLOCKED_BY_INPROGRESS=true jq -r '[.[] | select(.state == "REQUEST_CHANGES") | select(.stale == false)] | length') || true
elif ci_failed "$CI_STATE"; then if ci_passed "$CI_STATE" && [ "${HAS_APPROVE:-0}" -gt 0 ]; then
if handle_ci_exhaustion "$HAS_PR" "$ISSUE_NUM" "check_only"; then if try_direct_merge "$HAS_PR" "$ISSUE_NUM"; then
# Fall through to backlog scan instead of exit BLOCKED_BY_INPROGRESS=true
:
else
# Increment at actual launch time (not on guard-hit paths)
if handle_ci_exhaustion "$HAS_PR" "$ISSUE_NUM"; then
BLOCKED_BY_INPROGRESS=true # exhausted between check and launch
else else
log "issue #${ISSUE_NUM} PR #${HAS_PR} CI failed — spawning agent to fix (attempt ${CI_FIX_ATTEMPTS}/3)" # Direct merge failed (conflicts?) — fall back to dev-agent
log "falling back to dev-agent for PR #${HAS_PR} merge"
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} (agent-merge)"
BLOCKED_BY_INPROGRESS=true BLOCKED_BY_INPROGRESS=true
fi fi
fi
else # Do NOT gate REQUEST_CHANGES on ci_passed: act immediately even if CI is
log "issue #${ISSUE_NUM} has open PR #${HAS_PR} (CI: ${CI_STATE}, waiting)" # pending/unknown. Definitive CI failure is handled by the elif below.
BLOCKED_BY_INPROGRESS=true elif [ "${HAS_CHANGES:-0}" -gt 0 ] && { ci_passed "$CI_STATE" || [ "$CI_STATE" = "pending" ] || [ "$CI_STATE" = "unknown" ] || [ -z "$CI_STATE" ]; }; then
log "issue #${ISSUE_NUM} PR #${HAS_PR} has REQUEST_CHANGES — spawning agent"
nohup "${SCRIPT_DIR}/dev-agent.sh" "$ISSUE_NUM" >> "$LOGFILE" 2>&1 &
log "started dev-agent PID $! for issue #${ISSUE_NUM} (review fix)"
BLOCKED_BY_INPROGRESS=true
elif ci_failed "$CI_STATE"; then
if handle_ci_exhaustion "$HAS_PR" "$ISSUE_NUM" "check_only"; then
# Fall through to backlog scan instead of exit
:
else
# Increment at actual launch time (not on guard-hit paths)
if handle_ci_exhaustion "$HAS_PR" "$ISSUE_NUM"; then
BLOCKED_BY_INPROGRESS=true # exhausted between check and launch
else
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 &
log "started dev-agent PID $! for issue #${ISSUE_NUM} (CI fix)"
BLOCKED_BY_INPROGRESS=true
fi
fi
else
log "issue #${ISSUE_NUM} has open PR #${HAS_PR} (CI: ${CI_STATE}, waiting)"
BLOCKED_BY_INPROGRESS=true
fi
fi fi
else else
# Check assignee before adopting orphaned issue # Check assignee before adopting orphaned issue