91 Commits
Author SHA1 Message Date
jungfrauandClaude Fable 5.1 5bcb6d993d a warm start keeps the family of the registry version it continues; the 10-23 duplicates of the re-gated v5 versions go
CI / ledger-and-tools (push) Successful in 21s
--skip-train registers the version with the day it runs, so the nano and the yolo26s of
cycle 5 existed twice in the registry (2026-10-23 and 2026-10-25); the runs point at the
10-25 ones, the others are removed. A run whose base weights are a registry version (the
warm start) was named after the file weights.pt; it is now named after that version's family.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013uu3Bxsu5JqFhaWa9Ftu6z
v1.5.0
2026-10-26 10:29:31 +01:00
jungfrau 9bd88eb52e unseen-frame comparison after the warm-start and v5h runs
CI / ledger-and-tools (push) Successful in 16s
2026-10-26 09:16:46 +01:00
jungfrau 22192ec1a3 run 2026-10-26_v5h-noflip-mask1: gate_failed 2026-10-26 09:16:33 +01:00
jungfrau 0e5b02896e run 2026-10-26_v5h-noflip-mask1: exported on dataset/2026-10-26_v5h 2026-10-26 01:43:39 +01:00
jungfrau bb258eb2d2 dataset: 2026-10-26_v5h (1690 train / 298 val, 6 new pool images) dataset/2026-10-26_v5h 2026-10-26 01:43:39 +01:00
jungfrau 5dc38167c4 run 2026-10-25_v5-warm: gate_failed 2026-10-26 01:43:32 +01:00
jungfrau 09f7f2c4c4 yolo26s-seg-v5-s-noflip-mask1-2026-10-25 promoted by the gate on the honest measure (user decision 2026-10-25): F1 +0.021 in 96 % of draws, masks +0.011 in 90 %
CI / ledger-and-tools (push) Successful in 19s
2026-10-25 22:16:08 +01:00
jungfrau d4765b3185 run 2026-10-25_v5-warm: exported on dataset/2026-10-22_v5 2026-10-25 21:54:51 +01:00
jungfrau 8f260fa7f4 unseen-frame comparison after the amp run
CI / ledger-and-tools (push) Successful in 19s
2026-10-25 21:37:47 +01:00
jungfrau 32f354cde6 run 2026-10-25_v5-amp: gate_failed 2026-10-25 21:37:35 +01:00
jungfrau 3c9a0c6704 run 2026-10-25_v5-amp: exported on dataset/2026-10-22_v5 2026-10-25 09:48:33 +01:00
jungfrauandClaude Fable 5.1 63ee07fe61 a gold outline the reviewer kept from the model's proposal is not judged
CI / ledger-and-tools (push) Successful in 19s
454 of the 1 029 gold outlines are a proposal kept unchanged (loop 159 of 317, pin 140 of
224, face 140 of 295, crystal 14 of 149): the pre-labelling model's own masks. The
evaluation now ignores them object by object for every model, like a crowd region: they
leave the gold, and an unmatched prediction on one of them is not a false alarm.
tools/gold_kept.py finds them against the studio's batch proposals (mask IoU >= 0.98) and
writes data/gold/kept_machine.json; evaluate_image, evaluate_dirs and gate_stats.per_frame
read it. With it, the frame-level exclusion of 845bd87 is no longer applied (it stays as
the fallback without the file), so the gold set can grow with frames the active model
pre-labelled. Every registry model is measured again on this basis and the three v5 runs
are re-gated, without promotion.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013uu3Bxsu5JqFhaWa9Ftu6z
2026-10-25 09:48:20 +01:00
jungfrauandClaude Fable 5.1 845bd87bb3 a model is not measured on the gold frames it pre-labelled itself
CI / ledger-and-tools (push) Successful in 21s
Where a reviewer keeps an outline the model proposed, the gold holds the model's own mask,
which overlaps itself perfectly: on the 50 gold frames v4 had pre-labelled it scored a
matched IoU of 0.959 against 0.905 elsewhere, every other model 0.93, and that alone
produced the "mask dip" that failed all three v5 runs. tools/gold_prelabel.py records
which model proposed each gold frame (data/gold/prelabel.json, 265 of 335 frames);
gate_stats.without_own_proposals drops those frames from that model's measure; the unseen
comparison and the gate's paired bootstrap use it, so two models are compared on the
frames neither of them touched. The three v5 runs are re-gated on that basis, without
promotion.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-25 02:48:09 +02:00
jungfrau 0ed13a361c unseen-frame comparison after the 1024 px run
CI / ledger-and-tools (push) Successful in 21s
2026-10-25 02:13:49 +02:00
jungfrau 52e7e78b68 run 2026-10-23_v5-n-1024px: gate_failed 2026-10-25 02:13:35 +02:00
jungfrau fe6b008312 run 2026-10-23_v5-n-1024px: exported on dataset/2026-10-22_v5 2026-10-23 18:54:46 +02:00
jungfrau e5ad7fde30 cycle v5 stopped after the 26s run: m aborted (resolution first); unseen-frame comparison updated 2026-10-23 18:53:45 +02:00
jungfrau 19190188af run 2026-10-23_v5-m-noflip-mask1: exported on dataset/2026-10-22_v5 2026-10-23 18:53:13 +02:00
jungfrau 2de7a68509 run 2026-10-23_v5-s-noflip-mask1: gate_failed 2026-10-23 18:53:13 +02:00
jungfrau 33105dcfe8 run 2026-10-23_v5-s-noflip-mask1: exported on dataset/2026-10-22_v5 2026-10-23 03:53:49 +02:00
jungfrau d3e6e3cb6b run 2026-10-22_v5-noflip-mask1: gate_failed 2026-10-23 03:53:49 +02:00
jungfrau d53bdfa47e run 2026-10-22_v5-noflip-mask1: exported on dataset/2026-10-22_v5 2026-10-22 11:40:13 +02:00
jungfrau 562b0e13e2 gold grown to 335 frames; every registry model re-measured on it 2026-10-22 11:40:13 +02:00
jungfrau 27afcd57c2 dataset: 2026-10-22_v5 (2119 train / 372 val, 596 new pool images) dataset/2026-10-22_v5 2026-10-22 11:38:19 +02:00
jungfrauandClaude Fable 5.1 20fb1d03fb spark cycle trains several model sizes in turn and times each one the way the server calls it
MODELS="n s m l" runs the promoted recipe with yolo26n, s, m and l one after the other;
only the nano run may promote itself, the others are candidates until their speed at the
beamline is known. Each training waits for MEM_FLOOR_GB of free memory, an out-of-memory
run is tried again at batch 8, and vLLM is restarted at the end only if it was running.
tools/bench_latency.py measures the answer time per frame as the live server asks for it
(frame scaled by infer_scale, letterboxed to 640, PyTorch fp16) and writes runs/<id>/latency.json.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-22 11:38:01 +02:00
jungfrauandClaude Fable 5.1 ddaa5a99e6 dedup study: suppressing nested duplicate outlines on the unseen gold frames
CI / ledger-and-tools (push) Successful in 20s
Containment (intersection over the smaller area) between human-drawn crystal pairs never
exceeds 0.42, while the model-drawn duplicates sit at 0.96-1.0, so a rule at 0.9 cannot
lose a real pair. On 231 unseen frames, v4: precision 0.831 -> 0.876, recall 0.881 -> 0.869,
F1 0.855 -> 0.873, 46 outlines removed, 8 true positives lost where the less confident of
two outlines was the one matching the label.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-05 22:26:18 +02:00
jungfrauandClaude Fable 5.1 8c3c538244 gold: 285 frames (batch 8 added by mount: 83 corrected frames, 2-per-mount cap, 20 siblings held out); every model re-measured
CI / ledger-and-tools (push) Successful in 20s
231 frames unseen by every model (core 148), 82 crystals on them. v4-noflip-mask1 stays
the best: F1 0.855, mask score 0.798; v3-noflip-mask1 0.848 / 0.793, within noise;
the small cluster model now clearly loses on masks (-0.021, won in 0 % of draws).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-05 15:49:30 +02:00
jungfrauandClaude Fable 5.1 e8804c7762 gold: 202 frames (tpi_14688 dropped: same image as tpi_14689), mount groups and light states; comparison drawn by mount
CI / ledger-and-tools (push) Successful in 18s
11 mounts hold 40 of the 202 frames (largest 12); 6 saturated and 29 dark frames.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-02 15:48:02 +02:00
GotthardGandClaude Fable 5.1 82f0d9099b gate: bootstrap by mount, light states and excluded frames of the gold set
CI / ledger-and-tools (push) Successful in 19s
Frames of one mount are the same loop seen again, so the paired bootstrap now draws
mounts (data/gold/groups.json, built by tools/gold_groups.py from the mount ids the
studio writes in the gold manifest). The comparison also reports the unseen core without
the saturated frames, and frames the studio dropped from the gold set are pruned.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-02 15:46:31 +02:00
jungfrauandClaude Fable 5.1 c7d53646ce small cluster model re-gated on the Spark in one environment: gate_passed against v3; comparison after cycle 4
CI / ledger-and-tools (push) Successful in 19s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-02 13:30:10 +02:00
jungfrau f37604f87a run 2026-10-01_v4-noflip-mask1: promoted; comparison updated
CI / ledger-and-tools (push) Successful in 19s
2026-10-02 13:25:46 +02:00
jungfrauandClaude Fable 5.1 95e6ccad86 ledger: 2026-09-29_v3-noflip-mask1 deployed at the beamlines
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-02 13:25:45 +02:00
GotthardGandClaude Fable 5.1 d0cc67cb7e compare_unseen: per-frame counts for head-to-head comparisons of any two models
Written to runs/_unseen_per_frame.json (not tracked): overall and crystal
tp/fp/fn and matched IoU per unseen gold frame and model, which lets the
monitor page bootstrap the difference between any pair.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-02 13:25:45 +02:00
GotthardGandClaude Fable 5.1 62f568b0f6 gate: baseline and candidate measured in the same environment
The cluster's first run was gated against a baseline measured on the Spark.
The same weights score lower there (F1 0.840 vs 0.861, mask score 0.706 vs
0.757 on the 203 gold frames), so the gate failed a model that beats the
active one on F1 in 98.7 % of bootstrap draws when both are measured on one
machine.

