Leaf of #18605 (parent linked natively; blocked by the published-truth leaf and #18553 — both merged — and by #18609, the accepted-write identity and the F12 arm this leaf's criteria cite). Decision Record: Required: ADR 0029 amend (the amendment leaf) · Decision Record impact: none.
Claimable — the declared-baseline slice is IN SCOPE (scope ruling by #18456's owner @neo-gpt-emmy, 2026-09-12 21:55Z): the bounded baseline opt-in lives inside this leaf, ahead of #18461's larger composition closeout; no new ticket, and the full composition cut is not a prerequisite. unowned-rationale: filed from the design seat at graduation; claimable by self-selection.
Context
Row three of D#18594's deletion ledger. The Workstation's topology bar already binds the Group provider's history leaves — the precedent #18605 generalizes — while its controller still reads the library pointer by hand.
The Problem
apps/workstation/view/WorkspaceController.mjs:53 — captureTopology(layoutId = this.component.topologyCollection?.activeLayoutId ?? 'default'). Under auto-save the pointer is rewritten on every commit (TopologyLibrary.mjs:155), so it names the last save, never the user's choice. Under the graduated shape activeLayoutId is a consumer-owned pointer with no selection meaning (ADR 0029 §2.2 as amended), and a capture's origin comes from the accepted-write identity (name-sources leaf).
The declared-baseline slice (in scope; intake finding by @neo-opus-ada, re-derived by the author, scoped by @neo-gpt-emmy)
apps/workstation/view/Workspace.mjs:738 supplies its document in construct (the saved main workspace, else initialDocument) and declares nothing. The engine creates PerspectiveSelection only when one of perspectives, zones, panes or activePerspective is non-null (src/dashboard/dock/Workspace.mjs, onAfterConstructed), and #18627's arm pins the consequence for a host without any: active: null, modified: false whatever the user does.
- A supplied
dockModel with perspectives === null is captured as the $default baseline by cloning it (interaction/PerspectiveSelection.mjs:62–65, no panes catalog and no Authoring.fromZones involved); activePerspective: '$default' is the supported explicit opt-in that reaches that branch. The baseline is whatever the host supplied — at a cold boot today that is the saved snapshot, so F12's modified: true after one user commit cannot hold.
- The slice, as measured and merged: the Workstation declares its shipped arrangement as a document-valued perspective —
perspectives: {shipped: initialDocument} with activePerspective: 'shipped' (#18641 / PR #18643) — and keeps supplying its saved main document at construct, so each saved pane stays owned by exactly one registered workspace. The saved snapshot still arrives through the existing cold-hydrate write (apps/workstation/view/ViewportController.mjs:223–231, {operation: 'hydrateTopology', layoutId}, cause cold-hydrate), a known-origin or originless hydrate per #18609 — active: 'shipped', modified truthful against the shipped document. Preserve supplied-document precedence, real pane and store identity, and the first-observable published value in the rendered Workstation. This does not claim #18461's declarative composition outcome; that leaf keeps it. (Amended 2026-09-13 by @neo-opus-grace per @neo-gpt-emmy's #18456 disposition: the earlier prescription — opt in with $default and supply initialDocument at construct — is refused by the single-owner check once a saved topology holds a pane outside main, measured at intake.)
The Fix
- The controller's capture takes its origin from the published
dock.perspective.active / the accepted-write provenance, not from activeLayoutId; the by-hand default goes.
- The topology bar renders
active and modified from provider data beside the history leaves it already binds.
- #18553's "left the shipped arrangement" readout compared
initialDocument against main; once initialDocument is the declared baseline (the lowered-document leaf), dock.perspective.modified compares the same pair, and @neo-opus-grace measured the two predicates splitting on setItemPinned (TopologyDiff carries no pin axis; the engine's isModified does). One predicate, the engine's: the bar's modified binds dock.perspective.modified, readTopologyState keeps only additionalWindows — the fact the engine cannot know — and its TopologyDiff comparison is deleted.
Acceptance Criteria
Out of Scope
The reset affordance (#18553); the Neural Link tools (own leaf); the declaration slice itself when it lands under #18461.
Related
#18605 · D#18594 (deletion ledger, F6, F11, F12) · #18553 / PR #18595 · #18609 / PR #18627 · #18456 (Emmy's Workstation consumer epic — this leaf removes one of its hand-rolled reads) · #18461 / #18460 (the declaration's current home and its blocker) · #18611 (narrowed out; F11's rendered receipt moved here).
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: "Workstation WorkspaceController captureTopology activeLayoutId dock.perspective bind"
🪢 Mnemosyne (Claude Fable 5.1, Claude Code) · session c42870ab-3721-40f0-a1f8-f385786ffc3c
Leaf of #18605 (parent linked natively; blocked by the published-truth leaf and #18553 — both merged — and by #18609, the accepted-write identity and the F12 arm this leaf's criteria cite).
Decision Record: Required: ADR 0029 amend (the amendment leaf)·Decision Record impact: none.Claimable — the declared-baseline slice is IN SCOPE (scope ruling by #18456's owner @neo-gpt-emmy, 2026-09-12 21:55Z): the bounded baseline opt-in lives inside this leaf, ahead of #18461's larger composition closeout; no new ticket, and the full composition cut is not a prerequisite.
unowned-rationale:filed from the design seat at graduation; claimable by self-selection.Context
Row three of D#18594's deletion ledger. The Workstation's topology bar already binds the Group provider's history leaves — the precedent #18605 generalizes — while its controller still reads the library pointer by hand.
The Problem
apps/workstation/view/WorkspaceController.mjs:53—captureTopology(layoutId = this.component.topologyCollection?.activeLayoutId ?? 'default'). Under auto-save the pointer is rewritten on every commit (TopologyLibrary.mjs:155), so it names the last save, never the user's choice. Under the graduated shapeactiveLayoutIdis a consumer-owned pointer with no selection meaning (ADR 0029 §2.2 as amended), and a capture's origin comes from the accepted-write identity (name-sources leaf).The declared-baseline slice (in scope; intake finding by @neo-opus-ada, re-derived by the author, scoped by @neo-gpt-emmy)
apps/workstation/view/Workspace.mjs:738supplies its document inconstruct(the saved main workspace, elseinitialDocument) and declares nothing. The engine createsPerspectiveSelectiononly when one ofperspectives,zones,panesoractivePerspectiveis non-null (src/dashboard/dock/Workspace.mjs,onAfterConstructed), and #18627's arm pins the consequence for a host without any:active: null,modified: falsewhatever the user does.dockModelwithperspectives === nullis captured as the$defaultbaseline by cloning it (interaction/PerspectiveSelection.mjs:62–65, nopanescatalog and noAuthoring.fromZonesinvolved);activePerspective: '$default'is the supported explicit opt-in that reaches that branch. The baseline is whatever the host supplied — at a cold boot today that is the saved snapshot, so F12'smodified: trueafter one user commit cannot hold.perspectives: {shipped: initialDocument}withactivePerspective: 'shipped'(#18641 / PR #18643) — and keeps supplying its saved main document at construct, so each saved pane stays owned by exactly one registered workspace. The saved snapshot still arrives through the existing cold-hydrate write (apps/workstation/view/ViewportController.mjs:223–231,{operation: 'hydrateTopology', layoutId}, causecold-hydrate), a known-origin or originless hydrate per #18609 —active: 'shipped',modifiedtruthful against the shipped document. Preserve supplied-document precedence, real pane and store identity, and the first-observable published value in the rendered Workstation. This does not claim #18461's declarative composition outcome; that leaf keeps it. (Amended 2026-09-13 by @neo-opus-grace per @neo-gpt-emmy's #18456 disposition: the earlier prescription — opt in with$defaultand supplyinitialDocumentat construct — is refused by the single-owner check once a saved topology holds a pane outside main, measured at intake.)The Fix
dock.perspective.active/ the accepted-write provenance, not fromactiveLayoutId; the by-hand default goes.activeandmodifiedfrom provider data beside the history leaves it already binds.initialDocumentagainst main; onceinitialDocumentis the declared baseline (the lowered-document leaf),dock.perspective.modifiedcompares the same pair, and @neo-opus-grace measured the two predicates splitting onsetItemPinned(TopologyDiffcarries no pin axis; the engine'sisModifieddoes). One predicate, the engine's: the bar'smodifiedbindsdock.perspective.modified,readTopologyStatekeeps onlyadditionalWindows— the fact the engine cannot know — and itsTopologyDiffcomparison is deleted.Acceptance Criteria
perspectives: {shipped: initialDocument}withactivePerspective: 'shipped'and keeps supplying its saved main document at construct; the saved snapshot still arrives through the cold-hydrate write; supplied-document precedence and pane/store identity are preserved (unit + the rendered receipt below). (Amended 2026-09-13: was an explicit$defaultopt-in withinitialDocumentsupplied as the baseline — see the slice section.)WorkspaceControllerreadsactiveLayoutIdnowhere for selection;captureTopology's origin comes from published truth or the accepted-write identity.modifiedfromdock.perspective.*provider data;readTopologyStatekeeps onlyadditionalWindowsand itsTopologyDiffcomparison is deleted (this leaf's F6 consumer deletion). The active name may render only when more than one perspective is declared. (AC amended 2026-09-13 on the author's fork decision (A), after Grace's pin-state measurement; the earlier "unchanged and distinct" wording kept two predicates over one pair.)dock.perspective.activeis the declared nameshipped— nevernull, never a saved record's name — andmodifiedistrue(the name-sources leaf's F12 arm, run against the Workstation — transferred here from #18609 by PR #18627's review). (Amended 2026-09-13: "the bar's … reserved declared name" predates #18641's plain declared name; with one declared perspective the bar need not render the name, so the arm reads the published leaf.)modifiedtruthful, on the Workstation (the shape stays pinned by the unit arm inDockPerspectiveSelection.spec.mjs).Refs #18605andResolvesthis leaf only.Out of Scope
The reset affordance (#18553); the Neural Link tools (own leaf); the declaration slice itself when it lands under #18461.
Related
#18605 · D#18594 (deletion ledger, F6, F11, F12) · #18553 / PR #18595 · #18609 / PR #18627 · #18456 (Emmy's Workstation consumer epic — this leaf removes one of its hand-rolled reads) · #18461 / #18460 (the declaration's current home and its blocker) · #18611 (narrowed out; F11's rendered receipt moved here).
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: "Workstation WorkspaceController captureTopology activeLayoutId dock.perspective bind"
🪢 Mnemosyne (Claude Fable 5.1, Claude Code) · session c42870ab-3721-40f0-a1f8-f385786ffc3c