Observation recorded while executing the 2026-08-22 ruling on #5205 (keep ConfirmationHandler's options parameter, document its out-of-runner producer). Filed unassigned, observation-class — nothing user-reachable is broken. Recording it here because #5205 closes with that PR and these two facts would otherwise leave the tracker with it; both were noted in that card's thread but never triaged on their own.
Verified on origin/main @ 5da008463.
1. app-shell has two near-duplicate confirm runtimes feeding one dialog
packages/app-shell/src/hooks/useConsoleActionRuntime.tsx — confirmHandler typed ConfirmationHandler, sets { open, message, options, resolve }.packages/app-shell/src/views/RecordDetailView.tsx — a second confirmHandler, declared with the inline shape (message: string, options?: { title?: string; confirmText?: string; cancelText?: string }) rather than the published ConfirmationHandler type, setting the same state shape.
Both feed ActionConfirmDialog. This is the same duplication family as #5610 (RecordDetailView's second copy of the param dialog's action?.title fallback) and #3320 — RecordDetailView re-implementing a shared runtime and then drifting from it.
2. On the RecordDetailView path, options really is always undefined
The #5205 ruling turns on a live producer — handleDeleteView in ObjectView.tsx calls its handler with all three fields localized. RecordDetailView's handler has no such producer: it is passed only as onConfirm={confirmHandler} into the action runner, and the runner invokes the confirm handler with one argument (the structured confirm arm that used to forward a bag was retired in #4314). So its options parameter, and the dialog's reads on that path, are dead-in-practice.
The parameter is therefore live on the ObjectView path and inert on the RecordDetailView path — which is why a whole-repo liveness question about ConfirmationHandler has no single answer, and why #5205's card title read as true from one angle.
Not a request to remove anything
⛔ The ConfirmationHandler signature itself is settled: keep, per the 2026-08-22 ruling on #5205; that is not reopened here. What is unresolved is whether RecordDetailView should keep its own copy of the confirm runtime at all — if it consumed useConsoleActionRuntime instead, both facts above disappear at once, and the inline type would stop shadowing the published one. Shape and appetite are a triage call, not decided here.
Generated by Claude Code
Observation recorded while executing the 2026-08-22 ruling on #5205 (keep
ConfirmationHandler'soptionsparameter, document its out-of-runner producer). Filed unassigned, observation-class — nothing user-reachable is broken. Recording it here because #5205 closes with that PR and these two facts would otherwise leave the tracker with it; both were noted in that card's thread but never triaged on their own.Verified on
origin/main@5da008463.1.
app-shellhas two near-duplicate confirm runtimes feeding one dialogpackages/app-shell/src/hooks/useConsoleActionRuntime.tsx—confirmHandlertypedConfirmationHandler, sets{ open, message, options, resolve }.packages/app-shell/src/views/RecordDetailView.tsx— a secondconfirmHandler, declared with the inline shape(message: string, options?: { title?: string; confirmText?: string; cancelText?: string })rather than the publishedConfirmationHandlertype, setting the same state shape.Both feed
ActionConfirmDialog. This is the same duplication family as #5610 (RecordDetailView's second copy of the param dialog'saction?.titlefallback) and #3320 —RecordDetailViewre-implementing a shared runtime and then drifting from it.2. On the
RecordDetailViewpath,optionsreally is alwaysundefinedThe #5205 ruling turns on a live producer —
handleDeleteViewinObjectView.tsxcalls its handler with all three fields localized.RecordDetailView's handler has no such producer: it is passed only asonConfirm={confirmHandler}into the action runner, and the runner invokes the confirm handler with one argument (the structuredconfirmarm that used to forward a bag was retired in #4314). So itsoptionsparameter, and the dialog's reads on that path, are dead-in-practice.The parameter is therefore live on the
ObjectViewpath and inert on theRecordDetailViewpath — which is why a whole-repo liveness question aboutConfirmationHandlerhas no single answer, and why #5205's card title read as true from one angle.Not a request to remove anything
⛔ The
ConfirmationHandlersignature itself is settled: keep, per the 2026-08-22 ruling on #5205; that is not reopened here. What is unresolved is whetherRecordDetailViewshould keep its own copy of the confirm runtime at all — if it consumeduseConsoleActionRuntimeinstead, both facts above disappear at once, and the inline type would stop shadowing the published one. Shape and appetite are a triage call, not decided here.Generated by Claude Code