Gold reports now record the environment (ultralytics, torch, host). When the
active model's report comes from other versions, train_run.py measures its
weights again in the job and gates against that; the predictions feed the
paired bootstrap. Without the weights there is no verdict and no promotion.
The SLURM scripts pull the active model's weights.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-02 13:25:45 +02:00
GotthardGandClaude Fable 5.1 831367d35d noise-aware gate, frozen core of unseen frames, and a cycle script for the Spark
A paired bootstrap over the 149 unseen gold frames (2026-10-02) showed that a
difference between two models carries about +-0.023 of noise in F1, +-0.018 in
the mask score and +-0.10 in crystal F1, while the gate's tolerance was 0.005.

- tools/gate_stats.py: per-frame counts and a paired bootstrap (pure Python).
- train_run.py: when the baseline's gold predictions exist, the gate requires
  the candidate to beat it on F1 or the mask score in 90 % of the draws and
  not to lose the other in more than 90 %; the point rule is the fallback and
  is always reported (pass_point_rule).
- tools/compare_unseen.py replaces the Spark's ~/fair_gate_all.py: all models
  on the frames none trained on, on the frozen core (data/gold/unseen_core.json,
  149 frames) and on all unseen frames once the gold set grows, with the
  interval and win share against the active model.
- measure_weights.py keeps a version's gate verdict when it re-measures it.
- tools/spark_cycle.sh: gold growth, export, re-measure, train, gate, compare,
  push, with what cycles 3 and 4 taught built in.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-02 13:25:45 +02:00
