Skip to content

task #751: failover relaunch syncs new pod into pods.conf + recovery commands create-missing#561

Open
superkaiba wants to merge 554 commits into
mainfrom
issue-751
Open

task #751: failover relaunch syncs new pod into pods.conf + recovery commands create-missing#561
superkaiba wants to merge 554 commits into
mainfrom
issue-751

Conversation

@superkaiba

Copy link
Copy Markdown
Owner

Closes task #751.

Workflow-fix: a GCP→RunPod (and RunPod-wedge) failover relaunched a fresh pod but never registered it in pods.conf, so SSH/MCP couldn't reach it, the raw-SSH poller false-declared status=dead, and the documented recovery commands pod.py config --update / --refresh-from-api BOTH errored "pod '' not found in pods.conf". Three additive fixes:

  • Change B (scripts/pod_config.py): --update and --refresh-from-api CREATE a missing pods.conf row when the pod is RUNNING on the live RunPod API (refresh) or when both --host+--port are given (update), instead of sys.exit(1). Genuinely-absent/not-RUNNING still fails loud.
  • Change A (scripts/backend_poll.py): both failover paths (_failover_dead_gcp_to_runpod, _relaunch_fresh_runpod) call a best-effort registration helper after the authoritative sidecar re-point; the helper NEVER raises (terminal-JSON contract preserved).
  • Change C (scripts/poll_pipeline.py): when SSH probe fails for a pod absent from pods.conf AND the live API reports RUNNING, suppress the dead verdict for up to DEAD_SUPPRESSION_CAP (=20 = 2× SSH_FAIL_REFRESH_THRESHOLD, env-overridable) consecutive ticks, then fall through. Pod IN pods.conf that probes dead stays dead (scope guard).

Reviewed: code-reviewer PASS (no blockers); all 3 ACs realized + tested; 256 tests pass + ruff + workflow_lint clean. Plan auto-approved at 0 GPU-h.

3 sessions reproduced this gap today: pod-664, pod-697, pod-658 (fingerprint wf-fix-fp:1e207e2050f6).

## Code-Reviewer Verdict — PASS

[task.py]
title: 'A cross-model context-vector patch fails to regi

[task.py]
## Code-Reviewer Verdict — PASS

[task.py]
**Task:** #755 — reconciler must persi

[task.py]
**Blocker tags:** none
**Tier:** trunk
**D

[task.py]
Edited `.claude/agents/analyzer.md` (

[task.py]
…c/fact behavioral-E and re-fold the

[task.py]
superkaiba and others added 30 commits June 30, 2026 01:13
Audited against the original bod

[task.py]
Workflow-fix #759 lands cleanly across fi

[task.py]
[task.py]
…issue_697.md commit=d6b8fc3b748218

[task.py]
## Code-Reviewer Verdict — PASS

[task.py]
followup_label: input-pca-robustness-cC-to

[task.py]
[task.py]
Path used: scratch-worktree cherry-pick (

[task.py]
…itique-codex v2 -->

## Clean-Result

[task.py]
[task.py]
Audited against original body.md

[task.py]
…mands create-missing

Close a three-link recovery gap that bit pod-664/697/658: a failover-relaunched
pod could be RUNNING on the live RunPod API yet absent from pods.conf, the SSH
poller then read status=dead on the transport failure, and `pod.py config
--update/--refresh-from-api` refused to create the missing row.

- pod_config.py: cmd_refresh_from_api + cmd_update CREATE a missing pods.conf
  row from the live API / user values instead of sys.exit(1); genuine
  typo/gone still fails loud. (_pod_row_from_live helper.)
- backend_poll.py: both failover success paths (_failover_dead_gcp_to_runpod,
  _relaunch_fresh_runpod) best-effort re-register the new pod after the
  authoritative sidecar re-point, fail-soft (never derails the running JSON).
- poll_pipeline.py: an absent-from-pods.conf pod the live API reports RUNNING
  is "still registering" -> suppress the dead verdict for up to
  DEAD_SUPPRESSION_CAP consecutive ticks; a pod IN pods.conf that probes dead
  stays dead.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant