Directories
The source tree
src/geo.j is the only compilable unit. It uses the libraries and includes every file under src/topics/. include is a textual splice, so a topic file cannot be linted or tested on its own: in isolation its calls into its siblings read as undefined. Lint src/geo.j and src/geo_test.j.
src/geo_test.j mirrors the splice over src/topics/*_test.j, so the overlay is white-box and the tests call unexported helpers directly.
Include order matters for type declarations only. model.j precedes everything that handles a Point; geodesy.j precedes geometry.j and stats.j, which measure with it; scan.j precedes the four codecs; file.j is last because it dispatches to all of them. Functions resolve late, so call order is free.
src/geo.j the module boundary and every export
src/geo_test.j the white-box overlay
src/topics/version.j generated; VERSION
src/topics/core.j errors, entity codec, number formatting, clamping
src/topics/model.j Point, Segment, Track, Route, Document, Bounds
src/topics/geodesy.j haversine distance, bearings, dead reckoning
src/topics/geometry.j bounds, centroid, simplification, containment
src/topics/stats.j TrackStats and the thresholds behind it
src/topics/geohash.j geohash encode and decode
src/topics/tile.j Web Mercator tiles and quadkeys
src/topics/scan.j the streaming element scanner the XML codecs walk
src/topics/gpx.j GPX 1.0 and 1.1
src/topics/kml.j KML 2.2 and KMZ
src/topics/geojson.j GeoJSON, RFC 7946
src/topics/gml.j the GML geometry subset
src/topics/file.j whole files and the format dispatchEach has a co-located _test.j beside it, except the generated version.j, which opts out with a # ci-no-overlay line.
The rest
docs/ the book; docs/SUMMARY.md is the outline
examples/ runnable programs, all of which CI runs
tools/ the CI helpers, the fuzz sweep and the doc-claims checker
site/ the built book; not committedErrors
Every failure is Error{kind: "geo", ...} raised through fail() in core.j. The line between an error and damage a reader works around is in the introduction; tools/fuzz.j asserts it, and that no malformed input raises any other kind.
Value semantics
Functions that change a value return a new one and leave the argument alone. Tests assert it (testNamedAndWithersLeaveTheArgumentAlone, testMergeDocumentLeavesBothArgumentsAlone). What it costs on a large track is measured in Memory.