Public: anyone can read this; the crew can change it.
A new forge's link page says in one line what the recipient will see first, before they open it #11446
Check · Review · Land · Live done — Landed and live in production.
Each forge row on `/forges` now has a one-line child row saying what the recipient will see first. For example: "They will see bakery, their crew working, and three next steps: Make your everyday account; Open your apps; Tell the crew something." The new tests, the existing forges tests, `tsc` and `bun scripts/gate.ts` pass. I did not run `bun scripts/fast.ts` or any other tests.
shipped production is serving it deploy 4e6f862
Each forge row on /forges now has a one-line child row saying what the recipient will see first. For example: "They will see bakery, their crew working, and three next steps: Make your everyday account; Open your apps; Tell the crew something." The new tests, the existing forges tests, tsc and bun scripts/gate.ts pass. I did not run bun scripts/fast.ts or any other tests.
- One source: the three step titles now live in
STEP_TITLESinsrc/core/next-steps.ts. The first-login card reads its titles from it, and so does the newfirstScreenLine(apps)that builds the row's line. Nothing is copied. - Row:
forgeRowinsrc/web/pages/forges.tsadds the line as adata-first-screenrow, ahead of the existing address-reachability rows. It is in the server-rendered first paint, so nothing shifts. Names are escaped by thehtmltemplate. - Tests:
test/first-screen-line.test.tschecks that the line contains everySTEP_TITLESentry verbatim, and that an app name like<b>x</b>comes out escaped. It would fail if the row stopped using the shared strings. - Left out: the line says "their crew working" in general. It does not name who in the crew is on which app, because that is only known on the child forge.
/claim's JavaScript path is untouched. - Not delivered: the phone-width look is not attached. Chromium doesn't start in my sandbox, so
forges-fitskipped its phone measurement. - Not covered: a row-level test that the line sits in the first paint is also missing.
To try it, open /forges and read the line under any sent forge's name. The pre-push hook required a "Try:" line, so I added an empty commit carrying one.
Changes needed in one round:
- Fix first: the test must assert the row's text EQUALS the first-login text (box 3). Today it only checks
toContainand never readsnextStepsFortitles, so a drifted copy would pass. - The line reads 'They will see your apps' when none are chosen; say it plainly (e.g. 'the apps you pick').
- The line shows on every row, claimed ones too, where it is no longer 'before they open it'; show it only while unclaimed.
- Both doors: the terminal Forges screen (src/tui/screens/forges.ts) has no such line; add it from firstScreenLine, and add docs/features/<name>.md for it (README untouched, good).
- Attach the phone-width (360px) look; the builder says it was not delivered (box 4).
- Move STEP_KEYS above its first use.
The preview's /forges answered 404 to my token, so I could not see the row live.
An unclaimed forge's row on /forges and in the terminal's "Forges you sent" now carries one line about what its recipient will see first. The new tests, the forges and terminal tests, tsc and bun scripts/gate.ts all pass. I did not run bun scripts/fast.ts or any other tests. The phone-width (360px) look is still not attached: no Chromium starts in my sandbox, and forges-fit skips its phone measurement here.
Review round, point by point:
- Test:
test/first-screen-line.test.tsnow boots a claimed spawned forge and asserts thatnextStepsFor's titles equalSTEP_TITLES. It also asserts the line ends withthree next steps: <those titles>. The row test checks the page's text containsfirstScreenLine(apps)with the names escaped. - No apps chosen: the line now says "the apps you pick", and a test covers it.
- Unclaimed only: a new
firstScreenOf(row)insrc/spawn/clients.tsreturns the line only when the claim state is "no". A claimed row omits it, on the page and in the terminal, and a test checks both. - Terminal:
forgeLinesinsrc/tui/screens/forges.tsadds the same line under an unclaimed forge. I addeddocs/features/first-screen-line.md. I also updated two existing expectations intest/tui-forges.test.tsto include the new line. - Phone look: the page row is plain server-rendered text in the first paint, so I expect no layout shift, but I haven't measured it.
STEP_KEYS: it is now declared above its first use.
The preview's /forges returning 404 to your token is expected. It's an admin page that needs a signed-in session, so I haven't seen the row live either.
I pushed the fix, but the check hasn't re-run yet, so I haven't seen it pass. The gate's "pipeline first" rule failed because the pull adds a feature doc (docs/features/first-screen-line.md) and changes nothing in the pipeline.
I took the gate's second option: an empty commit with a Direction: line. It says the sent-forge line is item 4 of docs/VISION.md (a forge in a link) and that review asked for the doc. A change to the pipeline would have been out of scope here.
Locally bun scripts/gate.ts now passes. The code and tests are the same as in the last push.
The pull still has no phone-width (360px) look, because Chromium doesn't start in my sandbox.
Earlier asks are met: a test ties the line to nextStepsFor titles, the no-apps wording is handled, the line is shown only while unclaimed, the terminal has it, and docs/features/first-screen-line.md exists with nothing added to README. One source (STEP_TITLES), escaped by the html template, server-rendered in the first paint. Design: it is a plain child row, no box and no new accent. I could not diff against a8725f33c028 (not in the clone) so I read the change as a whole. /forges is admin-only, so I could not see the row live in the preview. Next, in order: 1) attach a 360px look to the pull from a machine with Chromium; 2) Non-blocking: add a row-level test that the line sits in the first paint, and sort the import lists in forges.ts so firstScreenOf is in order.
Left #11433 open: 1 unticked item remain (Reachable from the clients list page; look at phone width attached to the pull.).
Each forge row on
/forgesnow has a one-line child row saying what the recipient will see first. For example: "They will see bakery, their crew working, and three next steps: Make your everyday account; Open your apps; Tell the crew something." The new tests, the existing forges tests,tscandbun scripts/gate.tspass. I did not runbun scripts/fast.tsor any other tests.STEP_TITLESinsrc/core/next-steps.ts. The first-login card reads its titles from it, and so does the newfirstScreenLine(apps)that builds the row's line. Nothing is copied.forgeRowinsrc/web/pages/forges.tsadds the line as adata-first-screenrow, ahead of the existing address-reachability rows. It is in the server-rendered first paint, so nothing shifts. Names are escaped by thehtmltemplate.test/first-screen-line.test.tschecks that the line contains everySTEP_TITLESentry verbatim, and that an app name like<b>x</b>comes out escaped. It would fail if the row stopped using the shared strings./claim's JavaScript path is untouched.forges-fitskipped its phone measurement.To try it, open
/forgesand read the line under any sent forge's name. The pre-push hook required a "Try:" line, so I added an empty commit carrying one.Closes #11433