Public: anyone can read this; the crew can change it.
The home's archived list names its Server-Timing phases: session, each read, render #3546
Check · Review · Land · Live done — Landed and live in production.
`GET /home/archived/:op` (`homeArchived` in `src/web/studio/home_archive.ts`) now sends a Server-Timing header with the phases `session`, `op` and `render`, using `notePhase`/`timePhase` the same way `src/web/pages/milestones.ts` does.
shipped production is serving it deploy fb6f20c
GET /home/archived/:op (homeArchived in src/web/studio/home_archive.ts) now sends a Server-Timing header with the phases session, op and render, using notePhase/timePhase the same way src/web/pages/milestones.ts does.
sessionis the time the server already recorded, read withtakeSessionTime. As on the milestones page, it is noted after the sign-in check, so a signed-out request redirects without phases.opwrapsgetFleetOp, the page's only data read. The call order and the not-found path are the same as before.rendertimes building the body and callingpage(...).
The handler now keeps the signed-in user in a local variable so the wrapped read can use it after the sign-in check; the value is the same as before. The body, status codes and caching are unchanged, and the header uses only times the handler already measures.
test/home-archived-timing.test.ts archives one app as an admin and fetches the receipt page. It checks the status is 200, the <h1>Archived</h1> heading, and that app, session, op and render each appear as name;dur=N.N. It checks names only, never a wall-clock time. It fails with the handler change removed and passes with it; test/home-archive.test.ts still passes and tsc --noEmit is clean. No other page was touched.
To try it, archive an app from the home as an admin and look at the Server-Timing header on the page you are redirected to.
🤖 Generated with Claude Code
Matches the milestones pattern (notePhase/takeSessionTime/timePhase). Session is noted after the sign-in check, op wraps the only read, render covers body and page(). Behaviour, status codes and the 404 path are unchanged, no markup or design-system surface touched, and the test checks phase names only, never a wall-clock time. The preview receipt page needs a signed-in session, so I did not exercise it by curl. Two things next: (1) the test header cites #3528 but the pull is #3546; (2) add the same phases to the undo POST redirect path only if it renders, otherwise leave it.
GET /home/archived/:op(homeArchivedinsrc/web/studio/home_archive.ts) now sends a Server-Timing header with the phasessession,opandrender, usingnotePhase/timePhasethe same waysrc/web/pages/milestones.tsdoes.sessionis the time the server already recorded, read withtakeSessionTime. As on the milestones page, it is noted after the sign-in check, so a signed-out request redirects without phases.opwrapsgetFleetOp, the page's only data read. The call order and the not-found path are the same as before.rendertimes building the body and callingpage(...).The handler now keeps the signed-in user in a local variable so the wrapped read can use it after the sign-in check; the value is the same as before. The body, status codes and caching are unchanged, and the header uses only times the handler already measures.
test/home-archived-timing.test.tsarchives one app as an admin and fetches the receipt page. It checks the status is 200, the<h1>Archived</h1>heading, and thatapp,session,opandrendereach appear asname;dur=N.N. It checks names only, never a wall-clock time. It fails with the handler change removed and passes with it;test/home-archive.test.tsstill passes andtsc --noEmitis clean. No other page was touched.To try it, archive an app from the home as an admin and look at the Server-Timing header on the page you are redirected to.
🤖 Generated with Claude Code
Closes #3528