C-mirroring WLS + PPS timing simulation ======================================== epochs: 900 raw WLS bias/c range: -5.888015 .. 0.673753 ms derived GPS reference RMS error: 60.522 ns capture-to-commit delay mean/p99: 21.600 / 31.529 ms first HOW used as receive-now, median phase error: -229.876 ms first HOW + 160 ms + 68.802 ms, median phase error: -1.074 ms 4 satellites: position RMS=103.877 m, timing RMS=144.920 ns 5 satellites: position RMS=20.194 m, timing RMS=45.603 ns 7 satellites / drop-reacquisition: position RMS=14.626 m, timing RMS=36.888 ns timestamped PI: tail phase RMS=274.599 ns, |phase| p95=409.200 ns, PPS RMS=815.734 ns, rejected stale commits=0 timestamped, PI disabled: tail phase RMS=233591.232 ns, |phase| p95=302909.699 ns, PPS RMS=181359.923 ns, rejected stale commits=0 untagged APB-now PI: tail phase RMS=18651473.186 ns, |phase| p95=19146158.593 ns, PPS RMS=18060541.154 ns, rejected stale commits=0 Interpretation: - bias/c is millisecond-scale because it contains the 68.802 ms synthetic datum and the minimum satellite path. - epoch-aligned TOW (first delivery: HOW + 160 ms) + STARTOFFSET - bias/c reconstructs GPS time at the paired timestamp. - treating that old reference as valid at APB arrival converts software latency into PPS phase error. - timestamping removes that phase misassociation; control application delay remains only as loop delay. - baremetal applies the fixed 160 ms readout correction once; the PPS peripheral must not add it again.