Found while converging the server-action dispatch for #2904 (deliberately NOT fixed there — different decision surface).
useConsoleActionRuntime.modalActionHandler was fixed by objectstack#3959: an unresolvable type: 'modal' target is reported as an authoring error, because the framework rejects type: 'modal' over REST with a 400 (headlessActionTypeError) — the "fall back to the server-side handler" path can never succeed and only converts an authoring mistake into a confusing round trip.
RecordDetailView.modalActionHandler still has the pre-#3959 shape:
const descriptor = schema != null ? await resolveModalTarget(schema) : null;
if (descriptor) return modalHandler(descriptor);
return serverActionHandler(action); // ← dead fallthrough: server 400s type:'modal'
…and its doc comment claims "same rule as the shared console runtime", which is no longer true — the shared runtime returns the descriptive error, the record page POSTs and surfaces an opaque 400.
Fix: mirror the #3959 behavior (and its error copy) on the record page, or better, lift the modal dispatch into the shared wrapper so it cannot drift again. Test to update/add: a RecordDetailView-side counterpart of useConsoleActionRuntime.test.tsx's "reports an unresolvable target instead of POSTing to /actions".
Refs objectstack#3959, #2904.
Found while converging the server-action dispatch for #2904 (deliberately NOT fixed there — different decision surface).
useConsoleActionRuntime.modalActionHandlerwas fixed by objectstack#3959: an unresolvabletype: 'modal'target is reported as an authoring error, because the framework rejectstype: 'modal'over REST with a 400 (headlessActionTypeError) — the "fall back to the server-side handler" path can never succeed and only converts an authoring mistake into a confusing round trip.RecordDetailView.modalActionHandlerstill has the pre-#3959 shape:…and its doc comment claims "same rule as the shared console runtime", which is no longer true — the shared runtime returns the descriptive error, the record page POSTs and surfaces an opaque 400.
Fix: mirror the #3959 behavior (and its error copy) on the record page, or better, lift the modal dispatch into the shared wrapper so it cannot drift again. Test to update/add: a RecordDetailView-side counterpart of
useConsoleActionRuntime.test.tsx's "reports an unresolvable target instead of POSTing to /actions".Refs objectstack#3959, #2904.