{"module":"navcore","version":"1.0.0","filterVersion":"1.1.0","summary":"GPS-denied navigation measurement layer: celestial (Polaris, stars, Sun), camera sighting on known points, resection, and a navigation filter with course guidance. Same code online (/api/navcore) and offline (/navigator).","operatorPage":"/navigator","docs":{"readme":"docs/navcore/README.md","proof":"docs/navcore/PROOF.md","source":"shared/navcore/"},"components":[{"id":"almanac","file":"shared/navcore/almanac.ts","plain":"Offline star/Sun almanac: where every navigational body is at any second, no network.","method":"Meeus (1998) sidereal time, nutation, Sun from the single platform solar core (solar.ts = pnt-core.js algorithm), star apparent place (proper motion, precession, nutation, aberration). 57 navigational stars + Polaris from HYG/Hipparcos (CC BY-SA 4.0).","measuredAccuracy":"Stars/Aries ≤ 0.01′; Sun GHA ≤ 0.4′, Dec ≤ 0.15′; Rigil Kentaurus 0.29′ (binary orbit) — vs USNO, see PROOF.md","limits":"No Moon or planets; star parallax ignored (< 0.8″)."},{"id":"solar","file":"shared/navcore/solar.ts","plain":"The ONE Sun calculation for the whole platform (azimuth, elevation, twilight times). Same algorithm as the browser's pnt-core.js, parity-tested.","method":"NOAA Solar Calculator / Meeus ch. 25 with equation of time; twilight by scan + bisection.","measuredAccuracy":"Elevation ≤ 0.18′, azimuth ≤ 0.0014° (0.025 mil) vs USNO","limits":"Geometric center elevation (apply refraction for observed)."},{"id":"sight-reduction","file":"shared/navcore/sight-reduction.ts","plain":"Turns a measured star/Sun altitude into a line of position, a multi-star fix, Polaris latitude, or a true-north reference.","method":"Nautical Almanac dip/refraction/SD/parallax corrections; St-Hilaire intercept; iterated weighted least squares with running-fix advancement; exact Polaris latitude solve.","measuredAccuracy":"Hc ≤ 0.2′ and Zn ≤ 0.05° vs USNO; fix closure < 150 m with perfect sights","limits":"Fix accuracy is set by the altitude measurement: sextant ~1′ ≈ 1 nm; phone/clinometer 0.3–1° ≈ 20–60 nm (use for gross check and true-north)."},{"id":"resection","file":"shared/navcore/resection.ts","plain":"Position from bearings (and optionally ranges) to known points, with error ellipse, geometry rating and automatic blunder rejection. Can solve an unknown compass error with 3+ landmarks.","method":"Weighted Gauss-Newton least squares; optional common heading-bias unknown; 3-sigma outlier rejection (reported).","measuredAccuracy":"Exact geometry closes < 1 m; Monte Carlo CEP vs predicted in PROOF.md","limits":"Needs correct landmark identification; weak when bearings are < 30° apart."},{"id":"camera","file":"shared/navcore/camera.ts","plain":"Phone camera sighting: tap a landmark on screen → true bearing and elevation; calibrate field of view and compass offset; range from known height; re-find a stored landmark image chip.","method":"Pinhole model with radial distortion; device attitude rotation; circular-mean heading calibration; normalized cross-correlation template search.","measuredAccuracy":"Model round trip < 1e-6°; real-world accuracy is dominated by phone compass (2–10° raw, ~0.5–1° after calibration)","limits":"Operator identifies the landmark; NCC re-acquisition assists but does not replace confirmation."},{"id":"sensors","file":"shared/navcore/sensors.ts","plain":"Reads phone orientation as camera heading/tilt/roll and counts steps with stride length (electronic pace count).","method":"W3C DeviceOrientation rotation matrix; peak/valley step detection with Weinberg stride model.","measuredAccuracy":"Synthetic gait test in PROOF.md; per-user stride calibration required","limits":"Phone magnetometers are disturbed by vehicles, weapons and steel; calibrate in place."},{"id":"filter","file":"shared/navcore/filter.ts","plain":"The navigator: one best position with an honest error ellipse, corrected by every fix, learning compass error and stride scale, rejecting observations that don't fit, never resetting itself without an operator.","method":"4-state EKF [E, N, heading bias, stride scale]; Joseph-form update; chi-square 99% innovation gate; divergence watch; time-ordered event-log replay (late fixes land at their true time).","measuredAccuracy":"Monte Carlo position error and NEES consistency in PROOF.md","limits":"2-D (no altitude state); local frame valid ~100 km from session origin."},{"id":"guidance","file":"shared/navcore/guidance.ts","plain":"Course correction: which leg, how far left/right of the line, the heading to steer now (true and magnetic), distance to go, and whether the uncertainty is too big to trust the cue.","method":"Leg geometry in local frame; covariance projected across track; LOS intercept steering; corridor probability.","measuredAccuracy":"Closed-loop simulated patrol results in PROOF.md","limits":"Steering cue assumes the operator follows the commanded heading."},{"id":"planner","file":"shared/navcore/planner.ts","plain":"Tells you which fix to take next — control-point pairs, Polaris, best three stars, Sun compass check — with predicted accuracy.","method":"Geometry covariance prediction; sky visibility from the almanac.","measuredAccuracy":"Uses the same math as resection/sight reduction","limits":"Line of sight to control points is not checked against terrain."},{"id":"selftest","file":"shared/navcore/selftest.ts","plain":"Built-in check the navigator runs on itself (offline) against Naval Observatory values and known-answer geometry.","method":"38 embedded USNO almanac values + closed-form checks.","measuredAccuracy":"Reported per check with threshold","limits":"Self-test proves the math, not the sensors in your hand — field validation records do that."}],"endpoints":["GET /api/navcore/contract","GET /api/navcore/health","GET /api/navcore/selftest","GET /api/navcore/almanac","POST /api/navcore/sight/reduce","POST /api/navcore/celestial/fix","POST /api/navcore/polaris","POST /api/navcore/camera/sight","POST /api/navcore/camera/range","POST /api/navcore/heading-calibration","POST /api/navcore/resection","GET /api/navcore/control-points","POST /api/navcore/control-points","GET /api/navcore/plan","POST /api/navcore/sessions","GET /api/navcore/sessions","GET /api/navcore/sessions/:id","POST /api/navcore/sessions/:id/events","GET /api/navcore/sessions/:id/log","PUT /api/navcore/sessions/:id/route","POST /api/navcore/sessions/:id/accept","GET /api/navcore/sessions/:id/export","POST /api/navcore/sessions/import"],"evidenceClasses":{"OBSERVED":"An operator or device measurement reduced by deterministic Nav Core math.","MODELED":"No measurement yet — estimate is dead reckoning only.","SYNTHETIC":"Demo data. Never produced by Nav Core; refused at the fusion boundary."},"supportedBodies":["Sun","Alpheratz","Ankaa","Schedar","Diphda","Achernar","Hamal","Polaris","Acamar","Menkar","Mirfak","Aldebaran","Rigel","Capella","Bellatrix","Elnath","Alnilam","Betelgeuse","Canopus","Sirius","Adhara","Procyon","Pollux","Avior","Suhail","Miaplacidus","Alphard","Regulus","Dubhe","Denebola","Gienah","Acrux","Gacrux","Alioth","Spica","Alkaid","Hadar","Menkent","Arcturus","Rigil Kentaurus","Zubenelgenubi","Kochab","Alphecca","Antares","Atria","Sabik","Shaula","Rasalhague","Eltanin","Kaus Australis","Vega","Nunki","Altair","Peacock","Deneb","Enif","Al Na'ir","Fomalhaut","Markab"],"persistence":"DATABASE","persistenceError":null}