Skip to content

[BUG] [alpha] Call Stack presentationHint: "label" rows still behave like real selectable frames #37752

@angelicameri

Description

@angelicameri

Project

ide

Description

In the mounted Call Stack panel, debugger adapters can return stack frames with:

  • presentationHint: "label"

Per the Debug Adapter Protocol, those are artificial visual label/separator rows.

But CallStackPanel still treats them like normal actionable frames.

Visible result:

  • a row can be styled like a label,
  • but it still shows pointer/selection behavior,
  • clicking it still calls frame selection,
  • and double-click can still try to navigate.

So a visual separator/label can behave like a real stack frame in the active UI.

Root Cause

The active panel explicitly detects label frames:

  • /src/components/debugger/CallStackPanel.tsx:64
    • const isLabel = () => props.frame.presentationHint === "label";

And it renders them differently as label-style text:

  • /src/components/debugger/CallStackPanel.tsx:79-83

But the same row container always stays interactive:

  • /src/components/debugger/CallStackPanel.tsx:67-77
    • cursor-pointer
    • onClick={props.onSelect}
    • onDblClick={props.onNavigate}

Those handlers are the normal frame actions:

  • /src/components/debugger/CallStackPanel.tsx:127-129
    • handleSelectFrame(frameId) calls debug.selectFrame(frameId)
  • /src/components/debugger/CallStackPanel.tsx:131-136
    • handleNavigateToFrame(frame) dispatches editor:goto when a path exists

The mismatch is spec-visible too: the DAP StackFrame.presentationHint docs describe label as an artificial frame used as a visual label or separator, not a normal stack frame target:

So the component recognizes label rows for rendering, but does not stop them from behaving like ordinary selectable/navigable frames.

Error Message

Debug Logs

System Information

- Cortex IDE `alpha`
- Platform: any

Screenshots

output.mp4

Steps to Reproduce

  1. Start a debug session with an adapter that emits a stack frame using presentationHint: "label".
  2. Open Call Stack.
  3. Find the row rendered as a label/separator.
  4. Click it.
  5. Double-click it if it carries a source path.
  6. Observe the resulting selection/navigation behavior.

Expected Behavior

A presentationHint: "label" row should behave like a visual label/separator only.

It should not be treated like a normal selectable or navigable frame row.

Actual Behavior

The row is styled as a label, but the same container still behaves like a normal frame:

  • it is clickable,
  • it can become selected,
  • and double-click can still trigger navigation.

Additional Context

This is not the same as the current live/local Call Stack issues:

  • live #20612 Debug: Focus Call Stack command does nothing
  • live #29890 Run and Debug: Call Stack entries are mouse-only (clickable divs not focusable, no role/aria-selected)
  • live #36743 Debugger Missing Thread Selection UI (Functional Gap)
  • live #37394 Call Stack single-click selects a frame but only double-click actually navigates to it
  • live #37408 Call Stack switching threads does not refresh Watch expressions, so watch values can stay stale
  • live #37418 Call Stack copy tooltip hardcodes Ctrl+C on macOS
  • live #37430 Call Stack can keep highlighting the wrong thread after a later stop event
  • live #37524 Call Stack selecting a different frame does not retarget Disassembly view because DisassemblyView still uses stackFrames[0]
  • live #37546 Call Stack selecting a thread with no frames can leave the Variables panel showing stale scopes from the previous frame
  • live #37588 Call Stack copy button remains active with no frames and can overwrite the clipboard with an empty string
  • live #37592 Call Stack thread rows can be indistinguishable when different threads share the same name
  • live #37624 Call Stack Copy Call Stack can drop visible source names and replace them with unknown for pathless frames
  • live #37628 Call Stack Restart Frame button can disappear when the adapter omits canRestart on frames
  • local bug-report-call-stack-right-clicking-a-frame-falls-back-to-the-native-context-menu-and-loses-copy-frame-actions.md

Those issues cover command routing, generic keyboard accessibility, missing thread-selection affordance, frame click behavior, stale state after thread/frame changes, copy issues, restart-frame visibility, and lost frame context actions.

This report is specifically about presentationHint: "label" semantics in the mounted CallStackPanel.

Why it is different:

  • the panel already distinguishes label rows visually,
  • but it still routes them through the normal frame-selection/navigation path,
  • so the bug is the label-row interaction contract itself, not generic row accessibility or another stale-state bug.

Duplicate Check

Re-checked local (bug-3, bugs-codex) and targeted live repo searches across open and closed issues with:

  • "Call Stack" presentationHint label
  • "Call Stack" artificial frame
  • "Call Stack" visual label separator
  • local grep for presentationHint === "label", artificial frame, visual label, and existing Call Stack drafts

Findings:

  • Local: no matching report found for this specific label-row interaction path in the mounted CallStackPanel.
  • Live repo: no matching issue found in PlatformNetwork/bounty-challenge for this exact presentationHint: "label" Call Stack behavior at check time (2026-03-25 UTC).
  • Closest live/local items are different:
    • frame click / double-click behavior for normal frames,
    • generic row accessibility,
    • stale thread/frame synchronization issues,
    • copy/restart action issues.
  • Why they are different:
    • none of those reports cover the active CallStackPanel recognizing presentationHint: "label" for visual rendering while still treating the same row as a normal selectable/navigable stack frame.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingideIssues related to IDEmaliciousvalidValid issue

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions