Releases: cameronzucker/tuxlink
Releases · cameronzucker/tuxlink
Release list
v0.89.1
v0.89.0
0.89.0 (2026-07-12)
Features
- catalog: aim hero — magnetic/true bearing + offline declination (283ba2f)
- catalog: BandMatrix — per-band rows (openness dot + VOACAP bar + dial chips) (b87d2c7)
- catalog: live-openness dots on HF band chips (289d95c)
- catalog: StationRail Station|Live decodes tabs + LiveDecodesTab (5b52268)
- config: additive WwvOffairConfig (948fe7f)
- finder: peers as map diamonds that PREFILL the modem — never dial from the finder (efed5eb)
- finder: wire internet SFI refresh + mount WWV control in Station Intelligence (d7ca0fa)
- ft8: DeviceReservation — listener-priority acquire over in-flight meter reads (80aa809)
- ft8: emit listening:change on set_device + hoi1 two-face guards on all ft8 writers (6b56f18)
- ft8: ft8_cat_probe read-only dial probe (refuses during modem sessions) (7b2c3c7)
- ft8: ft8_device_meter + ft8_list_devices commands (20b86b3)
- ft8: ft8_set_sweep_bands command (validated, RMW, emits change) + Ft8CmdError (33d0cc3)
- ft8ui: BandSubsetPopover — sweep band selection gated on CAT (89a6fa2)
- ft8ui: close the six gaps a full-feature reachability audit found (53683c7)
- ft8ui: DecodeFeed (capped) + map layer-control housing (Gateways only) (2548117)
- ft8ui: deriveBandActivity + stripStats (evidence-only, provenance-gated) (5b26665)
- ft8ui: deriveUiState total mapping over ServiceAxis (9-member union) (782d18a)
- ft8ui: Ft8SetupSurface device-picker + live meter + meter/start handover (0283a8d)
- ft8ui: Ft8SetupSurface Step 2 — rig control + Test CAT + CTA (2ff260c)
- ft8ui: LiveBandStrip — collapsible strip composing waterfall/decodes/popover (1ee37e5)
- ft8ui: Phase D1 — mount the FT-8 surfaces the panel never got (8f6b0b3)
- ft8ui: useFt8Listener hook + ft8Types.ts (race-safe hydration, generation-gated) (ab77bf1)
- ft8ui: Waterfall.tsx — Canvas2D FFT renderer with gap markers (0ac7114)
- ft8ui: wire useFt8Listener to the real deriveUiState + deriveBandActivity (36e1015)
- ft8: waterfall FFT consumer thread + token-counted subscriptions (3765bf3)
- geomag: offline magnetic_declination command (WMM2025, NOAA-vector tested) (694d752)
- shell: FT-8 ambient badge in DashboardRibbon + Ft8ListenerProvider mount (6e71a92)
- stt: 16kHz mono f32 WAV loader (56ec2a6)
- stt: noise-rejection confidence gate (d00d777)
- stt: scaffold tuxlink-stt crate — DecodeMode, SttResult, SttError (8a3a3c9)
- stt: WhisperStt model wrapper + transcribe with vocabulary biasing (35f9115)
- wwv: backend for low-SNR clip playback, manual entry, manual-tune fallback (62d90b1)
- wwv: capture_cycle rig orchestration with serial-sequencing branch (218b4f8)
- wwv: CaptureSource trait + arecord capture (20e6105)
- wwv: frontend invoke bindings + useWwvOffair hook (5447a95)
- wwv: low-SNR clip player + manual entry + manual-tune prompt + styling (e0220dc)
- wwv: nearest-window scheduler (WWV :18 / WWVH :45) (afd54dd)
- wwv: off-air refresh + snapshot Tauri commands, model resolution, ingest (b6b98b0)
- wwv: Refresh off-air control mounted in station-finder actions row (0d50369)
- wwv: register wwv_offair_refresh + wwv_offair_snapshot_read commands (0cac962)
- wwv: setup-time STT model fetch script + off-air space-weather guide page (2830d35)
- wwv: spoken-number normalizer for STT output (f1577f2)
- wwv: time-of-day WWV frequency selection (97bc28d)
- wwv: window scheduling (:18/:45) + arm/cancel + no-copy retry-once (0ba2428)
Bug Fixes
- config: add wwv_offair: None to all full Config literals (E0063) (264f8c0)
- config: borrow instead of move in wwv_offair round-trip test (E0382) (c76875a)
- contacts: make suggestion rows clickable — clicking a correspondent opened nothing (tuxlink-wxtas) (d3fd434)
- ft8: clear two CI clippy/compile errors from Phase A (unused import, E0716) (07b6f07)
- ft8: map ft8_set_sweep_bands infra failures to internal-error, not invalid-band (a09b783)
- ft8: meter preempts on listener priority so the listener always wins cleanly (754e12e)
- ft8: normalize waterfall FFT magnitude so strong signals don't saturate to 255 (de97e4b)
- ft8ui: correct waterfall gap-marker slack to a genuine 2x cadence margin (ed1213d)
- ft8ui: enforce the 10-min openness window so stale bands revert to no-data (63cb0ae)
- ft8ui: interpolate active modem mode into BandSubsetPopover modem-busy copy (59b3e5b)
- mcp: bundle tuxlink-mcp shim in release + ECT packages (b781af4)
- wwv: adversarial-review correctness wave (rig restore, default device, timing, silence) (7296197)
- wwv: Codex adversarial findings on the completion (clip security...
v0.88.0
0.88.0 (2026-07-11)
⚠ BREAKING CHANGES
- peers: the frontend Peer/PeersFile DTOs and the peers_read/peers:changed contract are gone; reachability reads flow through contacts_read and the Contact v2 shape.
- contacts: the peers_read/peer_* Tauri commands and the peers:changed event are removed (unreleased surface); the frontend re-source lands in Task T-E.
- mcp: the telnet_p2p_connect MCP tool is no longer exposed to the agent surface; agents can no longer dial a saved P2P peer's telnet endpoint. The operator's manual telnet P2P dial and the agent's radio P2P dial are unaffected.
Features
- contacts: Contact grows tier + reachability; contacts.json schema v2 (8f30768)
- contacts: delete the peers store — commands cutover, record-site re-point, keyring retarget (3cdcf91)
- contacts: observation recorder + inbound limiter with exact-callsign attach (3e56353)
- contacts: Recent section + contact-detail reachability (T-F Parts 1-2) (6e9fef6)
- contacts: success-only last_ok + last_ok_direction on reachability rows (T-F Part 0) (9bbf572)
- contacts: success-only last_ok timestamps (T-F Part 0) (2d3588a)
- finder: "Dial a station" manual-dial affordance — dial an unheard callsign through the peer-connect seam (T-G) (37d3df1)
- ft8: 51-tap Kaiser 4:1 decimator with response-verified committed table (tuxlink-b026z.3 T3) (65a3b55)
- ft8: canonical slot-WAV writer, tuxlink-jt9 preflight round-trip proven (tuxlink-b026z.3 T2) (a044dae)
- ft8: capture-capable device enumeration + hw:<index> resolver handle (tuxlink-b026z.3 T8) (8becb30)
- ft8: commands + events + lib wiring; sweep race re-check; clippy round 6 (tuxlink-b026z.3 T17) (999f7ef)
- ft8: decode types + jt9 discovery with sibling version probe (tuxlink-b026z.2 T4) (f6363d2)
- ft8: FT8 message field extractor with pinned grammar (tuxlink-b026z.2 T2) (58adc71)
- ft8: Ft8Config + sweep config, validation rules, alsa + tuxlink-capture deps (tuxlink-b026z.3 T9) (4ec95ad)
- ft8: host-side slot-WAV preflight — jt9 cannot be trusted to reject bad input (tuxlink-b026z.2 T3) (ce33e2a)
- ft8: jt9 runner — spawn/timeout/kill discipline, partial salvage, full failure taxonomy (tuxlink-b026z.2 T5) (0152d98)
- ft8: listener service core — supervisor, start sequence, snapshot, ring (tuxlink-b026z.3 T11) (67f57a6)
- ft8: listener state machine — axes, health flags, sweep element, N/k counters (tuxlink-b026z.3 T6) (0aabbb8)
- ft8: modem arbiter — pause/hold/resume + rig-session serialization (tuxlink-b026z.3 T14) (20ee1fe)
- ft8: modem yield seams — ardopcf choke wrapper, Dire Wolf pre-probe hook, VARA spawn_blocking (tuxlink-b026z.3 T15) (b365386)
- ft8: salvage-on-signal parity in the jt9 runner + contract doc edits (tuxlink-b026z.3 T7, resolves tuxlink-gujnz) (374870c)
- ft8: slot anomaly rules — surplus drop, clock-anomaly abandonment, lost-frames drop (tuxlink-b026z.3 T5) (bcb0ea4)
- ft8: slot pipeline — capture/decode threads, tap, backpressure, ring records (tuxlink-b026z.3 T12) (3fd0848)
- ft8: src/ft8 skeleton — traits, wire records, fakes, ALSA source, clock probe (tuxlink-b026z.3 T10) (25b9826)
- ft8: stop protocol + resume/device-absent recovery (tuxlink-b026z.3 T13) (8dfeaa8)
- ft8: sweep scheduler + provenance downgrade + composition pin (tuxlink-b026z.3 T16) (056f817)
- ft8: tuxlink-capture leaf crate + FT8 band→dial table (tuxlink-b026z.3 T1) (abcc392)
- ft8: tuxlink-jt9 leaf crate + jt9 stdout line parser (tuxlink-b026z.2 T1) (7ed80e3)
- ft8: wall-clock-true slot assembler — boundaries, gap fill, provenance (tuxlink-b026z.3 T4) (c0ec114)
- mcp: agent telnet P2P dial — (peer_id, endpoint_id) addressing, rebinding-safe denylist (ff5d084)
- mcp: curated find_peers behind the egress arm gate (bc3d4cd)
- mcp: engine-aware VARA agent egress — honor HF/SAT vs FM, drop the VaraHf hard-pin (93726ff)
- mcp: find_peers reads contacts; telnet host:port never crosses the agent surface (1c5ef02)
- packet: thread SessionIntent through the packet connect path (cfa8816)
- peers: ARDOP record sites — outer connect-fail, exchange, and answer (806428e)
- peers: circle peer layer on both maps (escaped divIcon, map_peers-gated) (3f347ed)
- peers: contact-link reconciliation + peer_id favorite cleanup; finder/map capabilities on (053a148)
- peers: endpoint-keyed keyring secrets with conservative migration and cascade clear (4688104)
- peers: favorites link — peer_id on FavoriteDial, recorder->recents bridge, double-count suppression (f1e8b64)
- peers: finder station-type filter + peer rows + capability hide (6f4928b)
- peers: frontend P2P connect seam — peer Connect dials p2p with via/path/intent (69fb08f)
- peers: frontend peer types, usePeers hook, distinct aggregation (cf037d0)
- peers: global observation sink + VARA record sites (dial + answer) (0102d87)
- peers: inbound auto-create rate limiter + quarantine counter with p2p_limits config (bf1203f)
- peers: packet record sites — dial + answer (ab5db94)
- peers: peer data model — types + serde wire shapes (c4e9458)
- peers: peer store — open/quarantine/flush, upsert/dedup, split routing, bounded caps (d3a66a6)
- peers: recorder drop-guard, central observation entry, Tauri commands + state wiring (8d500c7)
- peers: telnet record sites + global reject->limiter plumbing complete the 8-site matrix ([0b1...
v0.87.2
0.87.2 (2026-07-10)
Bug Fixes
- catalog: preserve gateway SSID in parsed callsign — dial the station that actually answers (002b5fc)
- lint: allow result_large_err on the transport give-back — VaraConfig growth crossed clippy's 128-byte Err threshold (8a0955e)
- mcp: pass sideband default through the rig_tune port — ardop_tune_rig grew a second argument (71bf98c)
- rig: convert catalog CENTER to sideband DIAL at the CAT tune — every catalog dial transmitted 1.5 kHz off-channel (80f70bd)
- rig: gate sideband conversion off FM, preserve fractional-kHz centers, pin center semantics in MCP docs (Codex adrev round) (657befb)
- rig: set_mode passband -1 — never change the operator's filter width (86055ba)
- vara: give the data socket an RF-scale read timeout — 2s cmd cadence disconnected the first on-air gateway answer (8e53a2f)
- vara: hold PTT 250ms after VARA's PTT OFF — stop amputating frame tails (acbdcf0)
- vara: shut down the data socket on abort + harden xzxk1 tests (Codex adrev round) (ae4a4a7)
v0.87.1
v0.87.0
0.87.0 (2026-07-08)
Features
- config: persist selected connection; bump schema 5->6 (Contract 2) (a20248a)
- mcp: agent print + report export (Contract 3, tuxlink-z2nwx) (9d38f3d)
- mcp: modem_get_status reports selected + running with SoT kind (Contract 2) (ccdae4c)
- mcp: read-only vara_probe deep probe tool (Contract 1b) (ebf1e2c)
- mcp: rich audio-card inspection + disambiguation guidance (Contract 4, tuxlink-77seh) (3486e53)
- mcp: VARA cmd-port reachability on vara_status (Contract 1a) (7038436)
- ui: kind-aware active-modem panel + persist selected connection (Contract 2) (792016d)
Bug Fixes
v0.86.0
0.86.0 (2026-07-08)
⚠ BREAKING CHANGES
- elmer: Limits.max_tool_turns is replaced by Limits.max_response_duration.
Features
- elmer: remove the 10-tool-turn cap; bound a run by wall-clock instead (386608c)
- elmer: render one StreamingStatusCard; kill the bubble/indicator glitches (cab37a7)
- elmer: StreamingStatusCard — collapsed counter + bounded expand (h5azu/06v9s/d5zns) (bf6c612)
- elmer: useStreamAutoFollow pin-to-bottom scroll hook (06v9s) (0581843)
- elmer: useThinkingPulse verb + elapsed ticker (3de5e8e)
Bug Fixes
- elmer: keep Stop responsive between fast tool turns; stronger deadline test (8324055)
Refactors
- elmer: extract RADIO_VERBS into radioVerbs module (7e2f1cb)
v0.85.0
v0.84.0
0.84.0 (2026-07-07)
Features
- rig: expose rigctld_binary override field; document bundled default (tuxlink-a9ip3) (45a075b)
- rig: resolve bundled tuxlink-rigctl/rigctld by default (tuxlink-a9ip3) (0b0ef3a)
Bug Fixes
- ci: correct libusb dev package name to libusb-1.0-0-dev (tuxlink-a9ip3) (ba27a94)
- ci: dummy-backend smoke must match the freq line, not the whole capture (tuxlink-a9ip3) (9e4dc15)
- ci: ldd allow-list must basename the loader path; empty rigctld_binary=bundled (tuxlink-a9ip3) (3b52b5d)
- packaging: drop system hamlib dep, add bundled-binary base libs (tuxlink-a9ip3) (c13544e)
v0.83.0
0.83.0 (2026-07-07)
Features
- config: enrich serial device pickers with real USB device name from sysfs (tuxlink-xj7e1) (bd0fa80)
- elmer: context meter counter-mode when window is unknown (4951fc2)
- elmer: emit ContextUsage from the compat path (windowless) (c6c5cff)
- elmer: make context-meter denominator Option<u32> end to end (6495802)
- elmer: probe /v1/models for the compat context window (cfb0160)
- ft8: M2 real-WAV acquisition slice (channelize + Costas sync + thin e2e) (4a2b621)
- ft8: receive-only type-4 non-standard-callsign unpack (a140f6f)
- mcp: expose VARA provisioning to Elmer as MCP tools + playbook (wire-walk Flow 3) (cdb5709)
- vara: anytime VARA setup entry point in the VARA panel (wire-walk Flow 2) (71a69d6)
- vara: backend commands to provision VARA HF via the engine (3072602)
- wizard: optional VARA HF provisioning step in onboarding (5aebeea)
Bug Fixes
- config: serial-name enrich walks ancestors for bInterfaceNumber (Codex P2, tuxlink-xj7e1) (d32ed9b)
- elmer: anti-stacking guard for Ollama — stop the Stop-then-Send OOM (P0) (ee60f2f)
- elmer: bound the /v1/models probe + reject bogus context lengths (ee3c641)
- elmer: gate num_ctx on loopback-alias-aware isLocalOllamaEndpoint (0637219)
- elmer: gate operator num_ctx control on the Ollama preset (742dfc9)
- elmer: retry compat request once without stream_options on 400/422 (165f026)
- elmer: stop sending temperature to Anthropic frontier models (400) (615c64f)
- ft8: correct sync.rs metric provenance docs + harden sort (M2 review) (dac4d6c)
- ft8: harden M2 acquisition per Codex adversarial round (72019d1)
- vara: address Codex adversarial review findings (525bc6f)
- vara: detect dropped VARA connection (heartbeat) + poll status so the panel unlocks (tuxlink-6urh2) (efa7605)
- vara: listener terminal EOF stamps SocketLost, not laundered Open (tuxlink-6urh2) (7d1a7ef)
- vara: mark_socket_lost returns bool, not Result<(),()> (clippy) (tuxlink-6urh2) (bfde602)
- vara: non-blocking liveness drain + non-UTF8 counts as alive (tuxlink-6urh2) (b784032)
- vara: rebuild drop-detection as a consuming EOF-aware heartbeat (Codex, tuxlink-6urh2) (8af6c6f)
- vara: thread bound host/port into mark_socket_lost (reopen target) (tuxlink-6urh2) (697389a)
- vara: treat EINTR as a live idle tick in the liveness read (tuxlink-6urh2) (e7d41bb)