You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
| 1. Compilation correctness | pass | TypeScript typecheck and focused tests cover the schema, atom, Settings menu, Spotlight definition, and action registration. |
17
+
| 2. Dead code and structural deduplication | pass | Two schema fields, two atoms, four actions, two Spotlight choices, and the station-selection branches were replaced by one source and one action pair. The repository sweep found no old runtime identifier; eight obsolete keys were removed from all 13 locales. |
18
+
| 3. Naming consistency | pass |`general.chatPanelPosition` and `chatPanelPositionAtom` describe the setting without tying it to either station. Legacy names occur only in the migration boundary and its tests. |
19
+
| 4. Semantic overloading | pass | “Station” now describes the active layout only; it no longer selects a separate meaning for chat-panel position. |
20
+
| 5. Default branch analysis | pass | New users retain the left-side default. Migration precedence is explicit: canonical value, valid legacy My Station value, valid legacy Agent Station value, then the schema default. |
21
+
| 6. Cross-domain leakage | pass | Shared layout consumers import a station-neutral atom; no My Station or Agent Station position concept leaks into shared state. |
22
+
| 7. New-developer clarity | pass | One schema key, atom, UI row, and action pair form a direct ownership chain. |
23
+
| 8. Wire and serialization | pass / scoped | No network or IPC payload changed. The settings JSONC persistence surface changes to one canonical key; old keys are accepted only during validation and removed from normalized runtime state. |
24
+
| 9. Init parity | pass | Startup hydration and external settings-file changes both call `validateSettings`, so both entry paths apply the same migration and canonical projection. |
25
+
| 10. Resolver symmetry | pass | Both station layouts resolve the same field through the same atom. There is no longer a station-dependent fallback branch. |
26
+
27
+
## Ownership path
28
+
29
+
| Entry point | Canonical write/read | My Station consumer | Agent Station consumer |
| Layout settings submenu |`chatPanelPositionAtom`| App layout and workstation header affordance | App layout and agent-station header affordance |
32
+
| Action system |`chatPanelPositionAtom`| Same shared projection | Same shared projection |
33
+
| Spotlight | Shared left/right action IDs | Same shared projection | Same shared projection |
34
+
| Settings hydration |`validateSettings` → `general.chatPanelPosition`| Same shared projection | Same shared projection |
35
+
36
+
## Migration invariant
37
+
38
+
`src/config/settingsSchema/index.ts:55` is the only compatibility boundary. A valid canonical value always wins. If it is absent, the prior My Station value wins when valid because it was the primary workstation preference; a valid prior Agent Station value is the fallback. The normalized settings object drops both legacy keys, and startup backfills the canonical key to disk.
|`src/scaffold/NavigationSidebar/blocks/SidebarSettingsMenuButton.tsx:511`| Layout submenu trigger | fix | The separate Chat Panel and Workstation triggers duplicated one layout-settings surface. One localized Layout row now owns the complete submenu. | None. |
6
+
|`src/scaffold/NavigationSidebar/blocks/SidebarSettingsMenuSubmenus.tsx:84`| Layout submenu routing | fix | A single `layout` state replaces the two presentation-only modes, so menu state matches the consolidated information architecture. | None. |
7
+
|`src/components/SegmentedTextPill/index.tsx:9`| Segmented-control size API | fix | A typed `small` / `default` prop lets compact menus reduce the control without changing established creator controls. The default preserves the prior dimensions. | None. |
8
+
|`src/components/SegmentedTextPill/index.tsx:21`| Segmented-control size geometry | keep with reason | The 24px small control fits the shared 32px menu row, while the original 28px control remains the established Agent/Manual geometry. Both variants stay centralized in the design-system component. | None. |
9
+
|`src/scaffold/NavigationSidebar/blocks/SidebarLayoutSettingsSubmenu.tsx:37`| Compact segmented setting row | abstract | Three choice-based settings share one local row seam instead of rebuilding title/control alignment. | Keep new choice-based Layout settings on `SegmentedControlRow`. |
10
+
|`src/scaffold/NavigationSidebar/blocks/SidebarLayoutSettingsSubmenu.tsx:49`| Dropdown setting-row chrome | keep with reason |`DROPDOWN_CLASSES.menuControlItem` supplies the established menu height, spacing, typography, hover treatment, and label/control alignment. | None. |
11
+
|`src/scaffold/NavigationSidebar/blocks/SidebarLayoutSettingsSubmenu.tsx:51`| Left/right and style selectors | keep with reason | Reuses the shared `SegmentedTextPill` that owns the Agent/Manual visual pattern requested for this menu; each group exposes an accessible name and pressed state. | None. |
12
+
|`src/scaffold/NavigationSidebar/blocks/SidebarLayoutSettingsSubmenu.tsx:74`| Pagination control | fix | The shared Switch remains the correct boolean control and receives the visible row label as its accessible name. | None. |
13
+
|`src/scaffold/NavigationSidebar/blocks/SidebarLayoutSettingsSubmenu.tsx:127`| Shared chat-panel side row | fix | One station-independent Left/Right control replaces separate My Station and Agent Station rows, preventing contradictory choices in the UI. | None. |
14
+
|`src/scaffold/NavigationSidebar/blocks/SidebarLayoutSettingsSubmenu.tsx:121`| Floating submenu surface | keep with reason | Reuses the dropdown panel and width tokens shared by the sibling Presence and Appearance submenus. | None. |
15
+
16
+
Verdict totals: **5 fix**, **4 keep with reason**, **1 abstract**.
0 commit comments