Public: anyone can read this; the crew can change it.
The /forges and /forges/new pages speak the home page's language, with looks before and after #9703
Check · Review · Land · Live done — Landed and live in production.
This brings `/forges` and `/forges/new` closer to the home page's language. The "looks at 1440 and 390, light and dark, before and after" are **not** on this pull, because there is no Chromium in my sandbox to capture them. `test/forges-fit.test.ts` skipped its phone measurement for the same reason, and the forge's check will run it. The looks need a capture from a person or the preview.
shipped production is serving it deploy 7bd4f86
This brings /forges and /forges/new closer to the home page's language. The "looks at 1440 and 390, light and dark, before and after" are not on this pull, because there is no Chromium in my sandbox to capture them. test/forges-fit.test.ts skipped its phone measurement for the same reason, and the forge's check will run it. The looks need a capture from a person or the preview.
The client list, forge form and related tests (44 files, 280 pass, 6 skip, 0 fail), bun x tsc --noEmit and bun scripts/design-lint.ts are all green. I did not run bun scripts/gate.ts.
What changed
/forges(src/web/pages/forges.ts)
- The side-by-side table and the row list no longer sit in boxed cards; they are plain sections and rows. - The sub-line now reads "Each forge you sent: who it is for and what runs there." - Each row's line starts with "for whom" and the apps. The awake/asleep, size, spend, sent and activity details follow it unchanged, and every action is still there (fresh link, Stop, Remove).
/forges/new(src/web/pages/new-forge.ts)
- The subtitle and the "For whom" hint are shorter and plainer. - Name, For whom, What it is for, Apps and Fresh app stay in view. - Everything else is behind a "More options" disclosure: follow mode, crew, keep access, model key, API base URL, budget, template and size. They all still submit with the form. - If a field in that group has an error, the disclosure opens by itself. - The steps and the fields are unchanged.
What I left out
- Looks: no before/after images (see above).
- Row details: I did not fold the extra facts behind a disclosure on the list rows. The existing tests expect them in the row, and I kept them.
To try it: sign in as admin and open /forges and /forges/new on the preview.
🤖 Generated with Claude Code
The gate failed because no commit message had a "Try:" line. I added an empty commit that has one and pushed it. bun scripts/gate.ts now passes here. I did not re-run the tests or the type check, because this commit changes no code.
The line reads: "Try: sign in as admin on the preview and open /forges, then /forges/new and expand More options".
The looks at 1440 and 390, light and dark, before and after, are still not on the pull. There is no Chromium in my sandbox to capture them, so they need a person or the preview.
What changed, for the pull description
/forges: the table and the rows are no longer in boxed cards. Each row's line starts with who it is for and what runs there. The rest of the row's detail follows it, and every action is still there./forges/new: the subtitle and hints are shorter. The rarer fields sit behind "More options" and still submit with the form. The group opens by itself if one of them has an error.
The failing test, "a site admin reads it; everyone else gets 404" in test/flows-all.test.ts, was already broken on main (b710749a) and my forges changes don't touch it. I fixed the test and pushed.
The test fixed "now" at 2026-11-08 12:00Z, but /admin/flows judges staleness against the real clock. Once the real time passed 13:00 that day, every seeded upstream looked stale and the page listed all 300 repos instead of one. I changed the test to use Date.now(). test/flows-all.test.ts now passes: 8 pass, 0 fail. I did not re-run the rest of the suite.
This edits the test, not the page, because the test was wrong. The pull description should say so.
I merged main into the branch and pushed.
The only conflict was in test/flows-all.test.ts. main had already made the same fix I'd made there: the test now takes its time from the real clock, with a comment saying why. I kept main's version, so my change to that file no longer shows in the pull.
Checks after the merge:
- Tests:
test/flows-all.test.ts,test/client-list.test.tsandtest/forges-side-by-side.test.tspass (27 pass, 0 fail). I did not run the full suite. - Type check:
bun x tsc --noEmitprinted nothing. - Gate:
bun scripts/gate.tsprinted nothing.
The pull still changes only the two forges pages. /forges loses its boxed cards and each row now starts with who it is for and what runs there. /forges/new puts its rarer fields behind "More options". The before-and-after looks are still not on the pull because my sandbox has no Chromium.
Two things to fix in this round.
- First: the looks at 1440 and 390, light and dark, before and after, are not on the pull (box 3). The builder had no Chromium, so a person or the preview must supply them, and the pull cannot land without them.
- The new behaviour has no test. The 'More options' disclosure and its open-on-error rule are untested, and so is the new order of the row meta line. Add a test that fails without them: a bad value in a hidden field renders
<details ... open>, while a name-only error leaves it closed. Add one that checks the hidden fields still sit inside the form so they submit.
Design: the removal of the boxed cards matches principles 6 and 7, and the shorter sub-lines match 1 and 8. Principle 1 is still broken on /forges/new: the page keeps the hosting-terms paragraph, then a 'Never copied: ...' paragraph, and each field has its own hint, so it explains itself several times. Cut the hosting-terms paragraph to one sentence, or move it behind the disclosure. Principle 3 is broken in the new markup: the <details> holds a div.stack with a fixed 12px gap, and the rows are stacked flush. Use the page's field spacing.
No docs/features page covers /forges/new or /forges. If the form changed shape, update docs/features/forges-side-by-side.md or add a how-to, and mention that the terminal form is unchanged. The pull message says nothing about the terminal door.
I've addressed everything in juniper's review except the looks, and pushed. The 1440/390 before-and-after looks in light and dark are still not on the pull, and the pull cannot land without them. This sandbox has no Chromium, and nothing I can run here can take a screenshot. A person or the preview has to supply them.
test/new-forge.test.ts, test/client-list.test.ts, test/forges-side-by-side.test.ts and test/spawn-anon.test.ts pass, apart from the client-list test I had to fix after adding the order check (it passes now). bun scripts/gate.ts printed nothing, and tsc --noEmit and design-lint printed no errors. I did not run the full suite.
- Tests for the new behaviour:
- A fresh /forges/new has "More options" closed, with the rarer fields inside the form so they still submit.
- A bad budget opens it.
- An error on the name alone leaves it closed.
- The client-list test now pins the row order: who it is for, then the apps, then the state, with no card around the row.
- A bug the new tests exposed: the old open-on-error rule also opened "More options" for errors on fields that are always visible (apps, fresh app, for whom, direction). It now opens only for the fields inside it.
- One voice on
/forges/new: the hosting-terms paragraph is down to one sentence. The "Never copied" note moved inside "More options". The existing test only checks that the page contains it, and it still does. - Spacing: I removed the fixed 12px
div.stackinside the disclosure, so the fields use the page's normal field spacing. - Docs: I added a section to
docs/features/forges-side-by-side.mdsaying the pages changed shape and no field or action was removed. It also says the terminal's forge form is unchanged. I did not change the terminal code. - Untested: I could not look at the spacing between the "More options" summary and the first field. The summary's own padding should cover it.
Try: sign in as admin on the preview, open /forges/new, enter a name and a budget of x, and press "See the plan"; "More options" opens on its own.
🤖 Generated with Claude Code
Earlier asks are met: both pages drop the boxed cards, each row now leads with who it is for and the apps, the rarer fields sit in a closed More options inside the form, so they still submit, and the disclosure opens only for errors in those fields. Tests pin the order, the closed state, the open-on-error rule and the name-only case. The how-to went in docs/features/forges-side-by-side.md, not README. /forges/new answers 200 on the preview. Next: (1) Non-blocking: have a person capture the 1440 and 390 looks, light and dark, before and after, onto the pull. This is the one box left open. (2) Non-blocking: say in the pull description that the two sentences on /forges/new that were cut (hosting terms, For whom hint) still carry the same facts.
Left #9647 open: 1 unticked item remain (Looks at 1440 and 390, light and dark, before and after, are on the pull.).
This brings
/forgesand/forges/newcloser to the home page's language. The "looks at 1440 and 390, light and dark, before and after" are not on this pull, because there is no Chromium in my sandbox to capture them.test/forges-fit.test.tsskipped its phone measurement for the same reason, and the forge's check will run it. The looks need a capture from a person or the preview.The client list, forge form and related tests (44 files, 280 pass, 6 skip, 0 fail),
bun x tsc --noEmitandbun scripts/design-lint.tsare all green. I did not runbun scripts/gate.ts.What changed
/forges(src/web/pages/forges.ts)- The side-by-side table and the row list no longer sit in boxed cards; they are plain sections and rows. - The sub-line now reads "Each forge you sent: who it is for and what runs there." - Each row's line starts with "for whom" and the apps. The awake/asleep, size, spend, sent and activity details follow it unchanged, and every action is still there (fresh link, Stop, Remove).
/forges/new(src/web/pages/new-forge.ts)- The subtitle and the "For whom" hint are shorter and plainer. - Name, For whom, What it is for, Apps and Fresh app stay in view. - Everything else is behind a "More options" disclosure: follow mode, crew, keep access, model key, API base URL, budget, template and size. They all still submit with the form. - If a field in that group has an error, the disclosure opens by itself. - The steps and the fields are unchanged.
What I left out
To try it: sign in as admin and open
/forgesand/forges/newon the preview.🤖 Generated with Claude Code
Closes #9647