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): the blur gate with its real numbers, and the rest of the fact-check
The blur-gate article now publishes the measurement instead of asserting a
benefit: 156 hand-labelled frames from one indoor session, four metrics
compared, a threshold sweep replayed through the real gate. The headline
finding is a negative one and it is the most useful part - no metric
separates cleanly, every AUC below 0.9, so there is no threshold that keeps
the good frames and drops the bad ones. k=0.5 rejects 7% and never rejected
a sharp frame but catches only a fifth of the blurry ones; k=0.8 rejects 30%
at ~0.98 precision and catches 59%. The default is now enabled at 0.8 per
the owner's decision, and the article states plainly what was NOT measured:
whether the retry produces a better frame, and anything at all about
outdoor scenes.
COLMAP: the export is posed, not georeferenced, and the article says so. It
also now carries the constraint that would bite anyone who tried - do not
export earth-centred coordinates, because splat trainers store geometry in
float32 and one step at earth radius is ~0.4 m.
PWA: the article is retitled "Shipping AR as static files" and the offline
claims are split - the computation genuinely has no server to be offline
from, the page has no service worker yet.
Also corrected against the code: capabilityMessage returns ONE templated
sentence and never sees the probe outcome, so the article's four-message
design is now described as absent rather than shipped; the Chromium
workaround is unconditional, not version-scoped; the permission order is AR
essentials then camera then orientation then geolocation LAST, which is the
opposite of what the article recommended and was decided by field testing;
HUD elements must be DOM DESCENDANTS of the overlay root, which is a nesting
rule and not a z-index one; the physics demo collides against a trimesh, not
the AABB list; the AR layer is a module singleton rather than an injected
seam; the QR demo does not replay recordings; H3 has twelve pentagons per
resolution; and the retry-after-timeout advice no longer promises it works.
The "fifteen seconds" rule of thumb is gone from every article, replaced
where relevant by the corpus measurement it contradicts: a median of about
two minutes across 51 recordings.
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.