KStars v3.8.5 is released on 2026.10.03 for Windows, Linux, and MacOS. We are providing arm64 (Apple Silicon) and x86_64 variants for the MacOS release, but we hope to release a universal binary by the next KStars release.
For Linux users, it's highly recommended to use the official KStars Flatpak hosted at Flathub.
This release brings major stability improvements, a comprehensive AI Guider overhaul with multi-night training and closed-loop fixes, expanded MCP tool coverage for headless automation, multi-camera support in Analyze, and significant enhancements to the scheduler, capture, and guide modules. Here are some highlights:
FITS Viewer Quality of Life improvements
You can now drag and drop any FITS/XISF files directly unto the KStars sky map and it would be automatically opened. If you dragged a folder, it would be opened in Blink mode. Furthermore, when opening FITS files from file manager (e.g. Dolphin), it now re-uses the same KStars instance and does not open a new instance for each new file.AI Guider: Major Reliability & Performance Overhaul
- Fixed closed-loop RLS divergence in Active mode — the online phase/amplitude tracker in
WormGearGuider(WORM_GEAR mounts like the EQ8) could re-learn its own leftover prediction error once its output started influencing the applied pulse, making RA guiding measurably worse under Active mode than Standard. The tracker now freezes whenever the applied pulse contains the AI's own prediction, preventing contamination. Confirmed live: RA RMS improved from 3.06" (diverging Active) to 2.41" (frozen Active) vs. a 3.56–5.38" Standard baseline. - Per-axis confidence — RA and DEC now maintain independent confidence scores instead of sharing one across both axes. A bad prediction on one axis no longer drags the other axis's trust up or down. Verified live: DEC RMS improved 4.75"→1.26" same-session A/B after the split.
- Shadow Mode now stays in Shadow Mode —
applyFingerprintToOptions()was unconditionally switching the guide algorithm to AI on every weights load, defeating Shadow Mode's purpose. Verified live: a 1500+s Shadow session heldStandard/SHADOWthroughout with zero AI-influenced pulses. - Multi-night pooling and neural Shape Net for RA — new offline training scripts (
pool_sysid_data.py,train_shape_net.py,loocv_shape_net.py) pool free-drift data across multiple nights, phase-aligning each night to its own fitted period before combining. A small neural net (phase, altitude → predicted RA drift) trained on pooled data beats a fixed 4-harmonic Fourier baseline by a statistically real margin (95% CI excludes zero), winning in 7 out of 7 held-out nights. LOOCV-validated with a night-level cluster bootstrap. - DEC online drift tracker — adds a 1-state recursive Kalman filter tracking residual DEC rate against the existing physics baseline (refraction + polar drift). First live test achieved r=0.65 then r=0.55 physics_dec vs actual DEC error — the strongest correlation of the investigation. Matched-altitude live A/B testing found real altitude-dependent patterns (~29% DEC RMS improvement at low altitude, reversing to ~22% worse at mid altitude). Per-mount opt-in via
weights.json's newresidual_filtersection. - Multi-harmonic PE model — extended from a single sinusoid to 4 independently-tracked harmonics (RA), mirrored in the offline trainer's physics model. Real free-drift data shows significant power through the 4th harmonic that a single-sinusoid model structurally cannot represent.
- Safer AI/PID pulse blending — fixed a chronic RA under-correction bug where proportional gain was backed off by a flat confidence-scaled fraction regardless of whether the AI's feed-forward term was large enough to replace the P-authority being removed. Replaced with a capped backoff that only removes as much P as the AI term demonstrably reinforces, proven via unit tests to never weaken the blend below plain P+I when the AI term doesn't justify it.
- PID Auto-Tune improvements — cold vs. warm pulses now distinguished (3 consecutive pulses per direction instead of alternating), and Andreas R. added a short-exposure switch during
pulse_responsephases (0.25s) so the default ~2s guide cadence can actually sample the dead-time transient the fitter needs. DEC auto-tune timing tightened (12 response frames/10s settle → 6/2s) to keep the axis closer to continuously engaged. - PE period detection fixed —
train_worm_gear.pywas picking a 2nd-harmonic peak (~100s) over the true fundamental (~198–201s) via a bareargmax()over one Lomb-Scargle periodogram. Now walks toward longer periods when a comparably-strong harmonic relationship exists, gated on ≥2.5 cycles resolved. - Fixed
k_ref(RA refraction term) loaded fromweights.jsonbut never read byphysicsRA() - RLS cold-start now warm-starts from the offline-trained physics fit instead of zero, with anisotropic covariance
- AI Guide Wizard slew-skip bug fixed — a restarted session could silently skip its slew by matching a stale target position
- Data-collection phases now target a frame COUNT (with wall-clock as a 3x backstop) instead of fixed duration, so slower Debug-build cadence doesn't silently halve the frame count
- AI debug CSV logging added for dark-guiding pulses (previously only visible via verbose qCDebug)
Scheduler & Observatory Automation
- Fixed scheduler not shutting down when a safety alert outlasts the job — with the weather grace period set to wait indefinitely, an alert lasting past a job's completion constraint left the observatory open (reported in daylight in one incident). The monitoring branch now releases the active job when a soft shutdown starts, re-evaluates jobs before any post-startup task, and runs the full shutdown when no job is left.
- Fixed internal guider not guiding after the scheduler restarts it while suspended — when a scheduler job repeats and its sequence ends with non-light frames (e.g. flats), guiding is still suspended when the next iteration starts. The cgmath suspend flag set by
suspend()was never cleared, so every guide frame was skipped for the rest of the night. BUG: 526397 - Fixed scheduler retrying autofocus on an optical train without focuser — when a Focus tab switched to an optical train without a focuser,
canAutoFocus()kept reporting the capability of the previously selected focuser. The scheduler then started autofocus on the train without focuser, which aborted and was retried until the job aborted and rescheduled, oscillating between Scheduled and Running. - Fixed scheduler double-counting captured frames for targets with a dot in the name — Wolfgang Reissenberger fixed
PlaceholderPath::getCompletedFiles()deriving its file-matching pattern by stripping everything from the last.onward. A target likeSNR_G108.2-0.6got truncated right after that dot, discarding camera, filter, exposure, date tokens. Two optical trains capturing the same target into a shared directory each reported the combined frame count instead of its own. - Fixed UI test startup D-Bus service name and location —
locationNamed("Greenwich")returns Greenwich, Connecticut with US DST rules while tests expect Greenwich, UK - Fixed greedy scheduler tests using the standard-time UTC offset instead of DST
- Fixed scheduler not creating the Ekos Manager while loading sequence files (crashed
testschedulerunit) - Added scheduler and test pitfalls to
AGENTS.md— notes for AI agents from the scheduler weather work - Thomas Nemer added MCP scheduler tool family:
scheduler_status,scheduler_jobs,scheduler_current_job,scheduler_start/scheduler_stop,scheduler_load
Camera & Capture
- Fixed follower camera hanging after focusing — Wolfgang Reissenberger fixed a multi-camera bug where a follower camera could get stuck after re-focusing if the camera was paused while the lead camera dithered and a re-focus became due at the moment the sequence continued. Resuming a paused sequence now retries pending actions instead of giving up after the first attempt.
- Fixed capture status label stuck at "Focus Offset" — Wolfgang Reissenberger fixed the status label over the capture preview keeping "Focus Offset" while the frame is being exposed instead of switching back to "Capturing".
- Capture: do not restart an aborted sequence when dithering ends — Wolfgang Reissenberger fixed capturing that was stopped while a dithering run is still in progress restarting on its own as soon as the dithering finishes. Only capturing that was paused for the dithering itself is now resumed.
- Unified Temperature with Gain/Offset "no value" semantics — removed the separate enforce checkbox (could fall out of sync with the spinbox's own value) and gave Temperature the same special-value convention Gain/Offset already use: the spinbox itself carries a "--" sentinel (min - step) for "no target temperature".
- Fixed dark frame matching to use the target chip's camera, not the dialog's —
DarkLibrary::findDarkFrame()read gain/temperature from the camera tied to the optical train selected in the Dark Library dialog, not the camera that owns the chip being matched. For setups with a dedicated guide camera, this caused valid dark frames to be rejected on a gain mismatch that never existed. - Multi-camera bug fixed: disconnect from old camera device if device changes — Wolfgang Reissenberger fixed the camera tab not disconnecting from its former device if the device has been changed (e.g. optical train switched). Turning off cooling on the first camera appeared to turn off cooling on the second camera as well (the INDI driver showed cooling was still on).
- jc tk added camera name and optical train placeholders for filename generation:
%opticaltrain/%oand%cameraname/%c - Andreas R. added stream depth selector for video sequences — a combo box (Stream OFF / 16-bit / 8-bit) in the capture sequence editor for video frame type, allowing users to specify bit depth directly in the sequence file
- Thomas Nemer added MCP capture sequence tool family:
capture_status,capture_get_jobs,capture_start/capture_stop/capture_abort,capture_suspend/capture_pause/capture_resume,capture_load_sequence,capture_set_target
Guide
- Warn when mount stops tracking while guiding is active — if the mount reports
MOUNT_IDLEorMOUNT_ERRORwhile guiding/dithering is running, Guide now fires a loud GuideFailed notification instead of silently guiding into a wall (e.g. AM5N mounts spontaneously losing tracking mid-session per user reports). - Andreas R. added reset calibration when the field rotates — an opt-in option that invalidates a completed/stored guide calibration when the field has rotated (detected via the Align module's plate-solved position angle), so a fresh calibration is measured on the next guide start instead of guiding on a stale, rotated one. Handles both electronic rotator moves and manual camera rotation. Works with the internal guider and PHD2. Meridian flip changes are explicitly excluded via pier-side tracking and a 180° magnitude fallback.
- Andreas R. added a Stream OFF/16-bit/8-bit selector (per optical train) — replaces the guide module's Stream checkbox with a stream mode combo box offering three choices. The selection is saved per optical train. Includes
Camera::setStreamDepth(int)helper (0 = 8-bit, 1 = 16-bit). - Andreas R. fixed GUI freeze on streaming guide + normal dither (self-join deadlock) — a hard GUI freeze with the internal guider in streaming mode when the capture module requests a normal (multi-pulse) dither. Ekos locks up the instant "Dithering…" is logged. Root cause: a stream frame processed on the GUI thread spins a nested QEventLoop during star extraction, which dispatches the imaging camera's queued
newImage→dither→ synchronousInternalGuider::dither()→findStarson the same FITSData whose extraction future is still running inline → deadlock. Streaming normal dither now uses the same deferred path as single-frame guiding. - Andreas R. made calibration always run single-frame; stream only while guiding — streaming guide calibration produces erratic results (scattered plots, mis-estimated pulse rates, "Lost track of the guide star" aborts) because calibration is frame-driven and assumes each frame reflects a completed, settled pulse. With the default 1000 ms calibration pulse longer than the exposure, pulses overlap and the mount never settles.
Guide::calibrate()now stops any active stream beforebuildOperationStack(), so the whole calibration runs on the single-frame path; the stream starts automatically when active guiding begins. - Andreas R. applied dark/defect-map correction to streaming guide frames — in streaming mode the
GUIDE_DARKoperation step is skipped, so the "Dark" checkbox was a no-op. The correction is now applied inline inprocessData()for streaming frames via newDarkProcessor::denoiseSynchronous()before the frame is loaded into the guide view or handed to the guider. Verified on real hardware (PlayerOne Xena 585M): glow pedestal and gradient removed, edge-spread 5.0 → 0.2/0.7.
Alignment & Mount Modeler
- Lower the default align check threshold to 10 arcminutes and improve logging to identify if the actual mount moved between checks
- Account for declination when calculating total alignment error
- Properly display annotated objects after plate-solving an image from Sky Map objects
- Fixed align hang when a slew completes without an observable IPS_BUSY — some mount drivers finish very short corrective slews within a single status tick and never emit an intermediate
IPS_BUSYforEQUATORIAL_EOD_COORD. Align'sALIGN_SLEWINGhandler only trusted anIPS_OKonce it had witnessedIPS_BUSY, and the elapsed-timer fallback is only re-evaluated when a new property update arrives. Snapshot the mount's reported RA/DE right beforeSlew()commands the move, and also accept anIPS_OKwhose position differs from that snapshot as proof

No comments:
Post a Comment