daily-fix: inline-round pod upload-verify satisfier
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 /daily 2026-07-31 problem sweep (CONSOLIDATED M8; miner-8:P15). Source: session 0ac15c23 (#1773 full-dictionary inline rounds) — two halves of one durability seam on inline rounds: (a) pod.py terminate REFUSED without an epm:upload-verification PASS marker (Step 8 never runs on inline rounds), forcing --skip-upload-verify after a manual verify; (b) the per-issue fulldict upload-verify script's exact-set verification covered only fulldict/ prefixes — the raw_windows prefix (8h50m of GPU output) needed a hand-run set-diff, which found 0 missing "but only because someone checked by hand". The #779-class silent-loss risk.
Goal
Give user-chat inline rounds a sanctioned upload-verification-then-terminate path (documented verify-then-override recipe, or an inline-round verification marker the terminate guard accepts), and add the duty that per-issue upload-verify scripts enumerate ALL HF prefixes the run wrote.
Workflow gap
- Bug observed: #1773's inline round could not terminate its pod through the sanctioned path: the terminate guard's only satisfiers are a Step 8
epm:upload-verificationPASS marker (never posted on inline rounds) or the blunt--skip-upload-verifyoverride; and the round's own upload-verify script silently scoped verification to one artifact prefix, leaving a major prefix verified only by an ad-hoc hand check. - Why it is a workflow gap: (a)
scripts/pod_lifecycle.py::_guard_upload_verification_before_terminate(lines ~2704-2788) checks exactly two things:_has_upload_verification_pass(issue)(latestepm:upload-verificationevent, PASS verdict) orskip_flag— no inline-round satisfier exists (theepm:free-analysis-followup-runmarker appears in pod_lifecycle.py only in the watcher pod-safety predicate at lines 2515/2568, not in the terminate guard). (b) CLAUDE.md's user-chat inline carve-out § completion-side teardown mandates verify-then-terminate but never mentions the guard or the sanctioned override recipe (--skip-upload-verifyhas 0 hits in CLAUDE.md), so every inline round rediscovers the refusal and improvises. (c) No duty line anywhere requires a per-issue upload-verify script to enumerate every HF prefix the run wrote — prefix-scoped verification passing while a sibling prefix goes unverified is exactly the #779 silent-loss shape. - Confidence (emitter): high for (a)/(b) (guard code + CLAUDE.md probed); medium for (c) (teammate-reported hand set-diff)
- verified-at-filing:
grep -n "upload-verification\|skip-upload-verify\|free-analysis-followup-run" scripts/pod_lifecycle.py→ guard at 2704-2788 with satisfier set = {latest PASS marker,--skip-upload-verifyflag} (presence claim; context read — the inline marker kinds at 2515/2568 belong to the pod-safety predicate, not this guard).grep -n "skip-upload-verify" CLAUDE.md→ 0 hits (absence claim: the inline carve-out does not document the path).git log --oneline --since='7 days ago' -- scripts/pod_lifecycle.py→ 0 commits; no landed fix (2026-07-31).
Proposed change (candidate diff sketch — refine in planning)
scripts/pod_lifecycle.py (_guard_upload_verification_before_terminate):
+ Accept an inline-round verification satisfier: a `epm:upload-verification`
+ marker posted by the inline round itself (source: inline-round, Verdict:
+ **PASS**) — same bold-Verdict anchoring as the Step 8 marker — so an inline
+ round that ran a real verification posts the marker and terminates through
+ the front door; --skip-upload-verify stays the labeled last resort.
CLAUDE.md § user-chat inline free analysis, completion-side teardown clause:
+ one sentence: inline rounds run their verification, post
+ `epm:upload-verification` (Verdict: **PASS**, note naming the verified
+ prefixes), THEN terminate; never bare --skip-upload-verify without a
+ recorded verify.
+ one duty sentence: a per-issue upload-verify script MUST enumerate ALL HF
+ prefixes the run wrote (compare against the run's staging/upload call
+ sites), never only the current phase's prefix.
Scope / surfaces
- Primary target:
CLAUDE.md(inline carve-out § completion-side teardown) +scripts/pod_lifecycle.py(terminate guard) - Secondary:
.claude/skills/issue/SKILL.mdStep 9a-ter (if the inline-duty blocks live there),tests/pin test for the new satisfier (test_has_upload_verification_pass_*sibling) - Grep before editing:
grep -rn 'skip-upload-verify\|_has_upload_verification_pass' scripts/ .claude/ CLAUDE.mdand update every hit; list them in the plan.
Constraints / invariants
- Workflow-surface only — never experiment code,
configs/, ortasks/. - The Step 8 guard semantics for pipeline rounds are UNCHANGED — the new satisfier must not weaken the pipeline path (an inline marker must be distinguishable and still anchored on the bold Verdict line, per the existing regex test).
scripts/workflow_lint.py --check-askspasses; ruff on touched files passes.- This session runs under
EPM_WORKFLOW_FIX_SESSION=1and carries aworkflow_fix_target:Provenance line — it MUST NOT auto-route any of its own subagents' workflow-fix candidates.
Provenance
-
fingerprint: 3ece43d43231
-
workflow_fix_target: scripts/pod_lifecycle.py
-
fingerprint: (driver-computed; tag authoritative)
Origin: CONSOLIDATED M8 (miner-8:P15), /daily 2026-07-31 — "Inline-round pod release has no sanctioned upload-verification satisfier, and the per-issue upload verify script's prefix scope missed a major artifact prefix" (session 0ac15c23 / #1773).