record §5.4's first item as landed
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -32,8 +32,10 @@ before deciding what to pick up next. Its conclusions in one paragraph:
|
|||||||
identity, the app-config fields are deleted or moved onto the app, and the inert context is built
|
identity, the app-config fields are deleted or moved onto the app, and the inert context is built
|
||||||
once. **§5.1's first two items are closed too** (`04371a9`, `198dc71`, `c92b51c`) — panels have a close
|
once. **§5.1's first two items are closed too** (`04371a9`, `198dc71`, `c92b51c`) — panels have a close
|
||||||
signal that fires on a real close and on nothing else, and the terminals use it; the chat panel
|
signal that fires on a real close and on nothing else, and the terminals use it; the chat panel
|
||||||
deliberately does not, which is the inversion above. Tier B is now the pty backstop (the third item of
|
deliberately does not, which is the inversion above. **§5.4's first item is closed** (`1de1d92`) — the
|
||||||
§5.1), `normalizeLayout` (§5.4) and the mobile decision (§6).
|
allow-list is a `WorkspaceView` prop and the fourteen copies are gone. Tier B is now the pty backstop
|
||||||
|
(the third item of §5.1), the default-layout collapse (the second item of §5.4) and the mobile
|
||||||
|
decision (§6).
|
||||||
- **Tier C, orthogonal:** everything else — including **§5.2 (remounts) and §5.3 (drag-to-move), both
|
- **Tier C, orthogonal:** everything else — including **§5.2 (remounts) and §5.3 (drag-to-move), both
|
||||||
large downgrades.** A panel is now a pointer to a server-side session, so a remount costs a replay, and
|
large downgrades.** A panel is now a pointer to a server-side session, so a remount costs a replay, and
|
||||||
the drag hazard is disarmed by resolving identity by name (`e588524` + `bc82086`).
|
the drag hazard is disarmed by resolving identity by name (`e588524` + `bc82086`).
|
||||||
@@ -384,7 +386,21 @@ the whole table:
|
|||||||
|
|
||||||
### 5.4 Make `normalizeLayout` framework, not convention
|
### 5.4 Make `normalizeLayout` framework, not convention
|
||||||
|
|
||||||
- [ ] **One `makeLayoutNormalizer(allowed, fallback)` applied inside `WorkspaceView`.**
|
- [x] **One normaliser applied inside `WorkspaceView`.** _(`1de1d92`)_ — it landed as a prop rather
|
||||||
|
than a factory: `<WorkspaceView appTypes={{ allowed, fallback }} />`, with `normalizeLayout` in
|
||||||
|
`layout-utils.ts` and the persist-back inside `WorkspaceView`. All fourteen copies are deleted;
|
||||||
|
QrTransfer gained the persist-back it never had. Two notes for whoever reads this next. The
|
||||||
|
framework normaliser **drops `config`** when it replaces an app — the copies kept it, which left
|
||||||
|
the old app's config on a panel the new app now owns, the opposite of `setApp`. And Headscale
|
||||||
|
keeps a local `useMemo`, because its check is "is the server picker present at all", which is
|
||||||
|
about a panel being _missing_ and no allow-list can see that.
|
||||||
|
Still open from this item: deriving the allow-lists from the AppRegistry (they are still
|
||||||
|
hand-written literals, so a type still allow-listed but deleted from the registry passes and
|
||||||
|
reaches the unrecoverable empty box at `PanelSlot.tsx:311-317`), and the nine locked screens
|
||||||
|
that still pass no `appTypes` at all — now a one-line fix each rather than fifty.
|
||||||
|
The original text follows.
|
||||||
|
|
||||||
|
**One `makeLayoutNormalizer(allowed, fallback)` applied inside `WorkspaceView`.**
|
||||||
The guard currently exists **14 times, character-identical except for the allow-list and the
|
The guard currently exists **14 times, character-identical except for the allow-list and the
|
||||||
fallback**, plus a matching `useMemo`/persist-back `useEffect` pair 13 times — ~150 duplicated
|
fallback**, plus a matching `useMemo`/persist-back `useEffect` pair 13 times — ~150 duplicated
|
||||||
lines. Consequences of it being convention: - **10 `WorkspaceView` consumers have no guard at all**, including `screens/HomeScreen.tsx:11`,
|
lines. Consequences of it being convention: - **10 `WorkspaceView` consumers have no guard at all**, including `screens/HomeScreen.tsx:11`,
|
||||||
@@ -635,6 +651,13 @@ Cheap to fix, and prerequisites for the 5.8 migration rather than alternatives t
|
|||||||
|
|
||||||
_(move items here with the commit and a one-line resolution)_
|
_(move items here with the commit and a one-line resolution)_
|
||||||
|
|
||||||
|
- [x] **The appType allow-list is a prop, not a convention.** _(`1de1d92`, branch
|
||||||
|
`agent-coordination-mvp`)_ — closes the first item of §5.4. Fourteen character-identical
|
||||||
|
normalisers, each with its `useMemo` and persist-back `useEffect`, collapse to
|
||||||
|
`appTypes={{ allowed, fallback }}`. 402 lines deleted for 215 added, most of the additions being
|
||||||
|
the seven tests that pin the normaliser — including idempotence, because a normaliser that does
|
||||||
|
not normalise to itself turns the persist-back into an infinite write loop.
|
||||||
|
|
||||||
- [x] **Panels can carry per-panel settings, and keep them through a move.** _(`e588524`, branch
|
- [x] **Panels can carry per-panel settings, and keep them through a move.** _(`e588524`, branch
|
||||||
`agent-coordination-mvp`)_ — `LayoutPanel.config`, opaque to the framework, exposed as
|
`agent-coordination-mvp`)_ — `LayoutPanel.config`, opaque to the framework, exposed as
|
||||||
`usePanelConfig(panelId)`. The substantive half is in `layout-utils.ts`: `swapPanels` and
|
`usePanelConfig(panelId)`. The substantive half is in `layout-utils.ts`: `swapPanels` and
|
||||||
|
|||||||
Reference in New Issue
Block a user