Skip to content

action:icon as an action:bar member forwards the COMPONENT id as the action type, so the action never reaches a handler (clicks do nothing) #6306

Description

@os-support-ai

Filed unassigned by the dev seat implementing #5493 (branch claude/issue-5493-forward-onsuccess-action-surfaces, PR #6304). Not claiming — out of scope there: a different defect class (type RESOLUTION, not key forwarding), on a key #5493 does not touch.

What was measured

action:bar composes each inline member's schema as (packages/components/src/renderers/action/action-bar.tsx @ 42fcf136a):

308: type: componentType, // 'action:button' | 'action:icon' | …
309: actionType: action.type, // the real action type ('api', 'script', …)

action:button resolves that pair when it forwards (action-button.tsx:148):

 type: schema.actionType || schema.type,

action:icon does not (action-icon.tsx:99), and never forwards actionType either:

 type: schema.type,

So an icon member hands the runner type: 'action:icon'. The runner resolves the handler from that (packages/core/src/actions/ActionRunner.ts:954):

 const actionType = action.type || action.actionType || action.name || '';

'action:icon' binds no handler.

Measured, one action:bar holding two members of the SAME declaration (type: 'api'), one component: 'action:icon', one component: 'action:button', with an api handler registered through ActionProvider:

clickedhandler callsdef.type seen by the runner
the action:icon member0
the action:button member1'api'

The button member in the same render is the positive control: the harness executes, the click lands, and the zero on the icon member is a reading rather than a dead probe.

Why it stayed invisible

  • check:action-forward-parity cannot see it: typeis in the forward whitelist. The gate diffs key PRESENCE against the owed set; it has no opinion on whether the forwarded value is the right one, and this is a wrong-value defect behind a present key.
  • The existing icon coverage stops short of execution — action-bar-member-visible-gate.test.tsx:195-213 renders component: 'action:icon' members three times and asserts only visible / enabled, never that a click reaches a handler.
  • Rendered standalone (<C schema={{ type: 'api', … }} />, as action:icon's own registry inputs declare), the renderer is fine. Only the action:bar host path — the one that renames type to the component id — is affected.

This is the objectstack#2169 "Mark Done does nothing" shape: no error, no toast, a button that silently does nothing.

Scope of a fix (not made here)

action-icon.tsx:99 gets the same resolution action:button already has (schema.actionType || schema.type), with coverage that a bar-hosted icon member reaches the handler. Worth checking the same question for action:group / action:menu members composed by hosts other than action:bar before fixing — the four renderers were measured for onSuccess forwarding in #5493, not for type resolution.

Metadata

Metadata

Assignees

Labels

bugSomething isn't workingdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpm:dispatched

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions