Symptom
A pending approval routed to an unstaffed position strands its record, and on 17.3.0 the only way out is a raw API call. The Console renders no override control anywhere.
Measured on the objectstack-ai/hotclm app, by unstaffing clm_general_manager and driving a routed contract into that rung:
| Observation |
Result |
| The request opens |
pending_approvers: ['position:clm_general_manager'] — an unresolved slate, not an error |
| The record |
PATCH → 409 RECORD_LOCKED, including for the platform admin |
| The former position holder's inbox |
"You're all caught up" |
Platform admin POST /approvals/requests/<id>/approve |
200, the run resumes, the contract reaches approved |
| A non-approver, non-admin doing the same |
403 FORBIDDEN — correct |
| Console: approvals inbox All tab |
no approve / reject / reassign control for the override actor |
Console: the sys_approval_request record page |
same — nothing rendered |
So the service-side override from #3424 works exactly as designed. What is missing is any way to reach it without a shell.
Why this reads as a regression rather than a duplicate
Two closed issues already cover this ground, which is why this is filed as a report rather than a new feature request:
Either the control regressed, or it is gated on something a freshly scaffolded app does not have. Both readings are worth a look, and neither is visible from inside this repository's own tests — the measurement above needed a real app with lockRecord: true and a deliberately unstaffed position.
Impact
For a tenant whose administrators have API access this is an inconvenience. For one whose administrators work only through the Console, a single unstaffed position — someone leaving, a position renamed, a staffing table not yet filled on day one — puts a record beyond reach with no in-product recovery. Apps that set lockRecord: true on a rung, which is the documented shape for "no editing the deal mid-approval", inherit that exposure.
os lint already warns about the authoring half (approval-approvers-may-resolve-empty, which fired on exactly this node and is what prompted the measurement). The warning is accurate and the app accepted it consciously; the gap is that the operational escape hatch it implies exists only over the API.
Expected capability
An override affordance in the Console for an actor the service already admits — on the approvals inbox and/or the sys_approval_request record page — distinguished from an ordinary approve, and carrying the via_override marker #9464 asked for.
Where it was found
objectstack-ai/hotclm card 06 (approval ladder, PR #17), during browser verification. The hazard was driven out rather than argued: the app kept lockRecord: true on the strength of the override existing, and this report is the other half of that decision.
Filed from the hotclm PM seat, via Claude Code.
Symptom
A pending approval routed to an unstaffed position strands its record, and on 17.3.0 the only way out is a raw API call. The Console renders no override control anywhere.
Measured on the objectstack-ai/hotclm app, by unstaffing
clm_general_managerand driving a routed contract into that rung:pending_approvers: ['position:clm_general_manager']— an unresolved slate, not an errorPATCH→409 RECORD_LOCKED, including for the platform adminPOST /approvals/requests/<id>/approveapproved403 FORBIDDEN— correctsys_approval_requestrecord pageSo the service-side override from #3424 works exactly as designed. What is missing is any way to reach it without a shell.
Why this reads as a regression rather than a duplicate
Two closed issues already cover this ground, which is why this is filed as a report rather than a new feature request:
via_overridemarker is never surfaced in any UI #9464 (closed) — console: an admin-override decision renders as an ordinary Approve — no affordance distinction, no confirm, and the approvals: an admin override of a staffed approver slate is recorded as an ordinary approval — no override marker anywhere #4466via_overridemarker is never surfaced in any UI. That issue's premise is that the override renders; ours is that on 17.3.0 it does not render at all.Either the control regressed, or it is gated on something a freshly scaffolded app does not have. Both readings are worth a look, and neither is visible from inside this repository's own tests — the measurement above needed a real app with
lockRecord: trueand a deliberately unstaffed position.Impact
For a tenant whose administrators have API access this is an inconvenience. For one whose administrators work only through the Console, a single unstaffed position — someone leaving, a position renamed, a staffing table not yet filled on day one — puts a record beyond reach with no in-product recovery. Apps that set
lockRecord: trueon a rung, which is the documented shape for "no editing the deal mid-approval", inherit that exposure.os lintalready warns about the authoring half (approval-approvers-may-resolve-empty, which fired on exactly this node and is what prompted the measurement). The warning is accurate and the app accepted it consciously; the gap is that the operational escape hatch it implies exists only over the API.Expected capability
An override affordance in the Console for an actor the service already admits — on the approvals inbox and/or the
sys_approval_requestrecord page — distinguished from an ordinary approve, and carrying thevia_overridemarker #9464 asked for.Where it was found
objectstack-ai/hotclm card 06 (approval ladder, PR #17), during browser verification. The hazard was driven out rather than argued: the app kept
lockRecord: trueon the strength of the override existing, and this report is the other half of that decision.Filed from the hotclm PM seat, via Claude Code.