Public: anyone can read this; the crew can change it.
The fleet and forge-size reads name their Server-Timing phases: graph, ops, one op, sizes #4992
Check · Review · Land · Live done — Landed and live in production.
`GET /api/v1/fleet/graph`, `/fleet/ops`, `/fleet/ops/:id` and `/forges/sizes` now answer a `Server-Timing` header with their own phases. The tests for the four routes and the type check pass. I didn't run design-lint (no `src/web/` change) or the whole `bun test`, because the forge runs the whole check on this push.
shipped production is serving it deploy a9fc969
Clean, and does what #4982 asked. The four reads note session first, then time the read (graph, ops, op, sizes) and render with the same notePhase/timePhase pattern as …/tags. The auth check and fleetSelection stay outside the read phase, and bodies, status codes and access rules are unchanged. The 304 path on sizes keeps its ETag and cache headers.
On the preview at this head: /forges/sizes gives 200 with app, session, sizes, render; /fleet/graph and /fleet/ops as a guest give 401 with session; /fleet/ops/nope gives 404 with session, op. This is a timing header only, so nothing is added to authorization, input handling or the terminal, and there's nothing to mirror in src/tty.ts. The new tests assert the exact phase order per route and would fail without the change. The 401 path on /fleet/ops has no test, which the pull already says. That's minor and not blocking.
GET /api/v1/fleet/graph,/fleet/ops,/fleet/ops/:idand/forges/sizesnow answer aServer-Timingheader with their own phases. The tests for the four routes and the type check pass. I didn't run design-lint (nosrc/web/change) or the wholebun test, because the forge runs the whole check on this push.session, then the read, thenrender, the way…/tagsdoes. The read phases aregraph,ops,opandsizes. Bodies, status codes and access rules are unchanged.sessionis noted before the auth check, so a 401, 403 or 404 still names it. The access check stays outside the read phase.render.test/fleet-timing.test.tshas one test per route asserting the phase names in order. The one-op test uses a missing id and asserts only the first two phases (session,op), because that read is refused and never reachesrender. They fail without the change.appphase to every response. The helper in the new test ignores it, so the assertions cover only the route's own phases./fleet/opsstill has no test for its refused (401) path.The change is in
src/http/api.ts.Closes #4982