LearnNewsExamplesServices
Frontmatter
id18471
titleGroup tab operations clear a maximized pane instead of preserving it
stateClosed
labels
bugaidashboard
assigneesneo-gpt-emmy
createdAtSep 8, 2026, 1:49 PM
updatedAtSep 8, 2026, 2:56 PM
githubUrlhttps://github.com/neomjs/neo/issues/18471
authorneo-gpt-emmy
commentsCount2
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAtSep 8, 2026, 2:56 PM

Group tab operations clear a maximized pane instead of preserving it

neo-gpt-emmy
neo-gpt-emmy commented on Sep 8, 2026, 1:49 PM

Context

Found while answering the maximize-classifier review on PR #18470. The new operation's direct-path repair is separate; this Group-envelope defect already affects existing operations on dev a57ffbe717. Ada independently confirmed the source trace. The measured receipt and boundary and defect-note MESSAGE:9790d8a0-69f6-469a-83cb-e493777c8eb7 carry the discovery.

The Problem

A real WorkspaceSet.commit('main', [setActiveItem]) probe with the node maximized committed the requested active tab but cleared maximizedNodeId to null. The same scalar descriptor classified neutral. The projection received {operations:[{operation:'setActiveItem',tabsNodeId:'tabs',itemId:'b'}],workspaceKey:'main'}.

This contradicts the landed maximize input contract from #17928: operations confined to the maximized node preserve its transient, subject to the node surviving projection. The new finding does not reopen that resolved ticket. Browser geometry was not measured in this discovery probe; the failing state transition and real Group envelope were.

The Architectural Reality

  • src/dashboard/dock/window/WorkspaceSet.mjs:355 packages commit metadata as {operations, workspaceKey}.
  • src/dashboard/dock/plugin/Maximize.mjs:isNeutralOperation requires scalar descriptor.operation; its early guard rejects that envelope before any neutral-operation case is reached. onBeforeDockZoneDocumentChange then clears the transient.
  • Workstation registerMainWorkspace and PopupWorkspace forward context.descriptor into the engine projectDockZoneDocument hook.
  • Group semantic adoption precedes projection. manager/transaction/Commit.mjs supplies captured and valuesBefore in the participant context; the classifier must retain the meaning of an operation's source, rather than inferring it solely from the already-adopted result.

The Fix

Carry the existing Group operation context through the engine projection/collaborator seam and make the maximize decision agree with the existing scalar rules for the affected workspace. Classify a batch with its ordered before/after meaning. Keep policy in the engine maximize/projection boundary, with consumer callbacks only forwarding the needed context. Use the existing transaction capture; do not introduce a second document history, writer or maximize state.

Contract Ledger Matrix

Surface Authority Behavior Refusal / fallback Docs / evidence
Group projection metadata → maximize decision WorkspaceSet commit envelope and Commit participant context Preserve confinement decisions over admitted operations in order Unknown/whole-document/boundary-changing inputs retain the existing conservative clear Existing seam JSDoc; real Group integration controls
Maximize transient continuity Landed maximize input contract and plugin re-projection Confined changes preserve a surviving maximized node; changes beyond it clear terminally before reconciliation A removed node clears; failed semantic writes cause no maximize mutation Plugin JSDoc; direct/Group parity and rendered workspace witness

Acceptance Criteria

  • A positive real-Group test of tab activation within a maximized node fails on current dev and passes after repair. Exercise the Workstation main and popup participant wiring, not a manually unwrapped descriptor.
  • Existing confined activation, add/reorder and close operations preserve maximization when their node survives. Batch classification preserves those rules in order; a non-neutral member or collapsed-away node clears terminally. Direct-path behavior remains covered.
  • A cross-node move into the maximized node remains non-neutral even though the post-adoption document places the moved item there. Include a mixed batch and a rejected-write control; do not classify every member against only the final document.
  • A rendered Group-backed workspace witness proves that switching an active tab keeps the maximized presentation and pane identity, while a topology change outside that node restores normal presentation. No persisted maximize state, extra Group write, or new history entry is introduced.

Out of Scope

The addItem vocabulary repair in #18467 / PR #18470, maximize FLIP arming in #18027, declarative configuration design, and Workstation responsibility extraction. This ticket repairs Group presentation-context propagation; it does not redefine operation or transaction semantics.

Avoided Traps

Simply applying operations.every(isNeutralOperation) against the adopted document can misclassify cross-node moves. Do not flatten away workspace identity, re-admit documents during projection, or repair only one app while leaving the engine contract broken.

Decision Record impact

Aligned with ADR 0029: maximize stays transient presentation, semantic writes remain Group-owned, and persisted shapes are unchanged. No new module placement is prescribed.

Related: #18303 · #18305 · #17928

Ownership: @neo-gpt-emmy claimed this leaf after #18470 merged. Implementation branch: codex/18471-group-maximize-continuity.

Origin Session ID: 153d2e0a-ebae-4087-bcd5-3c92d213132c

Retrieval Hint: Maximize isNeutralOperation WorkspaceSet operations envelope captured valuesBefore setActiveItem

Creation sweeps (2026-09-08 11:49 UTC): live latest 20 open issues and 30 all-state recent A2A checked; no competing filing/claim. All-state maximize searches and the bodies of #17928, #18021 and #18027 distinguish feature, oracle and motion work. Own assignments checked (six open); same-surface #18467, #18456 and #16498 bodies do not own this defect. KB found no direct source; MC problem query returned three unrelated results, so live source and the measured Group probe govern.