/tml:review — did it work, and what did it cost
Adversarial by construction. The default posture is that the change did not do
what it claims, and the review's job is to find out whether that default
survives contact with the diff.
Hard rules
- Read-only. No edits, no writes, not even to
./.tml/. Verdicts only.
- Three questions, always, in order: did the mechanism engage, is the
measurement still valid, what did it silently break.
- "Improved throughput" is not an answer to any of them.
- A verdict without a check behind it is an opinion. Name the file, the
line, the trace, or the number.
Procedure
1. What is claimed, and what would falsify it
State the claim in one sentence, then its radius
(references/evidence-grades.md §3.1) read mechanically off the diff, then what
observation would show it false. If nothing would, say so — an unfalsifiable
claim is the finding.
2. Did the mechanism engage
The most common failure is a change that is present in the source and inert at
runtime:
- A flag set after the object it configures was constructed.
- A fast path guarded by a condition that never holds — dtype, shape, contiguity,
device, or a version check.
- A compiled path recompiling every step (count the recompilations; a
recompilation per step is worse than no compilation).
- A kernel that silently fell back because its workspace did not fit — which is
also why an interior batch-size optimum can appear (
tier-b-systems.md B14).
- An optimiser change where the beta convention differs between algorithms:
Adan's
β₂ is not Adam's β₂, Adan's β₃ is, RMSProp's alpha is, and
PyTorch's SGD momentum decays a sum rather than an average
(references/optimisers.md §1). A ported beta value is a silent
learning-rate change. Check this whenever an optimiser was swapped or its
hyperparameters were copied from elsewhere.
- Weight decay carried across an
Adam → AdamW boundary unchanged — different
hyperparameter, different scale (optimisers.md §2).
3. Is the measurement still valid
references/tier-c-protocol.md and references/pitfalls.md:
- Score inflation — did the change alter what is being measured, not just how
fast it is computed? Evaluation set, metric definition, checkpoint selection
rule, or the harness itself.
- Stale step-unit hyperparameters — anything expressed in steps (schedules,
warmup, decay length, EMA horizons, eval cadence) after a batch-size or
throughput change.
references/optimisers.md §1.3: a horizon fixed in steps
shrinks in examples when the batch grows.
- Timing boundary — is evaluation inside or outside the clock? Warmup
amortised or included? One-time costs priced at the real
k?
- Baseline drift — is the comparison still against the same baseline, run on
the same harness, on the same hardware?
4. What did it silently break
- Quality dimensions other than the mean — calibration, worst-group, tails,
robustness under shift, determinism. A mean that held while calibration moved
is a real regression and a common one.
- Train/eval mismatch — a transform, a precision, or a normalisation applied
on one path and not the other.
- Leakage — validation data touching training, directly or through
statistics.
- Numerics — reductions moved to lower precision; fp16 without loss scaling
where it is needed; catastrophic cancellation in a difference of near-equal
quantities (
optimisers.md §3.1 for the Adan case in bf16).
- Legibility — the axis nobody records. A pipeline only one person can now
modify is frequently a net loss (
tier-c-protocol.md).
5. Verdict
One of:
- holds — mechanism engaged, measurement valid, no unpriced breakage. Say
what evidence supports each of the three.
- holds with caveats — plus the specific caveats.
- does not hold — with the specific reason and the check that shows it.
- cannot determine — with the specific missing measurement, and what to run.
Then the residue: what remains unverified and would need a measurement to close.
Handoffs
- The change is fine but the sweep behind it is questionable →
/tml:analyze.
- The review found instability rather than a bad change →
references/instability.md.
Completion status
DONE (all three questions answered with evidence), DONE_WITH_CONCERNS,
BLOCKED, or NEEDS_CONTEXT.
1---2name: review3description: Adversarially review a proposed or applied change to a training/evaluation pipeline: did the claimed mechanism actually engage, is the measurement still valid, what did it silently break. Use for `/tml:review`, "I made training faster, check it", "review this diff before I merge", "why did throughput improve but accuracy drop", "did this speedup actually work", "check my optimiser swap", or on any diff touching a training loop, data pipeline, optimiser, precision, architecture or evaluation path. Walks a pitfall catalogue — score inflation, dead knobs, the throughput fallacy, changes that never engaged, stale step-unit hyperparameters, train/eval mismatch, leakage, beta-convention errors across optimisers. Read-only; verdicts, not edits. Do NOT use to find new opportunities (that is /tml:audit), to interpret a sweep (that is /tml:analyze), or for general code review of non-ML code (that is /code-review).4license: MIT5---67# /tml:review — did it work, and what did it cost89Adversarial by construction. The default posture is that the change **did not do10what it claims**, and the review's job is to find out whether that default11survives contact with the diff.1213## Hard rules14151. **Read-only.** No edits, no writes, not even to `./.tml/`. Verdicts only.162. **Three questions, always, in order**: did the mechanism engage, is the17 measurement still valid, what did it silently break.183. **"Improved throughput" is not an answer** to any of them.194. **A verdict without a check behind it is an opinion.** Name the file, the20 line, the trace, or the number.2122## Procedure2324### 1. What is claimed, and what would falsify it2526State the claim in one sentence, then its **radius**27(`references/evidence-grades.md` §3.1) read mechanically off the diff, then what28observation would show it false. If nothing would, say so — an unfalsifiable29claim is the finding.3031### 2. Did the mechanism engage3233The most common failure is a change that is present in the source and inert at34runtime:3536- A flag set after the object it configures was constructed.37- A fast path guarded by a condition that never holds — dtype, shape, contiguity,38 device, or a version check.39- A compiled path recompiling every step (count the recompilations; a40 recompilation per step is worse than no compilation).41- A kernel that silently fell back because its workspace did not fit — which is42 also why an interior batch-size optimum can appear (`tier-b-systems.md` B14).43- An optimiser change where the **beta convention differs between algorithms**:44 Adan's `β₂` is not Adam's `β₂`, Adan's `β₃` is, RMSProp's `alpha` is, and45 PyTorch's SGD `momentum` decays a _sum_ rather than an average46 (`references/optimisers.md` §1). A ported beta value is a silent47 learning-rate change. Check this whenever an optimiser was swapped or its48 hyperparameters were copied from elsewhere.49- Weight decay carried across an `Adam → AdamW` boundary unchanged — different50 hyperparameter, different scale (`optimisers.md` §2).5152### 3. Is the measurement still valid5354`references/tier-c-protocol.md` and `references/pitfalls.md`:5556- **Score inflation** — did the change alter what is being measured, not just how57 fast it is computed? Evaluation set, metric definition, checkpoint selection58 rule, or the harness itself.59- **Stale step-unit hyperparameters** — anything expressed in steps (schedules,60 warmup, decay length, EMA horizons, eval cadence) after a batch-size or61 throughput change. `references/optimisers.md` §1.3: a horizon fixed in steps62 shrinks in examples when the batch grows.63- **Timing boundary** — is evaluation inside or outside the clock? Warmup64 amortised or included? One-time costs priced at the real `k`?65- **Baseline drift** — is the comparison still against the same baseline, run on66 the same harness, on the same hardware?6768### 4. What did it silently break6970- **Quality dimensions other than the mean** — calibration, worst-group, tails,71 robustness under shift, determinism. A mean that held while calibration moved72 is a real regression and a common one.73- **Train/eval mismatch** — a transform, a precision, or a normalisation applied74 on one path and not the other.75- **Leakage** — validation data touching training, directly or through76 statistics.77- **Numerics** — reductions moved to lower precision; fp16 without loss scaling78 where it is needed; catastrophic cancellation in a difference of near-equal79 quantities (`optimisers.md` §3.1 for the Adan case in bf16).80- **Legibility** — the axis nobody records. A pipeline only one person can now81 modify is frequently a net loss (`tier-c-protocol.md`).8283### 5. Verdict8485One of:8687- **holds** — mechanism engaged, measurement valid, no unpriced breakage. Say88 what evidence supports each of the three.89- **holds with caveats** — plus the specific caveats.90- **does not hold** — with the specific reason and the check that shows it.91- **cannot determine** — with the specific missing measurement, and what to run.9293Then the residue: what remains unverified and would need a measurement to close.9495## Handoffs9697- The change is fine but the sweep behind it is questionable → **`/tml:analyze`**.98- The review found instability rather than a bad change →99 **`references/instability.md`**.100101## Completion status102103`DONE` (all three questions answered with evidence), `DONE_WITH_CONCERNS`,104`BLOCKED`, or `NEEDS_CONTEXT`.