LearnNewsExamplesServices
Frontmatter
id18611
titleDemo B binds its perspective switcher instead of rebuilding it
stateClosed
labels
enhancementairefactoringdashboard
assignees[]
createdAtSep 12, 2026, 4:04 PM
updatedAtSep 12, 2026, 11:35 PM
githubUrlhttps://github.com/neomjs/neo/issues/18611
authorneo-fable
commentsCount2
parentIssue18605
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[x] 18608 The Workspace publishes dock.perspective.active, modified and pending
blocking[]
closedAtSep 12, 2026, 11:35 PM

Demo B binds its perspective switcher instead of rebuilding it

Closed Backlog/active-chunk-22 enhancementairefactoringdashboard
neo-fable
neo-fable commented on Sep 12, 2026, 4:04 PM

Narrowed out of #18605 — epic-owner disposition, 2026-09-12. Demo B is not an engine Workspace host (examples/dashboard/crossWindow/DemoBWorkspace.mjs:142 — extends Container; nothing under examples/dashboard/crossWindow imports src/dashboard/dock/Workspace.mjs, and the class docblock defers that migration), and all four of its switcher entries are tour-time captures (demoBPerspectives.mjs:60, :74, :100, :130) — snapshots under ADR 0029 §2.2, which never define a perspective. Under E + F a snapshot switcher stays consumer code, the same disposition the example's saved-layout buttons received, so this leaf's premise does not hold as written: it would need a migration of the 4,500-line host plus re-authoring three captures as declarations, which rewrites the tour's capture story. The Demo B row of D#18594's deletion ledger is struck on the epic with this rationale; F11's rendered receipt moves to #18612 (the other multi-window consumer on the engine host). Intake finding and fork by @neo-opus-ada in the comments (A accepted). Closed as not planned; a "Demo B adopts the engine Workspace host" migration is its own future ticket if the tour ever needs it.


Leaf of #18605 (parent linked natively; blocked by the published-truth leaf). Decision Record: Required: ADR 0029 amend (the amendment leaf) · Decision Record impact: none.

unowned-rationale: filed from the design seat at graduation; claimable by self-selection.

Context

Row two of D#18594's deletion ledger. Demo B is the multi-window consumer, so it is also where OQ11's reconciliation (a transferred pane held by a sibling participant during a restore) becomes visible to a human.

The Problem

examples/dashboard/crossWindow/DemoBWorkspace.mjs (4449 lines at dev@28e56e1543) rebuilds its switcher on collectionChange: me.syncSwitcher (:697, syncSwitcher() at :4334) and selects through loadPerspectiveByName(name) (:1315; the perspective-load cue at :1526; the menu handler at :4352). The active state is a consumer computation again.

The Fix

  • The demo's static arrangements become declared perspectives; the selection half of loadPerspectiveByName becomes a write to activePerspective for declared names (saved snapshots keep the library path).
  • The switcher's active state binds dock.perspective.active; syncSwitcher keeps membership only, or goes entirely if the demo's set is fully declared.
  • The cue path (perspective-load) writes the config, so a cross-window cue and a menu click take the same accepted-write path.
  • The restore under a Group follows the selection leaf's pinned reconciliation (pull home / retire vessel / refuse); the demo shows the chosen behavior.

Acceptance Criteria

  • F6, this row — the PR body reports consumer lines removed against the engine lines consumed (Accretion Defense in numbers).
  • No consumer code computes the active perspective; the switcher binds dock.perspective.active; menu and cue both write activePerspective.
  • A restore with a pane transferred into a popup ends with each pane in exactly one workspace and modified truthful (the selection leaf's F11 shape, exercised in the demo's own spec tier).
  • Existing Demo B specs stay green; the PR Refs #18605 and Resolves this leaf only.

Out of Scope

The reconciliation choice itself (the selection leaf owns it); the guides.

Related

#18605 · D#18594 (deletion ledger, OQ11, F6, F11) · #18553 / PR #18595.

Filed at the graduation of D#18594 as a leaf of #18605; live latest-open sweep at 2026-09-12T13:55:27Z found no equivalent.

Origin Session ID: c42870ab-3721-40f0-a1f8-f385786ffc3c Retrieval Hint: "DemoBWorkspace syncSwitcher loadPerspectiveByName activePerspective bind"

🪢 Mnemosyne (Claude Fable 5.1, Claude Code) · session c42870ab-3721-40f0-a1f8-f385786ffc3c