From fd43d36c34611085c808d865d9fb04dac769bcef Mon Sep 17 00:00:00 2001
From: BigSimmo <87357024+BigSimmo@users.noreply.github.com>
Date: Thu, 13 Aug 2026 04:01:27 +0800
Subject: [PATCH 08/10] test: cover tools detail focus semantics
---
tests/ui-tools-search-mode-mockup.spec.ts | 20 ++++++++++++++++++++
1 file changed, 20 insertions(+)
diff --git a/tests/ui-tools-search-mode-mockup.spec.ts b/tests/ui-tools-search-mode-mockup.spec.ts
index 8e8d71782f..68e32a1508 100644
--- a/tests/ui-tools-search-mode-mockup.spec.ts
+++ b/tests/ui-tools-search-mode-mockup.spec.ts
@@ -63,6 +63,26 @@ test.describe("Perfected Tools results mode mockup @mockup", () => {
await expectNoHorizontalOverflow(page);
});
+ test("desktop details use inline semantics and preserve visible programmatic focus", async ({ page }) => {
+ const mockup = await gotoMockup(page, 1440);
+ const details = mockup.getByRole("button", { name: "View details for Differentials" });
+
+ expect(await details.getAttribute("aria-haspopup")).toBeNull();
+ await details.click();
+
+ const panel = mockup.locator("aside");
+ await expect(panel).toBeFocused();
+ const outline = await panel.evaluate((element) => {
+ const style = window.getComputedStyle(element);
+ return {
+ style: style.outlineStyle,
+ width: Number.parseFloat(style.outlineWidth),
+ };
+ });
+ expect(outline.style).not.toBe("none");
+ expect(outline.width).toBeGreaterThanOrEqual(2);
+ });
+
test("matches the exact displayed tool title after normalising punctuation", async ({ page }) => {
const mockup = await gotoMockup(page, 1440);
await page.locator('[data-testid="global-search-input"]:visible').fill("Risk & Safety");
From 57084815352bb62cfa4d7c8cbf6ad9caf61b2d86 Mon Sep 17 00:00:00 2001
From: BigSimmo <87357024+BigSimmo@users.noreply.github.com>
Date: Thu, 13 Aug 2026 05:14:27 +0800
Subject: [PATCH 09/10] chore: keep shared review ledger from main
---
docs/branch-review-ledger.md | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/docs/branch-review-ledger.md b/docs/branch-review-ledger.md
index 4570268870..6fe4a6548e 100644
--- a/docs/branch-review-ledger.md
+++ b/docs/branch-review-ledger.md
@@ -923,11 +923,10 @@ Records before 2026-07-28 were written by hand and had drifted: 146 lines carrie
| 2026-08-12 | codex/implement-process-safety-for-multi-agent-workflows | 6d054c1fa02a988829def3274b32d31c13570851 | full PR diff and unresolved review feedback | Fixed cached-origin truthfulness, agent-safe approval gates, UI browser proof ordering, index handoff safety, and synced main | focused Vitest 31/31; tsc --noEmit pass; git status clean |
| 2026-08-13 | PR-1845 | 795ce38e165ce44e167038839a914b2efdb77dae | current-main merge, CI repair, and open-comment review | preserved the current-main ledger; canonicalized whitespace-only q to the non-empty legacy query; replaced the stale clear-filter Playwright locator; no unresolved review threads remained | pending fresh GitHub CI |
| 2026-08-12 | PR #1854 / codex/chat-differentials-results-design-differentials-results-design | 86f7d22c0b5d6204708547740fc44228853a9662 | review-and-fix | Fixed the append-only ledger conflict and added a truthful zero-count result-type empty state with reset action; synced current main. | focused Differentials DOM test passed; typecheck passed; fresh hosted CI required on final head |
-| 2026-08-12 | codex/specifiers-results-polish-20260813 | 3e82cca69a72a66c1be87c5b9357336c3a95b7b0 | specifier result-card layout and interaction | No findings after resolving reduced-motion, dark-mode, and focus-ring review items | focused Chromium 1/1; lint pass; typecheck pass; RAG fixtures 36/36; full unit suite has 17 unrelated Windows/tooling baseline failures |
+| 2026-08-12 | claude/design-issues-triage-wnr7k9 | e6eb4c64b28141654bf5eb38121e657f3c2ef77c | Capture two session findings into the ledger (#310 fuzzy drug-match, #311 loss-detector) | docs-only; #310 records a measured cross-drug fuzzy match in open PR #1851 (fluoxetine->duloxetine at distance 2) with a tested one-line cap; #311 records promoting the derived ledger loss-detector to scripts/ | verify:pr-local 10/10 green after npm ci; check:outstanding-issues 114 open/195 archived |
+| 2026-08-12 | codex/codex-cloud-github-action-bridge | c633b92ed5cecac6495a2292ff7b84b11348120d | credential-isolated Codex Run PR operator security and reliability review | 3 findings fixed: trusted base-merge accounting, fail-closed dispatch and mutation preflight, generated-comment and rerun verification hardening | npm run test:ci-workflows (274 passed, 11 skipped); npm run check:github-actions; YAML parse plus 8 bash and 2 github-script syntax checks; clean merge of origin/main |
| 2026-08-12 | origin/pr/1850 | 385a0795d6c6f36e69c60d3b5424873115ea3e99 | PR #1850 full diff vs origin/main | P2 and CI focus regression fixed | focused DOM and Chromium pending coordinator; prior CI static build and UI passed |
| 2026-08-12 | 1850 | a08a0f6794da6990aae0d3446c43eb37f51b7f84 | PR #1850 full diff vs origin/main | merge-conflict resolved cleanly; no remaining actionable findings | merge-tree clean; installed-lock-parity pass; focused in-page-nav DOM 34/34 pass (single worker); changed-file format pass; pre-merge audit pass; hosted CI pending |
+| 2026-08-12 | codex/specifiers-results-polish-20260813 | 3e82cca69a72a66c1be87c5b9357336c3a95b7b0 | specifier result-card layout and interaction | No findings after resolving reduced-motion, dark-mode, and focus-ring review items | focused Chromium 1/1; lint pass; typecheck pass; RAG fixtures 36/36; full unit suite has 17 unrelated Windows/tooling baseline failures |
| 2026-08-12 | codex/specifiers-results-polish-20260813 | bbdb8337c2784941664a88a0d35a96a8c96a2edb | specifier result-card layout and interaction | Current-main sync introduced no changes to reviewed Specifiers scope; no findings after resolved review items | focused Chromium 1/1; lint pass; typecheck pass; RAG fixtures 36/36; full unit suite has 17 unrelated Windows/tooling baseline failures |
-| 2026-08-12 | codex/tools-results-mode-mockup | bcd0c3edd506bda94496d29353ed6e779d142f82 | Tools results-mode mockup design and interaction review | fixed: truthful result counts and refined selected-result hierarchy | typecheck:source; changed ESLint; type-scale; production mockup Playwright 10 passed; responsive 320-1920; reduced-motion and forced-colors |
-| 2026-08-12 | codex/codex-cloud-github-action-bridge | c633b92ed5cecac6495a2292ff7b84b11348120d | credential-isolated Codex Run PR operator security and reliability review | 3 findings fixed: trusted base-merge accounting, fail-closed dispatch and mutation preflight, generated-comment and rerun verification hardening | npm run test:ci-workflows (274 passed, 11 skipped); npm run check:github-actions; YAML parse plus 8 bash and 2 github-script syntax checks; clean merge of origin/main |
-| 2026-08-12 | claude/design-issues-triage-wnr7k9 | e6eb4c64b28141654bf5eb38121e657f3c2ef77c | Capture two session findings into the ledger (#310 fuzzy drug-match, #311 loss-detector) | docs-only; #310 records a measured cross-drug fuzzy match in open PR #1851 (fluoxetine->duloxetine at distance 2) with a tested one-line cap; #311 records promoting the derived ledger loss-detector to scripts/ | verify:pr-local 10/10 green after npm ci; check:outstanding-issues 114 open/195 archived |
| 2026-08-12 | PR #1870 / claude/design-issues-triage-wnr7k9 | 6edfeceeb768b5714f98dad355361ad9148374b0 | review-and-fix | Merged current main; corrected #310's per-record fuzzy-trigger analysis and regression-test condition; preserved #311; removed the temporary self-mutating workflow; no additional P0-P2 findings in a distinct adversarial pass. | verify:pr-local -- --files docs/branch-review-ledger.md,docs/outstanding-issues.md; check:outstanding-issues; check:branch-review-ledger; exact-head hosted CI pending |
From 5fc2f988c01a79974a2ae3039be885b9b8f0d619 Mon Sep 17 00:00:00 2001
From: BigSimmo <87357024+BigSimmo@users.noreply.github.com>
Date: Thu, 13 Aug 2026 07:37:17 +0800
Subject: [PATCH 10/10] fix: close mockup filter sheet across desktop
breakpoint
---
mockups/README.md | 2 +-
.../tools-search-mode-mockup.tsx | 11 +++++++----
tests/ui-tools-search-mode-mockup.spec.ts | 15 +++++++++++++++
3 files changed, 23 insertions(+), 5 deletions(-)
diff --git a/mockups/README.md b/mockups/README.md
index 5cb6d9ac63..696a41a229 100644
--- a/mockups/README.md
+++ b/mockups/README.md
@@ -20,7 +20,7 @@ Mockups use the Clinical White / Sky Graphite role tokens (`--command`, `--clini
Runnable mockups under `src/app/mockups/*` inherit the shared Clinical KB header and bottom search composer from `src/app/mockups/layout.tsx`.
- Put the mockup content between the global header and bottom composer; do not copy the header or composer into new pages.
-- Tool and favourites mockups keep the shared app header but hide the bottom composer because they provide their own primary search surface.
+- Favourites mockups and Tools mockups that provide their own primary search surface keep the shared app header but hide the bottom composer.
- Use `?mode=answer`, `?mode=documents`, `?mode=prescribing`, `?mode=evidence`, or `?mode=favourites` to preview the active search mode.
- The bottom composer routes live searches to the dashboard with `mode`, `q`, and `run=1`; New chat routes to `/?mode=answer&focus=1`.
- If a future mockup must be standalone, move it outside the `/mockups` route shell or add an explicit opt-out route group before implementing it.
diff --git a/src/components/tools-page-mockups/tools-search-mode-mockup.tsx b/src/components/tools-page-mockups/tools-search-mode-mockup.tsx
index 87ad453db0..0ede60d75f 100644
--- a/src/components/tools-page-mockups/tools-search-mode-mockup.tsx
+++ b/src/components/tools-page-mockups/tools-search-mode-mockup.tsx
@@ -235,12 +235,15 @@ export function ToolsSearchModeMockup() {
useEffect(() => {
const desktopMedia = window.matchMedia("(min-width: 1024px)");
- const closePhoneDetailOnDesktop = (event: MediaQueryListEvent) => {
- if (event.matches) setPhoneDetailOpen(false);
+ const closePhoneOverlaysOnDesktop = (event: MediaQueryListEvent) => {
+ if (event.matches) {
+ setPhoneDetailOpen(false);
+ setFilterOpen(false);
+ }
};
- desktopMedia.addEventListener("change", closePhoneDetailOnDesktop);
- return () => desktopMedia.removeEventListener("change", closePhoneDetailOnDesktop);
+ desktopMedia.addEventListener("change", closePhoneOverlaysOnDesktop);
+ return () => desktopMedia.removeEventListener("change", closePhoneOverlaysOnDesktop);
}, []);
const queryMatchedTools = useMemo(() => {
diff --git a/tests/ui-tools-search-mode-mockup.spec.ts b/tests/ui-tools-search-mode-mockup.spec.ts
index 0889efd2b5..d827634b66 100644
--- a/tests/ui-tools-search-mode-mockup.spec.ts
+++ b/tests/ui-tools-search-mode-mockup.spec.ts
@@ -153,6 +153,21 @@ test.describe("Perfected Tools results mode mockup @mockup", () => {
await expect(sheet).toHaveCount(0);
});
+ test("closes the phone filter sheet when the viewport enters desktop layout", async ({ page }) => {
+ const mockup = await gotoMockup(page, 390, 844);
+ const trigger = mockup.getByTestId("tools-search-filter-trigger-phone");
+
+ await trigger.click();
+ const filterSheet = page.locator('[data-testid="tools-search-filter-sheet"]:visible');
+ await expect(filterSheet).toBeVisible();
+
+ await page.setViewportSize({ width: 1440, height: 900 });
+ await expect(filterSheet).toHaveCount(0);
+
+ await page.setViewportSize({ width: 390, height: 844 });
+ await expect(filterSheet).toHaveCount(0);
+ });
+
test("phone filter sheet follows the shared local-filter behavior", async ({ page }) => {
const mockup = await gotoMockup(page, 390, 844);
const trigger = mockup.getByTestId("tools-search-filter-trigger-phone");