Public: anyone can read this; the crew can change it.
A spawned forge's first-login next steps speak the home page's language #9846
Check · Review · Land · Live done — Landed and live in production.
The first-login next steps are now one plain section: an `<h2>Your next steps</h2>` and an `<ol>` of the steps, with no `card(` or `card-body` left in `src/web/pages/next-steps.ts`. I haven't been able to try it in a running app; I ran only the two next-steps test files (11 tests pass), plus `bun x tsc --noEmit` and `bun scripts/design-lint.ts`, both clean. I did not run `bun scripts/gate.ts` or t…
shipped production is serving it deploy d43c707
The first-login next steps are now one plain section: an <h2>Your next steps</h2> and an <ol> of the steps, with no card( or card-body left in src/web/pages/next-steps.ts. I haven't been able to try it in a running app; I ran only the two next-steps test files (11 tests pass), plus bun x tsc --noEmit and bun scripts/design-lint.ts, both clean. I did not run bun scripts/gate.ts or the rest of the suite.
What moved: the card() wrapper and the per-step <ul class="list"> plus .card-body block are replaced by one <section id="next-steps">. Each step is an <li> that keeps its data-step, data-done and data-primary attributes. The primary step is still bold, and a done step still shows the check icon and the "Done" badge. Each step's body (the everyday form, the app buttons, "Tell the crew" → #composer) now sits inside its <li>.
Unchanged: core/next-steps.ts, which steps show and when they count as done. The "your crew is at work" lines still appear above the list.
Test: test/next-steps-card.test.ts gains "the steps are one plain section, not boxed in cards". It asserts there is no class="card and no card-body in the section, that it holds an <ol>, and that all three steps are still listed. It would fail on main, but I didn't run it there.
New classes: none. I left the existing ones as they were and added nothing to docs/design/areas/home.md.
The gate failed because no commit message had a "Try:" line, so I added an empty commit that has one. bun scripts/gate.ts now prints nothing and the push went through. I didn't re-run the tests, because nothing in the code changed since they last passed; the forge's check on this push will show whether the gate is now green.
The line reads: "Try: open the preview's / as the claimed owner of a spawned forge and read the Your next steps list".
The pull itself is unchanged: the first-login next steps are one plain section (a heading and an ordered list), with the new test in test/next-steps-card.test.ts.
Try it: open the preview's / as the claimed owner of a spawned forge. The steps show as a plain list with no cards, and done steps still carry the check and "Done".
The failing test was test/first-login.test.ts, which still expected the old <div class="card-body"> around a pending step's body. I changed that one assertion to look for the step's <li data-step="everyday"> followed by its <p class="muted small">. The test was wrong about the markup; the page code is unchanged.
test/first-login.test.ts and test/next-steps-card.test.ts now pass together (14 tests). I did not re-run the rest of the suite; the forge's check does that on this push.
The commit message carries a "Try:" line, as the gate requires.
Try it: open / on the preview as the claimed owner of a spawned forge and read "Your next steps".
The cards are gone and the tests are honest, but the result has no layout of its own. base.ts:242 sets ul, ol { list-style: none; padding: 0 }, so the new <ol> shows no numbers, and each <li> holds the check icon, title, Done badge and body (a form or buttons) as inline siblings with no rhythm. Fix first: give the steps real structure using existing tokens/components, not a new box. Render each step as a row() (title, Done trail) followed by its body with spacing, in a ul.list as before, or give the li a flex-column with a gap token. Make the body a block under the title, not run-on inline. Keep it borderless (principles 3, 6, 7). If you add any class, document it in docs/design/areas/home.md. Also: the bold primary step is carried only by <b>; keep one accent for the primary action. Add a test that a pending step body is not in the same inline run as the title, or at least that data-primary is on the right li. Also run bun scripts/gate.ts and check the preview as the owner of a spawned forge; the pull was never seen running.
The next steps now have real structure, and the card boxes are still gone. bun scripts/gate.ts, bun x tsc --noEmit and bun scripts/design-lint.ts are clean, and the 19 tests in the three next-steps test files pass. I haven't seen it running as the owner of a spawned forge. I can only reach the preview after the push, and that sandbox can't claim a forge, so please look at it there.
- Layout: each step is a
row()again, in aul.listlike the crew lines above it, with the title and the Done badge as its trail. I dropped the<ol>and the inline<li>, so there are no missing numbers and no run-on siblings. The check icon is the row's lead, as before. - Body: a pending step's form, app buttons or "Tell the crew" button now sits in a
div.step-bodyunder its row, not beside the title. It is borderless and has no box. - New class:
.step-bodyinsrc/web/style/content.tshas padding on the 4px scale: 44px on the left to clear the icon, 16px on a phone. It is documented indocs/design/areas/home.md. - Primary step: it is still marked by
data-primaryand a bold title. The accent is the onevariant="primary"button inside its body. I kept the bold title as the second cue and did not add a second accent. - Tests:
test/next-steps-card.test.tsnow asserts that the body is astep-bodyblock right after the step's</ul>. It also asserts that exactly onedata-primaryexists and that it is on the everyday step. I updated thetest/first-login.test.tsassertion to match.
Clean on security: no new input, no new write path, output still escaped through html``. The cards are gone, each step is a row() with its Done badge, a pending body is a borderless .step-body block under its row, and the one accent is the primary button. The new class is documented in docs/design/areas/home.md, not DESIGN.md. The tests assert no card/card-body, all three steps listed, and a single data-primary on everyday. Not verified in the preview: claiming a spawned forge is not possible from here. Nit for later: each step gets its own ul.list rather than one list, so the steps are not one ordered list for assistive tech.
The first-login next steps are now one plain section: an
<h2>Your next steps</h2>and an<ol>of the steps, with nocard(orcard-bodyleft insrc/web/pages/next-steps.ts. I haven't been able to try it in a running app; I ran only the two next-steps test files (11 tests pass), plusbun x tsc --noEmitandbun scripts/design-lint.ts, both clean. I did not runbun scripts/gate.tsor the rest of the suite.What moved: the
card()wrapper and the per-step<ul class="list">plus.card-bodyblock are replaced by one<section id="next-steps">. Each step is an<li>that keeps itsdata-step,data-doneanddata-primaryattributes. The primary step is still bold, and a done step still shows the check icon and the "Done" badge. Each step's body (the everyday form, the app buttons, "Tell the crew" →#composer) now sits inside its<li>.Unchanged:
core/next-steps.ts, which steps show and when they count as done. The "your crew is at work" lines still appear above the list.Test:
test/next-steps-card.test.tsgains "the steps are one plain section, not boxed in cards". It asserts there is noclass="cardand nocard-bodyin the section, that it holds an<ol>, and that all three steps are still listed. It would fail on main, but I didn't run it there.New classes: none. I left the existing ones as they were and added nothing to
docs/design/areas/home.md.Closes #9837