pi-goal-list-loop-audit 0.29.22 → 0.29.23
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.
- package/extensions/loops/goal.ts +12 -12
- package/package.json +1 -1
package/extensions/loops/goal.ts
CHANGED
|
@@ -633,9 +633,9 @@ function escalateSendRearmStorm(ctx: ExtensionContext, kind: "continuation" | "l
|
|
|
633
633
|
appendLedger(ctx.cwd, "send_rearm_escalated", { kind, afterMinutes: mins, silentMinutes: silent });
|
|
634
634
|
if (kind === "loop" && isLoopActive()) {
|
|
635
635
|
clearLoopTimer();
|
|
636
|
-
state.loop = { ...state.loop!, active: false, stopReason: `send-retry storm: ${mins}m of re-arms with no session activity for ${silent}m — the session is wedged.
|
|
636
|
+
state.loop = { ...state.loop!, active: false, stopReason: `send-retry storm: ${mins}m of re-arms with no session activity for ${silent}m — the session is wedged. Press Escape to cancel the stuck run (pi's own rate-limit retry holds it; pi prints "escape to cancel"), then /loop resume — the loop holds on restore. If still wedged: /reload rebuilds extensions in place, then /loop resume again. Restart pi only if /reload itself fails.` };
|
|
637
637
|
persistState(ctx);
|
|
638
|
-
ctx.ui.notify(`Loop stopped: send-retry storm (${mins}m, session silent ${silent}m).
|
|
638
|
+
ctx.ui.notify(`Loop stopped: send-retry storm (${mins}m, session silent ${silent}m). Escape cancels the stuck run, then /loop resume (the loop holds on restore). /reload if it persists; restart pi only if /reload fails.`, "warning");
|
|
639
639
|
notifyExternal(ctx, "Loop stopped: send-retry storm.");
|
|
640
640
|
return;
|
|
641
641
|
}
|
|
@@ -651,7 +651,7 @@ function escalateSendRearmStorm(ctx: ExtensionContext, kind: "continuation" | "l
|
|
|
651
651
|
// + junk-runner: "complete ending in a pause retry storm"). The audit
|
|
652
652
|
// lifecycle owns its own pauses (quota etc.).
|
|
653
653
|
appendLedger(ctx.cwd, "send_rearm_escalated_suppressed", { reason: "audit-lifecycle" });
|
|
654
|
-
ctx.ui.notify("Send-retry storm during the completion audit — NOT pausing; the auditor's silence is expected. If pi is wedged,
|
|
654
|
+
ctx.ui.notify("Send-retry storm during the completion audit — NOT pausing; the auditor's silence is expected. If pi is wedged, Escape cancels the stuck run; the stored claim survives.", "info");
|
|
655
655
|
return;
|
|
656
656
|
}
|
|
657
657
|
if (state.goal && state.goal.status === "active") {
|
|
@@ -659,9 +659,9 @@ function escalateSendRearmStorm(ctx: ExtensionContext, kind: "continuation" | "l
|
|
|
659
659
|
status: "paused",
|
|
660
660
|
pauseKind: "error",
|
|
661
661
|
pauseReason: `send-retry storm: ${mins}m of re-arms with no session activity for ${silent}m — the session never went idle for the continuation`,
|
|
662
|
-
pauseSuggestedAction: "The session produced no events while the send retried (wedged queue).
|
|
662
|
+
pauseSuggestedAction: "The session produced no events while the send retried (wedged queue — often pi's own rate-limit retry holding the run; pi prints 'escape to cancel'). Press Escape, then /goal resume. If still wedged: /reload rebuilds extensions in place, then /goal resume again. Restart pi only if /reload fails.",
|
|
663
663
|
}, ctx);
|
|
664
|
-
ctx.ui.notify(`${goalNoun()} paused: send-retry storm (${mins}m, session silent ${silent}m).
|
|
664
|
+
ctx.ui.notify(`${goalNoun()} paused: send-retry storm (${mins}m, session silent ${silent}m). Escape cancels the stuck run, then /goal resume. /reload if it persists; restart pi only if /reload fails.`, "warning");
|
|
665
665
|
notifyExternal(ctx, `${goalNoun()} paused: send-retry storm.`);
|
|
666
666
|
}
|
|
667
667
|
}
|
|
@@ -672,9 +672,9 @@ function escalateStallNow(ctx: ExtensionContext, threshold: number): boolean {
|
|
|
672
672
|
appendLedger(ctx.cwd, "stall_escalated", { threshold, kind: isLoopActive() ? "loop" : "goal" });
|
|
673
673
|
if (isLoopActive()) {
|
|
674
674
|
clearLoopTimer();
|
|
675
|
-
state.loop = { ...state.loop!, active: false, stopReason: `stalled: ${threshold} continuation refires landed no turn — the session is not continuing (wedged message queue or stale API).
|
|
675
|
+
state.loop = { ...state.loop!, active: false, stopReason: `stalled: ${threshold} continuation refires landed no turn — the session is not continuing (wedged message queue or stale API). Press Escape to cancel any stuck run, then /loop resume — the loop holds on restore. If the handle is stale, /reload rebuilds extensions in place; restart pi only if /reload fails.` };
|
|
676
676
|
persistState(ctx);
|
|
677
|
-
ctx.ui.notify(`Loop stopped: ${threshold} refires produced no turn — the continuation is not landing.
|
|
677
|
+
ctx.ui.notify(`Loop stopped: ${threshold} refires produced no turn — the continuation is not landing. Escape cancels a stuck run, then /loop resume (the loop holds on restore). /reload if stale; restart pi only if /reload fails.`, "warning");
|
|
678
678
|
notifyExternal(ctx, "Loop stopped: stalled (continuation not landing).");
|
|
679
679
|
return true;
|
|
680
680
|
}
|
|
@@ -683,9 +683,9 @@ function escalateStallNow(ctx: ExtensionContext, threshold: number): boolean {
|
|
|
683
683
|
status: "paused",
|
|
684
684
|
pauseKind: "error",
|
|
685
685
|
pauseReason: `stalled: ${threshold} continuation refires landed no turn`,
|
|
686
|
-
pauseSuggestedAction: "The continuation chain is broken in this process (wedged message queue or stale API).
|
|
686
|
+
pauseSuggestedAction: "The continuation chain is broken in this process (wedged message queue or stale API). Press Escape to cancel any stuck run, then /goal resume. If the handle is stale, /reload rebuilds extensions in place — restart pi only if /reload fails.",
|
|
687
687
|
}, ctx);
|
|
688
|
-
ctx.ui.notify(`${goalNoun()} paused: ${threshold} refires produced no turn.
|
|
688
|
+
ctx.ui.notify(`${goalNoun()} paused: ${threshold} refires produced no turn. Escape cancels a stuck run, then /goal resume. /reload if stale; restart pi only if /reload fails.`, "warning");
|
|
689
689
|
notifyExternal(ctx, `${goalNoun()} paused: stalled (continuation not landing).`);
|
|
690
690
|
return true;
|
|
691
691
|
}
|
|
@@ -1392,7 +1392,7 @@ function fireReviewer(
|
|
|
1392
1392
|
// to still count as "proposed" in the report + notify. Now the
|
|
1393
1393
|
// failure is LOUD and the proposal goes uncounted.
|
|
1394
1394
|
ctx.ui.notify(
|
|
1395
|
-
`Postaudit /goal proposal NOT delivered: ${err instanceof Error ? err.message : String(err)} — the follow-up never reached the session.
|
|
1395
|
+
`Postaudit /goal proposal NOT delivered: ${err instanceof Error ? err.message : String(err)} — the follow-up never reached the session. Run /reload if the session was just replaced (extensions rebuild in place), then retry.`,
|
|
1396
1396
|
"warning",
|
|
1397
1397
|
);
|
|
1398
1398
|
return false;
|
|
@@ -1528,7 +1528,7 @@ async function startDrafting(ctx: ExtensionContext, target: "goal" | "list" | "l
|
|
|
1528
1528
|
if (isStaleApiError(err)) {
|
|
1529
1529
|
extensionApiStale = true;
|
|
1530
1530
|
appendLedger(ctx.cwd, "extension_api_stale", { where: "startDrafting seed" });
|
|
1531
|
-
ctx.ui.notify("glla: can't start the drafting interview — this session's extension handle is stale (pi session replacement).
|
|
1531
|
+
ctx.ui.notify("glla: can't start the drafting interview — this session's extension handle is stale (pi session replacement). Run /reload (extensions rebuild in place), then re-run the command. Restart pi only if /reload fails.", "warning");
|
|
1532
1532
|
} else {
|
|
1533
1533
|
ctx.ui.notify(`glla: couldn't start the drafting interview (${err instanceof Error ? err.message : String(err)}) — try again.`, "warning");
|
|
1534
1534
|
}
|
|
@@ -1648,7 +1648,7 @@ async function cmdSet(args: string, ctx: ExtensionContext, skipDraft = false): P
|
|
|
1648
1648
|
// v0.28.1 (S3): the goal is persisted — mark the interrupt so the next
|
|
1649
1649
|
// fresh session LOADS it (held by default since v0.28.21), and tell the truth instead of "starting now".
|
|
1650
1650
|
updateGoal({ interruptedAt: nowIso(), interruptedReason: "created in a stale session" }, ctx);
|
|
1651
|
-
ctx.ui.notify(`Goal saved: ${shortObj(goal.objective)} — safe in .pi-glla/, but this stale process can't send continuations.
|
|
1651
|
+
ctx.ui.notify(`Goal saved: ${shortObj(goal.objective)} — safe in .pi-glla/, but this stale process can't send continuations. Run /reload (extensions rebuild in place, state survives), then /goal resume. Restart pi only if /reload itself fails.`, "warning");
|
|
1652
1652
|
return;
|
|
1653
1653
|
}
|
|
1654
1654
|
ctx.ui.notify(`Goal started: ${shortObj(goal.objective)} — the auditor will verify on completion.`, "info");
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pi-goal-list-loop-audit",
|
|
3
|
-
"version": "0.29.
|
|
3
|
+
"version": "0.29.23",
|
|
4
4
|
"description": "Goal. Loop. Audit. Done. \u2014 a pi-coding-agent extension that supervises long-running work, with isolated auditor on each completion. Beat bamboozling by design: the auditor runs in a fresh session with no extensions, no skills, no editor \u2014 only the read tools needed to verify your goal.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "dracon",
|