pi-goal-list-loop-audit 0.38.27 → 0.38.28

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/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.38.28 — close redundant provenance rows in the active goal card (2026-09-08)
4
+
5
+ ### Fixed
6
+ - The active card no longer shows a duplicate `handled turn` row when it is the same model as the primary model. When provenance is the final detail block, its last row now closes with `└─` instead of a dangling `│`/`├─`, so the card no longer implies missing rows. Failover-handled turns remain visible. Added focused regression coverage; `tsc` and the focused display suite pass.
7
+
3
8
  ## 0.38.27 — selective port of PRs #45/#46: /loop pause + widget subtask count (2026-09-08)
4
9
 
5
10
  ### Added
package/docs/INDEX.md CHANGED
@@ -18,7 +18,7 @@ For shipped docs, the relevant entry points are:
18
18
  failback; v0.35.9 hardened cross-version npm tarball checks; v0.35.10
19
19
  handles multi-entry npm dry-run reports; v0.35.11 accepts both npm report
20
20
  shapes; v0.35.12 supports npm 12's keyed pack reports; v0.35.13 fixes stale-API recovery loops.
21
- v0.35.14–v0.38.27 continue through the supervisor freeze (`/glla pause`),
21
+ v0.35.14–v0.38.28 continue through the supervisor freeze (`/glla pause`),
22
22
  load hold, auditor picker parity, Windows launch fix, zombie-watchdog
23
23
  subagent carve-out, due-wait backstop, the `/glla agents` visibility panel,
24
24
  durable state-root selection, blank-until-resume auditor context, frozen
@@ -28,7 +28,7 @@ For shipped docs, the relevant entry points are:
28
28
  packed-artifact release verification, and the 2026-09-07 display/lifecycle/
29
29
  settings audit pass (abort-latch send guards, ownership compare-and-swap,
30
30
  auditor inherit/clear parity) and the v0.38.25 post-objective summary
31
- (canonical approval render, persist + replay, audit-goal counts line) and the v0.38.27 selective port of PRs #45/#46 (`/loop pause` soft-hold, widget subtask count) — see CHANGELOG.md for the full trail.
31
+ (canonical approval render, persist + replay, audit-goal counts line), the v0.38.27 selective port of PRs #45/#46 (`/loop pause` soft-hold, widget subtask count), and the v0.38.28 provenance-row closure fix — see CHANGELOG.md for the full trail.
32
32
  - `../README.md` — what the plugin is, install, quickstart, and the
33
33
  architectural guarantee (drafting + confirm + detached auditor).
34
34
  - `../INSTALL.md` — source install / local development setup; the recommended
@@ -294,7 +294,13 @@ function modelProvenanceLines(provenance: ModelProvenanceDisplay | undefined, wi
294
294
  const skipped = uniqueModelRefs(provenance.skippedForbiddenRefs);
295
295
  if (skipped.length > 0) lines.push(`skipped forbidden: ${truncate(skipped.join(", "), budget)}`);
296
296
  const handledTurn = typeof provenance.handledTurn === "string" ? provenance.handledTurn.trim() : "";
297
- if (handledTurn) lines.push(`handled turn: ${truncate(handledTurn, budget)}`);
297
+ // A normal turn is handled by the configured primary model. Repeating the
298
+ // same ref immediately below it adds no information and, when it is the
299
+ // last row, leaves a misleading continuation glyph in the card. Keep the
300
+ // row only when a recovery/failover actually handled the turn.
301
+ if (handledTurn && handledTurn.toLowerCase() !== primary.toLowerCase()) {
302
+ lines.push(`handled turn: ${truncate(handledTurn, budget)}`);
303
+ }
298
304
  const handledAudit = typeof provenance.handledAudit === "string" ? provenance.handledAudit.trim() : "";
299
305
  if (handledAudit) {
300
306
  const source = provenance.handledAuditSource?.trim() ? modelSourceLabel(provenance.handledAuditSource) : "";
@@ -1580,6 +1586,7 @@ function goalLines(g: Goal, state: State, audit: AuditDisplayProgress | null | u
1580
1586
  // particular, never replace a configured forbidden ref with "none" — the
1581
1587
  // skipped line explains why it did not handle the turn.
1582
1588
  const provenance = modelProvenanceLines(extras?.modelProvenance, width);
1589
+ const provenanceStart = lines.length;
1583
1590
  provenance.forEach((line, i) => {
1584
1591
  lines.push(`${i === 0 ? "├─" : "│ "} ${paint(theme, "dim", line)}`);
1585
1592
  });
@@ -1904,6 +1911,16 @@ function goalLines(g: Goal, state: State, audit: AuditDisplayProgress | null | u
1904
1911
  // `/goal status` / `/glla` command hints were extension meta, not task
1905
1912
  // information — dropped. No queue, no footer at all.
1906
1913
  if (queue > 0) lines.push(`└─ ${paint(theme, "dim", `${queue} queued`)}`);
1914
+ // v0.38.28: provenance rows can be the entire detail block when there is
1915
+ // no recent action, pending task, or queue footer. Close that block with a
1916
+ // terminator instead of leaving `├─`/`│` suggesting missing rows.
1917
+ const provenanceEnd = provenanceStart + provenance.length;
1918
+ if (provenance.length > 0 && provenanceEnd === lines.length) {
1919
+ const last = lines[provenanceEnd - 1]!;
1920
+ if (last.startsWith("├─ ") || last.startsWith("│ ")) {
1921
+ lines[provenanceEnd - 1] = `└─ ${last.slice(3)}`;
1922
+ }
1923
+ }
1907
1924
  return lines;
1908
1925
  }
1909
1926
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-goal-list-loop-audit",
3
- "version": "0.38.27",
3
+ "version": "0.38.28",
4
4
  "description": "Mission control for autonomous pi: interview-drafted goals, an audited task queue, and forever-loops (metric, spec, project-audit) that run for hours. A detached extension-less auditor process re-verifies every completion with raw evidence without holding the main pi turn; confirmed drafts, decision pauses and consent gates keep you in charge.",
5
5
  "license": "AGPL-3.0-only",
6
6
  "author": "dracon",