v0.8.0 — the trust release
Never judge the wrong number, never be un-greppable.
Canonical record contract
Adapters are now the ONLY place log columns map to canonical keys — exact-name matching, never substring. eval_loss can no longer be mistaken for training loss; unknown columns (e.g. grad_accum) are dropped instead of misjudged. --map CANON=COLUMN overrides the table when your logs are weird, and doctor prints column provenance for generic logs (COLUMNS: loss<-'train_loss').
Stable rule IDs
Every finding now carries a permanent ID — TP-DIVERGE, TP-DEAD-RUN, TP-ZERO-LR, TP-STEP-CLIFF, … — documented in RULES.md (what fires it, the threshold, and what it does NOT mean).
[FAIL] TP-DIVERGE: ...). Parse --json instead — that is what it is for. Preflight IDs renamed to TP-PRE-*.
Honest PASS
TP-PASS now states which check groups actually ran and which were skipped for lack of data: "Ran: loss-shape, divergence, dead-run, grad-norm, lr. Skipped (no data): timing." The tool no longer implies stability of anything it did not measure.
Machine-readable output
--json on epoch / doctor / compare: one JSON document — schema_version: 1, trainproof_version, full reports with rule IDs, worst verdict. Exit codes unchanged.
Also
- HF adapter now captures
eval_lossrecords (no rule uses them yet — that is the next release). - New README section: For AI coding agents — if your agent checks training projects,
trainproof doctor . --jsonis built for it. - 52 tests passing. No rule threshold changes; all gallery verdicts identical to v0.7.