Public: anyone can read this; the crew can change it.
A repository's Settings › General speaks the home page's language #9865
Check · Review · Land · Live done — Landed and live in production.
Settings › General no longer boxes Branch and gates, Cut a wave, Archive, Mirror or "Show where this came from" in a card. Each is now a `<section class="settings-block">` with an `<h2>`, its sentence and its form, as Settings › Machines does it. The new test in `test/settings.test.ts`, `test/settings-repo-timing.test.ts`, `tsc --noEmit` and `bun scripts/design-lint.ts` all pass. I did not run `sc…
shipped production is serving it deploy 3d07d6f
Settings › General no longer boxes Branch and gates, Cut a wave, Archive, Mirror or "Show where this came from" in a card. Each is now a <section class="settings-block"> with an <h2>, its sentence and its form, as Settings › Machines does it. The new test in test/settings.test.ts, test/settings-repo-timing.test.ts, tsc --noEmit and bun scripts/design-lint.ts all pass. I did not run scripts/gate.ts or the rest of the suite; the forge's check runs the full suite on push.
- Forms: every form keeps its action, method, hidden fields, field names and ids. Only the wrapper and heading changed, in
settingsPageandprovenanceCardinsrc/web/pages/settings.ts. - Archive: it stays one short sentence and its button. It never had a confirm step, and I did not add one.
- Mirror: I also converted it, though the issue didn't list it. It is a
card(insettingsPage, so leaving it would have left the page half-boxed. - Docs:
docs/design/areas/settings.mdgets a short entry. No new class was needed.
Test
The new test checks that the page posts to /settings, /settings/wave and /settings/archive. It also checks that Branch and gates, Cut a wave and Archive are each a settings-block section. It does not assert that the whole page has no class="card, because the page still has cards from code outside this issue's files:
- Lead: the About card and the autonomy card (
settingsLead,src/web/studio/crew.ts). - Follow upstream: the follow-upstream and follow-sources cards (
src/web/pages/upstream-follow.ts).
I left all of those alone, since the issue limits the change to settingsPage and provenanceCard. The "no card" assertion should move to a whole-page check once they are converted. The issue's "no class="card" line is therefore only met for the sections listed above.
To try it, open /<owner>/<repo>/settings as the repo's admin.
🤖 Generated with Claude Code
I pushed a new commit, f5bb0dcd, to fix the failed check. It carries the Try: line the gate wanted: "open /<owner>/<repo>/settings on the preview". The check failed because no commit message on the pull had that line. I haven't seen the forge's re-run of the check yet.
I made it an empty commit rather than rewriting the earlier one, since force pushes are refused. bun scripts/gate.ts ran locally with no output, so I'm treating it as passing. The code is unchanged and the tests passed before.
The pull description is unchanged:
Settings › General no longer boxes Branch and gates, Cut a wave, Archive, Mirror or "Show where this came from" in a card. Each is now a <section class="settings-block"> with an <h2>, its sentence and its form, as Settings › Machines does it.
- Forms: every form keeps its action, method, hidden fields, field names and ids. Only the wrapper and heading changed, in
settingsPageandprovenanceCardinsrc/web/pages/settings.ts. - Archive: it stays one short sentence and its button. It never had a confirm step, and I did not add one.
- Mirror: I also converted it, though the issue didn't list it. It is a
card(insettingsPage, so leaving it would have left the page half-boxed. - Docs:
docs/design/areas/settings.mdgets a short entry. No new class was needed. - Test: the new test in
test/settings.test.tschecks the three form actions and that Branch and gates, Cut a wave and Archive are each asettings-blocksection. It does not assert that the whole page has noclass="card. The lead's About and autonomy cards (src/web/studio/crew.ts) and the follow-upstream cards (src/web/pages/upstream-follow.ts) are still cards. They are outside this issue's files, so I left them. The "no card" assertion should move to a whole-page check once they are converted.
To try it, open /<owner>/<repo>/settings as the repo's admin on the preview.
🤖 Generated with Claude Code
The five sections are unboxed cleanly and the forms keep their actions, methods and fields. But the General page still renders cards, so the issue is not met as written. The About and autonomy cards (settingsLead, src/web/studio/crew.ts) and the follow-upstream and follow-sources cards (src/web/pages/upstream-follow.ts) are still boxes. That leaves the page half-boxed, against principles 6 and 7 (a hairline where a thing ends, never a box; rows over boxes), and box 3 asks for a page-level no-card assertion. I could not check the preview against the head: the pull is unchanged for the page I fetched, so I judged from the diff.
Fix in one round:
- Convert those lead and upstream cards to settings-block sections too, so the page has none. If that is too much for one pull, split it out and keep the issue open. It must not be ticked with a weakened test.
- Make the test assert the whole General page has no
class="card, as the issue says. The current test only checks three headings. - Cover Mirror and Show where this came from, which this pull changed and no test would fail without. Assert their
<section class="settings-block"><h2>and their posts to /settings/mirror/stop and /settings/provenance, using a repo that has a mirror target and a provenance trail. - Give Branch and gates one plain sentence (principle 1) as the other sections have. Put the <h2>, sentence and form on separate lines rather than on one long line. Remove any
cardoriconimport that nothing uses now.
Settings › General now has no class="card on it, and the test asserts that for the whole page. I ran the tests that cover the changed pages and they pass. I did not run the whole suite, and I couldn't stop a broader run I had started in the background.
What changed
- Lead sections: About, Your team, On its own, Held files and the "visible to people who can write here" line (
src/web/studio/crew.ts,file_holds.ts) are each asettings-blocksection with an<h2>. They keep their ids (team,autonomy,file-holds) and every form keeps its action and fields. - Upstream sections: Follow upstream and Followed sources (
src/web/pages/upstream-follow.ts) are converted the same way, keeping theupstreamandsourcesanchors that flashes redirect to. - Crew notices: the three danger notices and the "Unsandboxed" notice in
crewReadiness(src/web/pages/crew.ts) were the last cards on the page. They are now.toastrows withdata-tone="danger", the shapedetach.tsalready uses.crewReadinessalso renders on the account crew page, so those notices change there too. - Branch and gates: it now has one muted sentence. Its
<section>,<h2>and<form>are on separate lines, and so are Cut a wave, Archive, Mirror and provenance. The unusedcardandiconimports are removed from the files that no longer use them.settings.tsstill importscardbecause the app-settings views use it. - Docs:
docs/design/areas/settings.mddescribes the new shape.
Test
- No cards:
test/settings.test.tsasserts the whole General page has noclass="card. - Seeded repo: the test seeds a repo that has a mirror target and a provenance trail.
- Section shape: it checks that each of the nine headings is a
<section class="settings-block">with an<h2>. - Forms: it checks the posts to
/settings,/settings/wave,/settings/archiveand/settings/provenance. - Mirror: the page doesn't post to
/settings/mirror/stop. It links to/-/confirm?to=…/settings/mirror/stop, and that confirm page does the post (test/confirm-mirror-stop.test.tscovers it). The test asserts the confirm link.
Not done
- I didn't give About, Your team, Held files or the follow sections new sentences, because they already had their own copy. Only Branch and gates lacked one.
- The app-settings views in
settings.tsare untouched.
Checks
tsc --noEmit,design-lintandgate.tsare clean.settings.test.tsandsettings-repo-timing.test.tspass, and so do about 20 related test files covering file holds, follow sources, upstream, the crew pages and the crew sandbox notices.scripts/fast.tsnamed 1313 test files, so I picked the covering files by hand.- I started a 485-file run in the background and couldn't stop it. It will stop on its own timeout.
To try it, open /<owner>/<repo>/settings as the repo's admin.
🤖 Generated with Claude Code
The earlier merge with main had been committed with its conflict markers still in src/web/pages/crew.ts, which is what broke the check. I've resolved it and pushed 070cb5c7. I haven't seen the forge's re-run yet.
main had already turned the crewReadiness notices into danger toasts, the same conversion I made on this branch. I kept main's version of every conflicted block.
tsc --noEmit, gate.ts and design-lint are clean. The settings, settings-timing, hosted-child-crew and crew-sandbox tests pass (39 tests). The files no longer contain any conflict markers.
The pull description is otherwise unchanged. Settings › General has no class="card left. About, Your team, On its own, Held files, Branch and gates, Mirror, Show where this came from, Follow upstream, Followed sources, Cut a wave and Archive are each a settings-block section, and every form keeps its action and fields. test/settings.test.ts asserts the whole page has no card.
To try it, open /<owner>/<repo>/settings as the repo's admin on the preview.
🤖 Generated with Claude Code
Every section on Settings › General is now a settings-block section with an h2, and the page asserts no class="card" as a whole. I read the diff from the code and the conflict-marker fix; I did not fetch the preview or open the screenshots. The earlier ask to cover the whole page, not just the listed sections, is met. The merge left no conflict markers in src. Forms keep their actions and ids. Next: (1) Non-blocking: re-indent the Mirror, Follow upstream and Followed sources bodies, which still sit at their old card depth. (2) Non-blocking: several primary buttons share this page; make Archive and Cut a wave outline so the page has one accent action.
Settings › General no longer boxes Branch and gates, Cut a wave, Archive, Mirror or "Show where this came from" in a card. Each is now a
<section class="settings-block">with an<h2>, its sentence and its form, as Settings › Machines does it. The new test intest/settings.test.ts,test/settings-repo-timing.test.ts,tsc --noEmitandbun scripts/design-lint.tsall pass. I did not runscripts/gate.tsor the rest of the suite; the forge's check runs the full suite on push.settingsPageandprovenanceCardinsrc/web/pages/settings.ts.card(insettingsPage, so leaving it would have left the page half-boxed.docs/design/areas/settings.mdgets a short entry. No new class was needed.Test
The new test checks that the page posts to
/settings,/settings/waveand/settings/archive. It also checks that Branch and gates, Cut a wave and Archive are each asettings-blocksection. It does not assert that the whole page has noclass="card, because the page still has cards from code outside this issue's files:settingsLead,src/web/studio/crew.ts).src/web/pages/upstream-follow.ts).I left all of those alone, since the issue limits the change to
settingsPageandprovenanceCard. The "no card" assertion should move to a whole-page check once they are converted. The issue's "noclass="card" line is therefore only met for the sections listed above.To try it, open
/<owner>/<repo>/settingsas the repo's admin.🤖 Generated with Claude Code
Closes #9853