Skip to content

🎯 Phase 6 — Evaluation, v0.1.0

WP-079 — per-worker, per-epoch augmentation RNG

_TrainPipeline seeded one generator in the parent process. A parent's generator never advances when workers are used, so every worker replayed one identical augmentation-parameter stream — diversity 1/num_workers. WP-076 then made workers non-persistent, so the pool restarted from that same state every epoch, replaying a single epoch's parameters for the entire run.

What the two defects together cost the training-data variety is measured at wp-079.md#wp-079.

WP-083 — synthetic-shapes generalization golden

The cheap stand-in for a tier run: 2000 generated scenes split 1800/200, n-scale, 6 epochs at 320 px, scored on held-out images through both decode paths. Unlike the overfit-100 gate it never scores what it trained on, so it measures generalization rather than loop composition, and mosaic stays on for five of six epochs so a collapsed augmentation RNG (WP-079) is detectable rather than merely absent.

The frozen numbers this golden pins are recorded at wp-083.md#wp-083.

WP-084 — commit-time gates

Three checks were moved to where they can catch something, and the reasoning generalizes past this repository.

The commit-trailer validator was a CI job. Under a squash merge the per-commit messages CI validated are replaced by the squash message — so the job gated text that never lands. It belongs in a commit-msg hook or nowhere.

The copyleft audit went the other way: it stays a standalone always-run job rather than a diff-triggered one, because it scans the installed environment. A transitive copyleft bump touches no tracked file, so a diff-scoped trigger would never fire on the case it exists for.

The dev extra became a PEP 735 [dependency-groups] entry, which is what stops build/lint/test packages advertising themselves in the published wheel's metadata (Provides-Extra: None on the installed dist is the check).

Test-suite and docs-updated checks were deliberately left unhooked — a pre-commit hook that runs the suite trains the operator to pass --no-verify, which is worse than not having it.

WP-085 — doctests join the offline gate

Every public function is required to carry an Examples section, and no gate had ever run one: testpaths pointed at tests/ alone and addopts carried no --doctest-modules. Four examples had rotted unnoticed over roughly eighty work packages.

The worst was not stale — it was never true. orthogonalize's example asserted near-exact orthogonality that the Newton–Schulz coefficients cannot reach, and which that function's own unit test documents as unattainable. It could not have passed at any seed, and was additionally unseeded. It now states the guarantee that actually holds (no singular value expanded). The other three pinned stale float reprs (0.01 against 0.010000000000000009; 0.01... against 0.00999...).

Wiring it up took the offline suite from 558 to 699 cases and coverage from 96% to 97%. The lesson recorded for later gates: a requirement nothing executes is a documentation convention, not a gate, and the two are indistinguishable from a green run.