<feed xmlns='http://www.w3.org/2005/Atom'>
<title>nav.git/android-app/app/src/test/kotlin/org, branch main</title>
<subtitle>nav — android navigation app
</subtitle>
<id>https://git.terst.org/nav.git/atom?h=main</id>
<link rel='self' href='https://git.terst.org/nav.git/atom?h=main'/>
<link rel='alternate' type='text/html' href='https://git.terst.org/nav.git/'/>
<updated>2026-04-06T09:41:32+00:00</updated>
<entry>
<title>feat(tracks): persist tracks as GPX in Documents/Nav/ — survives uninstall</title>
<updated>2026-04-06T09:41:32+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-04-06T09:41:32+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/nav.git/commit/?id=f9b8801eb52c48986eb0123e8758f7ab78736dec'/>
<id>urn:sha1:f9b8801eb52c48986eb0123e8758f7ab78736dec</id>
<content type='text'>
GpxSerializer/GpxParser: full round-trip of all TrackPoint fields via
GPX 1.1 + nav: extensions namespace. 13 unit tests.

TrackStorage: MediaStore on API 29+ (no permission needed), direct file
I/O on API 24-28 (WRITE_EXTERNAL_STORAGE maxSdkVersion=28).

TrackRepository: stopTrack() is now suspend, writes GPX and returns
TrackSummary (distance nm, duration, max/avg SOG, avg wind, avg wave).
getPastTracks() lazy-loads from Documents/Nav/ on first call.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>feat(ui): wire redesigned instrument sheet — InstrumentHandler rewrite + MainActivity</title>
<updated>2026-04-06T06:49:34+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-04-06T06:49:34+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/nav.git/commit/?id=c8a1e81faec6663b258898c109db1f63e57b07eb'/>
<id>urn:sha1:c8a1e81faec6663b258898c109db1f63e57b07eb</id>
<content type='text'>
InstrumentHandler: direction arrows (SKY/OCEAN palettes), WaveView state,
metres→feet conversion, bearing formatting, all helpers top-level for TDD.

MainActivity: setupHandlers wires all new view refs; observeDataSources
passes cogBearingDeg, twsBearingDeg, raw metres to handler; depth collector
wired from nmeaDepthDataFlow.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>feat(ui): add DirectionArrowView and WaveView custom views</title>
<updated>2026-04-06T05:25:04+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-04-06T05:25:04+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/nav.git/commit/?id=8004e7e05a68a2409ad0fdfc067936f9e2329067'/>
<id>urn:sha1:8004e7e05a68a2409ad0fdfc067936f9e2329067</id>
<content type='text'>
DirectionArrowView: rotating notched-chevron compass indicator in
SKY (grey) and OCEAN (blue) palettes, with bearing normalization.

WaveView: animated swell + wind-chop canvas divider — sky/sea
gradient fills, shimmer line, whitecap highlights; self-animates
via postInvalidateOnAnimation.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>refactor: unify core models and finish org.terst.nav migration</title>
<updated>2026-04-04T07:45:41+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-04-04T07:45:41+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/nav.git/commit/?id=97715ab4007ff3101f58edf4385cef1fc3d1615b'/>
<id>urn:sha1:97715ab4007ff3101f58edf4385cef1fc3d1615b</id>
<content type='text'>
</content>
</entry>
<entry>
<title>feat: implement PDF logbook export (Section 4.8)</title>
<updated>2026-03-25T04:54:58+00:00</updated>
<author>
<name>Claudomator Agent</name>
<email>agent@claudomator</email>
</author>
<published>2026-03-16T00:03:17+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/nav.git/commit/?id=7193b2b3478171a49330f9cbcae5cd238a7d74d7'/>
<id>urn:sha1:7193b2b3478171a49330f9cbcae5cd238a7d74d7</id>
<content type='text'>
- LogbookEntry data class: timestampMs, lat/lon, SOG, COG, wind, baro, depth, event/notes
- LogbookFormatter: UTC time, position (deg/dec-min), 16-pt compass, row/page builders
- LogbookPdfExporter: landscape A4 PDF via android.graphics.pdf.PdfDocument with column headers,
  alternating row shading, and table border
