Frontmatter
| title | >- |
| fix | Workstation resident cards size from their pane, not the viewport |
| author | neo-fable |
| state | Merged |
| createdAt | Aug 4, 2026, 11:20 AM |
| updatedAt | Aug 4, 2026, 12:38 PM |
| closedAt | Aug 4, 2026, 12:38 PM |
| mergedAt | Aug 4, 2026, 12:38 PM |
| branches | dev ← agent/16423-resident-card-container-sizing |
| url | https://github.com/neomjs/neo/pull/16487 |
| contentTrust | |
| projected | |
| quarantined | 0 |
| signals | [] |

PR Review Summary
Status: Approved
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve
- Rationale: The exact-head delta repairs the delivered #16423 behavior in the existing Workstation skin layer, with a non-vacuous red/green browser witness. Request Changes would require a product or safety defect I did not find; Approve+Follow-Up would manufacture a debt lane where the remaining items are open-ended human visual checks, not deferred correctness.
Peer-Review Opening: The measured width/height inversion was the right reason to challenge the ticket's suggested unit rather than implement it literally. The pane-owned container and relationship-level witness preserve the design on tall cards while making degradation explicit on short ones.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: #16423; the three-file changed-surface list; current
devWorkstation pane markup andViewport.scss; the merged Workstation container-query precedent from#15165/ PR#15169; exact-head CI, author L3/red-proof receipts, and targeted Memory Core prior-art results. - Expected Solution Shape: The pane must own a size-query context; fluid card tracks must bind to the constrained block axis, with explicit disclosure before negative slack. The fix must not hardcode dock-node identities or pixel-exact design values, and its E2E isolation must boot independent viewport contexts and assert rendered relationships rather than CSS mechanism.
- Patch Verdict: Improves the ticket's suggested method while matching its outcome. Moving the named
sizecontainer to.workstation-placeholderis necessary for the card's own padding to query an ancestor;cqhfollows the measured constraint axis, while the two fresh-boot cases carry a >1.5× height-ratio precondition, fit assertion, and explicit-hidden-vs-positive-height split. - Premise Coherence: Coheres with verify-before-assert: live geometry overturned the ticket's
cqipossibility, and the patch records the inversion plus mutation-grade red/green evidence instead of treating the prescription as authority.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #16423
- Related Graph Nodes:
#15165, PR#15169, Workstation resident-card, CSS size containment, progressive disclosure - Origin Session ID: 193a0352-2aac-4b8b-98e5-4b536155c0e0
🔬 Depth Floor
Documented search: I actively looked for size-containment collapse, a width/height-axis inversion, vacuous unequal-type assertions, selector/theme duplication, hidden trim still consuming layout, and loss of the torn-out-vessel selector path. The exact-head source, >1.5× geometry precondition, per-card slack check, sole shared SCSS definition, FiveBeat vessel assertion, and author red/green receipts surfaced no merge blocker.
Rhetorical-Drift Audit (per guide §7.4):
- PR description distinguishes the ticket's suggested mechanism from the measured height-axis implementation.
- SCSS comments explain why the container sits on the pane and derive the disclosure thresholds from fit arithmetic.
- No inflated
[RETROSPECTIVE]claim is present. - The prior Workstation container-query precedent supports app-owned CSS responsiveness without being borrowed as proof for this different axis.
Findings: Pass. The body keeps the small tear-out glance in Post-Merge Validation rather than claiming that subjective check as executed proof.
🧠 Graph Ingestion Notes
[KB_GAP]: None observed.[TOOLING_GAP]: None attributable to this PR; the exact-head author-owned E2E receipt covers the non-CI surface.[RETROSPECTIVE]: A responsive unit is only correct relative to the constrained geometry. When live pane width and height move in opposite directions, the ticket's unit suggestion remains a hypothesis and the rendered box decides.
N/A Audits — 📑 📡 🔗
N/A across listed dimensions: this app-local SCSS and E2E repair changes no public/consumed API ledger, MCP description, workflow convention, skill, wire format, or cross-substrate primitive.
🎯 Close-Target Audit
- Close-target identified: #16423
- #16423 is a
bugleaf and is notepic-labeled. - Exact-head commit and PR body contain the same single close target; after refreshing
origin/dev, the branch carries one #16423 commit and only the three declared files. - All five ACs map to the SCSS delta plus the exact-head L3 receipt: pane-relative sizing, non-zero-or-hidden wave, non-negative slack, two viewport sizes/both themes, and SCSS-only placement.
Findings: Pass. The two Post-Merge Validation checks are open-ended human verification, not deferred authoring or an expiring AC.
🪜 Evidence Audit
- PR body declares
Evidence: L3 (...) → L3 required. - Author receipt is exact-head appropriate: two independent viewport boots pass, the stashed-fix red run fails both on equal metric type, and both themes were measured on the shared source layer.
- The visual/runtime ACs are not promoted from static evidence; the browser CSSOM receipt is the stated proof.
- Post-merge items are explicitly separated from merge evidence.
Findings: Pass. Achieved L3 matches the rendered-CSS acceptance surface.
🧪 Test-Evidence & Location Audit
- Execution evidence: all 11 required checks are green at
ee3fa9624ce9340f449d5c003e3e83275bb19446; author non-CI receipt reports 2/2 exact-head E2E passes plus a 2/2 red proof with the fix stashed. - Reviewer falsifier: N/A — no unresolved behavioral concern after checking containment ownership, formula direction, threshold ordering, and the symptom-level red proof.
- Test location: pass — the new witness lives in the existing Workstation E2E shard, uses the custom Neo config, and isolates viewport states into separate boot contexts.
Findings: Pass. The assertions bind pane-height/type direction, rendered-or-hidden trim, and content-box fit rather than implementation tokens or exact pixels.
📋 Required Actions
No required actions — eligible for human merge.
📊 Evaluation Metrics
Verdict weights: 30% premise / right thing, 30% architecture + placement, 30% diff correctness, 10% AC/audit sanity. These are importance-to-verdict weights, not effort budgets.
[ARCH_ALIGNMENT]: 98/100 - The pane is the correct container owner, the constrained axis is evidence-selected, and the change stays in the shared Workstation SCSS layer; the two points retain ordinary caution for arbitrary future tear-out aspect ratios outside the measured ticket states.[CONTENT_COMPLETENESS]: 98/100 - The body truth-folds the ticket-method inversion, carries exact receipts, and the SCSS/spec explain ownership and fit arithmetic; only subjective post-merge glances remain.[EXECUTION_QUALITY]: 96/100 - Exact-head CI, relationship assertions, a geometry precondition, per-card fit checks, and the stashed-fix red proof cover the named failures; four points reflect that the behavioral shard is author-owned non-CI evidence rather than a required emitted check.[PRODUCTIVITY]: 100/100 - Every #16423 AC is delivered without widening into dock-layout or tab-overflow work.[IMPACT]: 68/100 - This is an operator-visible Workstation presentation defect affecting compact panes and film readiness, but it is contained to one app's resident cards.[COMPLEXITY]: 58/100 - Three files and a small selector surface, with moderate reasoning load in 2D container semantics, threshold arithmetic, and rendered relationship coverage.[EFFORT_PROFILE]: Quick Win - A contained SCSS correction plus a focused L3 witness removes a visible defect without changing the dock document or runtime component model.
Exact head is merge-safe; human merge authority remains with @tobiu.
Resolves #16423
The resident cards now size their type, padding, and trim from their pane instead of the viewport:
.workstation-placeholderbecomes a named size-query container (workstation-pane / size), every fluidclamp()track moves fromvwtocqh, the sparkline wave gets aflex-shrink: 0floor, and two@containermax-height rules drop the wave (≤170px) and footer (≤145px) explicitly instead of letting flex shrink them to nothing. The formulas are calibrated so a 436px pane reproduces the pre-change rendered values byte-close (metric47.2px → 46.9px) — the tall cards the operator liked are visually invariant — while a 188px pane resolves27pxmetric type,12pxpadding, and a visible 15px wave where it previously rendered0px. The same container travels with a torn-out vessel, so pane-keyed sizing holds in both boot modes for free.Evidence: L3 (browser-rendered receipts at
1180x840+900x700, both themes, plus the red/green stash cycle and the adjacent e2e battery below) → L3 required (every AC is a rendered-CSS relationship). Residual: none.Deltas from ticket
cqh, notcqi/cqmin: the ticket prescribed moving the fluid tracks tocqi/cqh; live measurement showed the dock hands the short panes more width than the tall ones (287pxwide at188pxtall vs233pxwide at436pxtall), so any width-keyed unit corrects in the wrong direction. Every track keys oncqhwith a px base (clamp(24px, 12px + 8cqh, 58px)etc.), calibrated against the measured pane boxes.170px/145pxcome from the card's fit arithmetic at clamp minimums (wave-visible break-even ≈167px, footer-without-wave ≈141px), each with a guard band so theflex-shrink: 0floor is never asked to absorb negative slack. The SCSS comment carries the arithmetic.container-type: sizeon the pane; that pins the implementation rather than the contract, so it was removed. The red-proof below convicts on the symptom assertions alone.WorkstationFiveBeatNLcomment truth-fix: its vessel skin check documents the padding formula it range-asserts; the prose named the retired2vwform. Comment-only.Test Evidence
New witness
test/playwright/e2e/workstation/WorkstationResidentCardSizingNL.spec.mjs(two boot-state describes, no mid-test resize): unequal panes ⟹ unequal metric type (guarded by a ≥1.5× pane-height-ratio precondition so the relationship can never pass vacuously),zero-height wave ⟹ explicitly hidden, and per-card non-negative slack (last visible child inside the content box).2 passed(NEO_E2E_PORT=8152 npx playwright test workstation/WorkstationResidentCardSizingNL -c test/playwright/playwright.config.e2e.mjs --workers=1).2 failed, both convicting onmetric type must track the panewith equal47.2pxtype across a438px/190pxspread — the exact defect, at the symptom level.1180x840tall/short metric46.88px/27.04px, wave15pxon all four cards (baseline:47.2pxeverywhere, wave0pxon both short cards);900x700tall38.7pxwith wave visible, short (137pxpane) drops wave+footer by rule at the24pxtype floor; both themes structurally identical (sizing lives in the theme-independent src layer).WorkstationNL(full dense tour, 26.5s) +WorkstationDockPreviewSymmetryNL+WorkstationDragTextSelectionNL→ 5/6;WorkstationFiveBeatNLheaded → 9 passed / 1 take-gated skip, byte-identical to the dev-head baseline receipt, including the vessel skin range-assert over the new formula.DragTextSelectionNLoff-document-release recovery) is a load-window flake, not this diff: red only under battery load or immediately after (test times 6.7s/7.4s, timeout-shaped), green 5/5 at cooled head (1.7–1.9s) and 3/3 at cooled baseline — the same signature as theSplitterGridGeometryNLenvironment-window exoneration banked on #16467's thread. Cost note for the record: container units re-resolve card type during pane resizes (bounded to the four placeholder panes); no measured drag regression in the green runs above.Surface coverage —
apps/workstation:WorkstationResidentCardSizingNL(new),WorkstationNL,WorkstationFiveBeatNL,WorkstationDockPreviewSymmetryNL,WorkstationDragTextSelectionNL, all listed above.Post-Merge Validation
.workstation-placeholder; verified via the FiveBeat vessel check locally, worth one human glance on a real tear-out).Authored by Mnemosyne (Fable 5, Claude Code). Session 1913de09-6dc0-4d1e-a9a3-b51c33b46cdc.