Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
78b0c01
fix(ui): give the mode-menu search box a search-shell focus owner
claude Sep 5, 2026
fb7cc8f
Merge branch 'main' into claude/magical-heisenberg-8ilf3g
BigSimmo Sep 5, 2026
34c0faf
Merge branch 'main' into claude/magical-heisenberg-8ilf3g
BigSimmo Sep 5, 2026
b2f0cb2
Merge branch 'main' into claude/magical-heisenberg-8ilf3g
BigSimmo Sep 5, 2026
d853e34
test(ui-smoke): scope the DSM page-root assertions to the visible owner
claude Sep 7, 2026
293d064
Merge the landed PR #2638 branch history so the follow-up fast-forwards
claude Sep 7, 2026
fef557b
Drop seven unreachable alternatives from the Smart search rules
claude Sep 7, 2026
d459593
test(ui-smoke): derive the DSM in-page locators from the visible root
claude Sep 7, 2026
d204dce
ledger: record the prlanded verification for PR #2637
claude Sep 7, 2026
ad1b84b
fix(search): a closed cross-mode tray that could not say what was beh…
claude Sep 7, 2026
a2a539f
fix(search-chrome): ready-gate the composer reserve clear in the effe…
claude Sep 7, 2026
5c07dc4
test(stress): the medication breakpoint test asserted a tray that can…
claude Sep 7, 2026
dda10bd
chore(issues): record the pr-required failure this session never expl…
claude Sep 7, 2026
9b4533a
fix(dashboard): clearing the composer left the URL submitted, so two …
claude Sep 7, 2026
3040e1e
test(audit): the source contract pinned the narrow-screen deferral th…
claude Sep 7, 2026
d3e1b24
issues: withdraw the #ZKR5YK re-scope in favour of the close already …
claude Sep 7, 2026
d8367c6
fix(dashboard): keep the clear-query rationale inside the no-growth b…
claude Sep 7, 2026
4d85c42
fix(dashboard): resolve clear-request review findings
codex Sep 7, 2026
449ab10
fix(tools): one Tools surface — port the hub's shortcuts, then redire…
claude Sep 7, 2026
6c36937
Merge remote-tracking branch 'origin/claude/mode-home-clear-fix' into…
claude Sep 7, 2026
9f1d4bf
fix(tools): port the hub's search box too, not just its shortcuts
claude Sep 7, 2026
1836ef0
Answer library line: reach the modes no local catalogue can
claude Sep 7, 2026
1b18a10
Pin the widened Answer line: builder contract and coverage register
claude Sep 7, 2026
94ee36c
Bound the library line at five, and prove the widened reach in a browser
claude Sep 7, 2026
e3076dd
Record what direction B cost the answer surface, and how it was repaid
claude Sep 7, 2026
8c5ac88
Answer library matches go back to the open card strip
claude Sep 7, 2026
644096a
Record the presentation reversal in the answer handover
claude Sep 7, 2026
7a86589
Keep each domain's own ranking in the universal cross-mode links
claude Sep 7, 2026
1669fb3
Hold the answer strip at four links
claude Sep 7, 2026
0552c7f
Answer library matches: one toggle, resting open
claude Sep 7, 2026
1beea07
Drop the record-name preview from the library line's header
claude Sep 7, 2026
2aa3c2c
Merge branch 'main' into claude/answer-mode-coverage-gap-ilcwui
BigSimmo Sep 7, 2026
f2b26e3
Merge branch 'main' into claude/answer-mode-coverage-gap-ilcwui
BigSimmo Sep 8, 2026
2a327b1
fix(search): key the cross-mode also-matches lookup to the submitted …
claude Sep 8, 2026
053891b
Merge branch 'main' into claude/magical-heisenberg-8ilf3g
BigSimmo Sep 8, 2026
63369ec
Integrate dashboard clearing, chrome, and search coverage fixes
BigSimmo Sep 10, 2026
db6376e
Preserve accessible counts while consolidating universal search fixes
BigSimmo Sep 10, 2026
61bd00f
Extract submitted-search state to keep the dashboard within its budget
BigSimmo Sep 10, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
82 changes: 82 additions & 0 deletions docs/answer-page-redesign-handover.md
Original file line number Diff line number Diff line change
Expand Up @@ -731,3 +731,85 @@ panel:
card, the rail cards, the drawer and print are fixed together. Display only.

---

### 12.9 What direction B cost, and how it was repaid (2026-09-07)

