sky-truth satellite detector 2 (unet-r18-v1), plan written 2026-10-24, before training Data: gs://goes_contrails_dataset/20230419/tfrecords (OpenContrails, CC BY 4.0). Training: the first 600 training files by name; every 10th of them is held back for tuning and never trained on. The validation split is not read until the model and its settings are locked and stamped, and is then measured exactly once. Input: the labelled frame of each scene as an ash false-colour image: 12-11 um clipped to (-4.0, 2.0) K, 11-8 um clipped to (-4.0, 5.0) K, 11 um clipped to (243.0, 303.0) K, each scaled to 0-1. Model: U-Net with an ImageNet-pretrained resnet18 encoder and a light decoder (256, 128, 64, 32 and 16 channels, the last at full resolution), one output (contrail probability per pixel). Trained on the CPU. Training: 10 epochs, batch 16, AdamW (learning rate 0.001, weight decay 0.0001), cosine decay, binary cross-entropy plus Dice loss, random flips and quarter turns, seed 20261024. The weights after the last epoch are used; nothing is picked by looking at validation. Turning probabilities into trails, chosen once on the held-back tuning files: probability threshold from (0.3, 0.4, 0.5, 0.6, 0.7) and smallest trail size in pixels from (10, 20, 40, 80), maximizing the smaller of (skill / 0.30) and (line precision / 0.50). Each connected group of pixels is one trail. An image is flagged when it has at least one trail. A trail is correct when at least half its pixels lie within 2 pixels of an expert-marked pixel. An image has contrails when the experts marked at least 10 pixels. Then the weights' SHA-256, the settings and the tuning scores are written and stamped into Bitcoin, the validation split is measured once, and the result is judged against the locked bar (bar.py): skill at least 0.30 and line precision at least 0.50. It is never retrained or re-measured.