v0.14.0 — the third-framework release
Every rule shipped so far had only ever been tested against HuggingFace trainer_state.json. PyTorch Lightning, Fish Speech and most research code write their metrics to TensorBoard event files and nowhere else — so those runs were invisible. A Lightning run could overfit for three hours and trainproof had nothing to read.
Added
A fifth log format: tfevents. A TensorBoard event-file reader written from the wire format — TFRecord framing plus the Event / Summary / TensorProto fields it needs.
It imports no tensorflow, no tensorboard, no protobuf, no torch, no numpy. Reading a log file should not require installing a training stack, and trainproof's zero-dependency guarantee is unchanged.
Validated against the reference implementation rather than against itself: on a real 2049-step Lightning run it reproduces tensorboard's own EventAccumulator byte-exact — all 13 tags, every point count, first and last values to 1e-6.
- Rank-0 tensor scalars decoded alongside
simple_value(Lightning writes the former; a reader handling only the latter sees an empty run) - Cross-framework tag normalisation —
train/loss,TrainIterStats/loss,training/loss→loss;val/loss,EvalStats/avg_loss→eval_loss;lr-AdamW/pg1→lr - When several tags claim one column, the denser series wins, ties alphabetical — deterministic, not dict-order dependent
--format tfeventsonepoch,doctor,compare,watch; directories are scanned and shards merged- Truncated files — the normal state of a killed run — are read up to the cut
Fixed
TP-ZERO-GRAD false positive. The rule condemned any run whose finite gradient norms were all exactly 0.0, reporting a severed backward graph. Coqui writes avg_grad_norm as 0.0 when clipping is off, so a healthy 125,000-step XTTS fine-tune that reached loss 0.017 was reported FAIL.
A run cannot both learn and receive no gradient. The check now stands down when the loss improved, recording the reason as a skip, and stays armed when the loss is stuck.
Found by running the shipped rules against a real training run — not by a test.
Evidence
evidence/ now ships the logs behind these claims: a 125,000-step Coqui XTTS v2 fine-tune as both a text log and the event file from the same run, and a 2049-step Fish Speech LoRA fine-tune. Both on an RTX 5080.
Judged by the shipped rules at generation time:
| framework | format | records | verdict |
|---|---|---|---|
| Coqui XTTS v2 | coqui |
2501 | FAIL TP-DIVERGE, TP-THROUGHPUT |
| Coqui XTTS v2 | tfevents |
1255 | FAIL TP-DIVERGE, TP-THROUGHPUT |
| Lightning / Fish Speech | tfevents |
82 | WARN TP-OVERFIT, TP-THROUGHPUT |
The two XTTS rows are the same run read by completely independent parsers. They agree exactly — and EVIDENCE_MATRIX.md now computes that agreement as a derived observation rather than asserting it in prose.
Contract
No new rule IDs (62, unchanged) and no schema change (schema_version 3). 0.14.0 adds a capability, it does not break one.
Tests: 179 → 210.
pip install trainproof==0.14.0
trainproof doctor results/my_run/tensorboard/version_0