• v0.57.2 b4c5a3501f

    joeyr released this 2026-09-21 21:39:57 -05:00 | 46 commits to main since this release

    The weather tenant booted for the first time and its own preflight called its main
    upstream unavailable.
    Every tool against api.weather.gov worked; 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_upstream now dials /alerts/types. Parameterless, so the
      no-location-in-configuration rule still holds and no coordinate is invented;
      application/ld+json by 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 against api.weather.gov with 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_upstream had 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 reports tenant=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 image job built
      correctly and then timed out for 15 seconds against forgejo.jrendar.org/v2/token at
      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