diff --git a/docs/branch-review-ledger.md b/docs/branch-review-ledger.md index 707e572da6..3d6520c17c 100644 --- a/docs/branch-review-ledger.md +++ b/docs/branch-review-ledger.md @@ -329,11 +329,6 @@ Records before 2026-07-28 were written by hand and had drifted: 146 lines carrie | 2026-07-31 | claude/root-dir-coverage-gate-v2 | 398660144d93aeefc2e5649c156948a68925cb64 | docs:check-index repo-root coverage, stale script counts, ledger correction | MERGED as PR #1458 (squash 907fd9f4a). Root-directory coverage pass for docs:check-index, red-then-green proven (flagged .cursor/.design-sync/.vscode, then 49 entries vs 31). Main landed an equivalent pass independently in #1480, so the two overlapped; no duplication reached main. Row not recorded at the time - appended retrospectively | verify:cheap exit 0, 435 test files / 4574 tests pass; codebase-index-coverage 10/10 incl 4 new root cases; eslint clean; docs gates green; prettier clean | | 2026-07-31 | claude/pre-commit-fail-open | 7b96a09b8500adc917cf5549b1c61142b2244b39 | pre-commit hook fail-open when the inventory script is absent | MERGED as PR #1494 (squash 387c3b653). Resolves ledger #153: core.hooksPath is absolute to the primary checkout, so the hook ran in worktrees lacking scripts/update-docs-inventory.mjs and aborted with MODULE_NOT_FOUND. Guard drops the inventory task and re-checks the all-tasks-empty exit; grep carries \|\| true because set -e treats a fully-filtering grep as failure | isolated-repo probe with the script genuinely absent: prints skipping inventory sync, commit succeeds; sh -n clean; no-op when the script is present; prettier does not parse shell so format:check skips it | | 2026-07-31 | claude/ledger-relanding | 30ec06964e4235d9f0b4bb782f357e6b4fb59430 | re-land the three session findings lost when PR #1490 was closed | MERGED as PR #1508 (squash 7b551abc4). Ledger-only: #151 corrects the claim that CI is unreadable (PAT has Actions:read though not Checks:read), #152 re-lands the at-risk worktree inventory with the four preservation snapshots, #153 archives the hook fix. Verified landed by content on main, not by PR state or row id | CI, PR Policy, PR mergeability, SAST, Secret Scan all completed/success via the Actions API; check:outstanding-issues 151 rows 45 open unique ids next-id=154; docs:check-links 1414 refs; prettier clean | -| 2026-07-31 | codex/fix-search-retrieval-issues-and-run-canary | c45cd227be6d852865eb111a2a06486d1f2c62a0 | pr-1503 reopen-ready | approved: #098 next-action (b) prohibits wholesale collapse; main synced clean; docs-only delta; PR stays closed | format:check; check:outstanding-issues; check:branch-review-ledger; merge-tree clean; bugbot+codex P2 fixed | -| 2026-07-31 | codex/fix-search-retrieval-issues-and-run-canary | c45cd227be6d852865eb111a2a06486d1f2c62a0 | pr-1503-review | re-reviewed: Codex P2 fixed; merge-tree clean vs origin/main; docs-only; no Bugbot/P0-P1; PR remains CLOSED (GitHub headRefOid may lag closed PR) | merge-tree+diff-vs-main+#098-text; no push/reopen | -| 2026-07-31 | codex/fix-search-retrieval-issues-and-run-canary | e8de1aebd1b32d5e901853a3473a792a66aa82cf | pr-1503 reopen-ready | approved: #098 collapse ban kept after main sync; merge-tree clean; docs-only; PR stays closed | format:check; check:outstanding-issues; merge-tree clean; codex P2 fixed; bugbot clean | -| 2026-07-31 | claude/latency-findings-impl-s8g01v | 7056a3e73c568c0dd4cf8d43ab98f47eb9a63acc | PR #1505 docs #147 CLS attribution | ready-for-reopen: main synced, CI was green on prior head, no Bugbot threads; fixed P2 mis-attribution of /therapy-compass to overlay reserve (collapse-motion exception); left PR closed | check:outstanding-issues; prettier --check docs/outstanding-issues.md; git merge-tree clean; bugbot-style review no prior threads; diff-review P2 fixed | -| 2026-07-31 | claude/ci-testing-review-2l8klp | fa304a5332443f544a676bdf35d813797154f87c | PR #1466 reopen-prep | READY: main merged (clean), phoneContract sibling arm fixed+pinned, Codex Cloud origin inspect uses configured URL (insteadOf-safe), prior Codex/Copilot/CodeRabbit threads resolved, no cursor[bot] Bugbot findings, PR left CLOSED | verify:cheap PASS (444 files / 4652 passed, 4 skipped); prettier --check . PASS; check:ci-scope PASS; verify-phone-chrome+codex-cloud-setup+test-runner-safety+playwright-project-isolation 59/59; merge-tree clean before merge; Bugbot none | | 2026-07-30 | PR-1490 | 0a44df55532fcea3cf3b8cad28526ff8805d803b | PR #1490 consolidated session follow-ups | reviewed; consolidated accurate provider-token, preserved-worktree, install-parity, CodeRabbit, hook, and physical-device findings; resolved concurrent documentation conflict without lost rows | check:outstanding-issues pass; check:branch-review-ledger pass; docs:check-links pass; git diff --check pass | | 2026-07-30 | PR-1492 | 4fdc4ba99f94a369702c747b104fa4eaf48cb53e | PR #1492 exact-head branch-sync anti-churn review | approved after P2 repair; current helper fails closed on Actions lookup errors and defers only behind branches with queued or running exact-head CI; operator guidance and tests match | focused Vitest 9 tests passed on reviewed implementation; hosted static checks passed; exact-head coverage in progress at review; merge-tree audit clean | | 2026-07-30 | PR-1495 | 99c62cf3bd6f2a47d13b6602d54de1f8f73123e1 | PR #1495 hydration documentation correction | approved after correcting unrelated issue #101 label and appending a resolvable landed-SHA hydration review record; content consolidated into PR #1490 | outstanding-issues and ledger guards previously passed; documentation-only diff reviewed; no provider checks required | @@ -350,10 +345,10 @@ Records before 2026-07-28 were written by hand and had drifted: 146 lines carrie | 2026-07-31 | PR-1510 | eed59358ffdb588c3015ef317de4587d14ea00cf | PR #1510 reopen-ready evidence correction | FIXED: removed false #098 canary attribution; NOTES #154->#157 and restored 7/4/3 token accounting; mockup tokens unchanged | check:outstanding-issues PASS; check:branch-review-ledger PASS; check:design-system-contract PASS; format:changed PASS; canary ancestry vs origin/main/work verified | | 2026-07-31 | PR-1510 | 61d25fd7727c2345fabb9631d604b1632bc0df6d | post-1513 concurrency-note reconciliation | no actionable findings; preserved main 155, renumbered withdrawn guard to 158, and advanced next-id to 159 | outstanding-issues, branch-review-ledger, design-system-contract, changed-format, diff-check | | 2026-07-31 | PR-1510 | 2e8821c77fcadaa283d8a0033b1a6af815458d79 | PR #1510 CodeRabbit + evidence reopen-ready | FIXED: CodeRabbit computed-value-time wording, unique #033 queue order, deduped #098 Done block; prior false canary attribution already corrected | check:outstanding-issues PASS; format:changed PASS; contains origin/main | -| 2026-07-31 | claude/search-results-mockups-iz7owo (PR #1514) | 1daa6b3d7979f2aed8e50b8a4661690bde5c1073 | closed-PR reopen prep | Synced origin/main (behind 68, merge-tree clean, no conflicts). No unresolved Codex/Bugbot/Copilot/human threads. Tip review: no P0-P2 (phone forms presentation only; clinicalRisk false, not RAG). Pathway guard narrowed intentionally; page-level exact guard intact. Ready for reopen; leave CLOSED. Fresh mergeability/CI count only after reopen. | ledger:lookup NOT REVIEWED; git fetch origin/main; merge-tree clean; git merge origin/main; gh reviewThreads=0; classifyPullRequestFiles clinicalRisk=false ragRanking=false; tip-vs-base review (no local suites; closed-PR CI treated stale; no provider-backed checks) | | 2026-07-31 | cursor/ci-followups-093-138-1bf5 | 299698480cb120483ea16895b9265ad2abf5d595 | closed-PR reopen prep | ready-for-reopen; merge-clean vs origin/main after resolving outstanding-issues; no open review threads; no P0-P2 findings; PR left CLOSED | check:outstanding-issues,check:ci-triage,check:github-actions,merge-tree-clean | | 2026-07-30 | codex/moderate-batch-20260730 | 1addcece5a2b7122c5898584830109f617421a3a | document accordion, auth-safe catalogue refetch, comparison contract, operator preflight | P1 late identity response race fixed; no remaining findings | verify:cheap static through owner-scope; lint; typecheck; full Vitest; Chromium UI; production-readiness | | 2026-07-31 | codex/moderate-batch-20260730 | d582c49fe3a2f01bad179d06f84484754b639458 | PR #1485 accordion/catalogues | APPROVE after Bugbot/CodeRabbit triage; fixed differential LRU soft-success on Retry and credential/error pulses; no open review threads; merge-tree clean vs main | vitest catalog DOM 12/12; check:outstanding-issues; merge-tree clean; Bugbot: no cursor[bot] threads; CodeRabbit threads resolved | +| 2026-07-31 | claude/ci-testing-review-2l8klp | fa304a5332443f544a676bdf35d813797154f87c | PR #1466 reopen-prep | READY: main merged (clean), phoneContract sibling arm fixed+pinned, Codex Cloud origin inspect uses configured URL (insteadOf-safe), prior Codex/Copilot/CodeRabbit threads resolved, no cursor[bot] Bugbot findings, PR left CLOSED | verify:cheap PASS (444 files / 4652 passed, 4 skipped); prettier --check . PASS; check:ci-scope PASS; verify-phone-chrome+codex-cloud-setup+test-runner-safety+playwright-project-isolation 59/59; merge-tree clean before merge; Bugbot none | | 2026-07-31 | PR-1485 | f4f42fbc5b4a73d0037c8c275a358d265727e0fc | post-review document accordion and catalogue sync | APPROVE; post-review changes limited to differential refetch memoization and current-main sync; no remaining findings | installed-lock parity; focused catalogue/document suites 3 files 19 tests PASS; typecheck PASS; issue and review-ledger guards PASS; zero unresolved threads | | 2026-07-31 | PR-1515 | 239a2ce6d708f8e1a6ac891c997baefec67cd9ab | PR #1515 CI triage and visible Playwright roots | No high-confidence defects; default-enabled trusted CI triage and visible-owner Playwright helper reviewed | check:installed-lock-parity; check:ci-triage; check:github-actions; check:outstanding-issues; check:branch-review-ledger; typecheck | | 2026-07-30 | codex/repair-pr1416 | 9f5c32270ecc2d606c3a483ddfbeebe3081d3b5d | branch-cleanup | exact merged PR #1416 head; inactive clean worktree archived in verified batch1 bundle | GitHub merged exact head, clean status, no Git operation, no open PR claim, bundle verify ok SHA256 18D9CFFD334278987D8FCCBED5F34125148BFF98C83D39287268103A5326BD2A | @@ -504,5 +499,11 @@ Records before 2026-07-28 were written by hand and had drifted: 146 lines carrie | 2026-07-31 | origin/claude/outstanding-issues-triage-24c8ow | d3c2a17a848be5458664355de4fd41d0933d2705 | branch-cleanup | safe remote delete: merged PR #1428 content and post-merge #122 disposition are superseded by later current-main issue records; archived batch19 | PR #1428 merged; post-merge tail inspection; current issue-row comparison; no local worktree; exact ls-remote SHA match; bundle verify | | 2026-07-31 | PR-1518 | 2fb0996e0208d3da04f941fdc1c1b4ab14d440d6 | PR #1518 archive validated issue 146 and add duplicated-list finding | APPROVE after current-main conflict repair; stale unvalidated claim corrected and unique issue 159 preserved | check:outstanding-issues PASS 157 rows 44 open 113 archived next-id 160; check:branch-review-ledger PASS; installed-lock parity PASS; diff check PASS | | 2026-07-31 | PR-1520 | 6e6998464a6996a66fdaaadcd482388e39af611e | PR #1520 branch and worktree reconciliation records | APPROVE; 146 historical cleanup dispositions retained as ledger-only evidence with no repository mutation | check:branch-review-ledger PASS 444 live 1206 archived; diff check PASS; current-main merge clean | +| 2026-07-31 | cursor/mode-page-redesign-handoff-7830 | 0ae080b618c7f8c802083520ec3dee28bd56504d | mode-page-redesign-comps-handoff | pass-with-findings | check:outstanding-issues; comps+issues #160-162; PR #1521; no production UI change | | 2026-07-31 | claude/issues-133-evidence | 5bb1bc8d8b1d3ba8aebdce5c348887c596f6b8e6 | docs/outstanding-issues.md: re-land #154 (id-allocation hazard) and #155 (--med-accent-soft) after PR #1506 closed unmerged | Recorded. Branch synced to origin/main; main had since taken #151 so the hazard row moved to #154 and --med-accent-soft landed as #155 (its fifth renumber) - both self-demonstrating the row's own claim. PR #1506 to be reopened by the user. | check:outstanding-issues exit 0 (153 rows, 45 open, 108 archived, unique ids, next-id=156, no ids deleted from base); verified zero origin/main ids lost after taking main's table as canonical; pre-push guard passed on pushed commit | | 2026-07-31 | claude/issues-133-evidence | 37f71f02f731175e4fed500f95529c3ef9eb568f | PR #1506 reopen prep: sync main, renumber hazard to #155, supersede #112 residual | READY — conflict cleared vs origin/main; main #154 preserved; hazard=#155 with archived #112 residual cross-link; med-accent=#156; false #155 evidence clause removed; Codex P2 addressed; Bugbot P1/P2 fixed; PR left CLOSED | check:outstanding-issues 154 rows/46 open next-id=157; check:branch-review-ledger 277 live; merge-tree clean da0c63d0; format no-op | +| 2026-07-31 | claude/search-results-mockups-iz7owo (PR #1514) | 1daa6b3d7979f2aed8e50b8a4661690bde5c1073 | closed-PR reopen prep | Synced origin/main (behind 68, merge-tree clean, no conflicts). No unresolved Codex/Bugbot/Copilot/human threads. Tip review: no P0-P2 (phone forms presentation only; clinicalRisk false, not RAG). Pathway guard narrowed intentionally; page-level exact guard intact. Ready for reopen; leave CLOSED. Fresh mergeability/CI count only after reopen. | ledger:lookup NOT REVIEWED; git fetch origin/main; merge-tree clean; git merge origin/main; gh reviewThreads=0; classifyPullRequestFiles clinicalRisk=false ragRanking=false; tip-vs-base review (no local suites; closed-PR CI treated stale; no provider-backed checks) | +| 2026-07-31 | claude/latency-findings-impl-s8g01v | 7056a3e73c568c0dd4cf8d43ab98f47eb9a63acc | PR #1505 docs #147 CLS attribution | ready-for-reopen: main synced, CI was green on prior head, no Bugbot threads; fixed P2 mis-attribution of /therapy-compass to overlay reserve (collapse-motion exception); left PR closed | check:outstanding-issues; prettier --check docs/outstanding-issues.md; git merge-tree clean; bugbot-style review no prior threads; diff-review P2 fixed | +| 2026-07-31 | codex/fix-search-retrieval-issues-and-run-canary | c45cd227be6d852865eb111a2a06486d1f2c62a0 | pr-1503 reopen-ready | approved: #098 next-action (b) prohibits wholesale collapse; main synced clean; docs-only delta; PR stays closed | format:check; check:outstanding-issues; check:branch-review-ledger; merge-tree clean; bugbot+codex P2 fixed | +| 2026-07-31 | codex/fix-search-retrieval-issues-and-run-canary | c45cd227be6d852865eb111a2a06486d1f2c62a0 | pr-1503-review | re-reviewed: Codex P2 fixed; merge-tree clean vs origin/main; docs-only; no Bugbot/P0-P1; PR remains CLOSED (GitHub headRefOid may lag closed PR) | merge-tree+diff-vs-main+#098-text; no push/reopen | +| 2026-07-31 | codex/fix-search-retrieval-issues-and-run-canary | e8de1aebd1b32d5e901853a3473a792a66aa82cf | pr-1503 reopen-ready | approved: #098 collapse ban kept after main sync; merge-tree clean; docs-only; PR stays closed | format:check; check:outstanding-issues; merge-tree clean; codex P2 fixed; bugbot clean | diff --git a/docs/outstanding-issues.md b/docs/outstanding-issues.md index ba97caa4f1..5d4e4cf160 100644 --- a/docs/outstanding-issues.md +++ b/docs/outstanding-issues.md @@ -78,8 +78,11 @@ removed after current-main verification; it is not missing recommended work. | 30 | `#102` | A3 | Operator — Supabase + Specialist | Next approved index window, after the ordering question is settled | 1–2 hours plus apply | Author the migration (operator SQL alone never reaches staging/DR/local replay), then apply → mirror `schema.sql` → regenerate drift manifest → register `required_indexes`. **Stop:** the RAG-path index is canary-gated, and ordering `fetchDocumentTitleAliasRows`'s unordered `.limit(12)` does not lift that — an imposed order can select a different twelve, so it is a second canary-gated change, not a way out of the first. The byte-identical claim was retracted. | | 31 | `#099` | A3 | Specialist — answer path | After `#098` | Half a day per sub-item | Remaining fixed per-request round trips: the 8 `setCachedSearch` deferrals (abort semantics + mutation window), the anonymous subject+global limiter pair (needs a new atomic RPC first), and proxy→route identity duplication. Stop before hand-authoring locking SQL. | | 32 | `#103` | A3 | Operator — Supabase schema | Same window as `#102` | 30–60 minutes | Confirm whether the wide `document_table_facts` trigram index from `20260714190000` exists live, then either mirror it into `schema.sql` (retained) or drop it via a forward migration (redundant). **Not the allowlist** — it suppresses live-vs-`schema.sql` findings only and cannot make the migration chain and the mirror agree. Stop: do not drop it without live scan evidence. | +| 33 | `#162` | A3 | High — frontend/UI | When starting the mode search redesign package | 0.5–1.5 days | Redesign `/tools?q=` as Compact Results Instrument (direction A): query-as-H1, one composer, dense tool rows, demote cross-mode cards, remove success-green filter banner and home hero on results. Comps in `public/mockups/mode-page-redesign-2026-07/tools-search/`. Verify phone+desktop chrome ownership and `verify:phone-chrome` / focused UI. Stop if scope expands into Tools home redesign without an explicit ask. | +| 34 | `#163` | A3 | High — frontend/UI | After or with `#162` | 0.5–1.5 days | Redesign `/services?q=` as Progressive Referral Workflow (direction B): H1 = query (not match count), progressive shortlist/compare (no always-on decision panel or giant step rail). Comps in `public/mockups/mode-page-redesign-2026-07/services-search/`. Verify referral shortlist still works; stop before changing Services home ModeHome. | +| 35 | `#164` | A3 | High — frontend/UI | Product confirmed Favourites is hybrid dashboard+search (no ModeHome) | 1–2 days | Redesign Favourites as one dashboard + search page: recommended Search-Led Workspace (direction B) — persistent search, sets as chips, Continue + recent + table on empty query, in-place filter on typed query. Comps in `public/mockups/mode-page-redesign-2026-07/favourites-hybrid/`. Do not reintroduce ModeHome for Favourites. Verify desktop+phone; stop before splitting into separate ModeHome routes. | - + ## Open items @@ -140,6 +143,9 @@ removed after current-main verification; it is not missing recommended work. | #155 | P2 | rec | Several agent sessions edit the same branch and ledger concurrently | **Outcome:** concurrent sessions stop silently undoing each other on shared `claude/*` branches and on this file. **Observed across one task on 2026-07-30/31:** (a) PR #1490 was **closed unmerged by another actor while auto-merge was armed**, and because arming had been treated as "done", the only record of four preservation snapshots went with it and had to be reconstructed as #152. (b) Three branches (`claude/organize-local-worktree-d22bc3`, `claude/root-dir-coverage-gate-v2`, `claude/capture-session-followups`) received pushes from a Cursor Agent and a Codex session mid-task, producing repeated non-fast-forward rejections; one rejection was masked because the push was piped to `tail`, so the reported exit code was `tail`'s and the push looked successful. (c) `scripts/guard-push.mjs` correctly refused a push with `Pushing now races the squash-merge and can orphan this commit`, requiring disarm to push then re-arm. (d) Ledger ids were renumbered underneath in-flight work (#135 to #141 to #144), which is the mechanism behind #154. **Next:** for a green ledger-only PR prefer merging it immediately over arming auto-merge; confirm a push landed with `git ls-remote` rather than the command's exit code; expect ids and row wording to move between reading and writing. **Stop:** do not treat auto-merge as completion, and do not assume a branch you pushed an hour ago still has your commit at its tip. | session 2026-07-30/31; PRs #1490, #1508, #1511 | 2026-07-31 | | #159 | P2 | rec | Lists naming test files are duplicated, and the stale copy fails by running nothing | **Outcome:** no gate, plan or config names a set of test files in a second place without being derived from the filesystem or asserted against it. **Detail:** four instances found on 2026-07-30, each failing the same way — not red, but silently running nothing: (1) `mockupPatterns` in `scripts/ci-change-scope.mjs` matched `-mockups.tsx` only, missing eight singular `-mockup.tsx` components and three of the five `@mockup` specs, so the advisory lane never started for them (PR #1453); (2) `scripts/phone-chrome-plan.mjs` grepped four ownership journeys out of a filename they had moved out of, selecting zero tests; (3) nothing under `tests/helpers/**` was in `uiPatterns`, so editing a shared Playwright fixture reported `ui_changed=false` and `Production UI` skipped entirely — `zero-touch.ts` alone backs six required specs, and this one predated the PR that found it; (4) a helper-only change ran four grepped cases in one of that helper's three consumers (Codex, PR #1466). Each is now guarded individually — `assertMockupSpecParity`, `tests/playwright-project-isolation.test.ts`, and the consumer-list parity test in `tests/verify-phone-chrome.test.ts` — but the general rule is enforced nowhere, so a fifth instance is a matter of time. **Next:** decide whether one gate can assert the class (any array or regex naming `tests/` paths is checked against `readdirSync`), or whether per-site guards are the honest ceiling. **Stop:** do not treat "CI would still have caught it" as a defence — in (3) CI did not, and in (2) and (4) the local gate the repo tells you to run reported green. | PR #1453; PR #1466; session 2026-07-30 | 2026-07-30 | | #161 | P3 | issue | Two mockup hover tokens are still undefined after `#141` closed | **Outcome:** every `var(--token)` in the repo either resolves or is knowingly exempt, with no unowned exceptions. **Detail:** `#141` closed on the production defect (`--clinical-accent-strong`, now defined in `globals.css` for light, dark and forced-colors), but two of the three genuinely-undefined references it listed are still undefined on `main`: `--primary-hover` and `--success-hover`, referenced at `src/components/favourites-page-mockups/favourites-library-redesign-page.tsx:203` and `:217`, with zero `--name:` definitions anywhere in the stylesheet. Confirmed against `origin/main` on 2026-07-31. Both declarations are therefore dropped at CSS parse time and those hover states silently do nothing. Impact is genuinely low — `*-mockups` is design scratch, 404s in production, and is exempt from the wiring and reachability gates — and `.design-sync/NOTES.md` already calls them lowest priority. This row exists because that note is prose in a tooling file, not a tracked item: with `#141` archived, nothing in this ledger owned them. **Next:** two-line fix when someone is next in that file — `--primary-hover` maps cleanly to `--primary-strong` (the existing `bg-[color:var(--primary)]` + `hover:bg-[color:var(--primary-strong)]` pattern in `badge.tsx:14`); `--success-hover` has no token to map to, since the success triad is text/bg/border with no darker step, so use a utility such as `hover:brightness-110` rather than inventing `--success-strong` for scratch. **Stop:** do not add a `--success-strong` token to `@theme` solely for a mockup, and do not treat this as production-urgent — it is a tidy-up, not a defect users can reach. | `#141` residue; verified against `origin/main` 2026-07-31 | 2026-07-31 | +| #162 | P2 | task | Redesign Tools search results state (Compact Results Instrument) | **Outcome:** `/tools?q=` is a committed results page: query-as-H1, one composer, dense tool rows; cross-mode demoted; no home hero / green filter banner / dual H1. **Product pick:** direction A from comps in `public/mockups/mode-page-redesign-2026-07/tools-search/`. **Next:** implement A on production Tools search; verify desktop+phone chrome ownership. **Stop:** do not redesign Tools home in the same PR unless asked. Renumbered after `main` took `#161` for mockup hover-token residue. | session 2026-07-31 mode-page design audit | 2026-07-31 | +| #163 | P2 | task | Redesign Services search results (Progressive Referral Workflow) | **Outcome:** `/services?q=` uses query-as-H1 (not match-count), progressive shortlist/compare, no always-on decision panel or giant step rail. **Product pick:** direction B from comps in `public/mockups/mode-page-redesign-2026-07/services-search/`. **Next:** implement B; keep referral shortlist behaviour. **Stop:** do not change Services ModeHome in the same PR. | session 2026-07-31 mode-page design audit | 2026-07-31 | +| #164 | P2 | task | Redesign Favourites as hybrid dashboard + search (no ModeHome) | **Outcome:** `/favourites` is one dashboard+search workspace; empty query shows Continue/recent/sets/table; typed query filters in place; no ModeHome hero. **Product pick:** Search-Led Workspace (direction B) from comps in `public/mockups/mode-page-redesign-2026-07/favourites-hybrid/`. User rejected ModeHome for Favourites. **Next:** implement B; retire command-library marketing H1 and redundant dual search. **Stop:** do not reintroduce ModeHome or a separate Favourites home route. | session 2026-07-31 mode-page design audit; user Favourites hybrid decision | 2026-07-31 | ## Resolved / archive diff --git a/mockups/README.md b/mockups/README.md index 421439511c..91bfb3f640 100644 --- a/mockups/README.md +++ b/mockups/README.md @@ -36,3 +36,15 @@ Runnable mockups under `src/app/mockups/*` inherit the shared Clinical KB header The document-search mockups use generated non-patient bitmap assets in `public/mockups/document-search/`. These images are abstract UI/document textures only: they must not be treated as source screenshots, hospital-branded material, or clinical content. Some document-search mockups include live handoff routes (for example `document-search/source-overlays`) that resolve into the real document viewer with a selected page and chunk when indexed data is available locally. + +## Mode-page redesign comps (2026-07-31) + +Static desktop/phone comps for the pages that need redesign (not ModeHome mockups for Favourites) live under [`public/mockups/mode-page-redesign-2026-07/`](../public/mockups/mode-page-redesign-2026-07/README.md): + +| Page | Recommended direction | Issue | +| --------------------------------------------------- | --------------------------------- | ------ | +| Tools search | A — Compact Results Instrument | `#162` | +| Services search | B — Progressive Referral Workflow | `#163` | +| Favourites (hybrid dashboard + search, no ModeHome) | B — Search-Led Workspace | `#164` | + +These are PNGs for design review only. Runnable `/mockups/*` routes are a separate implementation step. diff --git a/public/mockups/mode-page-redesign-2026-07/README.md b/public/mockups/mode-page-redesign-2026-07/README.md new file mode 100644 index 0000000000..46eb14be40 --- /dev/null +++ b/public/mockups/mode-page-redesign-2026-07/README.md @@ -0,0 +1,43 @@ +# Mode-page redesign comps (2026-07-31) + +Static design comps from the mode home / search / info design audit. Not runnable routes — +browse the PNGs here, or open them from the repo. Production pages are unchanged until an +implementation PR lands. + +Clinical White / Sky Graphite only. Desktop 16:9 + phone 9:16 for each direction. + +## Redesign candidates + +| Page | Route | Action | Recommended direction | +| --------------- | ------------------------ | ------------------------------------------------------- | ------------------------------------- | +| Tools search | `/tools?q=…` | Urgent redesign | **A — Compact Results Instrument** | +| Services search | `/services?q=…` | Redesign | **B — Progressive Referral Workflow** | +| Favourites | `/favourites` (+ search) | Redesign as **hybrid dashboard + search** (no ModeHome) | **B — Search-Led Workspace** | + +### Tools search (`tools-search/`) + +- **A** `tools-search-redesign-a-compact-results[.png|-phone.png]` — query-as-H1, one composer, dense rows, cross-mode collapsed (**recommended**) +- **B** `tools-search-redesign-b-dense-launcher-list*` — list + sticky tool brief +- **C** `tools-search-redesign-c-split-command*` — master/detail workspace + +### Services search (`services-search/`) + +- **A** `services-search-redesign-a-query-h1-results*` — query-as-H1, floating shortlist chip +- **B** `services-search-redesign-b-progressive-workflow*` — tiny step dots + shortlist banner when selected (**recommended**) +- **C** `services-search-redesign-c-dense-referral-table*` — power-user table + +### Favourites hybrid (`favourites-hybrid/`) + +Product decision: Favourites is **not** a ModeHome. It is one combined dashboard + search page. + +- **A** `favourites-hybrid-a-unified-library-desk*` — elevated 3-column library desk +- **B** `favourites-hybrid-b-search-led-workspace*` — no middle rail; search-first; sets as chips (**recommended**) +- **C** `favourites-hybrid-c-operational-command*` — metrics + fused toolbar + list/preview + +### Current baselines (`current/`) + +Live screenshots captured after `npm run ensure` (1280×900 / 390×844). Use the URL it prints for side-by-side comparison. + +## Implementation queue + +Tracked in `docs/outstanding-issues.md` as `#162` (Tools), `#163` (Services), `#164` (Favourites hybrid). diff --git a/public/mockups/mode-page-redesign-2026-07/current/current-favourites-home-desktop.png b/public/mockups/mode-page-redesign-2026-07/current/current-favourites-home-desktop.png new file mode 100644 index 0000000000..b726bcb4e6 Binary files /dev/null and b/public/mockups/mode-page-redesign-2026-07/current/current-favourites-home-desktop.png differ diff --git a/public/mockups/mode-page-redesign-2026-07/current/current-favourites-home-phone.png b/public/mockups/mode-page-redesign-2026-07/current/current-favourites-home-phone.png new file mode 100644 index 0000000000..1d616b3e3a Binary files /dev/null and b/public/mockups/mode-page-redesign-2026-07/current/current-favourites-home-phone.png differ diff --git a/public/mockups/mode-page-redesign-2026-07/current/current-favourites-search-desktop.png b/public/mockups/mode-page-redesign-2026-07/current/current-favourites-search-desktop.png new file mode 100644 index 0000000000..dcc679a0a7 Binary files /dev/null and b/public/mockups/mode-page-redesign-2026-07/current/current-favourites-search-desktop.png differ diff --git a/public/mockups/mode-page-redesign-2026-07/current/current-favourites-search-phone.png b/public/mockups/mode-page-redesign-2026-07/current/current-favourites-search-phone.png new file mode 100644 index 0000000000..6924d227e0 Binary files /dev/null and b/public/mockups/mode-page-redesign-2026-07/current/current-favourites-search-phone.png differ diff --git a/public/mockups/mode-page-redesign-2026-07/current/current-services-search-desktop.png b/public/mockups/mode-page-redesign-2026-07/current/current-services-search-desktop.png new file mode 100644 index 0000000000..a955c3ff16 Binary files /dev/null and b/public/mockups/mode-page-redesign-2026-07/current/current-services-search-desktop.png differ diff --git a/public/mockups/mode-page-redesign-2026-07/current/current-services-search-phone.png b/public/mockups/mode-page-redesign-2026-07/current/current-services-search-phone.png new file mode 100644 index 0000000000..46e089bed2 Binary files /dev/null and b/public/mockups/mode-page-redesign-2026-07/current/current-services-search-phone.png differ diff --git a/public/mockups/mode-page-redesign-2026-07/current/current-tools-search-desktop.png b/public/mockups/mode-page-redesign-2026-07/current/current-tools-search-desktop.png new file mode 100644 index 0000000000..847754d2ad Binary files /dev/null and b/public/mockups/mode-page-redesign-2026-07/current/current-tools-search-desktop.png differ diff --git a/public/mockups/mode-page-redesign-2026-07/current/current-tools-search-phone.png b/public/mockups/mode-page-redesign-2026-07/current/current-tools-search-phone.png new file mode 100644 index 0000000000..e37bd19323 Binary files /dev/null and b/public/mockups/mode-page-redesign-2026-07/current/current-tools-search-phone.png differ diff --git a/public/mockups/mode-page-redesign-2026-07/favourites-hybrid/favourites-hybrid-a-unified-library-desk-desktop.png b/public/mockups/mode-page-redesign-2026-07/favourites-hybrid/favourites-hybrid-a-unified-library-desk-desktop.png new file mode 100644 index 0000000000..ee958305e1 Binary files /dev/null and b/public/mockups/mode-page-redesign-2026-07/favourites-hybrid/favourites-hybrid-a-unified-library-desk-desktop.png differ diff --git a/public/mockups/mode-page-redesign-2026-07/favourites-hybrid/favourites-hybrid-a-unified-library-desk-phone.png b/public/mockups/mode-page-redesign-2026-07/favourites-hybrid/favourites-hybrid-a-unified-library-desk-phone.png new file mode 100644 index 0000000000..27b392bf4f Binary files /dev/null and b/public/mockups/mode-page-redesign-2026-07/favourites-hybrid/favourites-hybrid-a-unified-library-desk-phone.png differ diff --git a/public/mockups/mode-page-redesign-2026-07/favourites-hybrid/favourites-hybrid-b-search-led-workspace-desktop.png b/public/mockups/mode-page-redesign-2026-07/favourites-hybrid/favourites-hybrid-b-search-led-workspace-desktop.png new file mode 100644 index 0000000000..61a7154477 Binary files /dev/null and b/public/mockups/mode-page-redesign-2026-07/favourites-hybrid/favourites-hybrid-b-search-led-workspace-desktop.png differ diff --git a/public/mockups/mode-page-redesign-2026-07/favourites-hybrid/favourites-hybrid-b-search-led-workspace-phone.png b/public/mockups/mode-page-redesign-2026-07/favourites-hybrid/favourites-hybrid-b-search-led-workspace-phone.png new file mode 100644 index 0000000000..0bd63e4c71 Binary files /dev/null and b/public/mockups/mode-page-redesign-2026-07/favourites-hybrid/favourites-hybrid-b-search-led-workspace-phone.png differ diff --git a/public/mockups/mode-page-redesign-2026-07/favourites-hybrid/favourites-hybrid-c-operational-command-desktop.png b/public/mockups/mode-page-redesign-2026-07/favourites-hybrid/favourites-hybrid-c-operational-command-desktop.png new file mode 100644 index 0000000000..7921108e10 Binary files /dev/null and b/public/mockups/mode-page-redesign-2026-07/favourites-hybrid/favourites-hybrid-c-operational-command-desktop.png differ diff --git a/public/mockups/mode-page-redesign-2026-07/favourites-hybrid/favourites-hybrid-c-operational-command-phone.png b/public/mockups/mode-page-redesign-2026-07/favourites-hybrid/favourites-hybrid-c-operational-command-phone.png new file mode 100644 index 0000000000..f356009230 Binary files /dev/null and b/public/mockups/mode-page-redesign-2026-07/favourites-hybrid/favourites-hybrid-c-operational-command-phone.png differ diff --git a/public/mockups/mode-page-redesign-2026-07/services-search/services-search-redesign-a-query-h1-results-phone.png b/public/mockups/mode-page-redesign-2026-07/services-search/services-search-redesign-a-query-h1-results-phone.png new file mode 100644 index 0000000000..ea9774be03 Binary files /dev/null and b/public/mockups/mode-page-redesign-2026-07/services-search/services-search-redesign-a-query-h1-results-phone.png differ diff --git a/public/mockups/mode-page-redesign-2026-07/services-search/services-search-redesign-a-query-h1-results.png b/public/mockups/mode-page-redesign-2026-07/services-search/services-search-redesign-a-query-h1-results.png new file mode 100644 index 0000000000..b2f195f754 Binary files /dev/null and b/public/mockups/mode-page-redesign-2026-07/services-search/services-search-redesign-a-query-h1-results.png differ diff --git a/public/mockups/mode-page-redesign-2026-07/services-search/services-search-redesign-b-progressive-workflow-phone.png b/public/mockups/mode-page-redesign-2026-07/services-search/services-search-redesign-b-progressive-workflow-phone.png new file mode 100644 index 0000000000..859850c6d0 Binary files /dev/null and b/public/mockups/mode-page-redesign-2026-07/services-search/services-search-redesign-b-progressive-workflow-phone.png differ diff --git a/public/mockups/mode-page-redesign-2026-07/services-search/services-search-redesign-b-progressive-workflow.png b/public/mockups/mode-page-redesign-2026-07/services-search/services-search-redesign-b-progressive-workflow.png new file mode 100644 index 0000000000..f4d7d1cee7 Binary files /dev/null and b/public/mockups/mode-page-redesign-2026-07/services-search/services-search-redesign-b-progressive-workflow.png differ diff --git a/public/mockups/mode-page-redesign-2026-07/services-search/services-search-redesign-c-dense-referral-table-phone.png b/public/mockups/mode-page-redesign-2026-07/services-search/services-search-redesign-c-dense-referral-table-phone.png new file mode 100644 index 0000000000..91c1c916e6 Binary files /dev/null and b/public/mockups/mode-page-redesign-2026-07/services-search/services-search-redesign-c-dense-referral-table-phone.png differ diff --git a/public/mockups/mode-page-redesign-2026-07/services-search/services-search-redesign-c-dense-referral-table.png b/public/mockups/mode-page-redesign-2026-07/services-search/services-search-redesign-c-dense-referral-table.png new file mode 100644 index 0000000000..11f246678a Binary files /dev/null and b/public/mockups/mode-page-redesign-2026-07/services-search/services-search-redesign-c-dense-referral-table.png differ diff --git a/public/mockups/mode-page-redesign-2026-07/tools-search/tools-search-redesign-a-compact-results-phone.png b/public/mockups/mode-page-redesign-2026-07/tools-search/tools-search-redesign-a-compact-results-phone.png new file mode 100644 index 0000000000..d5bc2945fc Binary files /dev/null and b/public/mockups/mode-page-redesign-2026-07/tools-search/tools-search-redesign-a-compact-results-phone.png differ diff --git a/public/mockups/mode-page-redesign-2026-07/tools-search/tools-search-redesign-a-compact-results.png b/public/mockups/mode-page-redesign-2026-07/tools-search/tools-search-redesign-a-compact-results.png new file mode 100644 index 0000000000..9254c722ff Binary files /dev/null and b/public/mockups/mode-page-redesign-2026-07/tools-search/tools-search-redesign-a-compact-results.png differ diff --git a/public/mockups/mode-page-redesign-2026-07/tools-search/tools-search-redesign-b-dense-launcher-list-phone.png b/public/mockups/mode-page-redesign-2026-07/tools-search/tools-search-redesign-b-dense-launcher-list-phone.png new file mode 100644 index 0000000000..a79d4477e7 Binary files /dev/null and b/public/mockups/mode-page-redesign-2026-07/tools-search/tools-search-redesign-b-dense-launcher-list-phone.png differ diff --git a/public/mockups/mode-page-redesign-2026-07/tools-search/tools-search-redesign-b-dense-launcher-list.png b/public/mockups/mode-page-redesign-2026-07/tools-search/tools-search-redesign-b-dense-launcher-list.png new file mode 100644 index 0000000000..12016b5233 Binary files /dev/null and b/public/mockups/mode-page-redesign-2026-07/tools-search/tools-search-redesign-b-dense-launcher-list.png differ diff --git a/public/mockups/mode-page-redesign-2026-07/tools-search/tools-search-redesign-c-split-command-phone.png b/public/mockups/mode-page-redesign-2026-07/tools-search/tools-search-redesign-c-split-command-phone.png new file mode 100644 index 0000000000..28e4077e31 Binary files /dev/null and b/public/mockups/mode-page-redesign-2026-07/tools-search/tools-search-redesign-c-split-command-phone.png differ diff --git a/public/mockups/mode-page-redesign-2026-07/tools-search/tools-search-redesign-c-split-command.png b/public/mockups/mode-page-redesign-2026-07/tools-search/tools-search-redesign-c-split-command.png new file mode 100644 index 0000000000..60eaf1a71f Binary files /dev/null and b/public/mockups/mode-page-redesign-2026-07/tools-search/tools-search-redesign-c-split-command.png differ diff --git a/tests/ui-phone-scroll-page-owned.spec.ts b/tests/ui-phone-scroll-page-owned.spec.ts index cdb2d89de9..78d4105194 100644 --- a/tests/ui-phone-scroll-page-owned.spec.ts +++ b/tests/ui-phone-scroll-page-owned.spec.ts @@ -720,24 +720,39 @@ test("Services results keep a continuous browser viewport after shared chrome re // scroll. Document ownership must keep the reading offset and its content // anchor stable without switching back to a fixed or nested canvas. await page.setViewportSize({ width: phoneViewport.width, height: phoneViewport.height - 64 }); - // Wait for the chrome to settle rather than sleeping a fixed 100 ms and hoping - // (#146). The resize transiently re-shows the shared header, and while it is up - // the results anchor sits exactly `collapseHeight + safe-area-top` lower — 72 + 59 - // = the 131 px jump that failed this assertion identically on three separate - // heads, with `documentScrollTop` unchanged at 504 in the trace, so the content - // moved and the scroll position never did. A fixed sleep makes that a coin flip - // against CI load; polling the same geometry the hidden-state assertions use - // either settles or fails naming the real condition. + // Wait for chrome *and* the result anchor to settle rather than sleeping + // (#146). The resize transiently re-shows the shared header, and while it is + // up the results anchor sits exactly `collapseHeight + safe-area-top` lower — + // 72 + 59 = the 131 px jump that failed this assertion on multiple heads, + // with `documentScrollTop` unchanged, so the content moved and the scroll + // position never did. Polling only `header.bottom <= 1` is a false settle: + // the bar can clear the top edge a frame before `data-scroll-hidden` and the + // content anchor finish recovering (reproduced on PR #1521 tip `061468e4`, + // Production UI shard 1). Require the hidden attributes plus the pre-resize + // anchor so the poll names the real condition or times out on it. await expect .poll( () => - page.evaluate(() => { + page.evaluate((expectedAnchorTop) => { const header = document.querySelector("header#search"); - return header?.getBoundingClientRect().bottom ?? -1; - }), - { timeout: 10_000, message: "shared header did not re-settle hidden after the viewport shrink" }, + const collapse = document.querySelector('[data-testid="universal-header-collapse"]'); + const dock = document.querySelector(".answer-footer-search-dock"); + const resultList = document.querySelector('[data-testid="service-search-results"]'); + const headerBottom = header?.getBoundingClientRect().bottom ?? -1; + const anchorTop = resultList?.getBoundingClientRect().top ?? Number.NaN; + const chromeHidden = + headerBottom <= 1 && + collapse?.getAttribute("data-scroll-hidden") === "true" && + dock?.getAttribute("data-scroll-hidden") === "true"; + const anchorStable = Number.isFinite(anchorTop) && Math.abs(anchorTop - expectedAnchorTop) < 0.5; + return chromeHidden && anchorStable; + }, hidden.anchorTop), + { + timeout: 10_000, + message: "shared chrome and Services result anchor did not re-settle after the viewport shrink", + }, ) - .toBeLessThanOrEqual(1); + .toBe(true); const afterViewportResize = await page.evaluate(() => { const main = document.getElementById("main-content"); const resultList = document.querySelector('[data-testid="service-search-results"]');