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 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 # show active and waiting items
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.52 continue through the supervisor freeze (`/glla pause`),
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) and the v0.38.25 post-objective summary
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 batchActivates = !state.goal || state.goal.status === "complete" || state.goal.status === "aborted";
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 ? " — item 1 ACTIVATES now" : ""}.`, "info");
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}${batchActivates ? "\n\n(List is empty — confirming ACTIVATES item 1 immediately as the active goal.)" : ""}`,
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
- const wasIdle = !state.goal || state.goal.status === "complete" || state.goal.status === "aborted";
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 (wasIdle) {
2495
- return { content: [{ type: "text", text: `${n} items confirmed; first activated (list was empty). Begin work now.` }], details: {} };
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.52",
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.
@@ -49,6 +49,7 @@ try {
49
49
  "scripts/goal-auditor-launch.mjs",
50
50
  "scripts/goal-auditor-worker.mjs",
51
51
  "scripts/release-pack-smoke.mjs",
52
+ "skills/glla-delegate/SKILL.md",
52
53
  ];
53
54
  const listing = run("tar", ["-tzf", tarball]);
54
55
  for (const file of required) {
@@ -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.