diff --git a/docs/branch-review-ledger.md b/docs/branch-review-ledger.md index f8cd26bea9..d87d933dda 100644 --- a/docs/branch-review-ledger.md +++ b/docs/branch-review-ledger.md @@ -1138,6 +1138,10 @@ Records before 2026-07-28 were written by hand and had drifted: 146 lines carrie | 2026-07-28 | PR #1291 / `claude/issues-upload-limit-sync-123366` | `1607558188283d3497683f1067835d96f1031d3c` | CI babysit + merge conflict + Bugbot | FIXED. GitHub CONFLICTING/DIRTY was a real content conflict in `docs/outstanding-issues.md`: main had claimed `#084` for completed per-result grading evidence, colliding with this PR's upload-limit capture. Resolved by keeping main's ledger, renumbering the upload-limit recommendation to `#085`, and bumping `issues:next-id` to `086`. Synced again when main advanced with #1300. CodeRabbit date thread already resolved. Bugbot: zero `cursor[bot]` findings. Required CI green (PR required SUCCESS). | merge-tree CLEAN; prettier + docs:check-links PASS; hosted Change scope/Static/PR required SUCCESS; no provider-backed checks. | | 2026-07-28 | PR #1291 / `claude/issues-upload-limit-sync-123366` | `af140d11d5ca23dee0d8705d9933db967fc8c404` | Babysit closeout tip | Supersedes prior #1291 row at `16075581` after appending the conflict/Bugbot ledger record. Product delta vs main unchanged: `#085` upload-limit capture only. merge-tree CLEAN; awaiting exact-head required checks. | ledger append + check:branch-review-ledger PASS; prior tip hosted PR required SUCCESS. | | 2026-07-28 | PR #1302 / `claude/maturity-ledger-entry` | `64da2c1b34ae101590b8676af12ec6b49c14f0ad` | CI/conflict babysit + Codex threads + Bugbot | FIXED. Real content conflict with main: `#085` already claimed by upload-limit rec (#1291). Merged origin/main; renumbered maturity backlog to `#086`, bumped `issues:next-id` to `087`, added recommended-queue order 29 with go-ahead/RAG/provider stop rules. X7/M1 work orders arrived via main #1299. Codex P2 threads replied + resolved. Bugbot: zero cursor[bot] findings. CircleCI stub from main clears prior "no configuration" status error. | merge-tree CLEAN; prettier + docs:check-links + docs:check-scripts PASS; awaiting exact-head hosted CI; no provider-backed checks. | +| 2026-07-28 | PR #1295 / `fix/audit-remediation-from-main` | `11585678d28a9f399217429972e528b89b7f2466` | CI fix + main sync + Bugbot | FIXED. Unit coverage failed because therapy-compass contract still asserted `lg:grid-cols-[repeat(auto-fit,minmax(15rem,1fr))]` after intentional `sm:` breakpoint change in mode-home-template. Updated contract to `sm:`. GitHub CONFLICTING/DIRTY was stale base (30 behind); merge-tree clean; merged origin/main (ledger union). Bugbot: zero cursor[bot] review findings/threads. No unresolved review comments to resolve. | Focused vitest therapy-compass-responsive-contract 10/10; merge origin/main CLEAN; no provider-backed checks. | +| 2026-07-28 | PR #1295 / `fix/audit-remediation-from-main` | `5714bf6ceb9d85e18e895b34ec71dcca64837797` | Separator pairing follow-up after sm grid | FIXED. Coherent follow-up to the sm:grid-cols auto-fit change: stack separators are now `max-sm:border-t` (was unconditional `border-t`), matching the phone-only stack and avoiding double borders once `lg:border` card chrome applies. Contract asserts sm grid + max-sm separator and rejects stale lg grid token. | Focused vitest therapy-compass-responsive-contract 10/10; verify:cheap PASS (405 files / 4114 passed); merge-tree CLEAN; Bugbot 0 findings; no provider checks. | +| 2026-07-28 | PR #1295 / `fix/audit-remediation-from-main` | `862be5a843708360ad0d67239429d1d09405e570` | Codex P1: Playwright matrix browser install | FIXED. Cross-browser `playwright.yml` stopped using chromium-only `setup-ui-e2e`; installs `matrix.project` + deps with per-browser cache. Also dispositioned the Codex P1 about the responsive contract (already fixed earlier on tip). | check:github-actions PASS; focused vitest therapy-compass 10/10; no provider checks. | +| 2026-07-28 | PR #1295 / `fix/audit-remediation-from-main` | `4e10b1c017e40ee00649735dc4a771b720db193b` | CodeRabbit workflow hardening + bundle-size RAM flake | FIXED. bundle-size paths+permissions; nightly-drift secret scoping + main-only live steps; GITHUB_ACTIONS warn-only for guard-next-build RAM check; audit-plan Batch 2/approval-gate text repaired. mode-home max-sm separator already on tip (dispositions CodeRabbit border thread). | check:github-actions PASS; prior verify:cheap PASS; no provider checks. | | 2026-07-28 | PR #1296 / `css-layout-audit-complete` | `30596680a1c0026ea83c8fab0da2cd303106e1af` | Merge conflict + CodeRabbit/Codex + Bugbot closeout | FIXED. Merged origin/main (was CONFLICTING). Removed undersized `.content-visibility-auto` (80px) in favor of shared `.content-auto` (auto 320px); dropped persistent broad `will-change: transform` so fixed composer ancestors stay viewport-anchored (main's `data-reserve-transitioning` padding-bottom scope retained); kept semantic z-* utilities + AccessibleTable `@container`/`flex flex-col`. Updated mode-menu source-contract test for `z-modal`. Resolved CodeRabbit + Codex threads. Local Bugbot: no P0/P1; skipped raising mockup/popover z above token scale (would undo audit). | `npm run test` 4114 passed; prior verify:cheap gates green before test pin fix; no provider-backed checks. | | 2026-07-28 | PR #1296 / `css-layout-audit-complete` | `f333ddc8` | CI Build flake: RAM guard | FIXED. Hosted Build failed on ubuntu-24.04 reporting 7.8 GiB because `guard-next-build.mjs` hard-exited under 10 GiB; successful sibling Build jobs skip that path on larger runners. Warn-only under CI/GITHUB_ACTIONS; keep local hard-fail. Prior tip: Unit/Static/Advisory UI green; review threads resolved. | Hosted Unit/Static/Advisory PASS on 6bafb32d; local full vitest 4114; no provider checks. | | 2026-07-28 | PR #1296 / `css-layout-audit-complete` | `0ab3597fecd1fd7af669c766bf4b66fa725c9936` | CI re-trigger after Docker RAM allow | FIXED app-image path: Dockerfile sets DOCKER_BUILD=1; guard warns under CI/GITHUB_ACTIONS/DOCKER_BUILD/ALLOW_LOW_MEMORY_NEXT_BUILD. Hosted Build/Unit/Static/Advisory/Production UI green on prior tip; app-image failed only on RAM hard-stop before Docker opt-in. | Awaiting exact-head CI after synchronize; no provider checks. | @@ -1179,6 +1183,7 @@ Records before 2026-07-28 were written by hand and had drifted: 146 lines carrie | 2026-07-28 | PR #1304 / `fix-test-run-lock` | `7cc32c053c752bef19f3de408a1376428e54af74` | CI babysit: sync main | FIXED. GitHub CONFLICTING/DIRTY was staleness only (`git merge-tree` CLEAN; 7 behind). Merged origin/main. Required CI was already SUCCESS on prior tip `e6b826ed`; no product conflicts. Unique vs main remains knip.json (+ ledger). Bugbot/review threads: none unresolved. | merge-tree CLEAN; merge origin/main; no provider-backed checks. | | 2026-07-28 | PR #1310 / `claude/branch-review-ledger-fixes-42575f` (merged) | 422e43d86a69c88368454065c2b117f5982a43d6 | prlanded | LANDED as squash 422e43d86. Ledger repair + lookup/append tooling + hardened guard all present on main; guard PASS at 1107 records and repo-hygiene 25/25. Review improved the branch before merge and main is ahead of the authoring branch: findReviews now compares scope exactly (the original substring match would have let a branch-cleanup-deletion-pending row satisfy a branch-cleanup lookup and skip a branch that still needed cleanup), refTokens no longer false-hits on bare parenthetical prose, headMatches accepts an annotated 'sha (squash)' cell and rejects 'n/a - see ', and resolveHead now verifies full-length hex so a mistyped 40-char string cannot become an unmatchable HEAD. Authoring branch was deleted at merge; its unpushed local ledger-record commit was superseded by this row rather than pushed. | npm run check:branch-review-ledger PASS (1107 records) and vitest tests/repo-hygiene.test.ts 25/25 PASS, both run against origin/main after the merge. Pre-merge npm run verify:pr-local PASS on the merged tree (405 files / 4126 tests, build 3.7min). No provider-backed checks run. | | 2026-07-28 | PR #1305 / execute-audit-remediation-fixes | b101b69631edfe51bcbbc8f6c07e47157fe2c4e8 | CI green closeout after main re-sync | APPROVE for merge by human. Hosted PR required + Production UI PASS on tip after merging origin/main (#1320). MERGEABLE. Unresolved review threads 0. Bugbot-equivalent: no P0/P1/P2 on unique product delta; @cursor review requested. Product delta retained: clinical-notes trust gating answer wipe, SettingsStateProvider wiring, z-index ladder, OverlayProvider/card fixes, phone chrome viewport breakpoints. | Hosted PR policy/Static/Build/Unit/Safety/Advisory/Production UI/PR required PASS on b101b696; check:branch-review-ledger PASS; no provider-backed checks. | +| 2026-07-28 | PR #1295 / `fix/audit-remediation-from-main` | `3ff686e4957f5261c3d23d48e7a8195a60a8c800` | Main sync + container-images RAM guard | FIXED. GitHub CONFLICTING/DIRTY after main advanced 9 commits; real conflict only in `scripts/guard-next-build.mjs`. Kept main's `ALLOW_LOW_RAM_BUILD` / `evaluateNextBuildRamGuard` (+ Dockerfile/docker-image.yml wiring) which unblocks the container-images failure (Docker build lacked GITHUB_ACTIONS so the prior GITHUB_ACTIONS-only soften still hard-failed at 7.8 GiB). | Focused vitest guard-next-build+container-ci+therapy-compass 18/18; check:github-actions + ledger PASS; merge-tree CLEAN post-resolve; no provider checks. | | 2026-07-28 | PR-1297 | 5c7c4ff8cc92a3af1cd0a65898067272f332809e | PR #1297 full diff vs origin/main | APPROVE after main sync; no high-confidence P0-P2 defects | Local diff review and merge-tree clean; prior exact-head PR required, build, unit coverage, and Production UI passed; new exact-head CI pending | | 2026-07-28 | PR #1304 / `fix-test-run-lock` | `2abe39506f9f0ceaf8cf638bfa2b6dc37dc0ed2c` | CI babysit: resync main | FIXED. After green PR required on `f7d86c27`, main advanced by 1 commit (#1305); GitHub DIRTY again but `git merge-tree` CLEAN. Merged origin/main. No product conflicts; unique delta still knip.json (+ ledger). | merge-tree CLEAN; hosted PR required SUCCESS on prior tip; no provider-backed checks. | | 2026-07-28 | PR #1304 / `fix-test-run-lock` | `463e5c0adc77fe722e20376666f5991db3e288d9` | CI babysit closeout | MERGE-READY. Hosted PR required SUCCESS on exact tip; mergeable=MERGEABLE; 0 behind main; merge-tree CLEAN. Unique product delta: knip.json removes unused tailwindcss ignoreDependencies. Prior GitHub DIRTY labels during babysit were main-churn only. | Hosted CI run success on 463e5c0a; no provider-backed checks. | @@ -1196,3 +1201,5 @@ Records before 2026-07-28 were written by hand and had drifted: 146 lines carrie | 2026-07-28 | PR #1316 / `claude/top-search-design-mockups-w53znc` | `7b968d695c4545e1677c2e7f136172ef686d0012` | CI/review closeout: loadError split + adoption mode homes | FIXED new Codex P2s. Separated account loadError from mutation error; expanded band adoption to mode href pages + 2-hop reach; prior #024/favourites-counts/therapy-retry threads already resolved. Merge-tree clean vs main (0 behind). Bugbot earlier pass had no P0/P1 on prior WIP. | vitest favourites-account-retry + adoption + hub (10); typecheck; full suite 4232/4 prior tip | | 2026-07-28 | PR #1296 / `css-layout-audit-complete` | `84d846d8d0d168ca2babcc6d699e0a88bb0379c0` | Inspect closeout: sync main + forced-colors scope | FIXED. GitHub CONFLICTING was unpushed main sync (local merge-tree CLEAN, 3 behind on remote tip). Pushed merge. Bugbot P2: removed broad forced-colors `!important` wipe on `.edge-glass-header`/`[aria-selected=true]`/`.surface-raised` (token remap retained; header Canvas fill already earlier). Mockup board `z-[2147483647]` → ladder `z-[100]`. Prior CodeRabbit/Codex threads remain resolved. | lint/typecheck/format:check PASS; vitest 4197; local build PASS; no provider checks. | | 2026-07-28 | PR #1296 / `css-layout-audit-complete` | `f7c34fd7` | Sync main #1297 CSS/motion audit | FIXED. GitHub CONFLICTING after main landed #1297; `git merge origin/main` clean (globals.css + ledger auto-merge). Retained content-auto, scoped forced-colors token remap, mockup z-[100]. Prior tip hosted PR required SUCCESS. | merge-tree CLEAN; focused nav test PASS; no provider checks. | +| 2026-07-28 | PR-1295 | 2d474c973828736bc199c59136018220debb9907 | PR #1295 final remediation vs current origin/main | APPROVE after exact-head CI; redundant workflows and stale audit artifacts removed, tablet action cards aligned | Clean merge-tree; ledger guard PASS; diff check PASS; verify:pr-local dry-run selected runtime, lock parity, format, lint, typecheck, full test, build, and RAG fixture checks; local execution unavailable because node_modules is absent | +| 2026-07-28 | fix/audit-remediation-from-main | 88deecfb988da030d806b1d8c0a4c8349502a5f8 | stale-checkout P0 regression discovery | P0 regressions found in stale file checkouts | Confirmed affected worker/main.ts and tests/reconciliation-preflight.test.ts; superseded by later remediation and current final review | diff --git a/src/components/mode-home-template.tsx b/src/components/mode-home-template.tsx index fb7e2af9c2..dbb1bfe19b 100644 --- a/src/components/mode-home-template.tsx +++ b/src/components/mode-home-template.tsx @@ -262,7 +262,7 @@ export function ModeHomeTemplate({ {actions?.length ? (
{actions.map((action, index) => { const ActionIcon = action.icon; @@ -286,10 +286,11 @@ export function ModeHomeTemplate({ ); const actionClassName = cn( - "mode-home-action group grid min-h-[4.4rem] w-full grid-cols-[2.5rem_minmax(0,1fr)_1.25rem] items-center gap-3 bg-[color:var(--surface)] px-4 py-3 text-left transition hover:bg-[color:var(--surface-subtle)] focus-visible:relative focus-visible:z-10 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[color:var(--focus)] disabled:cursor-wait disabled:opacity-60 sm:min-h-[4.4rem] sm:grid-cols-[2.5rem_minmax(0,1fr)_1.25rem] sm:px-4 sm:py-3 lg:min-h-[4.75rem] lg:grid-cols-[2.75rem_minmax(0,1fr)_1rem] lg:gap-3 lg:rounded-lg lg:border lg:border-[color:var(--border)] lg:px-5 lg:py-3.5 lg:shadow-[var(--shadow-card)]", - // Phone stack separator only — at lg each action is its own card - // with `lg:border`, so do not zero the card's top edge. - index > 0 && "max-lg:border-t max-lg:border-[color:var(--border)]", + "mode-home-action group grid min-h-[4.4rem] w-full grid-cols-[2.5rem_minmax(0,1fr)_1.25rem] items-center gap-3 bg-[color:var(--surface)] px-4 py-3 text-left transition hover:bg-[color:var(--surface-subtle)] focus-visible:relative focus-visible:z-10 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[color:var(--focus)] disabled:cursor-wait disabled:opacity-60 sm:min-h-[4.4rem] sm:grid-cols-[2.5rem_minmax(0,1fr)_1.25rem] sm:rounded-lg sm:border sm:border-[color:var(--border)] sm:px-4 sm:py-3 sm:shadow-[var(--shadow-card)] lg:min-h-[4.75rem] lg:grid-cols-[2.75rem_minmax(0,1fr)_1rem] lg:gap-3 lg:px-5 lg:py-3.5", + // Phone stack separator only — the action grid becomes multi-column + // at `sm`, where each action also becomes its own bordered card, + // so do not keep a top edge that would double the card border. + index > 0 && "max-sm:border-t max-sm:border-[color:var(--border)]", ); if (action.href) { diff --git a/tests/therapy-compass-responsive-contract.test.ts b/tests/therapy-compass-responsive-contract.test.ts index 7ab37a2a42..8807d4c103 100644 --- a/tests/therapy-compass-responsive-contract.test.ts +++ b/tests/therapy-compass-responsive-contract.test.ts @@ -94,7 +94,14 @@ describe("Therapy Compass responsive contract", () => { expect(responsiveStackCount(therapyCardSource)).toBeGreaterThanOrEqual(2); expect(homeSource).toContain("ModeHomeMain"); expect(homeSource).toContain("ModeHomeTemplate"); - expect(modeHomeTemplateSource).toContain("lg:grid-cols-[repeat(auto-fit,minmax(15rem,1fr))]"); + // Mode-home action tiles switch to the auto-fit multi-column grid at `sm` + // (not `lg`) so tablet widths get a real grid before the large breakpoint. + // Stack separators must stop at the same breakpoint (`max-sm`) so they do + // not double `lg:border` card chrome once the grid is multi-column. + expect(modeHomeTemplateSource).toContain("sm:grid-cols-[repeat(auto-fit,minmax(15rem,1fr))]"); + expect(modeHomeTemplateSource).toContain("max-sm:border-t"); + expect(modeHomeTemplateSource).toContain("sm:rounded-lg sm:border"); + expect(modeHomeTemplateSource).not.toContain("lg:grid-cols-[repeat(auto-fit,minmax(15rem,1fr))]"); expect(modeHomeTemplateSource).toContain("sm:flex-wrap"); expect(homeSource).toContain("desktopComposerSlotId={modeHomeDesktopComposerSlotId}"); expect(homeSource).toContain("ModeHomeVerificationFooter"); diff --git a/tests/ui-tools.spec.ts b/tests/ui-tools.spec.ts index 264b5f5763..37ea6d2eed 100644 --- a/tests/ui-tools.spec.ts +++ b/tests/ui-tools.spec.ts @@ -1192,7 +1192,12 @@ test.describe("Clinical KB tools launcher", () => { { path: "/differentials?q=acute+confusion&run=1", resultsTestId: "differentials-search-results" }, ] as const) { await gotoLauncher(page, route.path); - await expect(page.getByTestId(route.resultsTestId)).toBeVisible({ timeout: 20_000 }); + const results = page.getByTestId(route.resultsTestId); + // A soft navigation can briefly retain the previous reserve-pad owner. + // Wait for the new route to settle to the single-owner contract before + // making a strict visibility assertion. + await expect(results).toHaveCount(1, { timeout: 20_000 }); + await expect(results).toBeVisible(); const dock = page.locator("form.answer-footer-search-dock"); await expect(dock, route.path).toBeVisible(); await expect(dock, route.path).not.toHaveAttribute("data-scroll-hidden", "true");