workflow-fix: zombie-GPU probe namespace-aware (host-PID false positive)
Highlight text on any card (body, plan, or an event) to anchor a comment, or leave a whole-task comment here. Mention @claude to summon a reply.
No comments yet.
Overview / Motivation
Auto-filed by the workflow-fix-on-bug protocol from a workflow-fix candidate raised on task #816 (emitting agent: orchestrator).
Goal
Make poll_pipeline.py's zombie-GPU probe namespace-aware so healthy runs on host-PID-namespace RunPod containers are not overridden running -> stalled.
Workflow gap
- Bug observed: On pod-816 (issue #816, 8×H100), the zombie-GPU probe flagged 3 nvidia-smi compute PIDs holding ~25 GB VRAM as "absent from /proc" and overrode a manifestly HEALTHY run (
phase_log_mtime_sec_ago: 1, steering cells completing 7/53, 10 live workload processes) tostatus=stalledwithstall_reason: vllm_worker_dead_zombie_gpu. On this RunPod host,nvidia-smi --query-compute-appsreports HOST-namespace PIDs which are never resolvable in the container's/proc— so the probe's "PID absent from /proc ⇒ dead worker" inference is structurally false-positive for EVERY healthy process on such hosts. - Why it is a workflow gap:
scripts/poll_pipeline.pyis workflow surface; the #664 zombie predicate assumes container-visible nvidia-smi PIDs. A falsestalledverdict routes healthy runs into the Step-7 infra-respawn path (experimenter respawn with a kill-by-PID reaper brief) — which would KILL healthy workers mid-run. - Confidence (emitter): high
Proposed change (candidate diff sketch — refine in planning)
In the zombie-GPU probe (poll_pipeline.py, #664 block):
+ # Namespace-mismatch guard: if NONE of the nvidia-smi compute PIDs resolve
+ # in /proc AND the workload's own log/phase mtime is fresh (< stall window),
+ # nvidia-smi is reporting host-namespace PIDs (RunPod containers) — skip the
+ # zombie override entirely for this tick.
+ if all_absent and phase_log_fresh:
+ log.info("zombie probe: all compute PIDs unresolvable + log fresh -> host PID namespace; skipping override")
+ else: (existing override)
Also consider: only fire the zombie override when log staleness ALSO holds
(the original #664 case had a DEAD log; a fresh log + unresolvable PIDs is
the namespace signature, not a zombie).
Scope / surfaces
- Primary target:
scripts/poll_pipeline.py - Grep the workflow surface for the pattern before editing (
grep -rln 'zombie' scripts/ .claude/) and update every hit; list them in the plan (the recovery-brief prose in.claude/skills/issue/SKILL.mdStep 7 +.claude/rules/gotchas.mdmay need a one-line "namespace false-positive" caveat).
Constraints / invariants
- Workflow-surface only — never experiment code,
configs/, ortasks/. scripts/workflow_lint.py --check-askspasses; ruff on touched files passes.- The genuine #664 zombie case (dead log + unresolvable PIDs holding VRAM) MUST still fire — the fix narrows the predicate, never removes it.
- This session runs under
EPM_WORKFLOW_FIX_SESSION=1and carries aworkflow_fix_target:Provenance line — it MUST NOT auto-route its own subagents' workflow-fix candidates (recursion guard).
Provenance
- workflow_fix_target: scripts/poll_pipeline.py
- fingerprint: (computed at filing)
target_file: scripts/poll_pipeline.py bug_observed: zombie-GPU probe treats host-namespace nvidia-smi PIDs (unresolvable in container /proc on RunPod) as dead workers and overrides a healthy advancing run to status=stalled (issue #816 tick 1; log mtime 1s, cells completing). why_workflow_gap: the #664 predicate assumes container-visible nvidia-smi PIDs; on host-PID-namespace containers it is false-positive for every healthy worker, routing healthy runs into the infra-respawn reaper path. proposed_change: skip the zombie override when ALL nvidia-smi compute PIDs are unresolvable AND the workload log/phase mtime is fresh; require log-staleness as a conjunct for the override. diff_sketch: |
- if all_pids_unresolvable and phase_log_mtime_sec_ago < STALL_WINDOW:
-
skip zombie override (host PID namespace signature)
- unconditional override running -> stalled on unresolvable VRAM-holding PIDs confidence: high related_task: #816