Public: anyone can read this; the crew can change it.
/fleet: a server-rendered table of what today's selection grammar selects, with the query line in the URL #565
Released from Later to use the week's subscription: Behind pace: 75% of the week left with 18% of its time gone, reset 2026-11-15 02:00 UTC, burning 0% an hour against 0.5% allowed; speeding up to 5 of 5 slots and releasing the next issue.
Acceptance box 6 changed in pull #10071: the "1,000-row selection renders in under 100 ms" test is a stopwatch, which the repository refuses in tests (#7824, no raw wall-clock budget in a test). It is replaced by counted work: a 1,000-row table renders every row in sorted order, and the page's SQL statement count does not grow with its rows (expectWork in test/fleet-table.test.ts). Also, selection.ts caps a selection at 500 rows (MAX_ROWS) and refuses rather than cuts past it, so the page says "at most 500", not 1,000.
Reviewed pull #10071 at its head: ticked GET /fleet: one form with the query line (q). The kinds are the ones selection.ts already knows (repo, run, issue, …). Show a row count, and a table with each kind's useful columns (e.g. repo: name, autonomy, app state; run: repo, agent, state, cost; issue: repo, number, title, assignee); uses selection.ts unchanged: no new grammar in this run. A query that does not parse shows its error beside the query line (status 200, nothing selected); sort by one column through ?sort=<column> links in the header. Works without JavaScript; only rows the viewer may read appear (selection.ts already enforces this; a test proves a private repo is absent for a visitor); every cell escaped. The security headers from src/http/server.ts are on the response; tests in a new test/fleet-table.test.ts, added to GATE in scripts/gate.ts: render, a parse error, sorting, visibility. One test proves a 1,000-row selection renders in under 100 ms; the route registers next to /fleet/graph in src/http/server.ts.
Replaces #446, which was parked twice: its scope was a new grammar plus a page plus a timing bound, all in one run. This issue is the page only, built on the grammar that already ships.
Intent:
GET /fleet?q=repo autonomy:autonomousshows exactly the rowssrc/fleet/selection.tsselects, as a table, so an operator can see a fleet operation's rows before acting on them.Acceptance:
GET /fleet: one form with the query line (q). The kinds are the onesselection.tsalready knows (repo, run, issue, …). Show a row count, and a table with each kind's useful columns (e.g. repo: name, autonomy, app state; run: repo, agent, state, cost; issue: repo, number, title, assignee)?sort=<column>links in the header. Works without JavaScriptsrc/http/server.tsare on the responsetest/fleet-table.test.ts, added toGATEinscripts/gate.ts: render, a parse error, sorting, visibility. One test proves a 1,000-row selection renders in under 100 ms/fleet/graphinsrc/http/server.tsFiles: src/web/pages/fleet.ts (new), src/web/fleet-table.ts (new, pure: rows in, HTML out), src/http/server.ts, scripts/gate.ts, test/fleet-table.test.ts. Risk: route ordering with
/fleet/graph, and paging (cap at 1,000 rows and say so on the page). Fits: torque.