← All reports

2026-11-13

Vote result: live model stays — Alex's 40-pair vote

Did our latest retraining attempts beat the model that's live?

1. The question we asked

The model that finds the stripes on your sail photos is called v39. We tried several ways of retraining it that we thought might make it a little better: grading itself more strictly while it trains, and fixing a bug that scrambled the order of a stripe's points whenever training flipped a photo upside down. Each recipe was trained more than once, so we could tell a real improvement from plain luck.

2. The answer: no new model beat the one that's live

Every retrain landed within luck-of-the-draw variation. Training the exact same recipe twice with different random starts already swings the score by about 9 photos, which is bigger than any gain from the changes we tried. So none of them is a proven upgrade.

3. The one bright spot

The flip-bug fix is the only change that moved the thing it was aimed at: it slightly improves where the lines start and stop on the sail (by a few hundredths of a percent of the stripe's length). That's small, and it could still be luck, so we're not claiming it. Alex's 40-photo vote at https://rate-t50.sailscanapp.com decides whether it ships: if his picks favor the new model, it moves forward to a stricter final check before going live.

4. What it cost and what we try next

About $100 of GPU rental. Roughly $20 of that went on two bugs in our own training setup, which we found and fixed along the way. One of them means older "different random start" tests on this software never actually varied, so some past comparisons were weaker than we thought.

Next: wait for Alex's vote, then try the strict-grading idea again from a fresh start instead of from the live model, plus a different way of scoring how close a line is to the true stripe.

Live model (v39) Best new model (flip-bug fix)
Photos with all lines right, out of 327 264 270
Typical camber error 0.30 0.30

The 6-photo gap is smaller than the 9-photo spread between two identical retrains, so treat it as a tie.


Technical detail

Everything below is the original working report, for the record.

task50: T0/T1/T3 retrain matrix + R1 scorecard + blind vote (12-13 Nov 2026)

RESULTS (the short version)

Did tight sigmas (T1) or order-safe flips (T3) beat T0 noise? NO — both land inside T0's own seed spread.

Full table: https://reports.sailscanapp.com/t50-ledger/ (source: server/inference/r1/LEDGER-t50.md, copy at t50/ledger.md). All rows = the same raw-model R1 harness (conf 0.45) on the 332 key / 327 live subset; v39-ref = shipped v39 weights through it (normal 264/327, strict 108, camber med 0.30, luff/leech end med 0.79/0.80 %chord).

Two methodology findings that outlast this task: 1. ultralytics 8.4.92 trains seed-identically in our setup (args.seed never reaches the dataloader generator, data/build.py:359; sampler shuffle is epoch-seeded only). T0-s1 == T0-s0 to 5 decimals over all 100 epochs proves full-recipe determinism. Every historical "seed sweep" on this version measured nothing. Fixed in t50_patches via a sys.modules-wide rebind of build_dataloader + generator reseed (first patch attempt silently didn't fire — trainers bind the symbol at import; guards added so that can't recur). 2. C2b flipud bug confirmed on-pod and fixed cleanly: stock augs reverse point order on 26-29% of train stripes; the order-safe wrap takes it to 0.00% (selftest, 500 samples, both measured every pod).

Status: blind vote LIVE for Alex — 40 customer pairs (batch t50-95a0eb), T3-s0 best.pt vs shipped v39, https://rate-t50.sailscanapp.com (key sent in chat; unblind = t50/blind/unblind.mjs + mapping.json, never deployed). Spot-checked pair dfbe by eye: upright frame, lines on the sail, genuine 3-vs-4-stripe difference between arms.

Plan (from task50.md + worklist sections 1.2/1.5/3/4/9 + report46 C1/C2b)

Log

Spend

(per-run GPU $ appended here as pods report)