Context
Phase 1 of #13280 (the auto-hide/pin UI consumer under Epic #13158, QT-parity docking polish). #13280 spans three independent PRs — (1) the autoHidden→edge-rail projection, (2) the runtime reveal overlay, (3) the pin affordance — but agent-pr-body-lint mandates exactly one Resolves #N per PR (the 1-PR-per-ticket model, operator rule #12367). So #13280 becomes the parent and each phase a sub-issue; this is the projection phase. The implementation is already complete + green in PR #13770 — this ticket gives it a valid 1:1 close-target.
The claim-time contract for all three phases was settled on #13280 (rail = a new projection branch; reveal = a runtime-only overlay; pin = setItemPinned via the operation-descriptor path).
The Problem
The auto-hide model seam is merged (the persisted autoHidden item field + setItemAutoHidden + pin/auto-hide coherence), but nothing rendered it: DockLayoutAdapter projected every item as a full pane regardless of autoHidden, so an auto-hidden item was invisible to the user. This phase makes it visible as a thin edge rail — the QT-parity collapsed-to-sidebar affordance — without yet wiring the reveal/pin interactions (phases 2–3).
The Architectural Reality
src/dashboard/DockLayoutAdapter.mjs — the model→config projection adapter (consumes committed dock-zone state; emits ordinary Neo container/tab configs). Methods: project → projectNode → projectEdgeZoneNode / projectSplitNode / projectTabsNode / projectItem.
src/dashboard/DockZoneModel.mjs — the merged model seam (autoHidden field; setItemPinned clears autoHidden).
- Guardrails: ADR 0020 §4 (JSON-first — no DOMRect/hover geometry serialized; no parallel pointer system) +
learn/agentos/HarnessDockZoneModel.md (Serializable vs Runtime).
The Fix (delivered in PR #13770)
collectAutoHiddenItems(nodeId, context) — walks an edge-zone/split/tabs subtree, returns the autoHidden item ids.
createEdgeRail / createRailTab — project a thin rail strip + clickable rail tabs carrying stable dockItemId/dockEdge metadata (the handle the phase-2/3 reveal/pin act on).
projectEdgeZoneNode — collects autoHidden items per edge band (top/right/bottom/left), passes a railedItemIds set down, weaves the edge rails into the zone layout.
projectTabsNode — drops railedItemIds from the tab flow; activeItemId falls back to the first remaining item.
- Fail-safe: a center-zone
autoHidden item (main content does not auto-hide) is left in the tab flow rather than vanishing.
Contract Ledger Matrix
| Target Surface |
Source of Authority |
Proposed Behavior |
Fallback / Edge Case |
Docs |
Evidence |
DockLayoutAdapter.projectEdgeZoneNode |
this ticket + HarnessDockZoneModel.md |
autoHidden items per edge band → a thin edge-rail strip; non-autoHidden projection unchanged |
center-zone autoHidden stays in the tab flow (fail-safe) |
HarnessDockZoneModel.md |
12/12 specs green |
DockLayoutAdapter.projectTabsNode |
this ticket |
drops railedItemIds from the tab flow; activeItemId falls back to first remaining |
a fully-railed tabs node projects an empty tab-container |
— |
spec: rail-projection |
rail-tab config (dockNodeType: 'edge-rail-tab') |
this ticket |
carries dockItemId / dockEdge for the phase-2/3 reveal/pin handle |
no DOMRect/hover geometry emitted (JSON-first) |
ADR 0020 §4 |
spec: pinned-not-railed |
Acceptance Criteria
Out of Scope
- The runtime reveal overlay (phase 2 — sibling sub of #13280).
- The pin affordance /
setItemPinned wiring (phase 3 — sibling sub of #13280).
- Visual verification of the rendered rail (phase-2 Neural-Link / post-merge).
Decision Record impact
none — aligned-with ADR 0020 (QT-grade docking); no ADR mutation.
Related
- Parent: #13280 (auto-hide/pin UI consumer)
- Epic: #13158 (QT-parity docking polish)
- PR: #13770 (the implementation)
Live latest-open sweep: checked latest 20 open issues 2026-06-21; no equivalent found.
Origin Session ID: 80932414-00dc-4d2e-96e6-d0bcf1529733
Retrieval Hint: "DockLayoutAdapter autoHidden edge-rail projection phase 1"
Context
Phase 1 of #13280 (the auto-hide/pin UI consumer under Epic #13158, QT-parity docking polish). #13280 spans three independent PRs — (1) the
autoHidden→edge-rail projection, (2) the runtime reveal overlay, (3) the pin affordance — butagent-pr-body-lintmandates exactly oneResolves #Nper PR (the 1-PR-per-ticket model, operator rule#12367). So #13280 becomes the parent and each phase a sub-issue; this is the projection phase. The implementation is already complete + green in PR #13770 — this ticket gives it a valid 1:1 close-target.The claim-time contract for all three phases was settled on #13280 (rail = a new projection branch; reveal = a runtime-only overlay; pin =
setItemPinnedvia the operation-descriptor path).The Problem
The auto-hide model seam is merged (the persisted
autoHiddenitem field +setItemAutoHidden+ pin/auto-hide coherence), but nothing rendered it:DockLayoutAdapterprojected every item as a full pane regardless ofautoHidden, so an auto-hidden item was invisible to the user. This phase makes it visible as a thin edge rail — the QT-parity collapsed-to-sidebar affordance — without yet wiring the reveal/pin interactions (phases 2–3).The Architectural Reality
src/dashboard/DockLayoutAdapter.mjs— the model→config projection adapter (consumes committed dock-zone state; emits ordinary Neo container/tab configs). Methods:project→projectNode→projectEdgeZoneNode/projectSplitNode/projectTabsNode/projectItem.src/dashboard/DockZoneModel.mjs— the merged model seam (autoHiddenfield;setItemPinnedclearsautoHidden).learn/agentos/HarnessDockZoneModel.md(Serializable vs Runtime).The Fix (delivered in PR #13770)
collectAutoHiddenItems(nodeId, context)— walks an edge-zone/split/tabs subtree, returns theautoHiddenitem ids.createEdgeRail/createRailTab— project a thin rail strip + clickable rail tabs carrying stabledockItemId/dockEdgemetadata (the handle the phase-2/3 reveal/pin act on).projectEdgeZoneNode— collectsautoHiddenitems per edge band (top/right/bottom/left), passes arailedItemIdsset down, weaves the edge rails into the zone layout.projectTabsNode— dropsrailedItemIdsfrom the tab flow;activeItemIdfalls back to the first remaining item.autoHiddenitem (main content does not auto-hide) is left in the tab flow rather than vanishing.Contract Ledger Matrix
DockLayoutAdapter.projectEdgeZoneNodeHarnessDockZoneModel.mdautoHiddenitems per edge band → a thin edge-rail strip; non-autoHidden projection unchangedHarnessDockZoneModel.mdDockLayoutAdapter.projectTabsNoderailedItemIdsfrom the tab flow; activeItemId falls back to first remainingdockNodeType: 'edge-rail-tab')dockItemId/dockEdgefor the phase-2/3 reveal/pin handleAcceptance Criteria
autoHiddenedge item projects to an edge rail, not the tab flow.autoHiddenitem stays in the tab flow (fail-safe — never vanishes).DockLayoutAdapterspecs stay green (backward-compatible — noautoHidden⇒ identical projection).Out of Scope
setItemPinnedwiring (phase 3 — sibling sub of #13280).Decision Record impact
none— aligned-with ADR 0020 (QT-grade docking); no ADR mutation.Related
Live latest-open sweep: checked latest 20 open issues 2026-06-21; no equivalent found.
Origin Session ID: 80932414-00dc-4d2e-96e6-d0bcf1529733
Retrieval Hint: "DockLayoutAdapter autoHidden edge-rail projection phase 1"