Build Packages / build:rugnux:aarch64 (cross) (push) Successful in 9m42s
Build Packages / build:windows:nocuda (push) Successful in 18m11s
Build Packages / build:rugnux-tgz (x86_64) (push) Successful in 18m22s
Build Packages / build:windows:cuda (push) Successful in 20m31s
Build Packages / build:viewer-tgz:cpu (push) Successful in 20m57s
Build Packages / build:viewer-tgz:cuda (push) Successful in 22m25s
Build Packages / build:rpm (rocky9_nocuda) (push) Successful in 22m33s
Build Packages / build:rpm (rocky8_nocuda) (push) Successful in 28m0s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Successful in 28m37s
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Successful in 19m49s
Build Packages / build:rugnux:windows (push) Successful in 11m34s
Build Packages / build:rpm (rocky9_sls9) (push) Successful in 23m11s
Build Packages / build:rpm (rocky8_sls9) (push) Successful in 28m23s
Build Packages / build:rpm (rocky9) (push) Successful in 25m25s
Build Packages / build:rpm (rocky8) (push) Successful in 29m21s
Build Packages / build:rpm (ubuntu2404) (push) Successful in 23m8s
Build Packages / Generate python client (push) Successful in 45s
Build Packages / Create release (push) Skipped
Build Packages / Build documentation (push) Successful in 1m12s
Build Packages / XDS test (durin plugin) (push) Successful in 10m58s
Build Packages / DIALS test (push) Successful in 26m15s
Build Packages / build:rpm (ubuntu2204) (push) Successful in 28m3s
Build Packages / XDS test (neggia plugin) (push) Successful in 8m36s
Build Packages / XDS test (JFJoch plugin) (push) Successful in 10m20s
Build Packages / Unit tests (push) Successful in 1h26m10s
A grid scan is analysed once, from the completed map, and the answer belongs to the run rather than to whoever happened to call it. rugnux computed it after RunPipeline had already written the end message, so the crystals reached the raster report and nothing else - the _process.h5 carried the per-cell scores and no crystal list, and a viewer re-opening that file had nothing to draw. Rugnux now accumulates the raster with ScanResultGenerator, the same accumulator the online receiver fills, runs AnalyzeGridScan at the end message for the same stated reason the receiver does, sets EndMessage::grid_crystals so the file gets /entry/MX/crystals, and returns the result on ProcessResult. The CLI consumes that instead of analysing the map a second time; the raster report and JSON are unchanged, verified against the previous binary on a real raster (identical crystal, identical report; the ice score differs in the seventh decimal, which the same binary does run to run). The accumulator keyed a cell on the message's number, which for rugnux is the ordinal of the images -s/-e/--stride selected, not the image's place in the raster. It now reads original_number where there is one, as the writer already does; both receivers set it equal to number, so nothing online changes. jfjoch_viewer offers Grid as a fourth mode beside MX, AzInt and Calib, configures the job with spot finding on and indexing from the experiment's grid-scan settings, and refuses the mode on a dataset that has no grid scan rather than scoring every image and reporting nothing. The shared azimuthal section is shown for it, which it needs - the ice score's radial channel reads that profile. Verified end to end: Grid, then Analyze dataset, on a stored raster leaves the composite map on screen with a frame at each crystal. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EFEJG6WBQv8th4UJFNe53N