@skrr-ai/cli 0.1.107 → 0.1.108

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -58,10 +58,22 @@ function renderExecutionReceipt(receipt, log, verbose = false) {
58
58
  log(` ${evidence.label}: ${location}`);
59
59
  }
60
60
  }
61
+ // "Next" names an action only when the receipt has one. A reason that only
62
+ // restates what happened (a typed blocker's summary, which servers before
63
+ // OSK-16429 sent as the reason) is narrative, not something to do: the actor
64
+ // is printed without it and the narrative stays with the blocker.
65
+ const narrative = [receipt.summary, receipt.blocker?.summary].filter(Boolean);
66
+ const action = receipt.nextActor?.reason && !narrative.includes(receipt.nextActor.reason)
67
+ ? receipt.nextActor.reason
68
+ : '';
61
69
  if (receipt.nextActor)
62
- log(`Next: ${receipt.nextActor.label || receipt.nextActor.kind}${receipt.nextActor.reason ? ` — ${receipt.nextActor.reason}` : ''}`);
70
+ log(`Next: ${receipt.nextActor.label || receipt.nextActor.kind}${action ? ` — ${action}` : ''}`);
63
71
  if (receipt.blocker) {
64
72
  log(`Blocker: ${receipt.blocker.code}`);
73
+ // The headline already carries a typed blocker's summary; say it again only
74
+ // when it differs.
75
+ if (receipt.blocker.summary && receipt.blocker.summary !== receipt.summary)
76
+ log(` Detail: ${receipt.blocker.summary}`);
65
77
  for (const evidenceRef of receipt.blocker.evidenceRefs || [])
66
78
  log(` Evidence: ${evidenceRef}`);
67
79
  }