Keeping one panel was right. Keeping the narrower one was a coverage loss nobody wrote down at
the time, and it is invisible from a screenshot.

`UniversalSearchAlsoMatches` is fed by `/api/search/universal` and reaches twelve domains.
`CrossModeLinksSection` was fed by four catalogues loaded in the browser — medications,
services, forms, differentials. So from 2026-08-26 a clinician who asked a question in Answer
mode could never be shown a matching DSM diagnosis, dictionary term, formulation, specifier,
therapy or tool, though all sixteen other modes could. The register in
`tests/universal-also-matches-mode-coverage.test.ts` recorded the exemption honestly and
recorded the wrong thing about it: that Answer answers cross-mode discovery elsewhere, without
saying that "elsewhere" reached a third of the surface the tray reached.

**Widened rather than replaced.** The line keeps its disclosure, its place inside the answer
thread between the governed caution and the follow-ups, its walk back through earlier turns when
a follow-up drops the entity name, and the per-record `Search in <mode>` control and
`cross_mode_link_open` telemetry the mode-level tray has never had. What changed is only where
the links come from: `buildCrossModeLinksFromUniversalSearch` maps universal-search groups into
the same `CrossModeLink` shape, gated on a query term naming the record at a word boundary — the
same weight and minimum term length the differentials path already used, because a content-only
score cannot be trusted on a question full of filler.

Three things hold it inside the 12.8 decision rather than undoing it:

- The lookup is opt-in per surface (`universalMode`) and off by default. Every mode but Answer
mounts the tray, so a surface that ran this too would print one record twice — which is what
§12.8 removed, and what the prescribing page later shipped anyway.
- The consumed domains and their complement come from one array. `documents` is excluded because
an answer already cites its documents in the evidence rail and the drawer, and the four
catalogue domains are excluded because the local half already resolves them.
- It is withdrawn while a generation is in flight, matching `answer && !loading` on the tray, so
the lookup never races the answer stream and an open tray never holds matches for the question
being replaced. An errored or empty group contributes nothing.

The strip's ceiling stays at four, the number the catalogue half alone allowed. Five was set
while this was still a collapsed disclosure, where an extra row cost nothing until the reader
opened it; with the strip open at every width every row is unconditional height on the answer
surface, so the old ceiling holds and this change stays about reach rather than size. The cap
only binds when the catalogue half filled the strip on its own, which is a question already well
served; the common answer names none of those four record types, and that is where the widened
reach earns its place.

Calculators, Factsheets, Sources, On Call and Favourites are still unreachable from here, and
not by omission — they contribute no cross-entity search domain at all
(`universal-search-mode-context.ts`), so nothing can resolve a link to them from any surface.

**The line keeps its single toggle, and now rests open (owner decision, 2026-09-07).** Both ends
of this were built and looked at on the day the data was widened, and both were wrong.

Closed by default, as direction B shipped it, hides the matches behind a tap nobody has a reason
to take: a closed tray cannot show what it holds, so the reader has to spend the tap to find out
whether it was worth spending. Removing the toggle entirely, which was the first correction, put
four unconditional rows into the answer's evidence stack with no way to put them away — roughly
90px of resting height on a phone, on the densest surface in the product, which is the trade
§12.8 made in the other direction for a reason.

The hybrid is one control that starts open. The matches are there to be read without a tap, and
the space is one tap away for a reader who wants the answer and the follow-ups closer together.
`variant="line"` and `CrossModeLinksLine` are the presentation again, so the `card` strip stays
what the DSM diagnosis page and the mockups use.

The header lost its preview of the first three record names in the same change. Those names
earned their room while the line rested closed and had no other way to say what it held; open,
they were naming the cards immediately below them. The header is label, rule and count now, at
every width, which is the device the "Also matches" tray already uses.

Worth recording because it nearly went the other way: `CrossModeLinksLine` was almost deleted
while it briefly had no consumer. `check:dead-code-candidate` refused the removal — the symbol
was introduced on 2026-08-26, inside the gate's 30-day window ("likely awaiting its consumer") —
and the deletion was dropped rather than forced past the threshold. A day later it was the
presentation again. The gate's heuristic looked wrong at the time and was right in substance.

Three browser tests carry the disclosure as their contract. The 1280px case asserts the rail's
own computed display in both states rather than the trigger's word for it: width is where this
broke before, when a `hidden` beside a `md:flex` in one class list lost to the media-query rule
from 768px up and left a rail painted open while its trigger reported it closed. Now that the
line rests open, the same mechanic would hide a broken collapse instead, which is why the closed
state is the one pinned on computed display.

