From be1b797083259a4f98d4b88cb4f3cd45f0a7ba03 Mon Sep 17 00:00:00 2001 From: REPPL <77722411+REPPL@users.noreply.github.com> Date: Sun, 4 Oct 2026 08:29:40 +0100 Subject: [PATCH 01/13] chore: capture the record dashboard scrolling sideways on a phone The site-screenshots job has failed on every pull request since 2026-10-03 23:37Z: /record/ scrolls sideways at 360 and 390 px. A local reproduction names the Latest decisions panel's title spans, not the genealogy timeline the bisect suspected. Refs: iss-2610040729344770 Assisted-by: Claude:claude-opus-5-5 --- ...oard-record-scrolls-sideways-at-360-and-390.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 .abcd/work/issues/open/iss-2610040729344770-the-record-dashboard-record-scrolls-sideways-at-360-and-390.md diff --git a/.abcd/work/issues/open/iss-2610040729344770-the-record-dashboard-record-scrolls-sideways-at-360-and-390.md b/.abcd/work/issues/open/iss-2610040729344770-the-record-dashboard-record-scrolls-sideways-at-360-and-390.md new file mode 100644 index 000000000..077318754 --- /dev/null +++ b/.abcd/work/issues/open/iss-2610040729344770-the-record-dashboard-record-scrolls-sideways-at-360-and-390.md @@ -0,0 +1,15 @@ +--- +schema_version: 1 +id: "iss-2610040729344770" +slug: "the-record-dashboard-record-scrolls-sideways-at-360-and-390" +severity: "major" +category: "bug" +source: "agent-finding" +found_during: "site-screenshots failing on every PR since 2026-10-03 23:37Z" +origin: researcher-authored +production_mode: hand-written +found_at: "site-src/site.css" +remedy: "Give the non-id spans of a .list row the treatment .links li>span already has: .list li>span:not(.id){overflow-wrap:anywhere;min-width:0} in site-src/site.css and its seeded copy internal/core/site/setupsrc/site.css, the id column keeping white-space:nowrap. Grounds: overflow-wrap:anywhere, unlike break-word, lowers the element's min-content width (CSS Text Module Level 3, overflow-wrap), and min-width:0 removes the grid item's content-based automatic minimum (CSS Grid Layout Level 1, section 6.6), so the 1fr track gives whatever title arrives; the stylesheet's own comment above .refs li records the same reasoning for bibliography addresses. A Go test pins the rule and the row markup it matches; the overflow audit proves it in a browser at 360/390/768/1360 px." +--- + +The record dashboard (/record/) scrolls sideways at 360 and 390 px: the site-screenshots job measures scrollWidth 476 to 482 there on every pull request since 2026-10-03 23:37Z. The cause is not the genealogy timeline, whose svg sits inside its own overflow-x:auto panel and cannot widen the page, and not the four sub-navigation links the job names first, which scroll inside their own bar; it is the Latest decisions panel. A .list row is a two-column grid (auto 1fr) whose title is a plain span, and a grid item's automatic minimum width is its min-content width, so a title holding one long unspaced token sets the width of the row, which spills past the panel and the page. The two ADRs from #795 (adr-2610031751065746 and adr-2610031751066232) carry such titles, a home-relative path with no break in it, and became the two newest decisions on 2026-10-03. Every .list on the site (dashboard decisions, health, status, development, supersessions) has the same shape, so any record whose title holds a long token reproduces it. From a4316eebcde1f66d0979bdf4d96319ea43054421 Mon Sep 17 00:00:00 2001 From: REPPL <77722411+REPPL@users.noreply.github.com> Date: Sun, 4 Oct 2026 08:32:28 +0100 Subject: [PATCH 02/13] chore: capture record pages scrolling sideways on a long unbroken token Found while reproducing the /record/ overflow: a timestamp-id ADR's source path and two ADR titles have no break opportunity, and the overflow audit samples only the lowest-numbered record of each type, so it never sees them. Refs: iss-2610040732240935 Assisted-by: Claude:claude-opus-5-5 --- ...roll-sideways-at-360-px-whenever-a-record-s.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 .abcd/work/issues/open/iss-2610040732240935-record-pages-scroll-sideways-at-360-px-whenever-a-record-s.md diff --git a/.abcd/work/issues/open/iss-2610040732240935-record-pages-scroll-sideways-at-360-px-whenever-a-record-s.md b/.abcd/work/issues/open/iss-2610040732240935-record-pages-scroll-sideways-at-360-px-whenever-a-record-s.md new file mode 100644 index 000000000..e387d19c7 --- /dev/null +++ b/.abcd/work/issues/open/iss-2610040732240935-record-pages-scroll-sideways-at-360-px-whenever-a-record-s.md @@ -0,0 +1,15 @@ +--- +schema_version: 1 +id: "iss-2610040732240935" +slug: "record-pages-scroll-sideways-at-360-px-whenever-a-record-s" +severity: "major" +category: "bug" +source: "agent-finding" +found_during: "site-screenshots failing on every PR since 2026-10-03 23:37Z" +origin: researcher-authored +production_mode: hand-written +found_at: "site-src/site.css" +remedy: "Set overflow-wrap:break-word on body in site-src/site.css and its seeded copy internal/core/site/setupsrc/site.css, as a net under every block of text: it breaks a token only where the line would otherwise overflow and, unlike anywhere, leaves min-content sizing alone, so tables, grids and flex rows lay out as before (CSS Text Module Level 3, overflow-wrap). Make the overflow audit also sample, per type, the record whose title or source path holds the longest run without a space or hyphen, so the worst case for wrapping is measured on every pull request rather than the shortest. A Go test pins the body rule; the audit run proves it in a browser." +--- + +Record pages scroll sideways at 360 px whenever a record's title or source path holds a long unbroken token, and the overflow audit cannot see it. Every ADR minted with a timestamp id shows its source path, .abcd/development/decisions/adrs/<16 digits>-.md, as one mono span in the side panel's reclinks paragraph, and the run up to the first hyphen is about fifty characters with no break opportunity: /record/adr/adr-2609091248200336/ measures scrollWidth 374 at 360 px. adr-2610031751065746 and adr-2610031751066232 also carry a home-relative path in their titles, which overflows the record page's h1 (scrollWidth 455). The stylesheet sets no overflow-wrap on body, the title or reclinks, so a block whose text has nowhere to break widens the page. The site-screenshots audit samples only the lowest-numbered record of each type (adr-1, itd-1, iss-1), whose paths and titles are short, so these pages have overflowed since timestamp ADRs began without the job noticing. From e90a2a4a03cb12b71df2d89ba337f625f8b1b20b Mon Sep 17 00:00:00 2001 From: REPPL <77722411+REPPL@users.noreply.github.com> Date: Sun, 4 Oct 2026 08:35:59 +0100 Subject: [PATCH 03/13] fix(site): let a .list row's title give on a narrow screen The /record/ dashboard scrolled sideways at 360 and 390 px. The genealogy timeline was suspected, but its svg sits inside its own overflow-x:auto panel and never widens the page; the cause is the Latest decisions panel. A .list row is a grid (auto 1fr), and a grid item's automatic minimum width is its min-content width, so the two newest ADR titles, which quote a home-relative path with no break in it, set the width of their rows. The non-id spans of a .list row now carry overflow-wrap:anywhere (the one value that also lowers min-content) and min-width:0, the treatment .links li>span already has. The rule reaches every .list on the site: the dashboard's decisions, health, status, development and the supersession list. A Go test holds the rule at the top level of both stylesheets and the row markup it matches. Refs: iss-2610040729344770 Assisted-by: Claude:claude-opus-5-5 --- internal/core/site/listwrap_test.go | 100 +++++++++++++++++++++++++++ internal/core/site/setupsrc/site.css | 7 ++ site-src/site.css | 7 ++ 3 files changed, 114 insertions(+) create mode 100644 internal/core/site/listwrap_test.go diff --git a/internal/core/site/listwrap_test.go b/internal/core/site/listwrap_test.go new file mode 100644 index 000000000..c8c721e20 --- /dev/null +++ b/internal/core/site/listwrap_test.go @@ -0,0 +1,100 @@ +package site + +// A `.list` row never widens the page, whatever title it carries. +// +// A row is a two-column grid, the id and then the title, and a grid item's +// automatic minimum width is its min-content width: a title holding one long +// unspaced token — a home-relative path, a URL — sets the width of the row, and +// the row spills past its panel and makes the whole page scroll sideways on a +// phone (iss-2610040729344770, the /record/ dashboard at 360 px). The browser +// half of that rule is the overflow audit in site-src/audit/; this is the half a +// test can hold without one: the title reaches the page as a non-id span +// directly under the row, and the stylesheet gives every such span, at every +// width, the two properties that let it give. + +import ( + "os" + "path/filepath" + "strings" + "testing" +) + +// listTitleSelector is the selector the stylesheet must carry, and the +// declarations it must give. `overflow-wrap:anywhere` rather than `break-word` +// because only `anywhere` lowers the element's min-content width; `min-width:0` +// because a grid item's automatic minimum is that min-content width. +const listTitleSelector = ".list li>span:not(.id)" + +var listTitleDecls = []string{"overflow-wrap:anywhere", "min-width:0"} + +// TestAListTitleWithAnUnbreakableTokenIsAWrappingSpan renders the dashboard's +// latest decisions with a title that is one 157-character token and holds that +// it lands where the stylesheet's wrapping rule reaches it. +func TestAListTitleWithAnUnbreakableTokenIsAWrappingSpan(t *testing.T) { + token := "~/.abcd.noindex/transcripts/" + strings.Repeat("0123456789abcdef", 8) + "/" + e := &explorer{c: &composer{}, export: RecordExport{Nodes: []ExportNode{ + {ID: "adr-7", Type: "adr", Date: "2026-10-03", Title: token}, + }}} + got := e.latestDecisions() + want := `
  • adr-72026-10-03` + + `` + escapeText(token) + `
  • ` + if !strings.Contains(got, `