fix(blog): links, edit seams, and errors in my own corrections
Three cold reviews. The largest finding was that all thirty articles
contained three outbound links between them - none to the repo, npm or any
demo, and none to each other despite a dozen prose cross-references. A
reader convinced by an article had nowhere to go. Fixed with links to the
deployed demos, the repo, npm, and the articles that prose already pointed
at.
A re-verification pass found real errors in yesterday's corrections, which
is the more useful half:
- The convergence checkpoints are measured in OBSERVATIONS, not seconds. My
"double-digit metres at twenty seconds" was wrong: at ~40 observations,
which is roughly twenty seconds, the median is about 7 m. Corrected in the
one article whose stated point is publishing the uncomfortable number.
- The permission count. My retitle to "four dialogs" was wrong on the only
platform that runs this: the motion prompt is iOS-only and iOS does not
expose WebXR AR at all. The article no longer hard-codes a count.
- The framework DOES route the probe outcome into distinct messages; only one
helper is narrow. My correction generalised a function-scoped gap into a
framework-scoped accusation.
- The on-screen first-placement exemption applies only to anchors created
with bootstrapping skipped, not to every anchor's first placement.
- Planar PnP disambiguates by reprojection error alone - there is no temporal
tiebreak, which is why the flicker it describes can still occur.
- QR size precedence is the opposite of what I wrote: an authored size WINS
and the depth measurement is the fallback.
- A float32 step at earth radius is half a metre, not 0.4 - the 0.38 figure
is relative precision, not a step.
- The 30 fps camera-delivery figure is measured nowhere; replaced with the
distinction that actually matters (render rate is not sensor rate).
Editorial seams from the correction pass: a heading swap orphaned "the
opposite of what?", a "general lesson" section that had grown a second
lesson, a bolded claim retracted four lines below itself, an inserted
paragraph that broke the bold-led list it landed in, and two descriptions
still describing titles that had changed.
fix(blog): correct the scene-graph inversion and the removed anchor bypass
The fact-check found five articles stating things that are the inverse of
what the code does. All five share one root cause and it was ours: the
framework README described a large-jump bypass that gps-anchor.ts.md records
as REMOVED in June, and it describes the scene graph in a way three articles
then paraphrased backwards.
The scene-graph correction is the one a developer would have acted on. The
scene ROOT is GPS-aligned world space and arWorldGroup - which holds the
camera - is a group inside it carrying the alignment. So an object at the
scene root keeps its world pose perfectly and appears to float, because the
camera moves under corrections while it stands still; an object at a fixed
transform inside the group stays visually nailed down and drifts in GPS; and
createGpsAnchor lives inside the group but re-derives its local position each
tick, which is how it gets both. The articles had the first two swapped, and
described the minimal example's "floater" as the local one when it is in fact
the world-correct one.
The anchor correction replaces an invented rule with the real reason: there
is no large-correction escape hatch, because smoothing lives once on the
group's lerped matrix, so a big alignment change is already eased across the
whole view before per-anchor logic runs. A per-anchor on-screen snap did not
rescue anything - it manufactured the hard jump the shared lerp existed to
remove.
Also corrected: the median bootstrap only rejects multipath when the caller
supplies a GPS sampler, since the default derives from the object's own pose;
and the "fifteen seconds" rule of thumb no longer appears as a fact.
docs(blog): the first batch of thirty drafts
Every page is gated at `status: draft` - the site build renders only pages
marked published, and an unrecognised or missing status renders as draft.
Nothing here reaches gps.csutil.com/blog/ until a marker is flipped.
The first three (why-outdoor-webxr-drifts, gps-is-a-distribution-not-a-
position, what-you-give-up-by-not-using-a-vps) are the style probe: written
first, deliberately different in register, so an edit pass has an obvious
entry point and the corrections can propagate to the other 27.
Topics and the suggested publication order are in the private docs repo's
2026-08-20-0812-marketing-content-backlog.md. Verified against the real
renderer: 31 files in, 0 published, 31 withheld, each with a reason.