feat(sf): /sf escalate list distinguishes auto-accepted from user-resolved

Auto-mode resolutions stamp the artifact with userRationale prefix
"auto-mode: ..." (set by auto-dispatch.ts when it auto-resolves an
escalation). The list view now shows "auto-accepted (accept)" for
those entries vs "resolved (option-id)" for user-resolved ones, so an
operator scanning `/sf escalate list --all` can tell at a glance which
decisions were autonomous and which had explicit human input.

The artifact JSON is unchanged — this is purely a list-formatter
refinement that surfaces information already recorded.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Mikael Hugo 2026-05-02 23:15:20 +02:00
parent 4fb3476912
commit e104f17ad2

View file

@ -73,12 +73,16 @@ export async function handleEscalate(
const art = readEscalationArtifact(task.escalation_artifact_path);
if (!art) continue;
count++;
const isAutoResolved =
art.respondedAt && art.userRationale?.startsWith("auto-mode:");
const status = task.escalation_pending === 1
? "PENDING"
: task.escalation_awaiting_review === 1
? "awaiting-review"
: art.respondedAt
? `resolved (${art.userChoice})`
? isAutoResolved
? `auto-accepted (${art.userChoice})`
: `resolved (${art.userChoice})`
: "(unknown)";
lines.push(` ${task.slice_id}/${task.id} [${status}]: ${art.question}`);
if (status === "PENDING") {