pi-goal-list-loop-audit 0.38.25 → 0.38.26
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 +5 -0
- package/docs/INDEX.md +1 -1
- package/extensions/approval-render-store.ts +10 -7
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.38.26 — approval-render store: spillway cap keeps undelivered renders (2026-09-08)
|
|
4
|
+
|
|
5
|
+
### Fixed
|
|
6
|
+
- Post-tag review of the v0.38.25 store: the sidecar cap could trim undelivered renders past 20 entries (non-positive slice budget). The cap now applies to delivered history only — undelivered renders are never dropped (self-draining: any user command replays them). Same 7 behavioral pins green; full gate 1986 pass / 0 fail.
|
|
7
|
+
|
|
3
8
|
## 0.38.25 — post-objective summary: canonical approval render, persist + replay, audit-goal counts (2026-09-07)
|
|
4
9
|
|
|
5
10
|
### Fixed
|
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.
|
|
21
|
+
v0.35.14–v0.38.26 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
|
|
@@ -47,7 +47,7 @@ function isValidRender(entry: unknown): entry is PendingApprovalRender {
|
|
|
47
47
|
&& (e.deliveredAt === undefined || typeof e.deliveredAt === "string");
|
|
48
48
|
}
|
|
49
49
|
|
|
50
|
-
function readRenders(cwd: string): PendingApprovalRender[]
|
|
50
|
+
function readRenders(cwd: string): PendingApprovalRender[] {
|
|
51
51
|
let raw: string;
|
|
52
52
|
try {
|
|
53
53
|
raw = fs.readFileSync(approvalRenderStorePath(cwd), "utf-8");
|
|
@@ -91,7 +91,7 @@ export function persistApprovalRender(cwd: string, render: {
|
|
|
91
91
|
delivered: boolean;
|
|
92
92
|
}): boolean {
|
|
93
93
|
const at = nowIso();
|
|
94
|
-
const existing = readRenders(cwd)
|
|
94
|
+
const existing = readRenders(cwd);
|
|
95
95
|
const entry: PendingApprovalRender = {
|
|
96
96
|
goalId: render.goalId,
|
|
97
97
|
objective: render.objective.slice(0, 300),
|
|
@@ -99,11 +99,14 @@ export function persistApprovalRender(cwd: string, render: {
|
|
|
99
99
|
createdAt: at,
|
|
100
100
|
...(render.delivered ? { deliveredAt: at } : {}),
|
|
101
101
|
};
|
|
102
|
+
// The cap trims DELIVERED history only: undelivered renders are never
|
|
103
|
+
// dropped (each is ~1KB and any user command replays them, so the
|
|
104
|
+
// undelivered tail is self-draining in practice).
|
|
102
105
|
const undelivered = existing.filter((e) => !e.deliveredAt);
|
|
103
|
-
const delivered = [...existing.filter((e) => e.deliveredAt), ...(render.delivered ? [entry] : [])]
|
|
104
|
-
|
|
105
|
-
const next = [...undelivered, ...(render.delivered ? [] : [entry]), ...delivered];
|
|
106
|
-
if (!writeRenders(cwd, next
|
|
106
|
+
const delivered = [...existing.filter((e) => e.deliveredAt), ...(render.delivered ? [entry] : [])];
|
|
107
|
+
const deliveredBudget = Math.max(0, MAX_STORED_RENDERS - undelivered.length - (render.delivered ? 0 : 1));
|
|
108
|
+
const next = [...undelivered, ...(render.delivered ? [] : [entry]), ...delivered.slice(-deliveredBudget)];
|
|
109
|
+
if (!writeRenders(cwd, next)) return false;
|
|
107
110
|
appendLedger(cwd, "terminal_approval_render_persisted", {
|
|
108
111
|
goalId: render.goalId,
|
|
109
112
|
delivered: render.delivered,
|
|
@@ -118,7 +121,7 @@ export function persistApprovalRender(cwd: string, render: {
|
|
|
118
121
|
* throws. */
|
|
119
122
|
export function replayUndeliveredApprovalRenders(ctx: { cwd: string; ui: { notify: (message: string, type?: "info" | "warning" | "error") => void } }): number {
|
|
120
123
|
const renders = readRenders(ctx.cwd);
|
|
121
|
-
if (
|
|
124
|
+
if (renders.length === 0) return 0;
|
|
122
125
|
const pending = renders.filter((e) => !e.deliveredAt).slice(0, MAX_REPLAY_PER_CONTACT);
|
|
123
126
|
if (pending.length === 0) return 0;
|
|
124
127
|
const at = nowIso();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pi-goal-list-loop-audit",
|
|
3
|
-
"version": "0.38.
|
|
3
|
+
"version": "0.38.26",
|
|
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",
|