pi-goal-list-loop-audit 0.29.3 → 0.29.4

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.
@@ -3383,13 +3383,11 @@ function registerAgentTools(pi: any, ctx: ExtensionContext): void {
3383
3383
  persistState(liveCtx);
3384
3384
  appendLedger(liveCtx.cwd, "list_added", { id: item.id, objective: item.objective, drafted: true });
3385
3385
  if (!state.goal || state.goal.status === "complete" || state.goal.status === "aborted") {
3386
- // v0.28.28: an AUTO-ACCEPTED draft does not auto-start unless
3387
- // autoResume is on accepting a draft is not consent to start.
3388
- if (autoAccept && loadSettings(liveCtx.cwd).autoResume !== true) {
3389
- liveCtx.ui.notify(`Auto-accepted and QUEUED (autoResume off — not auto-started): ${extracted.objective.slice(0, 80)} /list next when ready.`, "info");
3390
- appendLedger(liveCtx.cwd, "list_autoactivation_held", { source: "draft-autoaccepted", count: 1 });
3391
- return { content: [{ type: "text", text: "Draft accepted and added to the list, but NOT started (the user's autoResume setting is off — auto-accepted drafts queue, they don't auto-start). Do NOT begin work. Tell the user: /list next starts it." }], details: {} };
3392
- }
3386
+ // v0.29.4: an auto-accepted draft STARTS autoAcceptDrafts is the
3387
+ // pre-consent (the user asked for the draft in-session). The
3388
+ // 0.28.28 autoResume hold is lifted: that setting now gates ONLY
3389
+ // launch-time restore. The 0.29.1 zombie-twin guard already
3390
+ // refused duplicates of just-completed work upstream.
3393
3391
  activateNextListItem(liveCtx);
3394
3392
  return { content: [{ type: "text", text: "Confirmed and activated (list was empty). Begin work now." }], details: {} };
3395
3393
  }
@@ -3397,20 +3395,11 @@ function registerAgentTools(pi: any, ctx: ExtensionContext): void {
3397
3395
  }
3398
3396
  const goal = createGoal(full, liveCtx);
3399
3397
  setGoal(goal, liveCtx, autoAccept ? "draft-autoaccepted" : "draft-confirmed");
3400
- // v0.28.28: auto-accepted goal drafts are created HELD when autoResume
3401
- // is off auto-accept delegates the Confirm click, not the decision
3402
- // to start. Explicit user-confirmed drafts still start immediately.
3403
- if (autoAccept && loadSettings(liveCtx.cwd).autoResume !== true) {
3404
- updateGoal({
3405
- status: "paused",
3406
- pauseKind: "blocked",
3407
- pauseReason: "auto-accepted draft — held for the user's go-ahead (autoResume off)",
3408
- pauseSuggestedAction: "/goal resume to start · /goal cancel to drop · /glla autoresume=on starts auto-accepted drafts automatically",
3409
- }, liveCtx);
3410
- appendLedger(liveCtx.cwd, "draft_held", { goalId: goal.id, reason: "autoaccept-autoresume-off" });
3411
- liveCtx.ui.notify(`Draft auto-accepted and HELD (autoResume off): ${goal.objective.slice(0, 80)} — /goal resume to start, /goal cancel to drop.`, "info");
3412
- return { content: [{ type: "text", text: "Goal accepted but HELD (the user's autoResume setting is off — auto-accepted drafts do not auto-start). Do NOT begin work. Tell the user: /goal resume starts it, /goal cancel drops it." }], details: {} };
3413
- }
3398
+ // v0.29.4: auto-accepted drafts START (autoAcceptDrafts is the
3399
+ // pre-consent — the user asked for the draft in-session). autoResume
3400
+ // no longer gates draft starts; it gates ONLY launch-time restore of
3401
+ // persisted state ("load it but not auto start it"). Zombie twins of
3402
+ // just-completed work are refused upstream (0.29.1).
3414
3403
  iterationCounter = 0;
3415
3404
  consecutiveErrorIterations = 0;
3416
3405
  consecutiveAbortIterations = 0;
@@ -5367,6 +5356,12 @@ export default function (pi: ExtensionAPI): void {
5367
5356
  // "unproductive turns" pause). pi's own retry owns the backoff;
5368
5357
  // the nudge counter neither increments nor resets on these turns.
5369
5358
  appendLedger(ctx.cwd, "stall_nudge_exempt_error", { nudgesSoFar: heartbeatNudges });
5359
+ } else if (lastA?.stopReason === "aborted") {
5360
+ // v0.29.4: user aborts are not model unproductivity either — the
5361
+ // user pressed Esc. Counting the interrupt tripped the stall brake
5362
+ // on the USER's action (pully field case: Esc-spam → STALL WARNING
5363
+ // 1/3, 2/3 → a bogus "stalled" pause). Neither increment nor reset.
5364
+ appendLedger(ctx.cwd, "stall_nudge_exempt_aborted", { nudgesSoFar: heartbeatNudges });
5370
5365
  } else {
5371
5366
  const s = loadSettings(ctx.cwd);
5372
5367
  const shortWordsThr = s.stallShortWords ?? DEFAULT_STALL_SHORT_WORDS;
@@ -5529,6 +5524,13 @@ export default function (pi: ExtensionAPI): void {
5529
5524
  appendLedger(ctx.cwd, "goal_paused", { reason: "5 consecutive aborts (user interrupted)" });
5530
5525
  return;
5531
5526
  }
5527
+ // v0.29.4: an abort stands the chain DOWN — no auto re-fire. The old
5528
+ // fall-through re-fired the continuation immediately, so every Esc
5529
+ // was answered by another turn under the user's hands ("it auto
5530
+ // triggered and I kept spamming esc on it" — pully, 2026-07-30).
5531
+ ctx.ui.notify(`${goalNoun()} standing down — turn aborted by user (not counted toward stalls). /goal resume to continue, /goal cancel to stop.`, "info");
5532
+ appendLedger(ctx.cwd, "abort_stand_down", { consecutiveAborts: consecutiveAbortIterations });
5533
+ return;
5532
5534
  } else {
5533
5535
  consecutiveErrorIterations = 0;
5534
5536
  consecutiveAbortIterations = 0;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-goal-list-loop-audit",
3
- "version": "0.29.3",
3
+ "version": "0.29.4",
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",