- 20 unit tests covering all formatting helpers and data model behaviour

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>feat: add harmonic tide height predictions (Section 3.2 / 4.2)</title>
<updated>2026-03-25T04:54:31+00:00</updated>
<author>
<name>Claudomator Agent</name>
<email>agent@claudomator</email>
</author>
<published>2026-03-15T03:44:25+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/nav.git/commit/?id=826d56ede2c59cad19748f61d8b5d75d08a702d9'/>
<id>urn:sha1:826d56ede2c59cad19748f61d8b5d75d08a702d9</id>
<content type='text'>
Implement offline harmonic tide prediction as specified in COMPONENT_DESIGN.md:
- TideConstituent: name, speedDegPerHour, amplitudeMeters, phaseDeg
- TidePrediction: timestampMs, heightMeters
- TideStation: id, name, lat, lon, datumOffsetMeters, constituents
- HarmonicTideCalculator: predictHeight(), predictRange(), findHighLow()
  Formula: h(t) = Z0 + Σ [ Hi × cos( ωi × (t − t0) − φi ) ]
- 15 unit tests covering all calculation paths

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>fix: remove duplicate _orig source files causing duplicate class compilation errors</title>
<updated>2026-03-16T22:28:39+00:00</updated>
<author>
<name>Claudomator Agent</name>
<email>agent@claudomator</email>
</author>
<published>2026-03-16T22:28:39+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/nav.git/commit/?id=4d637d284dce6fc674599c226dd063c442fd350f'/>
<id>urn:sha1:4d637d284dce6fc674599c226dd063c442fd350f</id>
<content type='text'>
map_orig/MapFragment.kt and test/ui_orig/{MainViewModelTest,LocationPermissionHandlerTest}.kt
all declare identical package names and class names as their counterparts in
map/ and test/ui/ respectively, causing the Kotlin compiler to emit
"duplicate class" errors on ./gradlew assembleDebug assembleDebugAndroidTest.

Deleted the _orig copies; the real implementations are in map/ and test/ui/.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Merge branch 'master' of /site/git.terst.org/repos/nav</title>
<updated>2026-03-16T01:10:08+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-03-16T01:10:08+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/nav.git/commit/?id=9f694c364e547cb767a8f76a0cabf25ee06d6cc7'/>
<id>urn:sha1:9f694c364e547cb767a8f76a0cabf25ee06d6cc7</id>
<content type='text'>
</content>
</entry>
<entry>
<title>feat: add VHW boat speed parser, BoatSpeedData, and PerformanceViewModel</title>
<updated>2026-03-16T01:09:44+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-03-16T01:09:44+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/nav.git/commit/?id=0ded60427f27d2f69ae235633c7a7ad1ece1cd9c'/>
<id>urn:sha1:0ded60427f27d2f69ae235633c7a7ad1ece1cd9c</id>
<content type='text'>
- NmeaParser: add parseVhw() for NMEA VHW (water speed) sentences, returning BoatSpeedData
- NmeaStreamManager: expose nmeaBoatSpeedData SharedFlow for VHW emissions
- BoatSpeedData: new sensor data class (bspKnots, timestampMs)
- PerformanceViewModel + factory: new ViewModel for performance metrics
- Preserve orig copies of MapFragment and UI tests for reference
- Update SESSION_STATE.md and allowed tool settings

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>feat: add GribRegion and GribFile data models with staleness logic</title>
<updated>2026-03-16T00:02:55+00:00</updated>
<author>
<name>Claudomator Agent</name>
<email>agent@claudomator</email>
</author>
<published>2026-03-16T00:02:55+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/nav.git/commit/?id=76a7e39a4bdb15db8b782ac0c469b26bfc7d7ab6'/>
<id>urn:sha1:76a7e39a4bdb15db8b782ac0c469b26bfc7d7ab6</id>
<content type='text'>
</content>
</entry>
</feed>
