-
released this
2026-09-21 21:39:57 -05:00 | 46 commits to main since this releaseThe weather tenant booted for the first time and its own preflight called its main
upstream unavailable. Every tool againstapi.weather.govworked; the check was probing
the wrong URL.https://api.weather.gov/is not an API endpoint — it serves a
9,495-byte HTML landing page, measured identically from inside the container and from
a workstation — so the probe fell into this tenant's own non-JSON guard, which is the
captive-portal rule the tenant exists to enforce. The guard was right. The URL was wrong,
and so was the docstring that justified it, which asserted the root "answers a small JSON
status document".This is the A8-class defect the plan budgeted for, and it arrived in the first minute.
Not a request that fails and reports success this time, but its mirror: one that succeeds
and reports failure. A green suite could not have caught it, because the only thing that
knows what a URL returns is the URL.Fixed
WeatherClient.check_upstreamnow dials/alerts/types. Parameterless, so the
no-location-in-configuration rule still holds and no coordinate is invented;
application/ld+jsonby contract; about 3.4 KB of the API's own event vocabulary. The
detail string reports the decoded count rather than a field the root never carried, so a
passing check now proves a body was parsed and not merely that a host answered. Verified
live againstapi.weather.govwith this deployment's User-Agent:
api.weather.gov reachable, 111 alert types.
Changed
- The fake serves HTML at
/, because the real API does. It answered{"status": "OK"}there, which is precisely how a boot check probing the root passed 1,728 tests and
failed on first contact with production. A fake that returns JSON where the upstream
returns HTML is not a fake; it is a second defect agreeing with the first. Three cache
and header tests that were using the root as a convenient JSON endpoint now use
/points/{lat},{lon}, which is what they were always describing. - The preflight test asserts the path and no longer the root. It previously asserted
["/"]and passed for the same reason the bug shipped.check_upstreamhad no direct
test at all; it now has one for the change-group case that matters — an HTML body must
still fail the boot check, or fixing the URL would have cost the guard that caught it.
Notes
- Deployment is underway and not finished. The stack service is running on the cluster
as of this release and reportstenant=weather version=0.57.1; the Forgejo OAuth app and
the NFS export exist. The NPM proxy host does not yet, so the hostname answers
nothing and no connector has been attached.deploy/README.md's "four deployed" and
CLAUDE.md's status block are therefore still accurate and deliberately unchanged — they
move when the hostname does. - 0.57.1's image reached the registry only on a re-run: the first
imagejob built
correctly and then timed out for 15 seconds againstforgejo.jrendar.org/v2/tokenat
docker login. Transient, same commit and credential succeeded on the re-run, and worth
recording only because a push that never happened looks exactly like a stale digest.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads