---
description: Run the eval-gated fine-tuning lifecycle end to end — eval harness, method selection, data, environment, training, checkpoint gate, export
argument-hint: "[goal, e.g. 'tune an 8B model to write our support replies']"
---
# Fine-tune for: $ARGUMENTS
## Thinking
This command orchestrates the eval-gated fine-tuning lifecycle across
seven phases, each owned by a specialist agent and gated by the
artifact the prior phase produced:
- **Artifact-gating, not step-skipping.** Every phase below is gated
by a specific file the previous phase must produce. A missing
artifact means the phase still runs — it does not get skipped —
and the run stops at that gate rather than improvising downstream
work against nothing.
- **`eval/` outlives `runs/`.** The eval harness and its baseline,
built once in Phase 0, are never rebuilt or loosened for a later
run. Every Phase 5 checkpoint gets scored against the exact goldens
and drift suite Phase 0 baselined, so a "pass" always means the
same thing across every run this command ever launches.
- **Two lifecycle realities the phase numbering doesn't spell out.**
(1) Phase 0's baseline requires a *working inference environment*
before Phase 3 would otherwise preflight one — in practice, do
enough of Phase 3's environment setup to run inference before
Phase 0 needs it, rather than reading the phase order as "Phase 3
environment work only starts after Phase 0 finishes." (2)
Synthetic goldens/training data generation (Phase 0/Phase 2) needs
a teacher LLM to sample from — if a local model is already
resident for another purpose, using it and then releasing it
before training needs the memory back is expected, not a deviation
to justify.
## Phase 0: Eval Harness & Baseline
subagent_type: llm-finetuning-eval-engineer
prompt: |
Build or verify the eval harness for: $ARGUMENTS
1. Check whether `eval/` already exists (goldens.jsonl, graders/,
drift-suite.yaml, and `baseline-.json`). If it does,
verify it's complete rather than rebuilding it.
2. If it does not exist, build it per `eval-harness-first`: error
analysis into failure buckets (or synthetic goldens if no traces
exist), one grader per bucket, judge calibration for any
LLM-judge bucket, and a frozen `drift-suite.yaml`.
3. Only if `eval/baseline-.json` is missing, run the full
harness plus drift suite against the unmodified base model and
write it. If it already exists, preserve it as-is — it is the
measuring stick every later run's checkpoint gets diffed
against, and rewriting it on a later run would change what
"PROMOTE" means between runs.
4. Walk `eval-harness-first`'s Phase 0 Exit Checklist in full before
reporting done.
Report the path to `eval/baseline-.json` and a one-paragraph
summary of the failure buckets and grader mix.
**Gate:** `eval/baseline-.json` must exist before Phase 1
starts. If this agent reports the baseline is missing or incomplete,
stop here and resolve it — do not proceed to method selection against
no measuring stick.
## Phase 1: Off-Ramps, Method & Model Selection
subagent_type: llm-finetuning-architect
prompt: |
Determine whether fine-tuning is the right tool for: $ARGUMENTS
Baseline: {phase0.output}
1. Interrogate the goal and state the failure mode in one sentence.
2. Confirm `eval/baseline-.json` exists (from the baseline
above) before considering any method — refuse to proceed without
it.
3. Walk `finetuning-method-selection`'s decision tree: off-ramps
first (RAG, prompt-engineering, CPT), then the data-shape router.
If an off-ramp applies, say so plainly and stop — do not draft a
training brief for a request better served elsewhere.
4. If fine-tuning is warranted, pick a base-model size class and
model from the model catalog, size memory feasibility, and — on
a GRPO route — confirm the reward function's Inspection Rule ran.
5. Write `runs/-/training-brief.md` per the contract in
your instructions, populating every field.
Report the path to `training-brief.md`, or the off-ramp
recommendation if fine-tuning is not warranted.
**Gate:** `runs/-/training-brief.md` must exist with every
contract field populated before Phase 2 starts. If Phase 1 recommends
an off-ramp instead, stop here and report that recommendation — do not
continue the lifecycle.
## Phase 2: Dataset Preparation
subagent_type: llm-finetuning-training-engineer
prompt: |
Build and validate the training dataset for: $ARGUMENTS
Brief: {phase1.output}
1. Read the brief's `## Dataset Expectation` and `## Chosen Method`
fields.
2. Build the dataset per `dataset-curation`'s format table, applying
the chat template before any concatenation or packing.
3. If packing is enabled, decode and manually inspect 5–10 packed
sequences and attach the decoded samples to the validation
report — mandatory, not a spot check.
4. Write the dataset card with all six required fields and walk
`dataset-curation`'s Phase 2 Exit Checklist in full.
Report the dataset card path and the validation report, including
the decoded packed samples.
**Gate:** the dataset card and validation report (with decoded packed
samples, if packing was used) must be complete per the Phase 2 Exit
Checklist before Phase 3 starts.
## Phase 3: Environment Preflight
If the `dgx-spark-ops` plugin is not installed, send this same prompt
instead to `llm-finetuning-training-engineer` (whose environment
method covers the generic path): perform generic NVIDIA checks
(driver, VRAM, disk) and write `runs/-/env-report.json`
with `platform: generic-nvidia`.
subagent_type: dgx-spark-ops-engineer
prompt: |
Preflight the training environment for: $ARGUMENTS
Brief: {phase1.output}
Dataset: {phase2.output}
Run the full DGX Spark preflight procedure: confirm hardware
identity, execute the G1–G10 gotcha checks, compute UMA memory
headroom for the planned workload, and write `env-report.json` with
a verdict of `ready`, `ready-with-warnings`, or `blocked`.
Write it to `runs/-/env-report.json` — this run
directory, not your current directory, is where it belongs.
Report the verdict and, if `blocked`, the specific failing check and
its fix.
**Gate:** `env-report.json` must exist with verdict `ready` before
Phase 4 starts. For `ready-with-warnings`, surface the warnings and
require explicit caller confirmation before proceeding — this is a
caller decision, not an automatic pass. A `blocked` verdict is a hard
stop — report it and the named fix, and do not launch training.
## Phase 4: Training
subagent_type: llm-finetuning-training-engineer
prompt: |
Launch and monitor training for: $ARGUMENTS
Brief: {phase1.output}
Dataset: {phase2.output}
Environment: {phase3.output}
1. Generate `train/config.yaml` and `train/train.py` from the
method-specific skill's config, using the brief's method, base
model, and memory budget.
2. Commit both files before launching — non-negotiable.
3. Launch training as a background process; poll `logs/` and emit
structured progress lines (step, loss, lr, mem_gb, temp_c).
4. If a failure occurs, triage it against the three failure classes
(environment failure, divergence, UMA OOM) in your instructions
before touching any config value, and report which class applied
and the remediation taken.
5. On completion, report the checkpoint location — do not gate it
yourself.
Report the committed config paths, the run directory, and the final
checkpoint location (or the failure class and remediation if the
run did not complete).
**Gate:** a completed checkpoint must exist before Phase 5 starts. If
training failed and triage could not produce a completed checkpoint,
stop here and report the failure class and what was tried.
## Phase 5: Checkpoint Gate
subagent_type: llm-finetuning-eval-engineer
prompt: |
Gate the trained checkpoint for: $ARGUMENTS
Baseline: {phase0.output}
Checkpoint: {phase4.output}
Work the four promotion stages in order per `checkpoint-promotion`
(drift scoring and applying its budget are both part of stage 2,
not separate stages):
1. Stage 1 — data-quality gate: dedup and eval-goldens leakage
check against `eval/goldens.jsonl`.
2. Stage 2 — capability drift: re-run the identical harness plus
frozen drift suite used in Phase 0 — not a looser or expanded
one — diff against `eval/baseline-.json`, and apply the
drift budget by pointer to `checkpoint-promotion`'s Drift Budget
table.
3. Stage 3 — paired arena vs. base model, position-randomized
judge (or the deterministic paired-comparison variant when
every grader is deterministic).
4. Stage 4 — canary, if the deployment target has production
traffic.
Write `promotion-report.md` per `checkpoint-promotion`'s template,
including a `**Goldens fingerprint:**` field with the current
`sha256sum eval/goldens.jsonl` (first 12 hex chars) — later re-gates
via `/promote-checkpoint` compare against this field to detect
goldens changes since this gate. Cover all applicable stages, ending
with the terminal verdict contract: `PROMOTE` or `REJECT`, with
evidence and — for `REJECT` — exactly one top remediation.
Report the verdict and the path to `promotion-report.md`.
**Gate:** on `REJECT`, report the verdict, its evidence, and its named
top remediation, then **STOP** — do not auto-retrigger training or
loop back to Phase 4 on this command's own authority. On `PROMOTE`,
continue to Phase 6.
## Phase 6: Export
subagent_type: llm-finetuning-training-engineer
prompt: |
Export the promoted checkpoint for: $ARGUMENTS
Brief: {phase1.output}
Checkpoint: {phase4.output}
Promotion report: {phase5.output}
Runs only because Phase 5 returned `PROMOTE`. Pick format and
merged-vs-LoRA posture per `quantized-export`'s Format Map and the
brief's deployment target, write the artifact to `export/`, and run
the mandatory smoke test — load the artifact in its actual target
runtime and diff 3–5 golden outputs pre- and post-export.
Report the export artifact path and the smoke test result. An
export that skips the smoke test is not done, regardless of whether
the file loads.
**Gate:** the export artifact and a passing smoke test must both exist
before this command reports success.
## Wrap-up
Summarize:
- **Verdict**: PROMOTE (exported) or REJECT (stopped at Phase 5), or
the off-ramp recommendation if the lifecycle stopped at Phase 1.
- **Artifact paths**: `eval/baseline-.json`,
`runs/-/training-brief.md`, the dataset card,
`env-report.json`, the committed `train/config.yaml`,
`promotion-report.md`, and (on PROMOTE) the `export/` artifact.
- **Lessons worth recording**: anything about the failure buckets,
the drift budget, or the OOM ladder that would change how the next
run against this `eval/` should be planned.
**Phase 7 — Roadbook.** Append this summary's lessons and any
non-obvious workarounds hit during the run to
`runs/-/roadbook.md`, under a dated heading for this
attempt — create the file if it doesn't exist yet, and append rather
than overwrite on every later run against the same slug.