• v0.26.0
    CI / lint (push) Successful in 37s
    Docs build and publish / docker (push) Successful in 19s
    Build and Publish / release (push) Successful in 19s
    CI / test (3.13) (push) Successful in 1m6s
    CI / test (3.12) (push) Successful in 1m7s
    CI / test (3.14) (push) Successful in 1m6s
    CI / test-with-beamline-plugins (pxi_bec) (push) Successful in 1m21s
    CI / test-with-beamline-plugins (pxiii_bec) (push) Successful in 1m24s
    CI / test-with-beamline-plugins (pxii_bec) (push) Successful in 1m25s
    CI / test-with-coverage (push) Successful in 1m37s
    CI / coverage-analysis (push) Skipped
    Stable

    mx-gitea released this 2026-09-09 22:56:59 +02:00 | 0 commits to main since this release

    v0.26.0 (2026-09-09)

    Bug Fixes

    • Display flux more nicely (6e4e28c)

    • Don't require lock to cancel (8b62da1)

    • Don't show beamline is busy error message (ac0242d)

    • Implement simulated flux (06c66c1)

    Code Style

    Features

    Downloads
  • v0.25.0
    CI / lint (push) Successful in 41s
    Docs build and publish / docker (push) Successful in 6s
    CI / test (3.12) (push) Successful in 1m8s
    Build and Publish / release (push) Successful in 6s
    CI / test (3.14) (push) Successful in 1m16s
    CI / test (3.13) (push) Successful in 1m19s
    CI / test-with-beamline-plugins (pxii_bec) (push) Successful in 1m14s
    CI / test-with-beamline-plugins (pxi_bec) (push) Successful in 1m32s
    CI / test-with-beamline-plugins (pxiii_bec) (push) Successful in 1m33s
    CI / test-with-coverage (push) Successful in 1m59s
    CI / coverage-analysis (push) Skipped
    Stable

    mx-gitea released this 2026-09-09 18:15:11 +02:00 | 7 commits to main since this release

    v0.25.0 (2026-09-09)

    Features

    • Highlight whole mounted row in sample list (22228c0)

    The mounted sample used to tint only the frozen "#" cell. Paint the full row in the same blue so it is findable at a glance, and keep the theme's own text color on it (the mid-tone blue reads fine without the dark ink that the pastel status tints need). Repaint the whole row span on mount/unmount, not just column 0.

    Co-Authored-By: Claude Fable 5.1 noreply@anthropic.com

    • Show spreadsheet params in sample list (a2c5ed3)

    Add Oscillation, Exposure, Total range and Transmission columns to the dewar sample table, read from SampleShortInfo.aaredb_params (already filled by spreadsheetupdater from AareDB, so no server change). Transmission is shown as percent like the user spreadsheet.

    The new columns are nullable, so the header sort key now puts None last instead of raising on None < float.

    Co-Authored-By: Claude Fable 5.1 noreply@anthropic.com

    Downloads
  • v0.24.6
    CI / lint (push) Successful in 35s
    Docs build and publish / docker (push) Successful in 18s
    Build and Publish / release (push) Successful in 28s
    CI / test (3.12) (push) Successful in 1m5s
    CI / test (3.13) (push) Successful in 1m1s
    CI / test (3.14) (push) Successful in 1m4s
    CI / test-with-beamline-plugins (pxii_bec) (push) Successful in 1m11s
    CI / test-with-beamline-plugins (pxi_bec) (push) Successful in 1m18s
    CI / test-with-beamline-plugins (pxiii_bec) (push) Successful in 1m22s
    CI / test-with-coverage (push) Successful in 1m35s
    CI / coverage-analysis (push) Skipped
    Stable

    mx-gitea released this 2026-09-09 15:56:30 +02:00 | 10 commits to main since this release

    v0.24.6 (2026-09-09)

    Bug Fixes

    • Make xraycenter line scan on box center and twice box height (76062d5)
    Downloads
  • v0.24.5
    CI / lint (push) Successful in 32s
    Docs build and publish / docker (push) Successful in 15s
    Build and Publish / release (push) Successful in 9s
    CI / test (3.13) (push) Successful in 1m3s
    CI / test (3.12) (push) Successful in 1m10s
    CI / test (3.14) (push) Successful in 1m7s
    CI / test-with-beamline-plugins (pxi_bec) (push) Successful in 1m17s
    CI / test-with-beamline-plugins (pxii_bec) (push) Successful in 1m19s
    CI / test-with-beamline-plugins (pxiii_bec) (push) Successful in 1m22s
    CI / test-with-coverage (push) Successful in 1m35s
    CI / coverage-analysis (push) Skipped
    Stable

    mx-gitea released this 2026-09-09 15:06:56 +02:00 | 12 commits to main since this release

    v0.24.5 (2026-09-09)

    Bug Fixes

    • Validate screening instead of running it (29f5357)
    Downloads
  • v0.24.4
    CI / lint (push) Successful in 32s
    Docs build and publish / docker (push) Successful in 14s
    Build and Publish / release (push) Successful in 16s
    CI / test (3.12) (push) Successful in 1m2s
    CI / test (3.14) (push) Successful in 1m3s
    CI / test (3.13) (push) Successful in 1m8s
    CI / test-with-beamline-plugins (pxi_bec) (push) Successful in 1m15s
    CI / test-with-beamline-plugins (pxii_bec) (push) Successful in 1m21s
    CI / test-with-beamline-plugins (pxiii_bec) (push) Successful in 1m20s
    CI / test-with-coverage (push) Successful in 1m32s
    CI / coverage-analysis (push) Skipped
    Stable

    mx-gitea released this 2026-09-09 14:38:43 +02:00 | 14 commits to main since this release

    v0.24.4 (2026-09-09)

    Bug Fixes

    • Unmount sample at end of automation (9e6f50a)
    Downloads
  • v0.24.3
    Docs build and publish / docker (push) Successful in 17s
    CI / lint (push) Successful in 39s
    Build and Publish / release (push) Successful in 19s
    CI / test (3.12) (push) Successful in 1m5s
    CI / test (3.13) (push) Successful in 1m6s
    CI / test (3.14) (push) Successful in 1m5s
    CI / test-with-beamline-plugins (pxi_bec) (push) Successful in 1m21s
    CI / test-with-beamline-plugins (pxii_bec) (push) Successful in 1m21s
    CI / test-with-beamline-plugins (pxiii_bec) (push) Successful in 1m23s
    CI / test-with-coverage (push) Successful in 1m33s
    CI / coverage-analysis (push) Skipped
    Stable

    mx-gitea released this 2026-09-09 12:05:04 +02:00 | 16 commits to main since this release

    v0.24.3 (2026-09-09)

    Bug Fixes

    • Validate rotation scan instead of running it (3439233)
    Downloads
  • v0.24.2
    Docs build and publish / docker (push) Successful in 21s
    Build and Publish / release (push) Successful in 23s
    CI / lint (push) Successful in 47s
    CI / test (3.12) (push) Successful in 1m4s
    CI / test (3.13) (push) Successful in 1m8s
    CI / test (3.14) (push) Successful in 1m5s
    CI / test-with-beamline-plugins (pxi_bec) (push) Successful in 1m14s
    CI / test-with-beamline-plugins (pxii_bec) (push) Successful in 1m11s
    CI / test-with-beamline-plugins (pxiii_bec) (push) Successful in 1m28s
    CI / test-with-coverage (push) Successful in 1m39s
    CI / coverage-analysis (push) Skipped
    Stable

    mx-gitea released this 2026-09-09 11:54:00 +02:00 | 18 commits to main since this release

    v0.24.2 (2026-09-09)

    Bug Fixes

    • Spreadsheetupdate config refrence (df54ed5)

    • Tellupdater config refrence (d52cf30)

    • Update spreadsheetupdater tests (9f12167)

    • Update tellupdater tests (aa90dea)

    Downloads
  • v0.24.1
    Docs build and publish / docker (push) Successful in 5s
    Build and Publish / release (push) Successful in 12s
    CI / lint (push) Successful in 48s
    CI / test (3.13) (push) Successful in 1m3s
    CI / test (3.14) (push) Successful in 1m12s
    CI / test (3.12) (push) Successful in 1m18s
    CI / test-with-beamline-plugins (pxi_bec) (push) Successful in 1m16s
    CI / test-with-beamline-plugins (pxiii_bec) (push) Successful in 1m19s
    CI / test-with-beamline-plugins (pxii_bec) (push) Successful in 1m26s
    CI / test-with-coverage (push) Successful in 1m40s
    CI / coverage-analysis (push) Skipped
    Stable

    mx-gitea released this 2026-09-09 10:29:56 +02:00 | 23 commits to main since this release

    v0.24.1 (2026-09-09)

    Bug Fixes

    • Call jfjoch cancel in failed operation exception handler (ace1615)

    • Reduce TELL client log verbosity (7c6350e)

    • Validate gridscan params (7cc8fca)

    • Validate params with aarescan (7c893ce)

    Chores

    • Update aaresccan-client dependency (2eb5e3a)

    Code Style

    • Fix type hints and naming (69fbf4b)
    Downloads
  • v0.24.0
    Docs build and publish / docker (push) Successful in 14s
    CI / lint (push) Successful in 47s
    Build and Publish / release (push) Successful in 24s
    CI / test (3.13) (push) Successful in 1m6s
    CI / test (3.12) (push) Successful in 1m11s
    CI / test (3.14) (push) Successful in 1m8s
    CI / test-with-beamline-plugins (pxi_bec) (push) Successful in 1m13s
    CI / test-with-beamline-plugins (pxiii_bec) (push) Successful in 1m34s
    CI / test-with-beamline-plugins (pxii_bec) (push) Successful in 1m41s
    CI / test-with-coverage (push) Successful in 1m43s
    CI / coverage-analysis (push) Skipped
    Stable

    mx-gitea released this 2026-09-09 10:10:00 +02:00 | 30 commits to main since this release

    v0.24.0 (2026-09-09)

    Bug Fixes

    • Add tests and cleanup after exceptions (1cd8102)

    Code Style

    • Ignore pyright issues in redis return values (6483d50)

    Features

    • Add hardware lock to server (18bcbdb)

    • Remove all busy-state handling (fbfe773)

    Downloads
  • v0.23.1
    CI / test (3.12) (push) Successful in 1m2s
    CI / lint (push) Successful in 36s
    Docs build and publish / docker (push) Successful in 5s
    CI / test (3.14) (push) Successful in 1m4s
    CI / test (3.13) (push) Successful in 1m8s
    CI / test-with-beamline-plugins (pxi_bec) (push) Successful in 1m9s
    Build and Publish / release (push) Successful in 8s
    CI / test-with-beamline-plugins (pxii_bec) (push) Successful in 1m16s
    CI / test-with-beamline-plugins (pxiii_bec) (push) Successful in 1m25s
    CI / test-with-coverage (push) Successful in 1m30s
    CI / coverage-analysis (push) Skipped
    Stable

    mx-gitea released this 2026-09-08 15:01:08 +02:00 | 35 commits to main since this release

    v0.23.1 (2026-09-08)

    Bug Fixes

    • Bound the sample camera SUB receive queue (4c3b0ce)

    The socket used library defaults, so a GUI that stalls builds its own private FIFO of up to 1000 messages — 20 s of video at 50 Hz — plus whatever the autotuned kernel receive buffer holds on top. PUB/SUB pipes are per-subscriber, which is why only aareGUI lagged while the other receivers stayed current.

    RCVHWM=4 makes the producer drop frames for this subscriber once it is muted, instead of queueing them, and a fixed RCVBUF stops the kernel hiding a further few dozen frames behind the HWM. Measured against a flooding publisher, the buffered backlog drops from 1000 frames to 4.

    Co-Authored-By: Claude Opus 5 (1M context) noreply@anthropic.com

    Claude-Session: https://claude.ai/code/session_01DVqbXPoeHyqrQq5Vc8EcYP

    • Build the sample camera QPixmap on the GUI thread (c842856)

    QPixmap is a GUI-thread-only class in Qt; the worker was constructing one per frame via QPixmap.fromImage. It happens to work with the raster backend, which is why this has not bitten us, but it is not supported and the guarantee is not ours to rely on.

    The subscriber now emits QImage — which is explicitly safe to build and move between threads — and _on_sample_camera_frame converts once on the GUI thread before handing the pixmap to the visible view. No extra copy: the .copy() that detaches the QImage from the numpy buffer was already there.

    Verified end to end against a real PUB socket: the payload delivered is QImage, the slot runs only on the main thread, and frames still decode.

    Co-Authored-By: Claude Opus 5 (1M context) noreply@anthropic.com

    Claude-Session: https://claude.ai/code/session_01DVqbXPoeHyqrQq5Vc8EcYP

    • Drain the sample camera SUB socket to the newest frame (d63b4ad)

    The SUB socket is strictly FIFO, so once the GUI falls behind at 50 Hz it stays behind: every recv returns the oldest queued frame and the lag never recovers on its own. zmq.CONFLATE cannot fix this because it keeps only the last part of a message, which shreds the multipart header+payload frames the producer sends.

    recv_multipart is atomic, though — a non-blocking recv either yields a whole message or raises Again — so draining in a loop is a multipart-safe conflate. The drain runs after the previous frame's decode, so it discards exactly the backlog that built up while we were busy, and the socket is consumed at line rate regardless of how long a frame takes to decode.

    Verified against a real PUB/SUB pair: 100 queued multipart messages collapse to the newest one with both parts intact, and RCVTIMEO is still honoured when the queue is empty.

    Co-Authored-By: Claude Opus 5 (1M context) noreply@anthropic.com

    Claude-Session: https://claude.ai/code/session_01DVqbXPoeHyqrQq5Vc8EcYP

    • Pace sample camera frames to what the GUI can paint (a4a8b80)

    image is a queued cross-thread signal and Qt's event queue has no high-water mark, so this queue grew without bound independently of ZMQ: with a 50 Hz feed and a GUI painting slower, the displayed frame fell further behind for as long as the stream ran. Measured on a stand-in at 15 ms decode / 25 ms paint, the displayed frame aged from 40 ms to 2010 ms over three seconds and kept going.

    Two changes:

    • Emit once and fan out on the GUI thread to whichever view is actually on screen, rather than connecting all three SampleCameraImageLabels. Two of the three are always hidden (tab / compact page / portrait page), so this is one repaint per frame instead of three.

    • Cap the frames in flight and drop rather than queue past it. The cap is 2, not 1, so a frame can be queued while the GUI paints the other: at 1 the GUI idles waiting for the next decode (33.3 fps displayed), at 2 it does not (40.0 fps) for one extra frame of latency. Both stay bounded — 40 ms and 62 ms respectively, flat over the run.

    Co-Authored-By: Claude Opus 5 (1M context) noreply@anthropic.com

    Claude-Session: https://claude.ai/code/session_01DVqbXPoeHyqrQq5Vc8EcYP

    • Satisfy basedpyright on the Optional subscriber and socket (c0b0994)

    CI lint failed on reportOptionalMemberAccess: prediction_thread is None when the GUI runs without a sample feed, and _sock is nulled by run()'s cleanup, so both attributes are Optional to the checker even though the flagged call sites cannot see None at runtime. Guard the slot and bind the socket to a local asserted non-None in _recv_latest.

    Co-Authored-By: Claude Fable 5.1 noreply@anthropic.com

    Code Style

    • One PSI red for every busy camera badge, blue only for robot cooling (7c1efe4)

    AUTO CENTERING, ROBOT MOUNTING/UNMOUNTING/DRYING and BEAMLINE BUSY each had their own accent (purple, red, orange, yellow, maroon), so the sample camera read as a per-activity rainbow instead of one "hands off" signal. All busy states now share BUSY_PSI_RED; ROBOT COOLING keeps blue because it is the long, harmless phase the operator should read as "wait".

    The five near-identical BusyOverlayStyle blocks collapse into one _animated() helper plus a text lookup, and the now-unused purple/orange/ red-badge constants are dropped from styles.py.

    Co-Authored-By: Claude Fable 5.1 noreply@anthropic.com

    • Paint the unknown-session badge with the viewing-mode style (dbd5b90)

    The sample camera drew its own gold/orange/red "Session Vacant / Baton Requested / Guest Mode" box whenever the busy overlay had nothing to show. Since the busy-style builder already receives the session state, that box only ever appeared while the session was still unknown (no status yet, or one without a session), so it flashed a different color and shape than the yellow "Viewing mode, click here to grab the baton" badge every known not-owned state gets.

    Hoist that badge into VIEWING_MODE_STYLE and paint it from both paths; the hover fill is shared through _badge_fill. The three MARK_TOOLTIP constants had no other users and are dropped.

    Co-Authored-By: Claude Fable 5.1 noreply@anthropic.com

    Testing

    • Cover the sample camera pacing, the newest-frame drain and the frame slot (c3e7b9a)

    CI's diff-coverage gate sat at 29% because the ZMQ fixes live in code no test reached: the subscriber's socket setup, emit_image/notify_frame displayed, _recv_latest and the run() frame path, plus the main window's frame slot. The subscriber now runs against a real inproc socket (the drain and the in-flight cap are the fix, so a mock would prove nothing); run() is driven with a stubbed _recv_latest that hands over one JPEG and then stops. The busy overlay gets a check that cooling is the only blue busy state.

    The subscriber fixture takes qapp so no QImage is built before the QApplication exists.

    Co-Authored-By: Claude Fable 5.1 noreply@anthropic.com

    • Format the mocked token and cast the tell-state stand-in for basedpyright (ccb71bf)

    Co-Authored-By: Claude Fable 5.1 noreply@anthropic.com

    • Route the tell-state stand-in through object for basedpyright (a56457d)

    Co-Authored-By: Claude Fable 5.1 noreply@anthropic.com

    Downloads