---
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
| 2026-09-07 | claude/side-navigation-reliability-0sg48b | ee0cf48b5ae370475de1526bd843ac9f62ef55a2 | prlanded | PR #2637 merged 2026-09-05T11:11:08Z by BigSimmo via true merge commit ee0cf48 (auto-merge armed, three update-branch merges of main by the owner beforehand). Tree of ee0cf48 is identical to branch tip a943909 (git diff --stat empty); fix commit 1a6adff is an ancestor of origin/main; no late or orphaned commits; remote branch already deleted by GitHub. Sidebar shortcuts now switch mode in place via onSelectMode and useHomeModeSeed consumes the UI-change flag one-shot. | git diff --stat ee0cf48 a943909 empty; git merge-base --is-ancestor 1a6adff origin/main true; PR read via GitHub MCP state=closed merged=true; CI on head a943909 green before merge |
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"version": 2,
"id": "45cda6a2-725f-4fc7-bbd8-2350c7280d72",
"createdOn": "2026-09-07",
"action": "add",
"payload": {
"pri": "P2",
"type": "issue",
"summary": "PR required failed repeatedly on a UI-only branch with no cause ever identified",
"detail": "Session 2026-09-07, branch claude/jolly-keller-vy36h2 (the also-matches disclosure). The pr-required aggregate went red several times while every local gate was green: 15 static gates, whole-tree Prettier, 229 + 161 focused unit tests, 129 + 28 Chromium tests. A push-cancellation theory was offered and then disproved by a run with a quiet window. CI log access was blocked by the babysit marker for the whole session, so the failing job was never read and the branch merged with the cause unknown. Next action: on the next unexplained pr-required failure, unlock the marker first (CLAUDE_ALLOW_PR_FOLLOW=1) and read the failing job log before theorising. Two contributing factors worth ruling out: a second agent was pushing merge commits to the same branch concurrently, and main merged about twelve changes during the session.",
"source": "docs/branch-review-records + session 331c4d4d",
"issueUlid": "01M1XP1FE7K06J63XSYVBS40HA"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"version": 2,
"id": "4d148590-e6c2-4dde-b07d-111f312c827e",
"createdOn": "2026-09-07",
"action": "update",
"payload": {
"id": "#ZKR5YK",
"detail": "UPDATE 2026-09-06: this row is now partly stale and its Sources example is gone. PR #2672 consolidated /sources: its four-card mode home was deleted and the bare path now redirects to the shared home at /?mode=sources, so Sources no longer owns a home of its own and the mode pill landing there is correct rather than a miss. The row's remaining live cases are Favourites and Tools. Favourites is settled by an explicit owner decision (#V0EDR4, 2026-08-23: two purpose-specific surfaces are deliberate), which leaves Tools as the only open instance: changeMode still builds appModeSelectionHref, so picking Tools lands on /?mode=tools and the legacy client-only launcher (applications-launcher-page.tsx, data-testid tools-home) rather than canonical /tools (ToolsSearchResultsPage). Verified on main 0177bed by a browser probe: /?mode=tools renders tools-home. Documents and Medication also dropped off this row for the same reason as Sources - both bare paths redirect now. STILL AN OWNER RULING, not a defect to fix unilaterally: the pill deliberately always returns to the shared home, so special-casing Tools trades one inconsistency for another, and removing the second launcher means deleting a component that six assertions in tests/favourites-auth-gate.dom.test.tsx still render directly. Re-scope this row to Tools only.",
"baseRowFingerprint": "4a2c45298f781607394bb54bdde280518d7e1e6c1706ae00e2b05526613fa232"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"version": 2,
"id": "aca18f9d-f748-40cd-918a-51ecb9b91f1c",
"createdOn": "2026-09-07",
"action": "cancel",
"payload": {
"requestId": "4d148590-e6c2-4dde-b07d-111f312c827e",
"reason": "Withdrawn in favour of the competing request 4036f064, a done on the same row backed by an actual implementation (outcome: mode pill now routes to dedicated mode homes). My request only re-scoped #ZKR5YK to Tools after verifying that its Sources, Documents and Medication examples are gone (all three bare paths redirect now) and that Favourites is settled by owner decision #V0EDR4. A re-scope is pointless against a close that supersedes the whole row, and two pending mutations on one row block reconciliation for everyone (#686WHW). The verified findings are recorded in the PR that carried this session's fixes instead, so they are not lost if that close is ever reopened."
}
}
Loading
Loading