pi-goal-list-loop-audit 0.38.52 → 0.38.53
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 +30 -0
- package/README.md +9 -1
- package/docs/INDEX.md +4 -2
- package/extensions/loops/goal-list-queue.ts +5 -2
- package/extensions/loops/goal-tools.ts +30 -6
- package/package.json +5 -1
- package/prompts/goal-loop-draft.md +11 -0
- package/prompts/goal-loop-plan.md +10 -0
- package/scripts/release-pack-smoke.mjs +1 -0
- package/skills/glla-delegate/SKILL.md +44 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,35 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.38.53 — Consent-safe GLLA delegation skill and list-draft staging (2026-09-13)
|
|
4
|
+
|
|
5
|
+
Added the packaged `glla-delegate` skill for normal-chat goal/list delegation.
|
|
6
|
+
It documents the consent ladder, main-session ownership, auto-activation warning,
|
|
7
|
+
and tool-first usage without adding new runtime powers. Its quoted frontmatter
|
|
8
|
+
is validated through Pi's public loader and the packed-file release gate.
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- **Consent-safe delegation guidance:** explicit queue requests may use
|
|
13
|
+
`list_add`; discovered follow-ups are offered first; durable goals use
|
|
14
|
+
`propose_goal_draft`; speculative queueing, unowned activation, and agent
|
|
15
|
+
`/loop` control remain prohibited.
|
|
16
|
+
- **Pasted-list policy:** supplied multi-line, bullet, numbered, and checklist
|
|
17
|
+
structure is preserved without an exact-versus-refined meta-question. Only a
|
|
18
|
+
genuinely ambiguous individual item remains eligible for clarification, with
|
|
19
|
+
one-record seeds retaining the normal draft path.
|
|
20
|
+
- **Release/package coverage:** `skills/glla-delegate/SKILL.md` is allowlisted,
|
|
21
|
+
declared in `pi.skills`, required by the packed-artifact smoke, and loaded
|
|
22
|
+
with zero diagnostics in the release contract.
|
|
23
|
+
|
|
24
|
+
### Fixed
|
|
25
|
+
|
|
26
|
+
- **Draft staging:** interview and stale-entry gates remain ahead of Confirm;
|
|
27
|
+
confirmation remains ahead of conflict handling and enqueue.
|
|
28
|
+
- **Paused list carryover:** a confirmed multi-item draft now routes its first
|
|
29
|
+
promotion through the carryover-aware activation choke point, archiving the
|
|
30
|
+
paused predecessor before starting the list head instead of leaving the batch
|
|
31
|
+
stranded behind it.
|
|
32
|
+
|
|
3
33
|
## 0.38.52 — Second Gemini-gap: gate-inventory table + per-finding Test Results (2026-09-12)
|
|
4
34
|
|
|
5
35
|
Surveyed five more Antigravity report screenshots
|
package/README.md
CHANGED
|
@@ -157,7 +157,8 @@ quietly inventing an unbounded backlog.
|
|
|
157
157
|
```text
|
|
158
158
|
/list "fix the cache. Done when: tests pass"
|
|
159
159
|
/list plan.md # import a checklist or plan file
|
|
160
|
-
/list #
|
|
160
|
+
/list # interview + Confirm for a context draft
|
|
161
|
+
/list show # show active and waiting items
|
|
161
162
|
/list start # activate the queued head, or draft one clear recent request
|
|
162
163
|
/list next # explicitly skip/activate the next item
|
|
163
164
|
/list next <n> # explicitly choose a specific item
|
|
@@ -167,6 +168,13 @@ quietly inventing an unbounded backlog.
|
|
|
167
168
|
/list cancel # stop the active item and drop waiting items
|
|
168
169
|
```
|
|
169
170
|
|
|
171
|
+
A pasted multi-line, bulleted, numbered, or checklist-style list keeps its
|
|
172
|
+
item wording and boundaries; GLLA does not ask for an “exact or refined” choice.
|
|
173
|
+
Only a genuinely ambiguous individual item needs clarification. The packaged
|
|
174
|
+
`skills/glla-delegate/SKILL.md` records the safe normal-chat delegation path:
|
|
175
|
+
explicit queue requests may use `list_add`, while discovered follow-ups are
|
|
176
|
+
offered first and durable goals remain Confirm-gated.
|
|
177
|
+
|
|
170
178
|
Order is the default, not the law. Automatic advance normally uses the head of
|
|
171
179
|
the queue, while `/list next <n>` or the agent's `list_activate` tool can choose
|
|
172
180
|
another item. Numbering always matches `/list` output. After a list item is
|
package/docs/INDEX.md
CHANGED
|
@@ -16,7 +16,7 @@ Policy contracts and recent changes live in the `audit/` directory of the
|
|
|
16
16
|
failback; v0.35.9 hardened cross-version npm tarball checks; v0.35.10
|
|
17
17
|
handles multi-entry npm dry-run reports; v0.35.11 accepts both npm report
|
|
18
18
|
shapes; v0.35.12 supports npm 12's keyed pack reports; v0.35.13 fixes stale-API recovery loops.
|
|
19
|
-
v0.35.14–v0.38.
|
|
19
|
+
v0.35.14–v0.38.53 continue through the supervisor freeze (`/glla pause`),
|
|
20
20
|
load hold, auditor picker parity, Windows launch fix, zombie-watchdog
|
|
21
21
|
subagent carve-out, due-wait backstop, the `/glla agents` visibility panel,
|
|
22
22
|
durable state-root selection, blank-until-resume auditor context, frozen
|
|
@@ -25,7 +25,8 @@ Policy contracts and recent changes live in the `audit/` directory of the
|
|
|
25
25
|
extensions, bounded zero-stream retry containment, crash-safe persistence,
|
|
26
26
|
packed-artifact release verification, and the 2026-09-07 display/lifecycle/
|
|
27
27
|
settings audit pass (abort-latch send guards, ownership compare-and-swap,
|
|
28
|
-
auditor inherit/clear parity)
|
|
28
|
+
auditor inherit/clear parity), the v0.38.53 consent-safe `glla-delegate`
|
|
29
|
+
skill/list-drafting release, and the v0.38.25 post-objective summary
|
|
29
30
|
(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), the v0.38.28 provenance-row closure fix, and the v0.38.29 compact active-card recovery/judgment projection; see CHANGELOG.md for the full trail.
|
|
30
31
|
- `../README.md`: what the plugin is, install, quickstart, and the
|
|
31
32
|
architectural guarantee (drafting + confirm + detached auditor).
|
|
@@ -37,6 +38,7 @@ Policy contracts and recent changes live in the `audit/` directory of the
|
|
|
37
38
|
- `../README.md`: what the plugin is, install, quickstart
|
|
38
39
|
- `SETTINGS.md`: canonical settings reference (files, precedence, every key)
|
|
39
40
|
- `../INSTALL.md`: source install / local development setup
|
|
41
|
+
- `../skills/glla-delegate/SKILL.md`: normal-chat goal/list delegation and consent ladder
|
|
40
42
|
- `../CHANGELOG.md`: user-facing changelog; the first versioned heading is
|
|
41
43
|
the current released package version (use `/glla version` to compare with
|
|
42
44
|
the registry); post-release work may appear in `Unreleased` above it.
|
|
@@ -860,7 +860,7 @@ async function startDrafting(ctx: ExtensionContext, target: "goal" | "list" | "l
|
|
|
860
860
|
// concatenation produced "…regular draft.Goal drafting — deep planning: …".
|
|
861
861
|
const seededHint = (planNote ? `${planNote} ` : "") + (
|
|
862
862
|
target === "list"
|
|
863
|
-
? `${label}: free-text is valid without a "Done when:" clause — the agent will turn it into short list items and grill for concrete per-item contracts (nothing activates until you confirm). To skip drafting, include a per-item "Done when:" clause.`
|
|
863
|
+
? `${label}: free-text is valid without a "Done when:" clause — the agent will turn it into short list items and grill for concrete per-item contracts (nothing activates until you confirm). If the seed is already a pasted multi-line, bulleted, numbered, or checklist-style list, use its wording and structure as supplied; do not ask whether it should be exact or refined. To skip drafting, include a per-item "Done when:" clause.`
|
|
864
864
|
: target === "loop"
|
|
865
865
|
? `${label}: a loop target needs a metric and a direction — the agent will help you design them first (nothing activates until you confirm). Skip the interview entirely: /loop start "<target>" (bare = infinite metricless) or /loop start "<target>" measure="<cmd>" direction=min|max [window=5] [max=50] [time=h] [tokens=n] [branch=1].`
|
|
866
866
|
: `${label}: the objective has no "Done when:" clause — the agent will grill you about it first (nothing activates until you confirm). Skip the interview entirely: /goal start <objective>.`);
|
|
@@ -877,7 +877,10 @@ async function startDrafting(ctx: ExtensionContext, target: "goal" | "list" | "l
|
|
|
877
877
|
"for the big version. When the user has many items to enqueue at once ('queue these 50 audits'), propose them ALL AT " +
|
|
878
878
|
"ONCE with the items[] parameter — one Confirm for the whole batch, never 50 separate proposals. Each items[] entry " +
|
|
879
879
|
"is still a SHORT task — never an aggregate wrapper ('land all N findings' with a '≥N commits' contract is the " +
|
|
880
|
-
"canonical anti-pattern: the auto-committer squashes, the count fails, the auditor disapproves finished work).
|
|
880
|
+
"canonical anti-pattern: the auto-committer squashes, the count fails, the auditor disapproves finished work). " +
|
|
881
|
+
"For a pasted multi-line, bulleted, numbered, or checklist-style seed, preserve the supplied wording and structure, " +
|
|
882
|
+
"strip only import syntax and empty headings/lines, and propose items[] directly — do not ask whether it should be exact " +
|
|
883
|
+
"or refined; clarify only a genuinely ambiguous individual item.]",
|
|
881
884
|
);
|
|
882
885
|
}
|
|
883
886
|
// v0.14.0: the LLM grills (its strength — v0.13.0's canned questionnaire
|
|
@@ -2440,17 +2440,26 @@ function registerAgentTools(pi: any): void {
|
|
|
2440
2440
|
// v0.23.7: show ALL items in full — the user approves the whole
|
|
2441
2441
|
// batch; hidden items would be approved blind.
|
|
2442
2442
|
const preview = p.items.map((t, i) => ` ${i + 1}. ${t}`).join("\n");
|
|
2443
|
-
const
|
|
2443
|
+
const startsFromEmpty = !state.goal || state.goal.status === "complete" || state.goal.status === "aborted";
|
|
2444
|
+
const replacesPaused = state.goal?.status === "paused";
|
|
2445
|
+
const batchActivates = startsFromEmpty || replacesPaused;
|
|
2446
|
+
const activationNote = startsFromEmpty
|
|
2447
|
+
? listQueue().length > 0
|
|
2448
|
+
? "\n\n(Confirming starts the current list head immediately.)"
|
|
2449
|
+
: "\n\n(List is empty — confirming ACTIVATES the first proposed item immediately as the active goal.)"
|
|
2450
|
+
: replacesPaused
|
|
2451
|
+
? "\n\n(A paused objective is held — confirming resolves that carryover and ACTIVATES the current list head. Reject if you only wanted to queue these items.)"
|
|
2452
|
+
: "";
|
|
2444
2453
|
let batchConfirmed = false;
|
|
2445
2454
|
if (autoAccept) {
|
|
2446
2455
|
batchConfirmed = true;
|
|
2447
|
-
liveCtx.ui.notify(`List batch auto-accepted (Auto-accept drafts = on in /glla settings): ${p.items.length} items${batchActivates ? " —
|
|
2456
|
+
liveCtx.ui.notify(`List batch auto-accepted (Auto-accept drafts = on in /glla settings): ${p.items.length} items${batchActivates ? " — the list head ACTIVATES now" : ""}.`, "info");
|
|
2448
2457
|
appendLedger(liveCtx.cwd, "draft_autoaccepted", { kind: "batch", count: p.items.length });
|
|
2449
2458
|
} else {
|
|
2450
2459
|
const c = await confirmDraft(
|
|
2451
2460
|
liveCtx,
|
|
2452
2461
|
"Confirm list batch",
|
|
2453
|
-
`${p.items.length} items:\n${preview}${
|
|
2462
|
+
`${p.items.length} items:\n${preview}${activationNote}`,
|
|
2454
2463
|
);
|
|
2455
2464
|
const afterConfirm = freshCtxForGeneration(draftGeneration);
|
|
2456
2465
|
if (!afterConfirm) {
|
|
@@ -2489,10 +2498,25 @@ function registerAgentTools(pi: any): void {
|
|
|
2489
2498
|
}
|
|
2490
2499
|
draftingTarget = null;
|
|
2491
2500
|
await ((globalThis as any).restoreDrafterModel?.() ?? Promise.resolve());
|
|
2492
|
-
|
|
2501
|
+
// enqueueItems owns the empty/terminal-slot auto-start. A paused
|
|
2502
|
+
// objective is different: preserve the one-confirm batch, then route
|
|
2503
|
+
// promotion through the same carryover-aware choke point so the
|
|
2504
|
+
// paused record is archived before the new list head starts.
|
|
2505
|
+
const slotWasEmpty = !state.goal || state.goal.status === "complete" || state.goal.status === "aborted";
|
|
2506
|
+
const pausedBeforeEnqueue = state.goal?.status === "paused";
|
|
2493
2507
|
const n = enqueueItems(liveCtx, p.items, "drafted batch");
|
|
2494
|
-
if (
|
|
2495
|
-
return { content: [{ type: "text", text:
|
|
2508
|
+
if (n === 0) {
|
|
2509
|
+
return { content: [{ type: "text", text: "No new list items were queued — the proposed batch was empty after duplicate/persistence checks." }], details: {} };
|
|
2510
|
+
}
|
|
2511
|
+
if (pausedBeforeEnqueue && state.goal?.status === "paused") {
|
|
2512
|
+
const activated = activateNextListItem(liveCtx);
|
|
2513
|
+
if (activated) {
|
|
2514
|
+
return { content: [{ type: "text", text: `${n} items confirmed; the list head activated after paused carryover resolution. Begin work now.` }], details: {} };
|
|
2515
|
+
}
|
|
2516
|
+
return { content: [{ type: "text", text: `${n} items confirmed and queued (${listQueue().length} waiting), but activation was held. The paused objective remains recoverable; retry list activation after fixing the reported issue.` }], details: {} };
|
|
2517
|
+
}
|
|
2518
|
+
if (slotWasEmpty && state.goal?.status === "active" && state.goal.policy === "list") {
|
|
2519
|
+
return { content: [{ type: "text", text: `${n} items confirmed; the first list item activated. Begin work now.` }], details: {} };
|
|
2496
2520
|
}
|
|
2497
2521
|
return { content: [{ type: "text", text: `${n} items confirmed and added to the list (${listQueue().length} waiting).` }], details: {} };
|
|
2498
2522
|
}
|
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.53",
|
|
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",
|
|
@@ -29,6 +29,7 @@
|
|
|
29
29
|
},
|
|
30
30
|
"files": [
|
|
31
31
|
"extensions",
|
|
32
|
+
"skills",
|
|
32
33
|
"prompts",
|
|
33
34
|
"schemas",
|
|
34
35
|
"scripts",
|
|
@@ -45,6 +46,9 @@
|
|
|
45
46
|
"pi": {
|
|
46
47
|
"extensions": [
|
|
47
48
|
"extensions/loops/goal.ts"
|
|
49
|
+
],
|
|
50
|
+
"skills": [
|
|
51
|
+
"skills/glla-delegate"
|
|
48
52
|
]
|
|
49
53
|
},
|
|
50
54
|
"scripts": {
|
|
@@ -71,6 +71,17 @@ While drafting, watch the seed's shape and recommend the right mode:
|
|
|
71
71
|
The user invoked `/goal` with no objective. Your job is to turn their vague
|
|
72
72
|
request into a **confirmed goal contract**. Do NOT start substantive work yet.
|
|
73
73
|
|
|
74
|
+
## Pasted list seeds
|
|
75
|
+
|
|
76
|
+
When this prompt is being used for `/list` and the user supplies a multi-line,
|
|
77
|
+
bulleted, numbered, or checklist-style seed, use its structure and wording as
|
|
78
|
+
provided. Strip only import syntax and empty headings/lines, then propose the
|
|
79
|
+
resulting items together through `items[]`. Do not ask whether the user wants
|
|
80
|
+
the list exact or refined: there is no such choice. Clarify only a genuinely
|
|
81
|
+
ambiguous individual item; never turn a complete pasted list into a
|
|
82
|
+
meta-choice. A direct user request to add such a list may use the normal
|
|
83
|
+
bulk-enqueue path instead of drafting.
|
|
84
|
+
|
|
74
85
|
## Protocol
|
|
75
86
|
|
|
76
87
|
1. If the request is vague, ask ONE focused question at a time. Offer a
|
|
@@ -49,6 +49,16 @@ confirms.
|
|
|
49
49
|
earn its place — decisions, constraints, and checkable outcomes only.
|
|
50
50
|
Do not pad with boilerplate the user did not ask for.
|
|
51
51
|
|
|
52
|
+
## Pasted list seeds
|
|
53
|
+
|
|
54
|
+
When plan mode is used for `/list` and the user supplies a multi-line,
|
|
55
|
+
bulleted, numbered, or checklist-style seed, preserve its item boundaries and
|
|
56
|
+
wording as supplied. Normalize only import syntax and empty headings/lines;
|
|
57
|
+
do not ask whether the list should be exact or refined. Clarify only a
|
|
58
|
+
genuinely ambiguous individual item, never turn a complete pasted list into a
|
|
59
|
+
meta-choice. Research may deepen contracts and verification, but it must not
|
|
60
|
+
rewrite a clear pasted list merely to make it sound more polished.
|
|
61
|
+
|
|
52
62
|
## Hard rules (unchanged from regular drafting)
|
|
53
63
|
|
|
54
64
|
- Do NOT start implementing during planning. Research is read-only.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: glla-delegate
|
|
3
|
+
description: "Use GLLA's audited goals and list queue from normal chat: queue explicit work, offer follow-ups before adding them, or draft a confirmed goal. Includes safe handling for pasted list-like input."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# GLLA delegation
|
|
7
|
+
|
|
8
|
+
GLLA is not a scratch task list. A queued item becomes an audited goal, and
|
|
9
|
+
when the queue is idle its first item may activate immediately. Use these
|
|
10
|
+
tools in the main session only:
|
|
11
|
+
|
|
12
|
+
- `list_status` is read-only and safe for inspection.
|
|
13
|
+
- If the user explicitly asks to queue, add, backlog, or list work, call
|
|
14
|
+
`list_add` with the requested items. Do not turn a direct queue request
|
|
15
|
+
into an unnecessary interview.
|
|
16
|
+
- If you discover a useful follow-up while doing other work, finish the
|
|
17
|
+
current request and offer to queue it first. Queue it without another
|
|
18
|
+
question only when the user has given standing permission such as
|
|
19
|
+
“queue follow-ups as you find them.”
|
|
20
|
+
- If one durable, multi-hour objective is warranted, interview only what is
|
|
21
|
+
genuinely unknown, then call `propose_goal_draft`; the user's Confirm
|
|
22
|
+
dialog is the activation gate. Never activate a speculative raw seed.
|
|
23
|
+
- Never call `list_activate` for an item the user has not selected or clearly
|
|
24
|
+
authorized. Never control `/loop` bounds, metrics, or stopping on the
|
|
25
|
+
user's behalf.
|
|
26
|
+
|
|
27
|
+
## Pasted list-like input
|
|
28
|
+
|
|
29
|
+
When the user supplies a multi-line, bulleted, numbered, or checklist-style
|
|
30
|
+
list and asks to use or add it, use the structure and wording as supplied.
|
|
31
|
+
Strip only import syntax and empty headings/lines, then pass the resulting
|
|
32
|
+
items in one `list_add` call. Do **not** ask whether the user wants the list
|
|
33
|
+
“exact” or “refined”; there is no such choice. Clarify only a genuinely
|
|
34
|
+
ambiguous individual item, never turn a complete pasted list into a
|
|
35
|
+
meta-choice.
|
|
36
|
+
|
|
37
|
+
If a `/list` drafting session is already active, do not bypass its Confirm
|
|
38
|
+
gate with `list_add`: pass the complete pasted set once as `items[]` to
|
|
39
|
+
`propose_goal_draft` instead. This keeps one confirmation for the whole
|
|
40
|
+
batch and prevents partial activation.
|
|
41
|
+
|
|
42
|
+
Use the tools, not slash-command text, when acting. Worker and subagent
|
|
43
|
+
sessions do not own GLLA state; respect a foreign-session refusal instead of
|
|
44
|
+
routing around it.
|