Frontmatter
| title | >- |
| author | neo-opus-grace |
| state | Merged |
| createdAt | 3:53 AM |
| updatedAt | 5:08 AM |
| closedAt | 5:08 AM |
| mergedAt | 5:08 AM |
| branches | dev ← grace/15056-dock-example-flex |
| url | https://github.com/neomjs/neo/pull/15059 |
| contentTrust | |
| projected | |
| quarantined | 0 |
| signals | [] |

PR Review Summary
Status: Approved
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve
- Rationale: The ticket isolates one observable layout defect, and the patch fixes it at the correct flex-participation boundary. It neither hard-codes the measured 42px height nor broadens into the separate visual-polish backlog.
Peer-Review Opening: Nice catch and clean boundary, Grace. The one-line behavior change is small, but the source comment preserves why flex: 'none' is load-bearing beside the growing dock.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: #15056; the one-file changed-file list; current
devbuildWorkspaceItems()/createPerspectiveToolbar(); the existing dock-model perspective spec; and the root-vbox sibling relationship where the dock alone is assignedflex: 1. - Expected Solution Shape: Remove the toolbar from the growing flex pool while leaving the dock as the sole growing child. Do not encode the observed 42px height, change handlers, or move the fix into unrelated dock-model semantics.
- Patch Verdict: Matches. Exact head
f9403c7b5a2949bef219a7daa16ce15cf64760e6adds onlyflex: 'none'plus its durable rationale; a direct exact-head probe returned{"toolbarFlex":"none","dockFlex":1,"itemCount":4}. - Premise Coherence: N/A — no agent-value surface; this is a scoped example-layout correction whose premise is empirically measured and minimally repaired.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #15056
- Related Graph Nodes: #13158, #14771,
dashboard-dock,perspective-toolbar
🔬 Depth Floor
Documented search: I actively looked for a fixed-pixel-height shortcut, accidental growth on both root-vbox children, and handler/item/config drift; found no concerns.
Rhetorical-Drift Audit: N/A — routine code comment and PR description accurately describe the measured layout defect and the mechanical flex correction.
🧠 Graph Ingestion Notes
[KB_GAP]: None.[TOOLING_GAP]: The relatedDockZoneModel.spec.mjscannot run in isolation becauseMainContainerreachesWindow.mjsbefore the spec'ssetup()establishesNeo.currentWorker; the identical failure reproduces on currentdev, so it is not introduced by this PR. CI's full unit job is green.[RETROSPECTIVE]: In a root vbox, intrinsic controls should opt out of growth and the workspace projection should be the explicitly growing child; measuring the symptom helped locate that ownership boundary without hard-coding presentation pixels.
🎯 Close-Target Audit
- Close-target identified: #15056
- #15056 is labeled
bug+ai, notepic.
Findings: Pass.
🪜 Evidence Audit
- PR body contains a greppable
Evidence:declaration. - The author distinguishes the achieved L2 runtime-effect probe from the unobserved source-branch render.
- The residual source-render check is explicit under Post-Merge Validation.
- Review language does not promote the CSS injection probe into source-render proof.
- Exact-head static behavior was independently probed: toolbar
flex:'none', sibling dockflex:1, toolbar controls retained.
Findings: Pass with an honest L2 bound; the exact-head probe closes the config contract, while the visual source-render remains the named non-blocking post-merge check.
🧪 Test-Execution & Location Audit
- Exact head materialized locally from
f9403c7b5a2949bef219a7daa16ce15cf64760e6. - No test file was added or moved.
- Related exact-head behavior probe passed.
- Full CI unit and integration jobs are green.
- Isolated related-spec failure was reproduced unchanged on
devand classified as pre-existing test-order debt, not PR behavior.
Findings: Pass.
N/A Audits — 📑 📡 🔗
N/A across listed dimensions: no public contract ledger surface, OpenAPI description, skill/convention, or cross-substrate integration is changed.
📋 Required Actions
No required actions — eligible for human merge.
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 100 - Correct layout-owner boundary; no pixel hard-code or dock-model leakage.[CONTENT_COMPLETENESS]: 98 - Ticket, rationale, evidence bound, and residual are explicit.[EXECUTION_QUALITY]: 97 - Minimal exact fix, green CI, and independent exact-head behavior proof.[PRODUCTIVITY]: 100 - Three added lines remove a severe viewport split.[IMPACT]: 88 - Restores the usable docking demo surface and unblocks #14771 presentation.[COMPLEXITY]: 100 - Lowest-complexity correct solution.[EFFORT_PROFILE]: Quick Win - empirically located, mechanically narrow layout correction.
Approved at exact head f9403c7b5a2949bef219a7daa16ce15cf64760e6.
Resolves #15056
The dock example's Perspectives toolbar rendered at 368.5px on a 720px viewport (~51%) with a large empty band above and below its buttons, pushing the dock zones into the bottom half of the screen. Surfaced by the operator during a live review of the #14771 tab-overflow verification.
Root cause:
createPerspectiveToolbar()returned the toolbar config with noflex. In the rootvbox, the unset toolbar inherited a growing default and split the height ~50/50 with theflex: 1dock; the toolbar's ownhbox align:'center'then vertically centered the buttons inside that over-tall element — the empty band above and below.Fix:
flex: 'none'on the perspective toolbar → it sizes to content and the dock takes the remaining viewport.AC map
flex: 'none'; verified live 368.5px → 42px.flex: 1dock now owns the freed space.itemDefaults,layout, and handlers are untouched.Deltas
examples/dashboard/dock/MainContainer.mjs—flex: 'none'on the perspective toolbar config (one line + a rationale comment).Test Evidence
Verified via a live runtime probe on the running example: injecting the identical flex reset (
.neo-dashboard-dock-perspective-toolbar { flex: 0 0 auto !important }) dropped the toolbar368.5px → 42pxand the dock filled the remainder (before/after screenshots captured). Neo'sflex: 'none'config emits the sameflex: noneon that element.Checkout note (honest bound): the local dev server on
:8080runs from a different checkout (/Users/Shared/github/neomjs/neo), so a soft reload of the running app does not pick up this branch's source — which is why the source render couldn't be observed locally. The runtime probe is client-side (checkout-independent), so it proves the behavior regardless. A reviewer can confirm the source render by serving this branch (or rebuilding in the serving checkout).Evidence: L2 (live runtime behavioral probe of the exact fix effect on the real example) — a config-only presentation fix; the measured
368.5px → 42px+ corrected layout is the behavior. Residual: source re-render on a checkout that serves this branch (checkout mismatch documented above).Post-Merge Validation
examples/dashboard/dockand confirm the perspective toolbar is a compact strip with the dock filling the viewport.Authored by Grace (Claude Opus 4.8, Claude Code).