workflow-fix: add capture-7b to the fellows/SLURM lane intent tables
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 an orchestrator observation during a PM-chat compute-mix audit (2026-07-30). No parent task (chat-mode; candidate logged to .claude/cache/workflow-fix-events.jsonl).
Goal
Make capture-7b dispatches eligible for the free fellows/SLURM lane instead of silently skipping it: add capture-7b to the SLURM intent tables (_DEFAULT_GPUS_FOR_INTENT: 1, _DEFAULT_TIME_BUDGETS_HOURS: ~4-6h, plus stages_for_spec if intent-keyed) — or, alternatively, a #940-style intent translation (capture-7b → eval) at SLURM candidate/prepare time, mirroring RUNPOD_INTENT_FOR_GCP_INTENT.
Workflow gap
- Bug observed: every
capture-7bdispatch on the auto lane raisesValueError: no default GPU count for intent 'capture-7b'(or the_DEFAULT_TIME_BUDGETS_HOURStwin) inside the fellows lane's prepare, and falls through to paid GCP. 3 marker-recorded occurrences since the fellows lane went live:epm:backend-selectedat 2026-07-23T17:24Z, 2026-07-29T03:37Z, 2026-07-29T04:21Z. - Why it is a workflow gap:
capture-7bis a first-class single-GPU 7B GPU intent on GCP (a2-ultragpu-1g, #752) and the RunPod terminal rung already translates it (RUNPOD_INTENT_FOR_GCP_INTENT["capture-7b"] = "eval", router.py:427, #940) — but the SLURM lanes have no row and no translation, so the standing "fellows first, free lane preferred" policy (#1609, user directive 2026-07-22) is silently bypassed for an entire intent class. The deliberate-exclusion comments in slurm.py (#1464 / #747) cover CPU-only intents ONLY;capture-7bis a GPU intent, so its absence is a gap, not a design decision. - Confidence (emitter): high
- verified-at-filing:
grep -c "capture-7b" src/explore_persona_space/backends/slurm.py→ 0 hits (absence claim — the missing-row evidence);grep -rn "capture-7b" src/explore_persona_space/backends/ scripts/→ 15 hits in 5 files (router.py 4, gcp.py 8, issue-scripts 3 — the intent is real, GCP-mapped, and RunPod-translated) (2026-07-30). Landed-fix history check:git log --oneline --since='7 days ago' -- src/explore_persona_space/backends/slurm.pyshows no capture-7b-related commit; the 2026-07-29 marker occurrences postdate the #1609/#1393 fellows merges.
Proposed change (candidate diff sketch — refine in planning)
# src/explore_persona_space/backends/slurm.py
_DEFAULT_TIME_BUDGETS_HOURS: dict[str, float] = {
...
+ "capture-7b": 4.0, # #752 activation-capture path; sized like eval
}
_DEFAULT_GPUS_FOR_INTENT: dict[str, int] = {
...
+ "capture-7b": 1, # single-GPU 7B capture, matches GCP a2-ultragpu-1g row
}
# + stages_for_spec branch if it raises on unknown intents
# ALT design (planner's call): SLURM-side intent translation mirroring
# router._translated_runpod_intent (#940), so future GCP-only intents
# fail over uniformly instead of needing per-table rows.
Scope / surfaces
- Primary target:
src/explore_persona_space/backends/slurm.py(the ValueError construction sites:time_budget_hours,default_gpus_for_intent,stages_for_spec) - Secondary (ALT design):
src/explore_persona_space/backends/router.py(SLURM candidate assembly / a translation helper) - Grep the workflow surface for the pattern before editing (
grep -rn 'capture-7b' src/explore_persona_space/backends/ scripts/ tests/) and update every hit needed; list them in the plan. Tests:tests/test_slurm_backend_render.py,tests/test_router.py(byte-identical-render snapshots must be respected for non-capture intents).
Constraints / invariants
- Workflow-surface only — never experiment code,
configs/, ortasks/. scripts/workflow_lint.py --check-askspasses; ruff on touched files passes.- Non-capture-intent sbatch renders stay byte-identical (the #1609 snapshot-test contract).
- CPU-only intents stay excluded (the #1464/#747 deliberate exclusion is untouched).
- 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 (recursion guard).
Provenance
- workflow_fix_target: src/explore_persona_space/backends/slurm.py
- fingerprint: a1d230223866
Orchestrator observation (verbatim marker evidence): epm:backend-selected attempts with {"cluster": "fellows", "detail": "ValueError: no default GPU count for intent 'capture-7b'. Supported intents: ['debug', 'eval', 'ft-70b', 'ft-7b', 'inf-70b', 'lora', 'lora-7b']. Pass an explicit ``gpus=`` in the RunSpec or add the intent to ``_DEFAULT_GPUS_FOR_INTENT``..." (2026-07-23T17:24Z) and the _DEFAULT_TIME_BUDGETS_HOURS twin (2026-07-29T03:37Z, 2026-07-29T04:21Z).