From 9d6c01081923f63d39ac2cbb30baf74e12aa1b5b Mon Sep 17 00:00:00 2001 From: Codeman maintainer Date: Sat, 10 Oct 2026 04:11:00 +0200 Subject: [PATCH] docs: record the rail search in the architecture invariants (#580) CLAUDE.md gained a rule for the rail's Search sessions box and linked it to architecture-invariants#session-list-layout-header-strip-vs-left-sidebar, which said nothing about it, and the "Collapse is per-device" bullet under Owner tab layouts had an exception it did not record. - Session list layout: one paragraph on the shared _applyTabListFilter() over the pure CodemanTabSearch (classes only, layout-scoped hide rules, rail matches the name and the sidebar name + folder, locale-independent lower-casing), the alert-row keep (owner decision), the data-total count restore, the tree walk and roving-stop fix-up, the projection opening every group, the connector redraw, the global Escape claim, no drag while searching, and the reset off the rail. - Owner tab layouts: the collapse bullet notes that a search draws every group open and refuses toggles without writing the stored set. - CLAUDE.md: the Escape claim and the connector redraw as one clause on the existing rail search rule. Co-Authored-By: Claude Opus 5.5 (1M context) --- CLAUDE.md | 2 +- docs/architecture-invariants.md | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index aa8536a8..07a5b6f4 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -337,7 +337,7 @@ Frontend JS modules have `@fileoverview` with `@dependency`/`@loadorder` tags. L **Mobile tab strip scrolling** (issue #257): under 768px the tab strip scrolls horizontally, so the active tab must be kept reachable. `_updateActiveTabImmediate()` reveals it via `computeTabScrollLeft()` (constants.js, rect math on the strip's own `scrollLeft`, never `scrollIntoView()`, which scrolls the document under the fixed header); `_fullRenderSessionTabs()` must restore `scrollLeft` across rebuilds and re-reveal only when the active tab changed (`_lastRenderedActiveTabId`) or, grouped by state, the ACTIVE tab moved to another state band (`_noteActiveTabBand()`, both render paths, scrolling row only; another tab's move never scrolls). ⚠️ The phone-block `min-width` on `.session-tab.active .tab-name` keeps the tab's centre off the gear/close icons, sized for numberless tabs 10+ (floor 40px); do not shrink it. ⚠️ Never reintroduce hoisting the active session to the front of the strip. Tests: `test/mobile-tab-tap-zones.test.ts`, `test/tab-triage.test.ts`. → [architecture-invariants#mobile-tab-strip-scrolling](docs/architecture-invariants.md#mobile-tab-strip-scrolling) -**Session list layout: header strip or left sidebar** (`sessionListLayout`, default `header`; per-device via `displayKeys`, also in `SettingsUpdateSchema`): the list can move into a collapsible `