jungfrauandClaude Fable 5.1 591f7b0b31 train_run: a run that already has a gate verdict is not trained again without --force
The exit code 2 of a failed gate made the cycle script retry and train
2026-10-01_v4-recipeA twice.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-02 13:25:45 +02:00
jungfrau a67e6b8e8e run 2026-10-01_v4-recipeA: gate_failed; comparison updated 2026-10-02 13:25:45 +02:00
jungfrau ae889d1255 runs 2026-10-01_v4-recipeA and 2026-10-01_v4-noflip-mask1: exported on dataset/2026-10-01_v4 2026-10-02 13:25:45 +02:00
jungfrau 7688cfa713 dataset: 2026-10-01_v4 (1610 train / 285 val, 493 new pool images) 2026-10-02 13:25:44 +02:00
Duan a9192406d3 yolo26s-seg-v3-s-640px-2026-10-01
CI / ledger-and-tools (push) Successful in 22s
2026-10-02 10:47:39 +02:00
jungfrauandClaude Fable 5.1 28cbfa889d measure dir for yolo26n-seg-v3-noflip-mask1-2026-09-30; unseen-frame comparison includes the promoted v3 model
CI / ledger-and-tools (push) Successful in 25s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
v1.3.0
2026-09-30 13:56:58 +02:00
jungfrau 2956303ffe run 2026-09-29_v3-noflip-mask1: promoted; comparison updated
CI / ledger-and-tools (push) Successful in 21s
2026-09-30 13:56:07 +02:00
duan_j 9941d8d456 add ra train script
CI / ledger-and-tools (push) Successful in 17s
2026-09-30 11:45:26 +02:00
Duan 8ff20f9f84 add train script on merlin
CI / ledger-and-tools (push) Successful in 18s
2026-09-30 10:40:32 +02:00
jungfrauandClaude Fable 5.1 f1a945528e cluster runs on dataset v3: resolution and model-size levers
CI / ledger-and-tools (push) Successful in 18s
Three ledger runs for the cluster, exported on dataset/2026-09-29_v3 with the
promoted recipe: nano at 1024 px, small at 640 px, small at 1024 px. A run can
now carry its own training arguments (train_args in run.json, set with
ledger new --kv), which train_run.py applies under any --set; train.sbatch
forwards extra arguments after the run id (e.g. --batch 8). yolo26s-seg.pt
joins the base weights under LFS. slurm/README lists the runs, the questions
they answer and the commands.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-30 07:18:06 +02:00
jungfrauandClaude Fable 5.1 09cb49a3a2 ledger: v3-noflip-mask1 training on the Spark (restarted 07:13 after a memory-starved hang); v2-noflip-mask1 aborted, superseded by v3
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-30 07:16:27 +02:00
jungfrau d562b94671 run 2026-09-29_v3-recipeA: gate_passed; comparison updated 2026-09-29 23:42:41 +02:00
jungfrau efba872cdf runs 2026-09-29_v3-recipeA and 2026-09-29_v3-noflip-mask1: exported on dataset/2026-09-29_v3 2026-09-29 22:41:13 +02:00
jungfrau a6da2aa4aa dataset: 2026-09-29_v3 (1181 train / 210 val, 366 new pool images) dataset/2026-09-29_v3 2026-09-29 22:41:12 +02:00
jungfrauandClaude Fable 5.1 486b077f24 ledger: 2026-09-29_alc-v1-noflip-mask1 deployed at the beamlines (weights only)
CI / ledger-and-tools (push) Successful in 18s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-29 20:47:44 +02:00