diff --git a/docs/branch-review-ledger.md b/docs/branch-review-ledger.md index 824168bf13..f3ead2a937 100644 --- a/docs/branch-review-ledger.md +++ b/docs/branch-review-ledger.md @@ -171,11 +171,12 @@ Records before 2026-07-28 were written by hand and had drifted: 146 lines carrie | 2026-07-30 | claude/outstanding-issues-triage-24c8ow | 8d2710fd6cbdc84e8c50a6c9bc0a1e1a0cd612c8 | open PR changed-scope review | APPROVE: completed items 095, 096, 104, 109, and 115 move to archive with no deletion, duplicate ID, or stale next-id. | check:outstanding-issues PASS; check:branch-review-ledger PASS; diff review; no unresolved threads | | 2026-07-30 | claude/latency-findings-impl-s8g01v | e7ff5e933ba1f34d5adbd46dd77c38aced11ed44 | open PR changed-scope review | APPROVE: ordering-risk documentation is accurate and the near-bottom refusal guard now proves its geometry is non-vacuous before asserting no hide. | diff check PASS; focused test review; no unresolved threads; exact-head Production UI required | | 2026-07-30 | claude/ci-testing-review-2l8klp | 2e2160bc8b9d2d824209c217c67cb9cac1be3a8d | open PR changed-scope review | APPROVE: three-way UI sharding, critical-first gating, measured drag travel, and gate-manifest updates preserve required-check aggregation and deterministic Playwright settings. | check:github-actions PASS; check:ci-scope PASS; check:gate-manifest PASS; ledger guards PASS; exact-head sharded Production UI required | +| 2026-07-30 | PR #1430 | a9ae22ac4915e86d51ee05787059382a39bd8ba8 | phone chrome diagnostics and merge repair | fixed and ready for CI | issues guard; ledger guard; 37 focused tests; phone-chrome dry-run | +| 2026-07-30 | PR-1435 | df255ee5bf8269cca32b5ef426d1c37c1f7bcebc | PR #1435 tablet search header flow | tablet composer now follows desktop normal-flow ownership; stale pinning assertion corrected; no remaining findings | 29 focused tests pass; typecheck and formatting pass; focused Chromium route 1 passed | +| 2026-07-30 | PR-1440 | f7260cc6a0da87cb4df1ac95ef962967e667c3f0 | PR #1440 issue #102 ordering correction | accurately restores the two canary-gated retrieval ordering constraints; no findings | outstanding-issues and ledger guards pass; documentation-only diff | | 2026-07-30 | PR #1432 | a2b53c815b3c060dec2619af2855a63f9f496858 | Playwright browser preflight review and repair | fixed; focused tests pending coordinator | Prettier PASS; issues guard PASS; focused Vitest blocked by active Playwright lease | | 2026-07-30 | PR #1432 | f85995ade3a19513a531713724813adc742c360d | Playwright browser preflight verification | focused tests pass; typecheck lease-blocked | 16 focused tests PASS; Prettier PASS; typecheck admission blocked | -| 2026-07-30 | PR #1430 | a9ae22ac4915e86d51ee05787059382a39bd8ba8 | phone chrome diagnostics and merge repair | fixed and ready for CI | issues guard; ledger guard; 37 focused tests; phone-chrome dry-run | | 2026-07-30 | PR-1432 | 7c7b63cf40d59652954e539ce1b3027005916bf1 | PR #1432 Playwright browser preflight final exact-head review | fixed existing project-isolation contract after preflight refactor; no remaining findings | preflight and isolation Vitest 9/9; typecheck pass; Prettier and diff checks pass | -| 2026-07-30 | PR-1440 | f7260cc6a0da87cb4df1ac95ef962967e667c3f0 | PR #1440 issue #102 ordering correction | accurately restores the two canary-gated retrieval ordering constraints; no findings | outstanding-issues and ledger guards pass; documentation-only diff | | 2026-07-30 | PR-1432 | a5d234302b57be6f7ce5d1957c9ec00bc7f191f0 | PR #1432 Playwright preflight and phone-scroll reliability | cross-platform preflight fails closed and production focus-restore race is removed from the phone-scroll proof; no remaining findings | preflight tests 9 passed; focused Chromium journey 2 passed; formatting and ledger guards pass | | 2026-07-30 | PR-1432 | 330086eff76f704ce6b9cf5405aeecfdd375027c | PR #1432 visual-config preflight follow-up | visual runs now preflight chromium-artifacts instead of the unrelated main browser matrix; unknown configs fail closed | config-selection tests added; formatting passes; exact-head CI pending | | 2026-07-30 | PR-1445 | 07933e08cff6c7d81345e02c03727032ccf522b6 | PR #1445 close duplicate issue | correctly archives duplicate #140 while preserving #133 as the surviving open conflict-frequency record; no findings | outstanding-issues and docs-link guards pass; docs-only diff | @@ -261,10 +262,7 @@ Records before 2026-07-28 were written by hand and had drifted: 146 lines carrie | 2026-07-30 | PR-1475 | 6de5c321beac55860cc4b6fc7d26ef5a7e088f38 | PR #1475 ingestion behavioral extraction | PASS after current-main reconciliation; extracted decisions preserve entrypoint behavior and replace the matching source-grep assertion with executable coverage | focused Vitest 3 files, 27 tests passed; typecheck passed; outstanding-issues and branch-review-ledger guards passed; provider-backed ingestion not run | | 2026-07-30 | PR-1458 | 8c1975b178c67e4c54acffc395d85e38c43d39f5 | PR #1458 superseded root-gate reconciliation | PASS: retained only unique documentation corrections after PR #1480 landed the stronger tracked-root gate; archived resolved shared-hook issue #143 | docs index and links passed; outstanding-issues and branch-review-ledger guards passed; diff check passed | | 2026-07-30 | PR-1448 | 8ece7f345e93170c6bd242701eaff05f5504d98b | PR #1448 authenticated live workflow | PASS after review repair: protected-main-only checkout, explicit bounded mutations, scoped secrets, and static dispatch confirmation; no live provider workflow dispatched | GitHub Actions and PR-policy guards passed; focused Vitest 3 passed; docs links and scripts, issue and ledger guards, Prettier and diff checks passed | -| 2026-07-30 | claude/capture-session-followups | bbc5d4625adcbdc32aee2f9b4fb4b0d4365d0e99 | outstanding-issues capture: unreadable CI token, at-risk worktree work, unpushed hook fix | PR #1490 opened. Ledger-only: adds #149 (PAT lacks Checks: Read so no PR verdict is readable; the working status endpoint returns total:0 rather than erroring), #150 (four already-merged worktrees hold uncommitted work existing in no branch or PR, largest +395/-200 over 19 files incl CI config), #151 (the #143 pre-commit fail-open d2fd16d54 lives only on a never-pushed branch, 17 behind main, conflicting on the file main's docs:update generator now owns). Also records that PR #1458 is superseded by #1480 and should be closed after owner confirmation | check:outstanding-issues 149 rows 60 open unique ids next-id=152; docs:check-links 1415 refs resolve; docs:check-index 49 roots/modules/routes; prettier clean | | 2026-07-30 | codex/outstanding-deletion-guard | da1bed4bcb05f2b975823c76bab0913278cfaea6 | issue 148 deletion guard | approved: no P0-P2 findings; base comparison is fail-closed in CI and preserves archive moves | verify:cheap; deletion self-test; unreadable-base proof; CI scope; GitHub Actions pin guard | -| 2026-07-30 | claude/capture-session-followups | a026c0bfe70f0e9fe290abbdd3660f4c458e4115 | PR #1490 #143/#151/#149 reconciliation | corrected archived #143 fail-open claim; #151 owns remaining half; #149 separates Checks:Read from missing-gh; merged main #1491 | check:outstanding-issues; docs:check-links | -| 2026-07-30 | claude/capture-session-followups | f18dc1fb25f4687006be897f2c11a4bb1f583f41 | PR #1490 #143/#151/#149 reconciliation | reconciled after parallel remote main-sync; #143 corrected; #151 owns fail-open; #149 separates Checks vs missing-gh | check:outstanding-issues; docs:check-links | | 2026-07-30 | codex/sync-ci-anti-churn | 4f99c6d6dbcd4d2c16d5ec58183003c64d989ac8 | issue 145 anti-churn guidance | approved: guidance now covers both pushes and sync mutations without weakening cancellation | check:outstanding-issues; prettier AGENTS; diff check | | 2026-07-30 | PR-1492 | a50640970a4e4197c64fba7239aeae073445fed9 | PR #1492 branch-sync churn review | FIXED P2: exact-head queued or in-progress workflows now block automated branch updates; Run PR guidance matches the executable guard | focused Vitest 1 file, 8 tests passed; Prettier passed; sync dry-run passed on 19 open PRs; diff check passed; no provider-backed application checks run | | 2026-07-30 | codex/ingestion-fixes-current-main-20260731 | fe68a0a817213ef33ddeee35b45034656986d089 | ingestion fixes replacement release readiness | ready after fixing unreachable partial-batch handling and invalid recovery owner lookup | 4 focused files 183 tests passed; typecheck passed; production-readiness READY; git diff --check passed | @@ -272,18 +270,21 @@ Records before 2026-07-28 were written by hand and had drifted: 146 lines carrie | 2026-07-30 | PR-1494 | 807a3a09f5afc12e8db4f9158abe09d9c7b336c9 | PR #1494 pre-commit fail-open review | FIXED P2: legacy worktrees may skip a genuinely absent generator, while a staged deletion or rename now fails closed | docs-inventory Vitest 5 passed; shell syntax passed; Prettier test check passed; diff check passed | | 2026-07-30 | claude/x3-rag-coverage-gate-qx9j7d (PR #1463, squashed as dba7356f) | dba7356fc8dc926d951d6de6f019d5b8e000be21 | X3/#101 per-request hydration extraction from rag.ts into rag-hydration.ts | clean and landed — byte-identical move verified against pre-merge main, rag.ts 4780->4543, budget ratcheted to 4543, no back-edge (cluster referenced zero rag.ts-local symbols), both public re-exports preserved; squash captured 100% of branch content | typecheck, lint, check:knip, check:maintainability-budgets 4543/4543, focused vitest 83/83 incl rag-query-concurrency, eval:rag:offline 572/572 36 golden, format:check, verify:cheap, verify:pr-local build+bundle-scan, post-merge content verification on main | | 2026-07-30 | dba7356fc8dc926d951d6de6f019d5b8e000be21 | dba7356fc8dc926d951d6de6f019d5b8e000be21 | X3 hydration unit: per-request hydration extraction from rag.ts into rag-hydration.ts (PR #1463) | clean and landed — byte-identical move verified against pre-merge main, rag.ts 4780->4543, budget ratcheted to 4543, no back-edge, both public re-exports preserved. Supersedes the earlier row for this HEAD, which was keyed only to the slash-form branch token and so returned NOT REVIEWED on a landed-SHA lookup; it also mislabelled the unit as #101, which is the unrelated open canary-gated retrieval-parallelisation recommendation | typecheck, lint, check:knip, check:maintainability-budgets 4543/4543, focused vitest 83/83, eval:rag:offline 572/572 36 golden, format:check, verify:cheap 442 files 4625 passed, verify:pr-local, post-merge content verification on main | -| 2026-07-30 | claude/capture-session-followups | 4a041fcd2ac8f12e4ebb0ab68e0151722db65bcf | PR #1490 main sync + #151 close | merged origin/main (clean tree; GitHub DIRTY was ledger-driver staleness); archived #151 via #1494; #143 fully resolved; review threads already addressed | check:outstanding-issues; docs:check-links; merge-tree clean | -| 2026-07-30 | claude/capture-session-followups | adc4e2e86edce33849ec9c8080b8f0be86155734 | PR #1490 main sync after #1496 id collision | merged c8e53d57; kept main #149/#150; archived #151 via #1494; renumbered this PR's open rows to #152/#153; #143 fully resolved | check:outstanding-issues; docs:check-links; merge-tree clean | -| 2026-07-30 | PR-1433 | e7a8102620b5b4847894b3df21f438304ea581bd | PR #1433 document result cards and action menu final review | fixed clipped menu, clipboard fallback focus loss, and inherited action typography; no remaining findings | DOM Vitest 4/4; focused Chromium 1/1; typecheck, Prettier, and diff checks pass | | 2026-07-30 | PR #1474 | 098186866932394d2cc17983e566ae6c44b063b4 | PR #1474 full diff vs origin/main | approved | verify:cheap; eval:rag:offline; live canary 30578169116 -> 30579534353 | | 2026-07-30 | codex/coverage-scope-policy | 94f97cdb1d0543724de408f19e79d64e61c8b31a | issue 139 coverage scope policy | approved: workflow coverage breadth is deliberate and test-pinned; docs-like skills remain static-only | check:ci-scope; check:gate-manifest; check:outstanding-issues; prettier; diff check | | 2026-07-30 | codex/coverage-scope-policy | 4da2a003bc2254507662d1b8b6e9768e94371abd | issue 139 coverage scope policy post-sync | approved: late main sync preserves deliberate workflow coverage and static-only skill policy | check:ci-scope; check:outstanding-issues; check:branch-review-ledger; diff check | | 2026-07-30 | codex/archive-completed-ci-tasks | 5c902f422ceee78ef68132900fda734c1d5bc1f8 | archive issues 133 and 135 | approved: both rows were already resolved on current main and focused guards prove their contracts | check:ci-scope; check:outstanding-issues; check:branch-review-ledger; diff check | | 2026-07-30 | codex/next-local-task | 3e6d6d69c15fc056773657e15879ba2283fa2899 | archive issues 129 and 132 | approved: documented constraints satisfy both explicit outcomes without overstating client-side enforcement | guard:push:self-test; focused vitest 24/24; check:github-actions; check:outstanding-issues; diff check | +| 2026-07-30 | PR-1433 | e7a8102620b5b4847894b3df21f438304ea581bd | PR #1433 document result cards and action menu final review | fixed clipped menu, clipboard fallback focus loss, and inherited action typography; no remaining findings | DOM Vitest 4/4; focused Chromium 1/1; typecheck, Prettier, and diff checks pass | | 2026-07-30 | claude/design-visual-baselines | b57432facb7ded1e9605d1076e0d8c9d661efa2c | open PR changed-scope review | APPROVE after fix: platform-scoped baseline guidance matches the candidate-path and AWAITING_BASELINE adoption contract. | Prettier PASS; docs:check-links PASS; check:ci-scope PASS; review thread resolved; exact-head visual CI required | | 2026-07-30 | pr/1431 | 74e10087eb20a81279fb56d18f28a2475d895fab | docs: visual baseline platform layout | approved; candidate adoption and Linux baseline guidance match implementation | runtime/install parity; ledger; CI scope; docs inventory/links; Prettier; diff-check | | 2026-07-30 | pr/1431 | b4848aa92e890193a4a41744b611746673f3b058 | docs: visual baseline platform layout | approved after remote-head reconciliation; guidance unchanged | ledger; CI scope; docs inventory/links; Prettier; diff-check | | 2026-07-30 | pr/1431 | 897de9b1b7fc243006c1a71e67a6333681272ac6 | docs: visual baseline platform layout | approved after PR 1462 base sync; visual guidance unchanged | ledger; CI scope; docs inventory; Prettier; diff-check | +| 2026-07-30 | claude/capture-session-followups | bbc5d4625adcbdc32aee2f9b4fb4b0d4365d0e99 | outstanding-issues capture: unreadable CI token, at-risk worktree work, unpushed hook fix | PR #1490 opened. Ledger-only: adds #149 (PAT lacks Checks: Read so no PR verdict is readable; the working status endpoint returns total:0 rather than erroring), #150 (four already-merged worktrees hold uncommitted work existing in no branch or PR, largest +395/-200 over 19 files incl CI config), #151 (the #143 pre-commit fail-open d2fd16d54 lives only on a never-pushed branch, 17 behind main, conflicting on the file main's docs:update generator now owns). Also records that PR #1458 is superseded by #1480 and should be closed after owner confirmation | check:outstanding-issues 149 rows 60 open unique ids next-id=152; docs:check-links 1415 refs resolve; docs:check-index 49 roots/modules/routes; prettier clean | +| 2026-07-30 | claude/capture-session-followups | a026c0bfe70f0e9fe290abbdd3660f4c458e4115 | PR #1490 #143/#151/#149 reconciliation | corrected archived #143 fail-open claim; #151 owns remaining half; #149 separates Checks:Read from missing-gh; merged main #1491 | check:outstanding-issues; docs:check-links | +| 2026-07-30 | claude/capture-session-followups | f18dc1fb25f4687006be897f2c11a4bb1f583f41 | PR #1490 #143/#151/#149 reconciliation | reconciled after parallel remote main-sync; #143 corrected; #151 owns fail-open; #149 separates Checks vs missing-gh | check:outstanding-issues; docs:check-links | +| 2026-07-30 | claude/capture-session-followups | 4a041fcd2ac8f12e4ebb0ab68e0151722db65bcf | PR #1490 main sync + #151 close | merged origin/main (clean tree; GitHub DIRTY was ledger-driver staleness); archived #151 via #1494; #143 fully resolved; review threads already addressed | check:outstanding-issues; docs:check-links; merge-tree clean | +| 2026-07-30 | claude/capture-session-followups | adc4e2e86edce33849ec9c8080b8f0be86155734 | PR #1490 main sync after #1496 id collision | merged c8e53d57; kept main #149/#150; archived #151 via #1494; renumbered this PR's open rows to #152/#153; #143 fully resolved | check:outstanding-issues; docs:check-links; merge-tree clean | | 2026-07-30 | claude/capture-session-followups | 7954c044dd16e0669d417e09d6b6192a4df0e72d | PR #1490 main sync | merged origin/main 9af15e1f (clean tree; GitHub DIRTY was merge=ledger staleness); kept #152/#153 and clarified #153 snapshot wording; #151/#143 remain archived | check:outstanding-issues; docs:check-links; merge-tree clean | | 2026-07-30 | codex/ledger-next-20260730 | 268b201a1dbaed7cca6dff4a146b0319a5275216 | issue ledger closures, favourites partial-source status, CI and ledger guards | FIXED. No remaining P0-P2 findings. Reconciled current main row by row, retained current-main #105 and #136 dispositions, rejected the unsafe Playwright cache, and fixed favourites partial-source masking plus the indexed-search hydration race. | format PASS; static gates, lint, typecheck PASS; unit 4597 PASS, 3 SKIP, 1 stale donor failure repaired by exact-lock dependency; brace cap direct PASS; focused Chromium 1 PASS; production build PASS; ledger guards PASS | | 2026-07-30 | codex/ledger-next-20260730 | 1ee749bd71da45be2d6b9d3eb4913331696996a6 | issue ledger closures, favourites partial-source status, CI and ledger guards | FIXED. Supersedes the prior review after cleanly merging current main. No remaining P0-P2 findings; current-main #079 was retained, verified closures remained archived, and no product behavior changed during sync. | merge reconciliation + ledger:dedupe PASS; outstanding and branch ledger guards PASS; whole-tree format PASS; prior static, lint, typecheck, unit, build, RAG fixture, and focused Chromium evidence retained | @@ -329,6 +330,7 @@ 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-header-behavior-on-medium-screens (PR #1435) | 2cea044352dd67e2fde9784178272f423db1c8dc | PR #1435 tablet search header readiness | READY closed; mergeable vs main; Bugbot none; fixed tablet page-slot assert + stale sticky comments; no P0/P1 | vitest header contracts 61/61; playwright ui-chrome-scroll 17/17; composer ownership 15/15; verify:cheap 2 env-only codex-cloud origin insteadOf fails; prior head CI green | | 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 | @@ -506,8 +508,11 @@ Records before 2026-07-28 were written by hand and had drifted: 146 lines carrie | 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 | 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 | codex/fix-header-behavior-on-medium-screens | f1083c808473904152eaf92b78ad03a3213782aa | PR #1435 review+bugbot+fix | READY: merged main (real conflict in search-chrome-behaviour resolved); Bugbot 0; no P0/P1; no actionable threads | merge-tree clean; header-scroll-hide-contract 29/29; prior tip CI blocked by dirty; Bugbot/reviewThreads empty | +| 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 | codex/fix-header-behavior-on-medium-screens | f5c83aeb77b6fd65c8b10a8c2793ce1d4c5a817c | PR #1435 review+bugbot+fix | READY: synced main twice (content conflict in search-chrome-behaviour then behind-but-clean); Bugbot 0; no P0/P1; no actionable threads | merge-tree clean 0 behind; header-scroll-hide-contract 29/29; Bugbot/reviewThreads empty | +| 2026-07-31 | codex/fix-header-behavior-on-medium-screens | e3764d3f71615f9e8b644501704f81f39abd85d1 | PR #1435 review+bugbot+fix | READY: synced main (content conflict resolved + behind-but-clean cleared); Bugbot 0; no P0/P1; no actionable threads | merge-tree clean 0 behind; header-scroll-hide-contract 29/29; Bugbot/reviewThreads empty | +| 2026-07-31 | codex/chat-prompt-skill-review-e608 | e7b2b9ae864e4ca280761dc5e1dd23ea65afb520 | PR #1439 review+bugbot+fix | FIXED CONFLICTING: GitHub DIRTY was behind-but-clean; merged origin/main twice to current tip. Product delta: POSIX secondary-worktree bootstrap + consolidated skill contracts on main Cloud/status-hash verifier. Review+Bugbot: no P0/P1; 0 unresolved threads; no new Bugbot findings. Restored append-only ledger vs main (no historical row rewrite). | merge-tree clean; MERGEABLE; PR mergeability/policy/gitleaks success; Static/Unit/Safety in progress; isolation self-test 14/14; 0 unresolved threads | | 2026-07-31 | codex/chat-frontend-skill-selection-0978 | cf9ed2d12a68f0577b755d540bdd8dde0ff6ddc1 | PR #1460 reopen readiness | READY for reopen as conflict-free tip; product brace-expansion patch already on main via #1456; remaining unique delta is one historical ledger row; no Bugbot findings; no P0-P2 findings | merge-tree clean; check:branch-review-ledger PASS; installed-lock-parity PASS; vitest installed-lock-parity 6/6; brace-expansion@1.1.18 maxLength present; npm audit not re-run; PR left CLOSED | | 2026-07-31 | codex/chat-frontend-skill-selection-0978 | 7cf0505be4423f6856e45a6a87e9433fcae72462 | PR #1460 review+bugbot+fix | no findings; sync cleared GitHub DIRTY (merge-tree was behind-but-clean); tip delta ledger-only; product brace-expansion already on main via #1456; no Bugbot/actionable threads | merge-tree clean; check:branch-review-ledger PASS; required CI pending after sync push; prior missing checks while DIRTY not green | -| 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 | codex/chat-frontend-skill-selection-0978 | c436387c49d37e65bca49429d2b74fffe61c0bfd | PR #1460 review+bugbot+fix | no findings; second sync after main advanced mid-pass; merge-tree clean; tip delta ledger-only; product already on main via #1456; no Bugbot/actionable threads | merge-tree clean; check:branch-review-ledger PASS; required CI expected after sync push | -| 2026-07-31 | codex/chat-prompt-skill-review-e608 | e7b2b9ae864e4ca280761dc5e1dd23ea65afb520 | PR #1439 review+bugbot+fix | FIXED CONFLICTING: GitHub DIRTY was behind-but-clean; merged origin/main twice to current tip. Product delta: POSIX secondary-worktree bootstrap + consolidated skill contracts on main Cloud/status-hash verifier. Review+Bugbot: no P0/P1; 0 unresolved threads; no new Bugbot findings. Restored append-only ledger vs main (no historical row rewrite). | merge-tree clean; MERGEABLE; PR mergeability/policy/gitleaks success; Static/Unit/Safety in progress; isolation self-test 14/14; 0 unresolved threads | diff --git a/docs/search-chrome-behaviour.md b/docs/search-chrome-behaviour.md index 577845c19b..20b7b64269 100644 --- a/docs/search-chrome-behaviour.md +++ b/docs/search-chrome-behaviour.md @@ -4,15 +4,15 @@ This repo uses one shared search experience across the global shell, dashboard r ## Page ownership model -| Page state | Composer placement | Reserve owner | -| ----------------------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------ | -| Answer home / standalone mode homes | In-flow hero composer on phones and larger breakpoints | Page content; no fixed phone dock reserve | -| Submitted/search-result views | Compact bottom dock on phones; pinned below the header on tablets; in normal page flow on desktop | Shell/dashboard `--mobile-composer-reserve` on phones; page content on desktop | -| Answer result view | Overlaid glass header plus answer composer dock | Dashboard `#main-content` top/bottom reserves | -| Document detail/source routes | `DocumentViewer` floating composer | `DocumentViewer` content padding | -| Document section navigation | Header row disclosure (phone sheet) + rail index card at `lg` | None — adds no chrome and no reserve | -| Calculators (`/calculators`) | Page-owned composer (desktop top + phone bottom dock) | Calculators page pad; shell reserve stays `0` | -| Info/detail pages with no composer | No fixed composer | Idle shell padding only | +| Page state | Composer placement | Reserve owner | +| ----------------------------------- | -------------------------------------------------------------------------- | ------------------------------------------------------------------------------ | +| Answer home / standalone mode homes | In-flow hero composer on phones and larger breakpoints | Page content; no fixed phone dock reserve | +| Submitted/search-result views | Compact bottom dock on phones; in normal page flow on tablets and desktops | Shell/dashboard `--mobile-composer-reserve` on phones; page content on desktop | +| Answer result view | Overlaid glass header plus answer composer dock | Dashboard `#main-content` top/bottom reserves | +| Document detail/source routes | `DocumentViewer` floating composer | `DocumentViewer` content padding | +| Document section navigation | Header row disclosure (phone sheet) + rail index card at `lg` | None — adds no chrome and no reserve | +| Calculators (`/calculators`) | Page-owned composer (desktop top + phone bottom dock) | Calculators page pad; shell reserve stays `0` | +| Info/detail pages with no composer | No fixed composer | Idle shell padding only | ## Invariants @@ -21,7 +21,7 @@ This repo uses one shared search experience across the global shell, dashboard r 3. A visible fixed phone dock may include `var(--safe-area-bottom)` so the pill clears the home indicator. 4. A hidden phone dock must release the content-facing reserve to `0rem`; do not use `env(safe-area-inset-bottom)` or `var(--safe-area-bottom)` for hidden content padding. 5. Edge-to-edge phone dock mode is `left: 0; right: 0; bottom: 0; width: 100%`; inset the pill with padding, not with a non-zero bottom offset. Keep the dock form transparent and use its absolute `.answer-footer-search-backdrop` child for localized translucent gradient/blur around the pill. The gradient and every blur mask must return to fully transparent at the physical bottom edge. It must move and fade with the dock, then become `visibility: hidden` after the hide transition so WebKit cannot retain a safe-area compositor strip; it must never become a viewport-fixed or opaque slab. -6. Header and footer chrome that share the same scroll signal should hide/reveal symmetrically for the surfaces that actually hide. **Collapse motion:** when the phone top bar is hidden, `chrome-safe-area-top` and the controls both release to `0rem` so underlying content paints to the physical viewport edge. **Overlay motion (default for `GlobalSearchShell` phones; collapse remains for `isCollapseMotionPhoneRoute`):** the stack translates instead; `chrome-safe-area-top` stays inside the translated layer at a stable height, and the content-facing `--phone-overlay-chrome-h` clearance is constant across hide/reveal — zeroing it on hide would reintroduce the layout shift overlay exists to remove. The visible phone header still owns `var(--safe-area-top)`; tablet/desktop sticky chrome keeps its pinned inset. While visible that spacer is the top of the header, so it paints `var(--surface)` — the bar's own opaque phone colour — never `var(--background)`: the page colour there reads as a status-bar band above the bar, the seam overlay-strategy answer mode never shows because its header pads the inset itself. Keep it opaque so the sm+ pinned inset still hides scrolled content. Top-bar hide/reveal is cross-breakpoint; the search field stays pinned on tablets, while desktop search belongs to page flow and scrolls away naturally; the bottom search dock is phone-only. Hidden bottom dock reserve stays `0rem` (invariant 4). Read "Scroll hide/reveal" below before changing either. +6. Header and footer chrome that share the same scroll signal should hide/reveal symmetrically for the surfaces that actually hide. **Collapse motion:** when the phone top bar is hidden, `chrome-safe-area-top` and the controls both release to `0rem` so underlying content paints to the physical viewport edge. **Overlay motion (default for `GlobalSearchShell` phones; collapse remains for `isCollapseMotionPhoneRoute`):** the stack translates instead; `chrome-safe-area-top` stays inside the translated layer at a stable height, and the content-facing `--phone-overlay-chrome-h` clearance is constant across hide/reveal — zeroing it on hide would reintroduce the layout shift overlay exists to remove. The visible phone header still owns `var(--safe-area-top)`; tablet/desktop top-bar chrome keeps its pinned inset. While visible that spacer is the top of the header, so it paints `var(--surface)` — the bar's own opaque phone colour — never `var(--background)`: the page colour there reads as a status-bar band above the bar, the seam overlay-strategy answer mode never shows because its header pads the inset itself. Keep it opaque so the sm+ pinned inset still hides scrolled content. Top-bar hide/reveal is cross-breakpoint; the search field belongs to page flow and scrolls away naturally on tablets and desktops; the bottom search dock is phone-only. Hidden bottom dock reserve stays `0rem` (invariant 4). Read "Scroll hide/reveal" below before changing either. 7. Do not add page-local dock-sized `pb-[calc(...safe-area...)]` under a shell-owned dock. Put clearance in the shared reserve or the page-owned composer, never both. 8. `GlobalSearchShell` uses an inner `mobile-composer-reserve-pad` so phone padding contributes to scroll height; do not move phone shell clearance back to scrollport padding without a browser proof. 9. Page-owned fixed phone composers follow the same release contract: calculators use the shared footer backdrop; DocumentViewer keeps its floating pill but synchronizes transform, opacity, pointer release, and its own zero-reserve content padding. In-flow hero composers remain free of fixed-footer glass. @@ -122,21 +122,21 @@ geometry and tap heights). ## Scroll hide/reveal -The universal **top bar** (mode, new chat, menu) is the only sticky desktop chrome: it hides on a deliberate scroll down and returns on a deliberate scroll up at **every** breakpoint. Tablet search stays pinned below it. Desktop search is mounted at the top of normal page content, so it scrolls away with that content and is independent of the header's hide state. Only the phone bottom search dock scroll-hides, and that stays phone-only. The top bar and phone dock read one `useScrollHideReporter` per host, so they can never disagree about direction. +The universal **top bar** (mode, new chat, menu) is the only sticky desktop chrome: it hides on a deliberate scroll down and returns on a deliberate scroll up at **every** breakpoint. Tablet and desktop search are mounted at the top of normal page content, so they scroll away with that content and are independent of the header's hide state. Only the phone bottom search dock scroll-hides, and that stays phone-only. The top bar and phone dock read one `useScrollHideReporter` per host, so they can never disagree about direction. Choose the hide mechanism from where the host's scrollport lives, because that decides what hiding costs the reader: -| Host | Scrollport | `hideOnScroll` | Mechanism | -| --------------------------------- | ------------------------------------------------------------------------------------------ | ---------------------------------------- | ------------------------------------------------------------------------------------------------------------------ | -| `ClinicalDashboard` (answer view) | Document on browser phones; `
` in standalone and at `sm+` | `strategy: "overlay", allBreakpoints` | Absolute glass top bar translates off; `
` keeps its top reserve; search stays | -| `ClinicalDashboard` (other modes) | Document on browser phones; `
` in standalone and at `sm+` | `strategy: "collapse", wide: "collapse"` | Top-bar row collapses; tablet search stays sticky; desktop search portals into `
` page flow | -| `GlobalSearchShell` | Document in browser phones and at `sm+`; `#main-content` only in installed standalone mode | `strategy: "collapse", wide: "sticky"` | Tablet pins [top bar \| search]; desktop portals search into `#main-content`, leaving a sticky auto-hiding top bar | +| Host | Scrollport | `hideOnScroll` | Mechanism | +| --------------------------------- | ------------------------------------------------------------------------------------------ | ---------------------------------------- | ------------------------------------------------------------------------------------------- | +| `ClinicalDashboard` (answer view) | Document on browser phones; `
` in standalone and at `sm+` | `strategy: "overlay", allBreakpoints` | Absolute glass top bar translates off; `
` keeps its top reserve; search stays | +| `ClinicalDashboard` (other modes) | Document on browser phones; `
` in standalone and at `sm+` | `strategy: "collapse", wide: "collapse"` | Top-bar row collapses; tablet and desktop search portal into `
` page flow | +| `GlobalSearchShell` | Document in browser phones and at `sm+`; `#main-content` only in installed standalone mode | `strategy: "collapse", wide: "sticky"` | Tablet and desktop portal search into `#main-content`, leaving a sticky auto-hiding top bar | `GlobalSearchShell` defaults to `phoneMotion: "overlay"` on phones. The safe-area region, universal top bar, and any page navigation portaled into the collapse row form one fixed browser/absolute standalone layer, and the complete layer translates over content without changing the scrollport or content -geometry. Tablet and desktop continue using `wide: "sticky"`. +geometry. Tablet and desktop continue using `wide: "sticky"` for the top bar only. **Collapse remains the deliberate exception** for `isCollapseMotionPhoneRoute` (`/therapy-compass/*` and `/differentials/diagnoses/*`): those routes portal @@ -203,23 +203,22 @@ failure mode (see invariant 17). Rules that keep this working: -- **Hide the top bar, not the search field.** The collapse wrapper (`data-testid="universal-header-collapse"`) wraps `header#search` plus page navigation mounted through `PhoneHeaderCollapsePortal` into `#phone-header-collapse-addon-slot`. Keep composers outside the collapse row: tablet search stays pinned independently, and desktop search scrolls with page content rather than being translated by the header. +- **Hide the top bar, not the search field.** The collapse wrapper (`data-testid="universal-header-collapse"`) wraps `header#search` plus page navigation mounted through `PhoneHeaderCollapsePortal` into `#phone-header-collapse-addon-slot`. Keep composers outside the collapse row: tablet and desktop result search scroll with page content rather than being translated by the header. - **Every production phone navigation header has one collapse owner.** `PhoneHeaderCollapsePortal` moves Therapy section navigation, DocumentViewer navigation, and Differential detail navigation into `#phone-header-collapse-addon-slot` below `sm`; the same subtree stays in its existing page position at `sm+`. Do not add a second sticky/fixed phone header inside `#main-content`: the universal collapse row must own its safe area, focus pinning, timing, clipping, and measured release. Semantic content headings and modal/sheet headers are not viewport chrome and stay in their own flow/scroll context. - **Document phone headers overlay as one stable stack.** Document detail/source routes keep the complete phone header at a stable height and translate the safe area plus both header rows and the section track together. Hidden overlay chrome is transparent and non-interactive; revealed chrome frosts and covers the document. `readChromeCollapseMetrics` counts zero released top-header geometry for this overlay, while continuing to measure the independently hidden document composer reserve. Reveal must not change the active owner's scroll offset or a stable document/PDF anchor. - **Feed the reporter from the element that actually scrolls.** Both app hosts run `useDocumentScrollHideReporter` alongside their `
` reporter. In browser-mode phones the normal-flow shell and `overflow-y: visible` surface make the document the only vertical owner, which lets Safari minimize its browser UI. Installed standalone mode uses a normal-flow `100vh` shell plus bounded inner surface, so document scroll does not fire there. The hook measures the same collapse budget and blurs the same focused composer for either owner. Page-owned footer chrome must follow the same rule: `DocumentViewer` observes both the document and the inner surface, then combines the signals so only the active owner drives it. Its rendered footer, like calculator and differential page-owned footers, portals to the frame host so observing the inner scroll owner does not make the footer its descendant. - **Keep browser-phone chrome attached to the viewport without fixing the app root.** Collapse-mode headers use one phone-sticky wrapper; answer overlay headers are fixed only in browser mode and remain absolute over the inner surface in standalone mode. Footer layers are likewise viewport-fixed in browser mode and shell-absolute in standalone. While either header or reserve transition changes document geometry, the corresponding transition marker disables anchoring on the active document/inner scroller so synthetic reverse scroll cannot cause a hide/reveal loop or reading-position jump. - **Do not treat CSSOM bounds as physical iOS paint proof.** A fixed root can report perfect `getBoundingClientRect()` and hit-testing while WebKit leaves an app-external band. Keep browser/document and standalone/`100vh` static guards, then verify Safari and a freshly relaunched Home Screen app on a physical phone before merge. If iOS reports a web viewport shorter than `screen.height`, pixels outside that viewport are system-owned; keep the root canvas opaque and matching, but do not fake reachability with negative safe-area overscan. -- **Viewport stickiness belongs on the outer [top bar \| search] stack, not on `header#search`.** The top bar sits inside header-height boxes, which leaves a sticky rule on it zero travel. For the same reason the visible stack's ancestor in `GlobalSearchShell` is `display: contents` at every breakpoint rather than a block. The collapse result owns one phone-sticky wrapper (safe-area spacer + stack), while its `sm:` children retain the tablet/desktop offsets. At desktop widths the search portal leaves that same outer stack holding only the top bar. -- **Collapse only the top-bar row inside a sticky stack.** On tablets, translating the whole stack would take the search field off-screen; collapsing just the top bar lets search stay pinned at the viewport top below the wide-layout safe-area spacer. On desktop, the page-flow search is outside the stack entirely. +- **Viewport stickiness belongs on the outer top-bar stack, not on `header#search`.** The top bar sits inside header-height boxes, which leaves a sticky rule on it zero travel. For the same reason the visible stack's ancestor in `GlobalSearchShell` is `display: contents` at every breakpoint rather than a block. The collapse result owns one phone-sticky wrapper (safe-area spacer + stack), while its `sm:` children retain the tablet/desktop offsets. At tablet and desktop widths the search portal leaves that outer stack holding only the top bar. +- **Collapse only the top-bar row inside the sticky stack.** Tablet and desktop page-flow search sit outside this stack entirely; the stack hides and reveals only the universal top bar. - **Release the phone top inset with collapsing chrome.** For the default collapse motion, `chrome-safe-area-top` is a full-width sibling that is `h-[var(--safe-area-top)]` while the phone header is visible and `h-0` while hidden, using the same transition timing as the top-bar row. `readChromeCollapseMetrics` must charge that released phone height as well as the controls and dock reserve, or short pages clamp and oscillate at the bottom. The document overlay exception keeps this spacer inside the translated stack at a stable height and charges zero released top geometry. At `sm+` the spacer remains `h-[var(--safe-area-top)]`, and sticky chrome pins at `top: var(--safe-area-top)`. Do not leave a phone-only surface/status-bar band after collapsing controls hide. - **One transition, no jump.** Phone page navigation belongs inside the universal 1fr → 0fr grid rather than running another scroll hook. The shared reporter may emit one hide on a deliberate descent and one reveal on deliberate upward intent; geometry must move monotonically through the 240ms hide / 200ms reveal and remain still at the bottom edge. Reduced motion removes the animation but not the complete edge release. -- **Do not double-sticky tablet search inside an outer sticky stack.** When `wide: "sticky"` owns the tablet stack, the composer stays `relative` in that stack. A second sticky search with its own `top` overlays page controls (and blocks clicks) once the top bar collapses. -- **Desktop search is page-owned.** `desktop-page-search-composer-slot` is rendered at the top of normal shell/dashboard content and accepts the shared composer only at `min-width: 1024px`. The mode-home hero slot takes precedence. Never give the desktop page composer, its slot, or an ancestor `fixed`/`sticky` positioning. -- **Collapse-everywhere hosts still drop their own sticky search offset while the top bar is hidden.** Dashboard result composers that clear a visible top bar with `top: 4.75rem + safe-area` must switch to `top: 0` when collapse hide is active — otherwise a dead band the height of the mode bar remains above the search field. +- **Do not sticky-position tablet or desktop result search.** The composer belongs to page flow at these widths; anchoring it overlays page controls (and blocks clicks) once the top bar collapses. +- **Tablet and desktop search are page-owned.** `desktop-page-search-composer-slot` is rendered at the top of normal shell/dashboard content and accepts the shared composer at `min-width: 640px`. The mode-home hero slot takes precedence. Never give the page composer, its slot, or an ancestor `fixed`/`sticky` positioning. - **Rebase the reporter on geometry switches.** Pass `resetKey` when the host changes the scrollport under it (`ClinicalDashboard` passes `searchMode`, which swaps `
`'s header reserve); otherwise the carried-over offset spends the first post-switch scroll on a spurious hide or reveal. Shared mode-home shells should also reset on `pathname` so collapsed chrome/scroll offset does not carry across modes. - **Do not carry composer focus into submitted result views.** Focus pins both chrome edges for keyboard safety. `GlobalSearchShell` must not pass `focus: true` with `run: true`, must gate `queryInputAutoFocus` on `!hasSubmittedModeSearch`, and both hosts must blur the dock input when the active result owner scrolls so hide-on-scroll can reclaim the header and bottom dock. -Coverage: `tests/header-scroll-hide-contract.test.ts` (wiring), `tests/use-hide-on-scroll.test.ts` (decision logic), `tests/ui-chrome-scroll.spec.ts` (tablet pinned-search behaviour and desktop page-flow search plus top-bar hide/reveal), `tests/ui-phone-scroll.spec.ts` (shared shell header hide/reveal, per-mode top-edge release, collapse owner), `tests/ui-phone-scroll-routes.spec.ts` (per-route phone scroll sweep), `tests/ui-phone-scroll-page-owned.spec.ts` (document-viewer composer, standalone frame-owned footers, calculators dock, Services canvas) — the three share `tests/helpers/phone-scroll.ts`, and `tests/playwright-project-isolation.test.ts` asserts every sibling is collected by the required browser projects, `tests/ui-therapy-nav-scroll.spec.ts` (Therapy section nav hide/reveal with the top bar). +Coverage: `tests/header-scroll-hide-contract.test.ts` (wiring), `tests/use-hide-on-scroll.test.ts` (decision logic), `tests/ui-chrome-scroll.spec.ts` (tablet/desktop page-flow search plus top-bar hide/reveal), `tests/ui-phone-scroll.spec.ts` (shared shell header hide/reveal, per-mode top-edge release, collapse owner), `tests/ui-phone-scroll-routes.spec.ts` (per-route phone scroll sweep), `tests/ui-phone-scroll-page-owned.spec.ts` (document-viewer composer, standalone frame-owned footers, calculators dock, Services canvas) — the three share `tests/helpers/phone-scroll.ts`, and `tests/playwright-project-isolation.test.ts` asserts every sibling is collected by the required browser projects, `tests/ui-therapy-nav-scroll.spec.ts` (Therapy section nav hide/reveal with the top bar). Run `npm run verify:phone-chrome` for phone-chrome work. For executable changes its classifier checks installed/lock parity first, runs focused static contracts and only the browser/PWA owners and route journeys implicated by the changed files, then escalates to `npm run verify:ui` automatically for shared chrome foundations. Documentation-only scopes run only documentation guards. Use `-- --dry-run` to inspect the plan, `-- --files ` for an explicit scope, and `-- --full=always|never` only for a deliberate override. diff --git a/src/components/clinical-dashboard/dashboard-desktop-result-composer-slot.tsx b/src/components/clinical-dashboard/dashboard-desktop-result-composer-slot.tsx index c9622a1329..6dc2dacf2c 100644 --- a/src/components/clinical-dashboard/dashboard-desktop-result-composer-slot.tsx +++ b/src/components/clinical-dashboard/dashboard-desktop-result-composer-slot.tsx @@ -8,7 +8,7 @@ export function DashboardDesktopResultComposerSlot({ slotId }: { slotId?: string ); } diff --git a/src/components/clinical-dashboard/global-search-shell.tsx b/src/components/clinical-dashboard/global-search-shell.tsx index d7a9529aa1..a7ef0d99d6 100644 --- a/src/components/clinical-dashboard/global-search-shell.tsx +++ b/src/components/clinical-dashboard/global-search-shell.tsx @@ -857,9 +857,8 @@ function GlobalStandaloneSearchShellBody({ heroComposerBreakpoint="all" // Phones: #main-content owns vertical scroll, so hide-on-scroll // collapses the top bar to hand space back to content. - // Tablet: the document scrolls, so an outer sticky stack pins - // [top bar | search]. Desktop portals search into normal page flow, - // leaving this stack to own only the auto-hiding top bar. + // Tablet and desktop portal search into normal page flow. The outer + // sticky stack therefore owns only the auto-hiding top bar. hideOnScroll={{ strategy: "collapse", // Phones always overlay. The collapse mechanism is a 1fr -> 0fr @@ -934,7 +933,7 @@ function GlobalStandaloneSearchShellBody({ ) : null} {/* @@ -946,7 +945,7 @@ function GlobalStandaloneSearchShellBody({ Subnav (SpecifierSubnav / FormulationSubnav), so the shared mode bar is skipped for them to avoid a duplicate row on their workflow routes. Rendered in normal flow (sticky={false}) so it never contends with - the universal collapsing header / pinned search chrome. + the universal collapsing header or page-flow search chrome. */} {searchMode !== "specifiers" && searchMode !== "formulation" ? (