• v0.57.3 d0d6b492cf

    joeyr released this 2026-09-21 21:59:51 -05:00 | 45 commits to main since this release

    The weather tenant is deployed. weather.mcp.jrendar.org has its own Forgejo OAuth
    application, its own stack service with its own NFS export, its own certificate and its own
    NPM proxy host, and it answered a real get_forecast_grid call the evening it went up:
    /points/<coord> followed by /gridpoints/OKX/42,40, 167 KB of grid, with the coordinate
    redacted in the log exactly as designed
    . Tenant #7 in the code, the fifth deployed. It was
    parked beside subscriptions for one release rather than for thirty-six.

    The one code-adjacent change is a line that should have been there from 0.57.0.
    weather.conf said NPM's access log was "the one place a coordinate could still land;
    leave it off for this host" — and nothing implemented it. NPM has no per-host access-log
    switch in its UI and no conf in deploy/nginx/ carried an access_log directive, so the
    instruction was an intention for as long as it existed. Found while writing the standup
    steps, which is an argument for writing them down.

    Added

    • access_log off; in deploy/nginx/weather.conf, and deliberately nowhere else. On
      the other four hostnames the request names a folder or a course and the response is the
      private half, so their logs are worth having. Here every tool takes a latitude and a
      longitude: the request is the sensitive half and the response is public data. The tenant
      redacts its own URLs before they reach its log; nginx would have written the unredacted
      one, which made NPM the only remaining place a coordinate could land.

    Changed

    • docs/operations.md's standup list is now six and carries two steps it was missing.
      Issue the certificate before pasting the Advanced block — HTTP-01 fetches
      /.well-known/acme-challenge/<token> and every conf here has a location /.well-known/
      ending in deny all; longest-prefix matching should save it, but that depends on the NPM
      version and a failed issuance is rate-limited. The same applies at renewal, now with the
      allowlist in place. And access_log off belongs in the conf when the request is the
      sensitive half
      , per above.
    • deploy/README.md: six files, five deployed, and why weather.conf is the only one
      carrying access_log off. CLAUDE.md's status block: five tenants, with weather
      moved out of the paragraph that files it alongside subscriptions.
      docs/weather-plan.md's deployment item is closed, which is what was blocking W2.

    Notes

    • The live pass has started and has already earned its budget twice, in the first
      minutes rather than the first week. 0.57.2 was the boot check probing an HTML landing
      page; this release is the access-log line. Neither was reachable from a green suite, which
      is the entire argument for the A8 step that CLAUDE.md requires of every tenant.
    • What the deployment did not need. No DNS change, no secret, no credential rotation and
      nothing on a provider's side — every upstream here is a public read endpoint. The whole
      job was the identity layer in front, which is what makes subscriptions' remaining
      absence a decision rather than an obstacle.
    Downloads