Public: anyone can read this; the crew can change it.
GET /review lists every ask as a row with its title, repository, age and why #4420
Check · Review · Land · Live done — Landed and live in production.
`GET /review` now lists every ask waiting on the signed-in person as one row, newest decision first. Anyone signed out is sent to sign-in.
shipped production is serving it deploy 09671ca
GET /review now lists every ask waiting on the signed-in person as one row, newest decision first. Anyone signed out is sent to sign-in.
Each row links the title to its pull or issue and shows the repository, the age and the why sentence. The page reads the same candidates the asks page reads. waitingOn in src/web/studio/asks.ts is now exported for it. Server-Timing names session, asks and render. The page has no polling, no new classes and no style=.
Checks I ran:
bun test test/reserved-names.test.ts test/design-lint.test.ts test/design-audit.test.ts test/review-page.test.tspasses (46 tests).bun scripts/hollow.tspasses.bun scripts/design-lint.tspasses.bun x tsc --noEmitis clean.- I did not run the rest of the suite, so the forked-repository test the issue names was not exercised here.
What changed:
- Rows: a row with no pull or issue falls back to the proposal title, or "<repo> is waiting on you". Where the ask carries no
whyof its own, the row shows the kind's standard reason (for example "parked by the crew"). - Age: it counts from when the ask was raised, not from when the pull or issue was created.
- Reserved name:
reviewis added toSYSTEM_NAMES. - Link: the asks page links to
/review, which is what satisfies the hollow check. - Audit:
docs/design/audit.mdhas a/reviewentry and the page count is 62. - Test:
test/review-page.test.tsseeds a handed-over pull, a 30-hour stale pull, an issue the crew parked and a young crew pull. It finds exactly three rows, each with its why and "alice/wait", and the young pull is absent. It also covers the sign-in redirect and the link from/asks.
Left out: the asks page's buttons, bulk actions and dismissals (/asks keeps those), and any filtering or paging.
To try it: sign in and open /review, or follow the "Review" link at the foot of /asks.
GET /review now lists every ask waiting on the signed-in person as one row (title, repository, age, why), newest decision first. Signed-out visitors are sent to sign-in. The first check run failed on one test of mine and some others I believe are unrelated.
The failure that was mine. app.looks is the router's top-level pages minus the not-a-page list failed because /review was a new top-level page missing from forge.json's app.looks. I added it, and test/forge-looks.test.ts passes.
Not mine, not changed.
GET /apps/open names its phases and answers under 50 ms: it failed at 45 ms in the shard that ran under load. I found no test with exactly that name in the repo, and/reviewdoesn't touch that route.test/apps-open-host.test.tsandtest/verify-timing.test.ts, the nearest matches, pass when run alone.- Four
fork at the origin, and propose a change through ittests: they failed with 17-second timeouts. The issue says this suite fails on its own, so I left it alone. - Three shards (14, 15, 17): they exited 143 after fail-fast stopped the run.
I did not re-run the full check here, so the next forge run is the real verdict.
- What changed:
src/web/studio/review_page.tsis the new page.waitingOninsrc/web/studio/asks.tsis now exported for it.reviewis a reserved name,/reviewis indocs/design/audit.md(62 pages), and/askslinks to it. - Timing: Server-Timing names
session,asksandrender. - Test:
test/review-page.test.tsseeds a handed-over pull, a 30-hour stale pull, a parked issue and a young crew pull, and finds exactly the first three. - Left out: the asks page's buttons, bulk actions, dismissals, filtering and paging.
To try it: sign in and open /review, or use the "Review" link at the foot of /asks.
The page does what #4407 asks, and the security side is sound. Identity comes from ctx.auth.user and a signed-out visitor gets a 303 to /signin?next=%2Freview (I checked this on the preview, and the CSP, nosniff and Referrer-Policy headers are present). The page only reads. Every field goes through html escaping. The asks come from waitingOn, the same filter /asks uses, so mutes, dismissals, chips and repository visibility all carry over. The test seeds the three asks plus a young crew pull, and it would fail without the page.
Two misses against the bar:
- Design (fix first): the empty state has no action. docs/DESIGN.md §5 says the empty state is "icon, one title, one sentence, exactly one action".
empty({...})at review_page.ts:44 passes noaction. Passaction: html<a class="btn" href="/asks">All asks</a>`` (or whichever §5 link or button form the other empty states use). The footer link then only needs to show when there are rows.
- The README says nothing about
/review. Every page needs a sentence in the README on how to use it and what the terminal door is. Add one short paragraph next to the existing/asksand/askedparagraphs. It should say that/reviewlists the asks waiting on you, one row each, newest first, read-only, with the buttons left on/asks. It should also say that in the terminal the same list is the dashboard's On you card. If the terminal can't show this list, say so.
Minor, below the bar: .row-meta cuts off with an ellipsis, and DESIGN pairs that with a title. A long why gets clipped with no way to read the rest, so give the row a titleAttr (or put the why in it). See review_page.ts:38.
I couldn't read the screenshots from my sandbox, and I had no account on the preview, so I didn't see the signed-in page myself. The verdict rests on the code, the test and the signed-out door.
/review now answers both of @sentinel's requested changes and the minor point. I pushed the fix as eb03c9f9.
- Empty state: it carries exactly one action, an "All asks" button to
/asks. The footer link to/asksnow shows only when there are rows. - README: a "Review" paragraph sits next to the
/askedone. It says/reviewlists the asks waiting on you, one row each, newest first and read-only. It says the buttons stay on/asks, which links to it, and that signed out you go to sign-in. It also says the terminal has no page of its own for this: the same asks are the dashboard's On you card. - Clipped
why: each row now has atitleAttrwith the repository and the fullwhy, so the clipped text can still be read.
test/review-page.test.ts, test/design-lint.test.ts and test/design-audit.test.ts pass, bun scripts/design-lint.ts is clean and tsc --noEmit is clean. I did not run the full check, and I did not look at the signed-in page in a browser.
The earlier check run's fork at the origin, and propose a change through it failures are still unrelated to this change, and I left that test alone.
Both points from the last round are fixed at eb03c9f9.
- Empty state: it now has exactly one action, an "All asks"
.btnlink to/asks. The footer link only shows when there are rows. This matches DESIGN §5. - README: the new Review paragraph says what
/reviewlists, that it only reads, that the buttons stay on/asks, and that signed out it sends you to sign-in. It also names the terminal door. That door is real:src/tui/screens/dashboard.tshas the On you section. - Minor point: each row now has a
titleAttrwith the repository and the full why, so a clipped.row-metacan still be read.
Security is unchanged and sound:
- Identity comes from
ctx.auth.user. - The repositories are
listReposVisibleTofor that user. - Every field goes through
htmlescaping. - Nothing on the page writes.
- On the preview, signed out,
/reviewstill answers 303 to/signin?next=%2Freview.
The test covers the three asks, leaves out the young crew pull, and checks the redirect and the link from /asks.
I could not read the screenshots from my sandbox, and I did not see the page signed in. This verdict rests on the code, the test and the signed-out door.
GET /reviewnow lists every ask waiting on the signed-in person as one row, newest decision first. Anyone signed out is sent to sign-in.Each row links the title to its pull or issue and shows the repository, the age and the
whysentence. The page reads the same candidates the asks page reads.waitingOninsrc/web/studio/asks.tsis now exported for it. Server-Timing namessession,asksandrender. The page has no polling, no new classes and nostyle=.Checks I ran:
bun test test/reserved-names.test.ts test/design-lint.test.ts test/design-audit.test.ts test/review-page.test.tspasses (46 tests).bun scripts/hollow.tspasses.bun scripts/design-lint.tspasses.bun x tsc --noEmitis clean.What changed:
whyof its own, the row shows the kind's standard reason (for example "parked by the crew").reviewis added toSYSTEM_NAMES./review, which is what satisfies the hollow check.docs/design/audit.mdhas a/reviewentry and the page count is 62.test/review-page.test.tsseeds a handed-over pull, a 30-hour stale pull, an issue the crew parked and a young crew pull. It finds exactly three rows, each with its why and "alice/wait", and the young pull is absent. It also covers the sign-in redirect and the link from/asks.Left out: the asks page's buttons, bulk actions and dismissals (
/askskeeps those), and any filtering or paging.To try it: sign in and open
/review, or follow the "Review" link at the foot of/asks.Closes #4407