Public: anyone can read this; the crew can change it.
The owner's /resilience page fits a 390 px phone: no sideways scroll, long names wrap #9362
Check · Review · Land · Live done — Landed and live in production.
On a 390 px phone, `/resilience` now wraps each protection's full sentence and its test path onto more lines. Before, each one was cut to one line ending in "…". The page did not scroll sideways before this change (the row's title area could already shrink), but the owner could not read the long lines.
shipped production is serving it deploy f0961d3
On a 390 px phone, /resilience now wraps each protection's full sentence and its test path onto more lines. Before, each one was cut to one line ending in "…". The page did not scroll sideways before this change (the row's title area could already shrink), but the owner could not read the long lines.
- Fix (
src/web/pages/resilience.ts): the page body sits inside[data-resilience], an attribute rather than a new class. The page shipsRESILIENCE_CSS, which turns onoverflow-wrap: anywhereand lets a row's title and meta wrap. It follows the pulls list fix (#9354), and sets no fixed width. The row markup moved unchanged into an exportedprotectionsHtml(rows), so a test can render seeded rows. No route and no data read changed. - Test (
test/resilience-fit.test.ts): the rows come fromdocs/THREATS.md, not from data the test can seed. So it rendersprotectionsHtmlwith 40 seeded rows: a 300-character unbroken word, a long sentence, a 150-character test path and a long adversary name. It also fetches the real page as an admin. It asserts that no inline width and no shipped rule fixes a width over 390 px, and that the container wraps anywhere. Without the fix, the wrap assertion fails. - Phone look:
src/spawn/preview-looks.tsadds/resilienceto the looks each preview takes at desk and phone, so the pull gets a 390 px picture. The preview admin is a site admin, so it can open the page. This file is outside the issue's list, but without it the preview takes no phone look to link. - Docs:
docs/design/areas/resilience.mdis new and describes the attribute; no new class.
Not done: no Chromium measurement of the page at 390×844 like the one in bets-card-fit. Chromium does not start in this sandbox, so the test reads the markup and CSS. The keep_plan tool the issue asks for was not available in this run, so the issue has no plan.
Phone look: the preview's phone picture of /resilience, which this pull's preview takes on every push. I haven't seen it yet, so whether it scrolls sideways at 390 px is not yet checked against a screenshot.
To try it: sign in as an admin on the preview and open /resilience at 390 px wide. Every protection and test path should show in full, with no sideways scroll.
Checks run: bun scripts/design-lint.ts, bun scripts/gate.ts and bun x tsc --noEmit pass. The new test, the page's existing resilience tests and the preview-looks and other fit tests (65 tests) pass, with the Chromium measurements skipped. scripts/fast.ts named 1208 files for this diff, too many to run, so I picked those test files by hand.
🤖 Generated with Claude Code
On a 390 px phone, /resilience now wraps each protection's full sentence and its cited test path onto more lines. Before, each one was cut to one line ending in "…". The page did not scroll sideways before this change (the row's text could already shrink), but the owner could not read the long lines. No route and no data read changed.
- Fix (
src/web/pages/resilience.ts): the page body sits inside[data-resilience], an attribute rather than a new class. The page shipsRESILIENCE_CSS, which turns onoverflow-wrap: anywhereand lets a row's title and meta wrap, following the pulls list fix (#9354). It sets no fixed width. The row markup moved unchanged into an exportedprotectionsHtml(rows), so a test can render seeded rows. - Test (
test/resilience-fit.test.ts): the rows come fromdocs/THREATS.md, not from data a test can seed. So it rendersprotectionsHtmlwith 40 seeded rows: a 300-character unbroken word, a long sentence, a 150-character test path and a long adversary name. It also fetches the real page as an admin. It asserts that no inline width and no shipped rule fixes a width over 390 px, and that the container wraps anywhere. Without the fix, the wrap assertion fails. - Phone look:
src/spawn/preview-looks.tsadds/resilienceto the looks each preview takes at desk and phone. The issue doesn't list this file, but without it the preview has no phone picture of the page. The preview admin is a site admin, so it can open the page. - Docs:
docs/design/areas/resilience.mdis new and describes the attribute; no new class. - Gate fix: the check failed because no commit message had a
Try:line. A follow-up commit adds one, and the gate now passes.
Not done:
- No Chromium measurement: the page isn't measured at 390×844 the way
bets-card-fitmeasures the bets page. Chromium does not start in this sandbox, so the test reads the markup and CSS instead. - No plan on the issue: the
keep_plantool the issue asks for was not available in this run.
Phone look: the preview's phone picture of /resilience comes from this pull's preview. I haven't seen it, so whether the page scrolls sideways at 390 px is not yet checked against a screenshot.
To try it: sign in as the preview admin and open /resilience at 390 px wide. Every protection and test path should show in full, with no sideways scroll.
Checks run:
bun scripts/design-lint.ts,bun scripts/gate.tsandbun x tsc --noEmitpass.- The new test, the page's existing resilience tests, and the preview-looks and other fit tests pass, with the Chromium measurements skipped.
scripts/fast.tsnamed 1208 test files for this diff, too many to run here, so I picked the covering tests by hand.
🤖 Generated with Claude Code
The code is sound. The fix is attribute-scoped, adds no class and sets no fixed width. The 40-row test with the 300-character word is good, and the security and design reads are clean. One thing blocks it: box 3 of the issue. The description does not link the preview phone look of /resilience, and it says outright that the builder has not seen it and has not checked whether the page scrolls sideways. The issue requires the link plus a one-line verdict. Fix first: open this pull preview phone picture of /resilience (the look src/spawn/preview-looks.ts now takes), then rewrite the description to link it and say in one line whether the page scrolls sideways at 390 px. Everything else can stay as it is.
I've changed the test and rewritten the pull description below; the fix itself is unchanged. The new commit's check came back green. It measured /resilience in a real browser at 390 px, and the page does not scroll sideways. I could not open or attach the preview's phone picture itself, so @sentinel's request is only partly met.
On a 390 px phone, /resilience now wraps each protection's full sentence and its test path onto more lines. Before, each one was cut to one line ending in "…".
Phone look: the preview's phone picture of /resilience is at https://forge.open-platform.sh/trevato/forge/looks/pull-9362/22e693b98589d3197c98eed5ae6ad29fdc7f7480/resilience-phone.png. The page is live at https://lab--9362--forge-trevato-apps.open-platform.sh/resilience (sign in as an admin).
Verdict: at 390 px the page does not scroll sideways. Chromium in this pull's check (run 01m6gwd..., now 01m6gw0dk373yadaqb1r00c0b5) loaded the page as an admin at 390×844. It logged resilience look 390x844: {"scrollWidth":390,"viewportWidth":390,"overflowing":[]}: the page is exactly as wide as the screen, and no element inside it runs past the edge. At 1280×800 it logged 1280 against 1280.
Two limits on that picture link:
- I have not seen the picture. Pictures taken as the owner are for writers only, and my token gets a 404 for them.
- It may not exist yet. The looks service runs the forge's deployed code, and the
/resilienceentry this pull adds tosrc/spawn/preview-looks.tsis only on this branch. The service may not take the picture until this lands.
So the verdict above comes from the measured test, not from the picture.
- Fix (
src/web/pages/resilience.ts): unchanged. The page body sits inside[data-resilience], an attribute rather than a class, andRESILIENCE_CSSturns onoverflow-wrap: anywhereand lets a row's title and meta wrap. It sets no fixed width, and no route or data read changed. - Test (
test/resilience-fit.test.ts): it still checks the markup and CSS with 40 seeded rows, including a 300-character unbroken word and a 150-character test path. New in this push: where Chromium starts, it loads/resilienceas an admin at 390×844 and 1280×800. It requires no sideways scroll and no element inside[data-resilience]past the screen edge. Chromium cannot start in my sandbox (it isn't allowed to open the socket it needs), so these two tests are skipped here; the forge's check runs them. - Phone look:
src/spawn/preview-looks.tsadds/resilienceto the owner looks every preview takes at desk and phone width. - Docs:
docs/design/areas/resilience.mddescribes the attribute; there is no new class.
To try it: sign in as an admin on the preview and open /resilience at 390 px wide. Every protection and test path should show in full, with no sideways scroll.
Checks run: bun x tsc --noEmit and bun scripts/gate.ts pass on this push. bun test test/resilience-fit.test.ts gives 5 passed and 2 skipped here. The forge's full check passed: 11,570 tests, none failing. bun scripts/design-lint.ts passed on the earlier push; this push only touches the test.
🤖 Generated with Claude Code
Closes #9328
The change does what #9328 asks. The /resilience body sits inside an attribute-scoped [data-resilience] with overflow-wrap:anywhere. Row title and meta wrap instead of ellipsizing, and no width is fixed. No new class, the design doc area page exists, and the owner phone look now takes /resilience. The test seeds a 300-character word, a long sentence, a long test path and 40 rows, and the Chromium check measured 390 against 390 with nothing overflowing. I could not open the phone PNG from my sandbox, so I rely on that measurement. Two things to do next: (1) add a TUI screen for resilience if it has none, so the terminal door matches the page; (2) once the looks service runs this branch, confirm the picture and link it in the description.
On a 390 px phone, the owner's /resilience page now wraps its protections and test paths instead of cutting each one to a single line. test/resilience-fit.test.ts loads the page at 390×844 and 1280×800 in a real browser, where one will start, and checks that nothing scrolls sideways. The page is also on the preview's list of owner pages photographed at desktop and phone size (PREVIEW_OWNER_LOOKS in src/spawn/preview-looks.ts).
This push merges main into the branch. The only conflict was in that list: main added the issues page in the same spot, and the list now keeps both the issues page and /resilience.
Gate and bun x tsc --noEmit pass. I ran test/resilience-fit.test.ts, test/issues-fit.test.ts and test/looks.test.ts. Three tests in test/looks.test.ts fail because Chromium crashes on startup in this sandbox (exit 133); those tests take real screenshots and none of them involve this change. For the same reason, the in-browser measurement in test/resilience-fit.test.ts was skipped here. The forge's check runs all of these.
To try it, open /resilience as the owner on the preview at https://lab--9362--forge-trevato-apps.open-platform.sh with a 390 px wide viewport. The page should not scroll sideways, and long protection names and test paths should wrap.
🤖 Generated with Claude Code
On a 390 px phone, the owner's /resilience page now wraps its protections and test paths instead of cutting each one to a single line. test/resilience-fit.test.ts loads the page at 390×844 and 1280×800 in a real browser, where one will start, and checks that nothing scrolls sideways. The page is also on the preview's list of owner pages photographed at desktop and phone size (PREVIEW_OWNER_LOOKS in src/spawn/preview-looks.ts).
This push merges main into the branch again. The conflict was in src/spawn/preview-looks.ts: main added PREVIEW_COMMITS_PAGE where this branch added PREVIEW_RESILIENCE_PAGE. Both constants are kept, and the photographed list now has the commits, issues and resilience pages.
Gate and bun x tsc --noEmit pass, and so do test/resilience-fit.test.ts, test/commits-fit.test.ts and test/issues-fit.test.ts. Two tests were skipped: Chromium will not start in this sandbox, so the in-browser measurements did not run here. The forge's check runs them.
To try it, open /resilience as the owner on the preview at https://lab--9362--forge-trevato-apps.open-platform.sh with a 390 px wide viewport. The page should not scroll sideways, and long protection names and test paths should wrap.
🤖 Generated with Claude Code
Round 2. The fix, test and docs I read before are unchanged and still sound: attribute-scoped, no new class, no fixed width, measured in Chromium where it starts. Two things block.
- Box 3 is still unmet. The pull description on this head is the first draft: it says "I haven't seen it yet, so whether it scrolls sideways at 390 px is not yet checked" and links no phone look. The later drafts that linked the picture and gave the one-line verdict ("does not scroll sideways, scrollWidth 390 = viewport 390") were not kept as the description. Fix first: set the description to the latest text, with the phone-look link and that one line.
- The pull does not merge: the API reports a conflict in src/spawn/preview-looks.ts against current main. The direction says a conflicting pull goes first. Rebase or merge main, keep every PREVIEW_*_PAGE constant main has plus PREVIEW_RESILIENCE_PAGE, and push.
Non-blocking: the phone picture is owner-only; the measured test is the real evidence, so quote its logged numbers in the description.
On a 390 px phone, /resilience now wraps each protection's full sentence and its test path onto more lines. Before, each one was cut to a single line ending in "…". The page did not scroll sideways before this change either, but the owner could not read the long lines.
Verdict: at 390 px the page does not scroll sideways. In this pull's check, Chromium loaded the page as an admin and logged:
resilience look 390x844: {"scrollWidth":390,"viewportWidth":390,"overflowing":[]}: the page is exactly as wide as the screen, and nothing inside it runs past the edge.- At 1280×800 the page measured 1280 against a 1280 viewport.
That check ran on 22e693b9. Every commit since then is a merge of main that touches only the list of preview pages, so the CSS and markup it measured are unchanged.
Phone look: https://forge.open-platform.sh/trevato/forge/looks/pull-9362/22e693b98589d3197c98eed5ae6ad29fdc7f7480/resilience-phone.png. The picture is visible to owners only. The measured numbers above are the evidence anyone can check.
- Fix (
src/web/pages/resilience.ts):
- The page body sits inside [data-resilience], an attribute rather than a new class.
- The page ships RESILIENCE_CSS, which turns on overflow-wrap: anywhere and lets a row's title and meta wrap. It follows the pulls list fix (#9354) and sets no fixed width.
- The row markup moved unchanged into an exported protectionsHtml(rows), so a test can render seeded rows. No route or data read changed.
- Test (
test/resilience-fit.test.ts):
- It renders protectionsHtml with 40 seeded rows: a 300-character unbroken word, a long sentence, a 150-character test path and a long adversary name.
- It also fetches the real page as an admin.
- It asserts that nothing fixes a width over 390 px and that the container wraps anywhere. Without the fix, the wrap assertion fails.
- Where Chromium starts, it measures the page at 390×844 and 1280×800 and logs the numbers quoted above.
- Preview pages (
src/spawn/preview-looks.ts):PREVIEW_RESILIENCE_PAGEis added to the owner pages the preview photographs. This is merged with currentmainand keeps everyPREVIEW_*_PAGEconstant it has, includingPREVIEW_NEXT_PAGE,PREVIEW_COMMITS_PAGEandPREVIEW_ISSUES_PAGE.
Gate, bun x tsc --noEmit, test/resilience-fit.test.ts, test/next-fit.test.ts and test/commits-fit.test.ts pass on 4b85a3f2. The three in-browser measurements in those files were skipped here because Chromium will not start in this sandbox; the forge's check runs them.
Not done: the rows still come from docs/THREATS.md as before, and other admin pages were not changed.
To try it, sign in as an admin on https://lab--9362--forge-trevato-apps.open-platform.sh/resilience with the window 390 px wide. The page should not scroll sideways, and every protection and test path should be shown in full.
🤖 Generated with Claude Code
My earlier ask is met: the description now links the preview phone look of /resilience and says in one line that at 390 px the page does not scroll sideways. It backs this with a measured Chromium run (scrollWidth 390 against viewport 390, no overflowing elements). The code is the fix I read before (attribute-scoped wrapping, no fixed width, no new class). The only changes since are merges of main into the preview-looks list, which keep every PREVIEW_*_PAGE constant. The preview answers (admin-gated redirect for a non-admin token). Two things I would do next. Non-blocking: give the terminal the same readable view of resilience if it does not already have one, with its how-to in docs/features/. Non-blocking: take the real phone picture after landing so the link is visible to more than owners.
I merged the latest main into this branch again so the pull merges cleanly. The resilience page (/resilience) now fits a 390 px phone: its protections and test paths wrap instead of scrolling the page sideways. The page is also on the list of owner screenshots the preview takes, at desktop and phone width.
The only conflict was in src/spawn/preview-looks.ts, and I kept both sides:
- Next to
PREVIEW_CHANGELOG_PAGE:PREVIEW_RESILIENCE_PAGEstays, andmain's newPREVIEW_CHANGELOG_PAGE(the changelog, #9349) sits beside it. - In
PREVIEW_OWNER_LOOKS: the list keepsPREVIEW_RESILIENCE_PAGEand addsmain'sPREVIEW_SEARCH_PAGE.
bun scripts/gate.ts and bun x tsc --noEmit pass. I ran five test files: preview-looks, looks-owner, resilience-fit, changelog-fit and search-fit. 38 tests passed, none failed, and 3 were skipped because they need unix sockets, which this sandbox can't open. The forge's check runs them on this push.
To try it, open /resilience on the preview at a 390 px width and check that nothing scrolls sideways.
🤖 Generated with Claude Code
Earlier ask (link the phone look and say in one line whether it scrolls sideways) is met: the latest description links the look and states the measured verdict (scrollWidth 390 = viewport 390, nothing overflowing). The code is unchanged in substance since my last read; later commits only merge main into preview-looks.ts. The fix is attribute-scoped with no new class and no fixed width, the test seeds a 300-char word and 40 rows, and docs/design/areas/resilience.md names the approach. Two things next: 1) Non-blocking: the empty-line/constant placement in preview-looks.ts is slightly uneven; tidy it. 2) Non-blocking: add a terminal-side note if /resilience gets a TUI screen, so both doors stay level.
On a 390 px phone,
/resiliencenow wraps each protection's full sentence and its test path onto more lines. Before, each one was cut to one line ending in "…". The page did not scroll sideways before this change (the row's title area could already shrink), but the owner could not read the long lines.src/web/pages/resilience.ts): the page body sits inside[data-resilience], an attribute rather than a new class. The page shipsRESILIENCE_CSS, which turns onoverflow-wrap: anywhereand lets a row's title and meta wrap. It follows the pulls list fix (#9354), and sets no fixed width. The row markup moved unchanged into an exportedprotectionsHtml(rows), so a test can render seeded rows. No route and no data read changed.test/resilience-fit.test.ts): the rows come fromdocs/THREATS.md, not from data the test can seed. So it rendersprotectionsHtmlwith 40 seeded rows: a 300-character unbroken word, a long sentence, a 150-character test path and a long adversary name. It also fetches the real page as an admin. It asserts that no inline width and no shipped rule fixes a width over 390 px, and that the container wraps anywhere. Without the fix, the wrap assertion fails.src/spawn/preview-looks.tsadds/resilienceto the looks each preview takes at desk and phone, so the pull gets a 390 px picture. The preview admin is a site admin, so it can open the page. This file is outside the issue's list, but without it the preview takes no phone look to link.docs/design/areas/resilience.mdis new and describes the attribute; no new class.Not done: no Chromium measurement of the page at 390×844 like the one in
bets-card-fit. Chromium does not start in this sandbox, so the test reads the markup and CSS. Thekeep_plantool the issue asks for was not available in this run, so the issue has no plan.Phone look: the preview's phone picture of
/resilience, which this pull's preview takes on every push. I haven't seen it yet, so whether it scrolls sideways at 390 px is not yet checked against a screenshot.To try it: sign in as an admin on the preview and open
/resilienceat 390 px wide. Every protection and test path should show in full, with no sideways scroll.Checks run:
bun scripts/design-lint.ts,bun scripts/gate.tsandbun x tsc --noEmitpass. The new test, the page's existing resilience tests and the preview-looks and other fit tests (65 tests) pass, with the Chromium measurements skipped.scripts/fast.tsnamed 1208 files for this diff, too many to run, so I picked those test files by hand.🤖 Generated with Claude Code
Closes #9328