LearnNewsExamplesServices
Frontmatter
id16716
titleThe resident card sheds children instead of degrading when its pane is too short
stateClosed
labels
bugai
assigneesneo-fable
createdAtAug 8, 2026, 6:15 PM
updatedAtAug 8, 2026, 8:19 PM
githubUrlhttps://github.com/neomjs/neo/issues/16716
authorneo-opus-grace
commentsCount2
parentIssue15252
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAtAug 8, 2026, 7:37 PM

The resident card sheds children instead of degrading when its pane is too short

neo-opus-grace
neo-opus-grace commented on Aug 8, 2026, 6:15 PM

Context

Found while classifying #16498 and deliberately split out of it, because it is a different defect that was competing for attention on a ticket whose real cause turned out to be tear-out staging (@neo-gpt-emmy's frame-precise evidence there). This one is steady-state layout and reproduces without any gesture at all.

Measured live via Neural Link against a running apps/workstation, viewport measured rather than assumed (window.innerWidth/innerHeight read from the page):

viewport pane height card height card scrollHeight children with height
1282×880 210 208 94 6 / 6
1282×560 80 78 94 4 / 6
1282×420 10 24 94 4 / 6

The Problem

The resident card has no minimum height and no behaviour defined below its content height, so it degrades element-by-element instead of as a unit.

At 1282×560 the card is 78 px against a 94 px content requirement, and it fails two different ways simultaneously:

kicker  h:12    top:175    bottom:187     ok
icon    h:18    top:187    bottom:205     ok
metric  h:22.8  top:213    bottom:235.8   ok
title   h:13    top:243.8  bottom:256.8   → renders BELOW its own card box (cardBottom 241)
footer  h:0                               → collapsed
wave    h:0                               → collapsed

overflow is visible, so the title is not clipped — it paints outside its container, over whatever occupies that space. Two children collapse to zero height and simply do not appear. Neither outcome is a designed degradation; both are what happens when a fixed-content stack is given less room than it needs and nobody decided what should give.

At 1282×420 it goes further: the pane region is 10 px while the card inside it is 24 px — the card is larger than its own container, with content needing 94.

The Architectural Reality

  • The resident panes are built in apps/workstation/view/Workspace.mjs resolvePane() — a plain Neo.component.Base with cls: ['workstation-pane', 'workstation-placeholder', 'workstation-pane-<id>'] and an html block containing .workstation-resident-card with six fixed children (kicker, icon, metric, title, footer, wave).
  • Every non-scale/feed dock item resolves to this shape, so the fragility is shared by roughly 18 panes rather than being specific to one.
  • The card is a showcase surface: it is what a viewer sees in the product's own docking demo, which is where the visual cost lands.

The Fix

Direction, not prescription — the owning decision is what should happen when the space is smaller than the content.

  • Give the card a minimum height, or an explicit below-minimum presentation, so it degrades as a unit rather than shedding children silently.
  • Decide the overflow contract. A title painting outside its own card is the sharper half of this bug: clipping would at least be visibly wrong rather than invisibly wrong.
  • Consider whether a region below a threshold should present a deliberate empty/compact state instead of a partially-rendered card — the same question #16498 AC-2 raises for its own reason, which is why the two want separate answers rather than one shared guess.

Acceptance Criteria

  • At a viewport where the pane is shorter than the card's content height, no child renders outside the card's own box.
  • No child silently collapses to zero height without that being a declared presentation state.
  • The card is never taller than the pane containing it.
  • A spec drives at least two viewport heights either side of the threshold and asserts the presentation contract at both; it must fail against current dev.

Out of Scope

  • #16498's tear-out staging vacancy and drag-start chrome overlay. Different mechanism, different phase, separately owned — this ticket reproduces with no gesture at all.
  • Changing the card's content or visual design.

Avoided Traps

  • Treating this as #16498's cause. I did, briefly, and it was wrong: the 17-frame staging vacancy reproduces at 1282×880 where the pane is a healthy 210 px and nothing here has engaged. A mechanism that only appears near 420 cannot explain a failure already present at 880. Recorded so the next reader does not re-merge them.
  • Fixing it with overflow: hidden alone. That converts an invisible failure into a differently-invisible one; the content is still gone, just tidily. The question is what the card should do with insufficient space, not how to hide the evidence.

Related

#16498 (split from; different mechanism), #15252 (film epic — the showcase surface this affects)

Live latest-open sweep: latest 20 open issues checked 2026-08-08T16:14:41Z; keyword sweep for resident-card/min-height/collapse returned only #16498, from which this is deliberately split. No equivalent found.

Origin Session ID: 9ced67a1-8f21-4da2-a1bf-a2a968c47ed2

Retrieval Hint: query_raw_memories("workstation resident card min-height collapse title escapes card box short viewport")

tobiu referenced in commit 5ca872b - "fix(workstation): resident card degrades as a declared unit below content height (#16716) (#16722) on Aug 8, 2026, 7:37 PM
tobiu closed this issue on Aug 8, 2026, 7:37 PM