You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit d7a204a
Browse filesBrowse the repository at this point in the historyBrowse files
fix(plugin-approvals): an SLA reassign to a target that resolves to no one keeps the slate
An approval node's `escalation: { action: 'reassign', escalateTo }` falls
back to the literal `escalateTo` when its position expansion is empty. A
literal that resolved to no one (an unstaffed or mistyped position, a user
id with no account, a `team:` literal) was written onto the slate on
timeout, stranding the request the way the reassign door did before #25592.
The fallback is now judged by the door's own predicate, split out as
`reassignTargetRefusal` (the door's assert is a thin throw over it). A
target that does not resolve leaves the slate, labels and approver index
as they were, takes the `notify` branch to the current slate, and the
`escalate` audit row records why. The submitter notice names the action
actually taken. A failed `sys_user` read throws before the audit row, so
the next sweep retries.
Claude-Session: https://claude.ai/code/session_01HopxxRtFE6z3z91wUD54tp
Co-authored-by: Claude <noreply@anthropic.com>
fix(plugin-approvals): an SLA escalation that reassigns to a target resolving to no one keeps the request on its approvers and notifies them, instead of stranding it on a slate nobody can decide
6
+
7
+
Clause-②: no
8
+
Metadata-protocol: none
9
+
10
+
An approval node's `escalation: { action: 'reassign', escalateTo }` expands `escalateTo` to the holders of that position, and when nobody holds it falls back to the value itself, so a config naming a specific user id keeps working. That fallback is now judged by the same rule the reassign door applies: a user id or email an account carries (and not a user of other organizations only), or `position:<name>` for a position someone in the request's organization holds.
11
+
12
+
-**A target that resolves** reassigns exactly as before.
13
+
-**A target that does not** (an unstaffed or mistyped position name, a user id with no account, a `team:` / `department:` / `org_membership_level:` / `role:` literal) no longer replaces the slate. The pending approvers are kept and receive `approval.sla_breached`, and the `escalate` audit row records `reassign → <target> — not applied: <why>`. The escalation still fires once.
14
+
-**The submitter's escalation notice** now names the action actually taken (`notify` when the reassign was not applied, or when no `escalateTo` was set), not the configured one.
15
+
- A directory read that fails during the sweep leaves the request untouched and unmarked, so the next sweep retries it.
16
+
17
+
Nothing an author writes is refused that was accepted before. To have an overdue request move, name a staffed position or a person in the request's organization in `escalateTo`.
0 commit comments