Found while executing #6034 (converge the two confirm runtimes' close handlers). Filed unassigned, observation-class — the same divergence, one dialog over, and nothing was verified against a running app.
Verified on origin/main @ 9602dc820.
The same close divergence, on ActionParamDialog instead of ActionConfirmDialog
app-shell mounts two action runtimes into two copies of ActionParamDialog. They agree on open and disagree on close, exactly as the confirm runtimes did:
| open | close |
|---|
packages/app-shell/src/hooks/useConsoleActionRuntime.tsx | :264setParamState({ ... }) | :716setParamState({ open: false, params: [] }) — replaces the whole state |
packages/app-shell/src/views/RecordDetailView.tsx | :562setParamState({ ... }) | :2519setParamState(s => ({ ...s, open: false })) — preserves fields |
#6034 ruled the confirm pair onto the field-preserving shape, and the reason it gave transfers in form but not automatically in substance: Radix keeps dialog content mounted through its exit animation (data-[state=closed]:animate-out … duration-200 on AlertDialogContent / DialogContent), so whatever the runtime writes on close is what the dialog renders while it fades out.
Why this is filed rather than folded into #6034
#6034's fence is the CONFIRM path, and its dispatch was explicit that finding a further consumer changes the card rather than widening it.
It is also not the same mechanical call. ConfirmDialogState is four display-ish fields; ParamDialogState carries params and the collection's in-flight state, so "blank it on close" may be the deliberate choice there — dropping a stale form rather than re-rendering it for 200ms — or it may be the same mid-fade blanking defect. Deciding that needs a look at what ActionParamDialog reads off state after open flips false, and at whether any consumer depends on the params surviving. That is a ruling, not a cleanup.
Related: the third dialog in the same two runtimes, ActionResultDialog, does not diverge — both sides close with setResultDialogState({ open: false }) (useConsoleActionRuntime.tsx:722, RecordDetailView.tsx:2528), which is also its initial state. So the drift is two dialogs out of three.
Same family as #6034, #5610 and #3320 — RecordDetailView re-implementing a shared runtime and then diverging from it with nothing red in between.
Generated by Claude Code
Generated by Claude Code
Found while executing #6034 (converge the two confirm runtimes' close handlers). Filed unassigned, observation-class — the same divergence, one dialog over, and nothing was verified against a running app.
Verified on
origin/main@9602dc820.The same close divergence, on
ActionParamDialoginstead ofActionConfirmDialogapp-shellmounts two action runtimes into two copies ofActionParamDialog. They agree on open and disagree on close, exactly as the confirm runtimes did:packages/app-shell/src/hooks/useConsoleActionRuntime.tsx:264setParamState({ ... }):716setParamState({ open: false, params: [] })— replaces the whole statepackages/app-shell/src/views/RecordDetailView.tsx:562setParamState({ ... }):2519setParamState(s => ({ ...s, open: false }))— preserves fields#6034 ruled the confirm pair onto the field-preserving shape, and the reason it gave transfers in form but not automatically in substance: Radix keeps dialog content mounted through its exit animation (
data-[state=closed]:animate-out … duration-200onAlertDialogContent/DialogContent), so whatever the runtime writes on close is what the dialog renders while it fades out.Why this is filed rather than folded into #6034
#6034's fence is the CONFIRM path, and its dispatch was explicit that finding a further consumer changes the card rather than widening it.
It is also not the same mechanical call.
ConfirmDialogStateis four display-ish fields;ParamDialogStatecarriesparamsand the collection's in-flight state, so "blank it on close" may be the deliberate choice there — dropping a stale form rather than re-rendering it for 200ms — or it may be the same mid-fade blanking defect. Deciding that needs a look at whatActionParamDialogreads offstateafteropenflips false, and at whether any consumer depends on the params surviving. That is a ruling, not a cleanup.Related: the third dialog in the same two runtimes,
ActionResultDialog, does not diverge — both sides close withsetResultDialogState({ open: false })(useConsoleActionRuntime.tsx:722,RecordDetailView.tsx:2528), which is also its initial state. So the drift is two dialogs out of three.Same family as #6034, #5610 and #3320 —
RecordDetailViewre-implementing a shared runtime and then diverging from it with nothing red in between.Generated by Claude Code
Generated by Claude Code