carlos / platform Public

Merge branch 'release-notes-v0.22.0' into main

Merge branch 'release-notes-v0.22.0': README: operator note for v0.22.0
claude-code agent, operated by bill@keymail.dev 2158949f7597b65bbd4ddc4be541eb9b20ded78e parent 1786da9parent 7f4f395
1 file changed, +52 −0
  • README.md +52 −0

CI passed — run details

diff --git a/README.md b/README.md
index faa6765c0..c01f67ea8 100644
--- a/README.md
+++ b/README.md
@@ -313,6 +313,58 @@ route's host rather than the whole app.
deployment's policy before this rolls there, since a narrower grant is
exactly what would trip it.
+### Availability, and why the edge had no answer (2026-09-24)
+
+This release moves every 502, 503 and 504 the edge sees from the Errors
+tab to a new Availability tab, grouped by cause (errors spec
+`2026-09-07-errors-and-analytics-design.md` §11), and adds replica
+placements (#409).
+
+- roll the boxes and the console together. the boxes record causes and the
+ console shows them. the console alone gives the Availability tab, and
+ 502s already stored regroup there under "cause not recorded"; until the
+ boxes roll, new 502s land there too. boxes alone, with an old console,
+ file new records the old console lists on Errors, one row per cause,
+ named like "502 · the instance refused the connection".
+- rolling the console back is safe. nothing in the bucket is rewritten;
+ the regrouping happens on read.
+- the Errors tab and `carlos errors` show fewer rows. edge 502/503/504 and
+ every platform-stream line (failed wakes, exits, sidecar restarts) are
+ on Availability now. anyone watching Errors for wake failures should
+ watch Availability instead.
+- a request whose visitor gives up after waiting five seconds or more,
+ before the instance has sent response headers, is now filed as an
+ outage, as "the visitor gave up waiting for the instance". the five
+ seconds count from when the edge received the request, so on a
+ hibernating route they include the wake. an endpoint that holds its
+ response headers longer than that by design, like a long poll, will
+ show a standing row for it. that row is expected; it is not a
+ regression. a slow export that sends its headers straight away does
+ not.
+- a visitor who leaves within five seconds is no longer filed at all.
+ previously those were filed as a 502 on whatever path they were
+ loading, so expect fewer single-count 502s on static assets.
+- on a route this box proxies over a tunnel or to a fleet, the front box
+ now files only its own hop failures. the box serving the app files the
+ rest, so a tunnelled 500 is filed once, not twice. two edges follow from
+ that: a visitor who leaves after five seconds can be filed as
+ "gave up waiting" on both boxes, and a far agent whose status store
+ failed to open files nothing, which the front box no longer covers.
+- a new CLI against a console that has not been updated:
+ - `carlos availability` fails with `not found: check --account and
+ --app, and that your token's address is a member`. until the
+ console rolls, that message means the console predates the
+ command, not that the app or your membership is missing.
+ - `carlos instances create --role replica` is silently ignored by an
+ old console, which creates an ordinary home instance in that region
+ instead. update the console before creating a replica.
+- replica placements add two registry columns (`routes.replicas`,
+ `routes.replica`) on each box's start, by an idempotent `ALTER TABLE`.
+ there is no migration to run, and a box rolled back keeps two unused
+ columns harmlessly. do not create a replica until every box is on this
+ release: only this release's DNS steering leaves replicas out of
+ latency routing.
+
## App config & secrets
Per-app config lives in the deployment bucket