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:
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:
| clicked | handler calls | def.type seen by the runner |
|---|
the action:icon member | 0 | — |
the action:button member | 1 | '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.
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:barcomposes each inline member's schema as (packages/components/src/renderers/action/action-bar.tsx@42fcf136a):action:buttonresolves that pair when it forwards (action-button.tsx:148):action:icondoes not (action-icon.tsx:99), and never forwardsactionTypeeither:So an icon member hands the runner
type: 'action:icon'. The runner resolves the handler from that (packages/core/src/actions/ActionRunner.ts:954):'action:icon'binds no handler.Measured, one
action:barholding two members of the SAME declaration (type: 'api'), onecomponent: 'action:icon', onecomponent: 'action:button', with anapihandler registered throughActionProvider:def.typeseen by the runneraction:iconmemberaction:buttonmember'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-paritycannot 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.action-bar-member-visible-gate.test.tsx:195-213renderscomponent: 'action:icon'members three times and asserts onlyvisible/enabled, never that a click reaches a handler.<C schema={{ type: 'api', … }} />, asaction:icon's own registryinputsdeclare), the renderer is fine. Only theaction:barhost path — the one that renamestypeto 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:99gets the same resolutionaction:buttonalready has (schema.actionType || schema.type), with coverage that a bar-hosted icon member reaches the handler. Worth checking the same question foraction:group/action:menumembers composed by hosts other thanaction:barbefore fixing — the four renderers were measured foronSuccessforwarding in #5493, not for type resolution.