Skip to content

Release v26.6.74: coverage freeze fix + launcher/audio fixes#64

Merged
chriskinal merged 10 commits into
mainfrom
develop
Jul 4, 2026
Merged

Release v26.6.74: coverage freeze fix + launcher/audio fixes#64
chriskinal merged 10 commits into
mainfrom
develop

Conversation

@chriskinal

Copy link
Copy Markdown
Collaborator

Promotes develop → main for release. Bumps 26.6.69 → 26.6.74.

What's included (4 merged PRs since main)

Testing

  • Full solution test suite green (Models 146 / ViewModels 222 / Services 1026).
  • Desktop head builds; each fix device-verified in its own PR.

After merge, cut the release: git tag v26.6.74 && git push origin v26.6.74.

🤖 Generated with Claude Code

chriskinal and others added 9 commits July 2, 2026 19:26
The camera-panel buttons (mode/heading cycle, zoom, tilt) were bound on
`click`, which the NativeWebView launcher (touch) doesn't fire reliably —
so tapping the heading-mode button did nothing on the launcher build while
it worked in a browser. Bind them on `pointerdown` instead (the same event
the rest of the touch UI uses); the campad container already stops
propagation so this doesn't pan the map.

Fixes #56.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…her-tap

Fix heading/camera mode button not responding on launcher (#56)
The audio-unlock nudge played every cached alert element to prime it for
autoplay, pausing each in an async .then(). Because the pause lands a beat
after play() starts, the first pointer/key event emitted a brief burst of
all alerts — most audibly the Hyd up/down 3-pt-hitch sounds. Prime the
elements MUTED instead (muted playback still satisfies the autoplay policy),
then restore. Real plays clone the element so they're unaffected.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…-burst

Fix alert-sound burst on first UI click after startup
The test opened a read handle (FileShare.Read) on OldProfile.json and,
while that handle was still open inside the using block, called
WriteAllText on the same path -- which deterministically failed with
'process cannot access the file'. Read the file fully into a string and
close the handle before writing the stripped-down profile back.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The virtual steer and machine modules bound their listen sockets to
IPAddress.Any (0.0.0.0), which makes Windows Defender Firewall prompt for
network access on every test run. All virtual-module traffic is 127.0.0.1,
so bind the listeners to IPAddress.Loopback instead -- loopback traffic
bypasses the firewall entirely, no per-machine allow rule needed.

The send-only GPS receiver is left as an unbound UdpClient: outbound UDP
does not trigger the prompt, and eager binding would race the machine
module for an ephemeral port in VirtualModuleHub.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Fix Windows-only test failures: profile file-lock and firewall-prompting sockets
The web UI froze for ~1s and jumped the tractor forward whenever the
coverage grid changed, worsening with field size. Root causes + fixes,
all in the coverage streaming path:

- Full-coverage snapshot walked the ENTIRE field bounding box at 0.1m
  (O(field area), ~130ms on a 40ha field even with 0.63ha painted) on
  the 10Hz broadcast loop, stalling pose/tick frames. Now enumerates
  only painted display cells via GetPaintedDisplayCells (O(worked area),
  ~9ms) and builds off the broadcast loop so pose never stalls.

- Client drained a full snapshot in one render frame (unbounded
  per-cell drawRect). Now time-sliced (COV_DRAIN_BUDGET/frame).

- Bounds expansion re-sent the entire accumulated coverage. The added
  ground is empty, so the host now announces the new grid (reset=false)
  and the client re-anchors its existing coverage into the larger grid
  (exact integer-offset pixel copy) — zero rescan, zero resend. A new
  CoverageInit `reset` flag distinguishes grow (re-anchor) from new
  field / reload / cell-size change (tear down + rebuild).

- The first no-boundary expansion crosses the 0.1->0.2m resolution band
  (rebuild path). GetPaintedDisplayCells read the display buffer
  lock-free and could catch it cleared-but-not-yet-resampled, yielding
  an empty snapshot that permanently dropped pre-expansion coverage.
  Now materialized under _coverageLock (alpha folded in) for a
  consistent read.

- Pre-existing edge-ribbon bug surfaced by the no-boundary test path:
  the auto-init SetFieldBounds->ClearEdges wiped an active section's
  ribbon while it stayed on, so StartMapping never re-opened it and the
  crisp worked-area perimeter silently never rendered. AccumulateEdge
  now re-opens a ribbon on a miss (self-heals).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…freeze

Fix periodic coverage-map freeze on large fields (#34)
@chriskinal
chriskinal merged commit 4b24316 into main Jul 4, 2026
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants