pi-goal-list-loop-audit 0.35.70 → 0.36.0
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 +104 -0
- package/INSTALL.md +13 -3
- package/README.md +39 -10
- package/docs/DESIGN-long-running-supervision.md +116 -0
- package/docs/DESIGN.md +35 -15
- package/docs/INDEX.md +6 -2
- package/docs/VISION-ASSIST.md +42 -48
- package/examples/example-objective.md +3 -3
- package/extensions/auditor-extensions.ts +19 -4
- package/extensions/completion-summary.ts +258 -0
- package/extensions/context-checkpoint.ts +397 -0
- package/extensions/context-growth.ts +340 -0
- package/extensions/continuous-supervision.ts +191 -0
- package/extensions/goal-agents-panel.ts +51 -11
- package/extensions/goal-commands.ts +288 -42
- package/extensions/goal-continuation.ts +32 -12
- package/extensions/goal-heartbeat.ts +60 -7
- package/extensions/goal-loop-auditor-process.ts +363 -51
- package/extensions/goal-loop-auditor.ts +19 -0
- package/extensions/goal-loop-backoff.ts +31 -20
- package/extensions/goal-loop-core.ts +492 -42
- package/extensions/goal-loop-display.ts +49 -37
- package/extensions/goal-loop-forever.ts +2 -0
- package/extensions/goal-loop-shield.ts +84 -16
- package/extensions/goal-loop-subagents.ts +2 -1
- package/extensions/goal-loop.ts +97 -23
- package/extensions/goal-recovery.ts +78 -18
- package/extensions/goal-settings.ts +84 -28
- package/extensions/goal-state.ts +2 -2
- package/extensions/loops/goal-activation.ts +200 -76
- package/extensions/loops/goal-auditor-hooks.ts +571 -69
- package/extensions/loops/goal-list-queue.ts +23 -8
- package/extensions/loops/goal-orchestrator.ts +269 -46
- package/extensions/loops/goal-runtime-globals.ts +3 -0
- package/extensions/loops/goal-session.ts +122 -15
- package/extensions/loops/goal-settings-ui.ts +202 -76
- package/extensions/loops/goal-tools.ts +622 -103
- package/extensions/loops/goal-ui.ts +2 -1
- package/extensions/loops/goal.ts +1 -0
- package/extensions/main-model-recovery.ts +54 -13
- package/extensions/proactive-pre-read.ts +101 -0
- package/extensions/quota-retry.ts +2 -2
- package/extensions/reviewer.ts +15 -3
- package/extensions/settings-menu.ts +36 -20
- package/extensions/start-context.ts +299 -0
- package/extensions/vision-assist.ts +80 -47
- package/media/glla2.png +0 -0
- package/package.json +2 -1
- package/prompts/goal-loop-continuation.md +10 -2
- package/schemas/goal.schema.json +24 -1
- package/scripts/durable-wait.mjs +236 -0
- package/scripts/goal-auditor-worker.mjs +61 -20
- package/scripts/measure-context-growth.mjs +98 -0
- package/scripts/smoke.sh +67 -19
- package/scripts/verify-auditor-extensions-offline.mjs +11 -11
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,109 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.36.0 — event-driven long-running supervision (2026-08-28)
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
Bare `/goal start`, `/loop start`, and `/list start` now use a bounded active
|
|
7
|
+
branch context window only when it contains one clear actionable user
|
|
8
|
+
request. Ambiguous, generic, truncated, or multi-task context returns to the
|
|
9
|
+
existing drafting/confirmation flow; list queue activation and loop metric
|
|
10
|
+
settings remain explicit.
|
|
11
|
+
|
|
12
|
+
GLLA now records a six-label user-facing recap for every archived terminal
|
|
13
|
+
objective and loop stop. Valid recaps are preserved; missing or incomplete
|
|
14
|
+
claims receive a recorded-facts-only fallback with explicit `not recorded`
|
|
15
|
+
values instead of invented evidence.
|
|
16
|
+
|
|
17
|
+
The shared heartbeat is now an event-first continuous supervisor across
|
|
18
|
+
goals, list items, loops, auditors, subagents, provider recovery, and queue
|
|
19
|
+
state. It reacts to lifecycle/durable signals immediately and uses adaptive
|
|
20
|
+
fallback polling rather than guessed task-duration waits.
|
|
21
|
+
|
|
22
|
+
### Fixed
|
|
23
|
+
Detached completion-auditor failures now coordinate RPC stdout EOF with the
|
|
24
|
+
child process close, preserving bounded exit code, signal, stderr, and
|
|
25
|
+
malformed-stream diagnostics while remaining fail-closed until
|
|
26
|
+
`agent_settled`.
|
|
27
|
+
|
|
28
|
+
### Changed
|
|
29
|
+
The detached auditor now has the same ordered, deselectable, bounded fallback
|
|
30
|
+
chain as the main agent (`auditorModelFallbacks`, up to 10 refs), with the
|
|
31
|
+
former singular fallback setting migrated compatibly. An unset auditor
|
|
32
|
+
thinking level inherits the parent session's live dial, including `max`,
|
|
33
|
+
while explicit auditor levels remain overrides.
|
|
34
|
+
|
|
35
|
+
Aggressive recovery retries recoverable provider/host/auditor failures across
|
|
36
|
+
arbitrary durations with bounded per-attempt backoff. Ordinary auditor
|
|
37
|
+
objections become durable TODOs; repeated identical objections with no new
|
|
38
|
+
progress stop on a state-based decision boundary. Conservative mode retains
|
|
39
|
+
its bounded recovery horizon.
|
|
40
|
+
|
|
41
|
+
Full auditor `IMPOSSIBLE` results and list auto-drops now pass through the
|
|
42
|
+
terminal archive fence with durable recaps; partial impossible results keep
|
|
43
|
+
their explicit narrowing behavior. Every loop-stop notification includes a
|
|
44
|
+
compact projection of the generated six-label recap. Version-bearing
|
|
45
|
+
already-shipped claims, explicit goal/list cancellation, and `/glla wipe`
|
|
46
|
+
now include the same compact projection in their terminal notifications.
|
|
47
|
+
|
|
48
|
+
Detached-auditor first-event watchdogs start at worker spawn rather than
|
|
49
|
+
charging dispatch setup time, with a runtime-compatible return-time fallback;
|
|
50
|
+
cancellation waits for worker teardown before classifying the attempt. The
|
|
51
|
+
former unconditional auditor wall is compatibility metadata only; active
|
|
52
|
+
output, tool, durable, and child progress can continue until a result,
|
|
53
|
+
confirmed-silence watchdog, per-tool timeout, or explicit lifecycle stop.
|
|
54
|
+
|
|
55
|
+
Carryover replacement, `/list next` skips, and complete-without-audit now
|
|
56
|
+
check the archive fence before reporting success and include the same recap
|
|
57
|
+
projection as other terminal paths. Continuous-supervision tests now drive
|
|
58
|
+
durable state transitions and lifecycle signals across every declared plane.
|
|
59
|
+
|
|
60
|
+
Validation warnings are metadata rather than recap fields: an incomplete
|
|
61
|
+
claim whose NOTE mentions label names is still replaced by the recorded-
|
|
62
|
+
facts-only archive fallback. Approved terminal notifications use the same
|
|
63
|
+
six-label compact projection, including for long valid recaps, instead of a
|
|
64
|
+
raw flattened slice.
|
|
65
|
+
|
|
66
|
+
Durable-vs-defer decisions now have an explicit `record_goal_judgment` tool:
|
|
67
|
+
inline and deferred choices are persisted as bounded ledger events, with a
|
|
68
|
+
required durable follow-up for intentional deferrals. The policy keeps the
|
|
69
|
+
durable action ahead of defer and pins the plaque-ordering regression.
|
|
70
|
+
The recommendation now comes from a typed semantic decision path, including
|
|
71
|
+
the three-defer case, and the active goal card has a deterministic ordered
|
|
72
|
+
plaque fixture so UI ordering is tested rather than inferred from prose.
|
|
73
|
+
`record_goal_judgment` now persists bounded recommendation facts on the goal
|
|
74
|
+
and immediately routes them through production `refreshUI()`; the production
|
|
75
|
+
integration test captures the resulting durable-first card.
|
|
76
|
+
|
|
77
|
+
See `docs/DESIGN-long-running-supervision.md` for the durable policy and
|
|
78
|
+
future decision checklist.
|
|
79
|
+
|
|
80
|
+
## 0.35.72 — remove duplicate terminal outcome widget (2026-08-28)
|
|
81
|
+
|
|
82
|
+
### Fixed
|
|
83
|
+
Approved or aborted goals now clear the live outcome slot after the single
|
|
84
|
+
completion notification. The archived goal record and ledger remain the
|
|
85
|
+
durable history, while legacy `lastOutcome` state is read safely but no
|
|
86
|
+
longer paints a second `✓ done` row after archival.
|
|
87
|
+
|
|
88
|
+
### Tests
|
|
89
|
+
Updated terminal-outcome regressions to verify that completed/aborted goals
|
|
90
|
+
leave no retained widget row, while live goals still outrank legacy state.
|
|
91
|
+
|
|
92
|
+
## 0.35.71 — bounded Pi-core retry containment (2026-08-26)
|
|
93
|
+
|
|
94
|
+
### Changed
|
|
95
|
+
GLLA now exposes a configurable zero-stream retry budget (default 3,
|
|
96
|
+
allowed range 0–10). When Pi remains BUSY without stream activity, GLLA
|
|
97
|
+
still aborts and durably parks the owner, then re-dispatches repeatedly
|
|
98
|
+
within that finite budget before requiring explicit resume. A real stream
|
|
99
|
+
starts a fresh budget; supervisor pause, generation fences, and durable
|
|
100
|
+
recovery semantics remain intact. This contains the Pi-core retry-sleeper
|
|
101
|
+
failure at GLLA's public boundary without modifying Pi or any other plugin.
|
|
102
|
+
|
|
103
|
+
### Tests
|
|
104
|
+
Added repeated-silence exhaustion, budget persistence/validation, settings
|
|
105
|
+
menu/editor coverage, and existing lifecycle/park/no-storm regressions.
|
|
106
|
+
|
|
3
107
|
## 0.35.70 — optional-provider boundary and recovery alignment (2026-08-26)
|
|
4
108
|
|
|
5
109
|
### Changed
|
package/INSTALL.md
CHANGED
|
@@ -72,7 +72,9 @@ Done when:
|
|
|
72
72
|
A complete `Done when:` clause starts directly. For a new or ambiguous
|
|
73
73
|
objective, use bare `/goal` instead: GLLA interviews you, helps shape the
|
|
74
74
|
contract, and waits for Confirm. `/goal start "..."` skips that interview only
|
|
75
|
-
when you explicitly want it skipped.
|
|
75
|
+
when you explicitly want it skipped. Bare `/goal start` uses one clear recent
|
|
76
|
+
user request when possible and otherwise returns to the normal drafting flow;
|
|
77
|
+
it never guesses across ambiguous requests.
|
|
76
78
|
|
|
77
79
|
The first run proceeds like this:
|
|
78
80
|
|
|
@@ -93,17 +95,22 @@ waiting for a decision.
|
|
|
93
95
|
/list "refactor the cache. Done when: tests pass"
|
|
94
96
|
/list plan.md
|
|
95
97
|
/list
|
|
98
|
+
/list start
|
|
96
99
|
/list next
|
|
97
100
|
/list resume
|
|
98
101
|
|
|
99
102
|
/loop
|
|
103
|
+
/loop start # one clear recent target, metricless
|
|
100
104
|
/loop start "reduce flaky tests" measure="..." direction=min
|
|
101
105
|
/loop start "keep improving the spec" measure=none max=20 cadence=900
|
|
102
106
|
/loop audit
|
|
103
107
|
```
|
|
104
108
|
|
|
105
109
|
Use `/goal` for one outcome, `/list` for several independently auditable
|
|
106
|
-
outcomes, and `/loop` for an improvement process without one final item.
|
|
110
|
+
outcomes, and `/loop` for an improvement process without one final item. Bare
|
|
111
|
+
`/list start` activates the queued head, or seeds the normal Confirm-gated list
|
|
112
|
+
draft when the queue is empty. Bare `/loop start` infers only the target; it
|
|
113
|
+
does not invent metric, direction, bounds, cadence, or branch settings. For
|
|
107
114
|
metricless loops that intentionally mature between checks, add optional
|
|
108
115
|
`cadence=<seconds>`; the interval is visible in `/loop status`, while explicit
|
|
109
116
|
starts/resumes remain urgent. See the README for the full command semantics.
|
|
@@ -147,7 +154,10 @@ Useful controls:
|
|
|
147
154
|
```
|
|
148
155
|
|
|
149
156
|
`/glla pause` freezes supervisor automation without killing active work.
|
|
150
|
-
`/glla resume` releases it. A
|
|
157
|
+
`/glla resume` releases it. A BUSY/no-stream Pi turn is aborted and parked by
|
|
158
|
+
GLLA, then automatically re-dispatched within the **Zero-stream retries**
|
|
159
|
+
budget (default 3, configurable from 0–10); exhaustion requires an explicit
|
|
160
|
+
mode-correct resume. A user abort means stop; recovery is not silently
|
|
151
161
|
re-fired behind your back.
|
|
152
162
|
|
|
153
163
|
## Auditor model requirement
|
package/README.md
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
# pi-goal-list-loop-audit
|
|
2
2
|
|
|
3
|
+
<p align="center">
|
|
4
|
+
<img src="media/glla2.png" alt="GLLA mission control" width="960">
|
|
5
|
+
</p>
|
|
6
|
+
|
|
3
7
|
> **Long-running, high-leverage autonomy for pi.**
|
|
4
8
|
>
|
|
5
9
|
> Give pi a meaningful outcome. GLLA helps it research, plan, execute,
|
|
@@ -18,13 +22,18 @@ finished without evidence**:
|
|
|
18
22
|
|
|
19
23
|
- You state the outcome and what “done” means.
|
|
20
24
|
- The agent researches, decomposes, and executes across many turns.
|
|
21
|
-
- GLLA keeps durable state,
|
|
25
|
+
- GLLA keeps durable state, checks lifecycle/progress signals continuously, and
|
|
26
|
+
recovers failures with bounded per-attempt backoff plus policy-driven stop rules.
|
|
27
|
+
- Every terminal objective leaves a useful six-label recap; missing evidence is
|
|
28
|
+
shown as `not recorded`, never guessed.
|
|
22
29
|
- Optional subagents can do parallel research and focused implementation work.
|
|
23
30
|
- A separate detached auditor checks the saved completion claim before GLLA
|
|
24
31
|
accepts it.
|
|
25
32
|
|
|
26
33
|
The aim is not “run forever.” The aim is **more useful work per unit of
|
|
27
|
-
attention, with
|
|
34
|
+
attention, with event-driven progress instead of guessed-duration waiting, and
|
|
35
|
+
better evidence at the end**. See `docs/DESIGN-long-running-supervision.md` for
|
|
36
|
+
the long-running policy.
|
|
28
37
|
|
|
29
38
|
Use `/glla version` to inspect the installed version and compare it with the
|
|
30
39
|
registry. This checkout may contain unreleased changes; npm is authoritative
|
|
@@ -127,6 +136,7 @@ forcing every problem into a loop.
|
|
|
127
136
|
/goal # interview + Confirm
|
|
128
137
|
/goal "... Done when: ..." # direct contract start
|
|
129
138
|
/goal start "..." # explicit no-interview start
|
|
139
|
+
/goal start # use one clear recent request, or draft safely
|
|
130
140
|
/goal plan "..." # research-first extended plan
|
|
131
141
|
/goal status # inspect the current goal
|
|
132
142
|
/goal pause # pause automatic continuation
|
|
@@ -146,6 +156,7 @@ quietly inventing an unbounded backlog.
|
|
|
146
156
|
/list "fix the cache. Done when: tests pass"
|
|
147
157
|
/list plan.md # import a checklist or plan file
|
|
148
158
|
/list # show active and waiting items
|
|
159
|
+
/list start # activate the queued head, or draft one clear recent request
|
|
149
160
|
/list next # intentionally activate the next item
|
|
150
161
|
/list next <n> # choose a specific item
|
|
151
162
|
/list resume # explicitly retry/resume the list
|
|
@@ -162,12 +173,16 @@ If a saved item is malformed or needs a repair, the repair card preserves the
|
|
|
162
173
|
full original target, explains the concrete recovery action, and permits one
|
|
163
174
|
bounded bootstrap turn containing `propose_task_list`. Confirm the redraft;
|
|
164
175
|
automatic repeats are fenced. Use `/list resume` for an intentional retry and
|
|
165
|
-
`/list next` when you intentionally want another queued item.
|
|
176
|
+
`/list next` when you intentionally want another queued item. `/list start` is
|
|
177
|
+
also explicit: it activates the queued head, or—when the queue is empty—uses
|
|
178
|
+
one clear recent user request as a seed for the normal Confirm-gated list
|
|
179
|
+
drafting flow. Ambiguous context is never queued automatically.
|
|
166
180
|
|
|
167
181
|
### `/loop` — an improvement process
|
|
168
182
|
|
|
169
183
|
```text
|
|
170
184
|
/loop # interview + Confirm
|
|
185
|
+
/loop start # use one clear recent target as an explicit metricless start
|
|
171
186
|
/loop plan # research-first loop design
|
|
172
187
|
/loop start "reduce flaky tests" measure="..." direction=min
|
|
173
188
|
/loop start "keep improving the spec" measure=none max=20 cadence=900
|
|
@@ -176,6 +191,12 @@ automatic repeats are fenced. Use `/list resume` for an intentional retry and
|
|
|
176
191
|
/loop stop
|
|
177
192
|
```
|
|
178
193
|
|
|
194
|
+
Bare `/loop start` infers only one clear recent target. It does not invent a
|
|
195
|
+
measure, direction, bound, cadence, or branch setting; the command uses the
|
|
196
|
+
existing explicit metricless-start path. If the context is ambiguous, GLLA
|
|
197
|
+
returns to loop drafting so the target and any numeric metric/consent gates
|
|
198
|
+
remain visible.
|
|
199
|
+
|
|
179
200
|
There are three loop styles:
|
|
180
201
|
|
|
181
202
|
- **Metric:** a bounded command prints one number that honestly represents
|
|
@@ -329,7 +350,9 @@ that silence means success. Error text is **not trusted** to pick a retry policy
|
|
|
329
350
|
failure wording is retained as bounded diagnostics, not interpreted as
|
|
330
351
|
proof of a quota or billing state.
|
|
331
352
|
|
|
332
|
-
- automatic retries are bounded and visible;
|
|
353
|
+
- automatic retries are bounded and visible; a BUSY/no-stream turn is parked
|
|
354
|
+
and re-dispatched within the configurable **Zero-stream retries** budget
|
|
355
|
+
(default 3, range 0–10), then requires explicit resume;
|
|
333
356
|
- `/goal resume`, `/list resume`, and `/loop resume` are explicit recovery
|
|
334
357
|
paths;
|
|
335
358
|
- a user abort means stop, not “try again behind my back”;
|
|
@@ -341,16 +364,18 @@ proof of a quota or billing state.
|
|
|
341
364
|
- interrupted completion claims remain available for retry and inspection.
|
|
342
365
|
|
|
343
366
|
Use `/glla pause` to freeze supervisor automation without killing active work,
|
|
344
|
-
`/glla resume` to release it, and `/glla status` or `/goal status` to inspect
|
|
367
|
+
`/glla resume` to release it, `/glla bug [message]` to capture failure context to `bugs/` without touching durable goal state, and `/glla status` or `/goal status` to inspect
|
|
345
368
|
what happened.
|
|
346
369
|
|
|
347
370
|
### Settings worth knowing
|
|
348
371
|
|
|
349
372
|
Open `/glla` for the settings table. The most important choices are:
|
|
350
373
|
|
|
351
|
-
- **Auditor model / thinking level:** the verifier's model and depth;
|
|
352
|
-
|
|
353
|
-
|
|
374
|
+
- **Auditor model / thinking level:** the verifier's model and depth; when
|
|
375
|
+
unset, auditor thinking inherits the parent session dial (including `max`);
|
|
376
|
+
- **Main-agent and auditor fallback models:** both roles use the same ordered,
|
|
377
|
+
deselectable, bounded fallback-chain picker for provider failures; the
|
|
378
|
+
auditor's session model remains the final last resort;
|
|
354
379
|
- **Auto-resume:** whether persisted work may restart automatically after a
|
|
355
380
|
session loads; explicit resume commands are always available;
|
|
356
381
|
- **State root:** `workingDir` by default, opt-in `sessionDir`;
|
|
@@ -358,6 +383,8 @@ Open `/glla` for the settings table. The most important choices are:
|
|
|
358
383
|
choices win;
|
|
359
384
|
- **Subagent hang escalation:** warning-only at `0`, or one child-specific
|
|
360
385
|
action after a confirmed frozen interval;
|
|
386
|
+
- **Zero-stream retries:** automatic GLLA recovery attempts after a busy,
|
|
387
|
+
stream-silent Pi turn; `0` keeps recovery manual and `1–10` bounds repeats;
|
|
361
388
|
- **Audit cap and retry cadence:** bounds for repeated objections and
|
|
362
389
|
infrastructure recovery.
|
|
363
390
|
|
|
@@ -435,8 +462,10 @@ when tracing behavior:
|
|
|
435
462
|
|
|
436
463
|
The package contains the extension entry point
|
|
437
464
|
`extensions/loops/goal.ts`, prompt templates, schemas, scripts, docs, examples,
|
|
438
|
-
and the
|
|
439
|
-
|
|
465
|
+
and the user-facing README/install/changelog files. The full test suite remains
|
|
466
|
+
repository material for maintainers and is exercised by `npm run test:all`; it is
|
|
467
|
+
not included in the published tarball. `audit/` and `.research/` are also
|
|
468
|
+
repository material, not first-use package content.
|
|
440
469
|
|
|
441
470
|
## License
|
|
442
471
|
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
# Long-running supervision policy
|
|
2
|
+
|
|
3
|
+
**Decision record: v0.36.0 — 2026-08-28**
|
|
4
|
+
|
|
5
|
+
This document records the GLLA policy for work that can outlive one agent
|
|
6
|
+
turn, one provider session, or one day. It is a project decision record, not a
|
|
7
|
+
change to Pi core, `pi-subagents`, or `pi-memory`.
|
|
8
|
+
|
|
9
|
+
## Decision
|
|
10
|
+
|
|
11
|
+
GLLA automation is **event-driven and progress-aware**, not duration-guessed.
|
|
12
|
+
|
|
13
|
+
- A lifecycle event, durable state transition, child-progress signal, or
|
|
14
|
+
process completion marker is the primary reason to inspect or advance work.
|
|
15
|
+
- If no public event signal exists, GLLA uses a short adaptive fallback poll
|
|
16
|
+
(`250ms` backoff to the normal safety cadence) rather than sleeping for an
|
|
17
|
+
estimated task duration. A five-second task must not inherit a ten-minute
|
|
18
|
+
wait merely because the system guessed wrong.
|
|
19
|
+
- A live process remains eligible while real output, tool activity, durable
|
|
20
|
+
markers, or child progress proves liveness. A silent or unreachable process
|
|
21
|
+
may be classified as wedged only by the existing bounded safety watchdog.
|
|
22
|
+
Detached auditors have no unconditional wall-clock expiry: legacy wall
|
|
23
|
+
metadata is ignored, while confirmed silence and an individual tool timeout
|
|
24
|
+
remain the bounded safety mechanisms.
|
|
25
|
+
- Timers remain useful for per-attempt backoff, watchdogs, and host safety. A
|
|
26
|
+
timer is never evidence that work completed and is not the definition of a
|
|
27
|
+
long-running process's lifetime. Detached-auditor first-event silence starts
|
|
28
|
+
at the successful worker spawn boundary (with a return-time fallback for
|
|
29
|
+
runtimes that deliver the spawn event too early), so dispatch setup cannot
|
|
30
|
+
consume the worker's startup budget. Cancellation awaits the worker's
|
|
31
|
+
TERM-to-KILL settlement before the attempt is classified or cleaned up.
|
|
32
|
+
|
|
33
|
+
The shared checker covers all GLLA-owned work planes: ordinary goals, list
|
|
34
|
+
items and their queue, metric/spec/audit loops, detached completion auditors,
|
|
35
|
+
tracked subagents, provider recovery, and lifecycle/session transitions.
|
|
36
|
+
|
|
37
|
+
## Aggressive automation
|
|
38
|
+
|
|
39
|
+
Aggressive mode is the default effective keep-going policy unless the user
|
|
40
|
+
explicitly opts out. Its purpose is unattended long-running work:
|
|
41
|
+
|
|
42
|
+
- Recoverable provider, host, and auditor-infrastructure failures retry with
|
|
43
|
+
bounded per-attempt backoff and durable owner/generation fences.
|
|
44
|
+
- In aggressive mode, a recovery episode has no wall-clock expiry. Legacy
|
|
45
|
+
`autoRetryUntil` fields remain readable for compatibility, but new aggressive
|
|
46
|
+
scheduling must not stop solely because that old horizon elapsed.
|
|
47
|
+
- A semantic auditor disapproval is actionable work: its extracted objections
|
|
48
|
+
become a bounded durable TODO projection and the next continuation works them.
|
|
49
|
+
Repeated identical objections with no new progress are a state-based stop,
|
|
50
|
+
not an invitation to burn more turns.
|
|
51
|
+
- Automation stops on success, explicit user pause/cancel, a non-retriable or
|
|
52
|
+
contradictory semantic result, ownership loss, persistence-integrity failure,
|
|
53
|
+
or repeated no-progress. A cold-start consent/load hold still wins; aggressive
|
|
54
|
+
mode does not silently turn an unattended fresh launch into user consent.
|
|
55
|
+
- A retry must be idempotent with respect to durable state. It must not create
|
|
56
|
+
duplicate workers, overwrite a newer generation, duplicate TODOs, or erase a
|
|
57
|
+
recoverable claim.
|
|
58
|
+
|
|
59
|
+
Conservative mode keeps the pre-v0.36 bounded recovery horizons and explicit
|
|
60
|
+
manual holds. This opt-out is retained for users who prefer a finite
|
|
61
|
+
unattended recovery envelope.
|
|
62
|
+
|
|
63
|
+
## User-facing completion summaries
|
|
64
|
+
|
|
65
|
+
Every archived terminal objective gets one full six-label recap:
|
|
66
|
+
|
|
67
|
+
```text
|
|
68
|
+
Outcome: ...
|
|
69
|
+
Changed: ...
|
|
70
|
+
Evidence: ...
|
|
71
|
+
Tests: ...
|
|
72
|
+
Unresolved: ...
|
|
73
|
+
Next: ...
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
This applies to complete, aborted/cancelled, auto-dropped, full-auditor-IMPOSSIBLE,
|
|
77
|
+
and already-shipped archive paths. A valid executor recap is preserved. A
|
|
78
|
+
partial IMPOSSIBLE verdict remains a decision pause in conservative mode (or
|
|
79
|
+
continues narrowing in aggressive mode); only a full impossible objective is
|
|
80
|
+
terminalized. A missing, generic, or incomplete recap is replaced at the
|
|
81
|
+
central archive boundary by a
|
|
82
|
+
fallback assembled only from recorded GLLA facts: the objective, terminal
|
|
83
|
+
status/reason, durable telemetry, captured audit verdicts, and known archive
|
|
84
|
+
path. It says `not recorded` when a changed-file manifest or test result is not
|
|
85
|
+
available. It never infers a passing test or invents a commit.
|
|
86
|
+
|
|
87
|
+
The full recap lives in the archive and status/history surfaces. Every
|
|
88
|
+
terminal goal notification—including version-bearing already-shipped claims,
|
|
89
|
+
explicit goal/list cancellation, and `/glla wipe`—includes a compact
|
|
90
|
+
projection of all six labels; loop notifications do the same. The terminal
|
|
91
|
+
notification may use a compact excerpt. The executor recap and independent
|
|
92
|
+
auditor verdict stay separate: an approval is not manufactured from the
|
|
93
|
+
presence of a summary.
|
|
94
|
+
|
|
95
|
+
Metric-loop stops use the same six-label contract in their durable loop state
|
|
96
|
+
and `/loop status`, and every terminal loop notification carries a compact
|
|
97
|
+
projection of that recap. Lifecycle/recovery holds are not falsely presented
|
|
98
|
+
as terminal completion.
|
|
99
|
+
|
|
100
|
+
## Future decision checklist
|
|
101
|
+
|
|
102
|
+
Before adding a new long-running GLLA path, record answers to these questions:
|
|
103
|
+
|
|
104
|
+
1. What durable or lifecycle signal proves start, progress, recovery, and
|
|
105
|
+
completion?
|
|
106
|
+
2. If the host has no signal, what is the adaptive fallback, and what bounded
|
|
107
|
+
watchdog identifies confirmed silence without guessing task duration?
|
|
108
|
+
3. Which failures are recoverable, and which state-based conditions stop
|
|
109
|
+
automation? Is the retry idempotent across reload and owner changes?
|
|
110
|
+
4. What exact six-label user recap is available after every terminal path? Which
|
|
111
|
+
values are recorded facts, and which must explicitly say `not recorded`?
|
|
112
|
+
5. Does the change stay at GLLA's public boundary and preserve persistence,
|
|
113
|
+
ownership, lifecycle, auditor, and user-stop semantics?
|
|
114
|
+
|
|
115
|
+
Do not solve an external Pi/core defect by widening GLLA's scope. Keep the
|
|
116
|
+
external-only issue as a documented observation or a separate upstream report.
|
package/docs/DESIGN.md
CHANGED
|
@@ -117,19 +117,19 @@ architectural decisions that changed the SHAPE of the system:
|
|
|
117
117
|
- **The durable claim owns recovery state**: `pendingCompletion.phase` is
|
|
118
118
|
`running`, `recovery-pending`, or `quota-waiting`. Missing phase is legacy
|
|
119
119
|
state and is treated as recovery-pending after a fresh lifecycle event.
|
|
120
|
-
The isolated attempt id
|
|
121
|
-
|
|
120
|
+
The isolated attempt id prevents an old generation from finalizing a newer
|
|
121
|
+
attempt; legacy wall-deadline metadata is not a lifetime bound.
|
|
122
122
|
- **Rebind recovery is immediate but consent-aware**: a replacement
|
|
123
123
|
`session_start` converts an old running claim to recovery-pending and
|
|
124
124
|
retries it immediately when the lifecycle handoff or global `autoResume`
|
|
125
125
|
supplies consent. A cold startup with autoResume off paints the pending
|
|
126
126
|
claim and waits for `/goal resume`.
|
|
127
|
-
- **Auditor
|
|
128
|
-
only when no auditor tool is active; a live verification tool may
|
|
129
|
-
|
|
130
|
-
also has an independent five-minute ceiling.
|
|
131
|
-
infrastructure failures, never verdicts, and the
|
|
132
|
-
retryable.
|
|
127
|
+
- **Auditor liveness has event-derived layers**: no-event inactivity aborts
|
|
128
|
+
after 10m only when no auditor tool is active; a live verification tool may
|
|
129
|
+
finish, and the complete isolated run has no unconditional wall-clock cap.
|
|
130
|
+
Each auditor tool also has an independent five-minute ceiling. These
|
|
131
|
+
watchdog outcomes are infrastructure failures, never verdicts, and the
|
|
132
|
+
stored claim remains retryable.
|
|
133
133
|
|
|
134
134
|
## Addendum v0.34.22 (detached completion auditor)
|
|
135
135
|
|
|
@@ -140,9 +140,10 @@ architectural decisions that changed the SHAPE of the system:
|
|
|
140
140
|
never loads glla extensions or project context files. In current power mode,
|
|
141
141
|
bash is not an OS sandbox: it can write repository or goal-state files, so
|
|
142
142
|
the worker's isolation is process/API isolation rather than immutability. The
|
|
143
|
-
worker has independent per-tool and
|
|
144
|
-
|
|
145
|
-
|
|
143
|
+
worker has independent per-tool and confirmed-silence bounds, with no
|
|
144
|
+
unconditional wall-clock expiry. This removes the previous nested
|
|
145
|
+
`AgentSession` from the main pi process and prevents a provider stall in the
|
|
146
|
+
auditor from occupying the executor's turn.
|
|
146
147
|
- **Durable job protocol**: request, progress, lock, and result files live
|
|
147
148
|
under `.pi-glla/audit-jobs/<attemptId>/`. Requests and results are hashed and
|
|
148
149
|
atomically written. The parent validates attempt/request identity, verdict
|
|
@@ -160,10 +161,12 @@ architectural decisions that changed the SHAPE of the system:
|
|
|
160
161
|
`audit recovery pending` are distinct. The main session can continue
|
|
161
162
|
rendering and accepting input while the worker audits; completion/archive or
|
|
162
163
|
disapproval/continuation happens only after durable result consumption.
|
|
163
|
-
- **
|
|
164
|
-
auditor tool is active aborts the worker; a five-minute per-tool ceiling
|
|
165
|
-
|
|
166
|
-
|
|
164
|
+
- **Event-derived worker liveness**: no session event for 10 minutes while
|
|
165
|
+
no auditor tool is active aborts the worker; a five-minute per-tool ceiling
|
|
166
|
+
remains armed while a tool is open. There is no unconditional wall-clock
|
|
167
|
+
bound, so active output/tool progress may continue indefinitely. Watchdog
|
|
168
|
+
outcomes are infrastructure failures, never verdicts, and the claim remains
|
|
169
|
+
retryable.
|
|
167
170
|
|
|
168
171
|
## Addendum v0.34.24 (dispatch proof and display projection safety)
|
|
169
172
|
|
|
@@ -354,6 +357,23 @@ replacement without delivering a successor `session_start`:
|
|
|
354
357
|
and normalize old files. Canonical persisted state uses `retry-waiting`,
|
|
355
358
|
`retryAttempts`, `retryFirstAt`, and `retryUntil`.
|
|
356
359
|
|
|
360
|
+
## Addendum v0.35.71 (GLLA-only external-failure containment)
|
|
361
|
+
|
|
362
|
+
GLLA is a workflow supervisor, not a maintenance fork of its host ecosystem.
|
|
363
|
+
The repository changes only GLLA-owned code. Pi-core, OS, provider, and
|
|
364
|
+
third-party-plugin failures may be observed through public hooks and contained
|
|
365
|
+
by durable GLLA state (for example, a BUSY/no-stream turn can be aborted,
|
|
366
|
+
parked, and retried within a finite configured budget), but GLLA never edits
|
|
367
|
+
those external implementations or claims to repair them. Reports whose only
|
|
368
|
+
code lives outside GLLA are explicitly documented and disposed of as
|
|
369
|
+
out-of-scope.
|
|
370
|
+
|
|
371
|
+
The zero-stream budget defaults to three automatic re-dispatches and accepts
|
|
372
|
+
0–10. Each uninterrupted silent attempt consumes one slot; a real stream
|
|
373
|
+
starts a fresh episode. Exhaustion leaves the goal/list item/loop parked for
|
|
374
|
+
explicit resume. Generation, supervisor-pause, persistence, and dispatch
|
|
375
|
+
ownership fences remain authoritative throughout.
|
|
376
|
+
|
|
357
377
|
## Addendum v0.35.0 (long-running judgment, Designer, and drafting chain)
|
|
358
378
|
|
|
359
379
|
- **Judgment is a prompt-level contract**: drafting and continuation preserve
|
package/docs/INDEX.md
CHANGED
|
@@ -18,11 +18,13 @@ 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.
|
|
21
|
+
v0.35.14–v0.36.0 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
|
|
25
|
-
subagent recovery,
|
|
25
|
+
subagent recovery, bounded repair/replan recovery, production RPC child
|
|
26
|
+
stopping, mandatory hermetic auditor-extension validation, optional provider
|
|
27
|
+
extensions, and bounded zero-stream retry containment — see CHANGELOG.md for
|
|
26
28
|
the full trail.
|
|
27
29
|
- `../README.md` — what the plugin is, install, quickstart, and the
|
|
28
30
|
architectural guarantee (drafting + confirm + detached auditor).
|
|
@@ -39,6 +41,7 @@ For shipped docs, the relevant entry points are:
|
|
|
39
41
|
|
|
40
42
|
## Architecture
|
|
41
43
|
- `DESIGN.md` — plugin design (types, state, extension lifecycle)
|
|
44
|
+
- `DESIGN-long-running-supervision.md` — v0.36.0 event/progress-driven supervision, aggressive recovery, terminal recaps, and future decision checklist
|
|
42
45
|
- `GLLA-POSITIONING-AND-DECOMPOSITION-2026-08-08.md` — ecosystem
|
|
43
46
|
positioning, competitor review, and the goal.ts decomposition plan
|
|
44
47
|
(the current strategic doc — read this before touching
|
|
@@ -51,6 +54,7 @@ For shipped docs, the relevant entry points are:
|
|
|
51
54
|
- `../schemas/` — goal state JSON schema
|
|
52
55
|
- `../examples/` — example objective files
|
|
53
56
|
- `../CHANGELOG.md` — user-facing changelog (unreleased at top)
|
|
57
|
+
- `/glla bug` — `extensions/goal-commands.ts:cmdGllaBug` captures failure context to `<stateDir>/bugs/<ts>-<id>.md` without touching `active.jsonl`/`goals/*.md` (see `tests/glla-bug-capture.test.ts`)
|
|
54
58
|
|
|
55
59
|
## Repository-only material
|
|
56
60
|
The audit history and competitor research live in `audit/` and `.research/`
|
package/docs/VISION-ASSIST.md
CHANGED
|
@@ -1,60 +1,52 @@
|
|
|
1
|
-
# Vision Assist —
|
|
1
|
+
# Vision Assist — native vision first; external tools optional
|
|
2
2
|
|
|
3
|
-
**v0.34.72** ·
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
we need to specify that it cant be too eager to switch only preapproved."*
|
|
3
|
+
**v0.34.72 policy update** · The executor/auditor should use the native image
|
|
4
|
+
capability of the model currently doing the work whenever it is available.
|
|
5
|
+
No external vision CLI, including MMX, is assumed to be installed.
|
|
7
6
|
|
|
8
7
|
## Policy
|
|
9
8
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
it must NOT switch models to get vision. The check routes to the **mmx vision
|
|
13
|
-
CLI** (the `mmx-cli` skill, MiniMax VLM):
|
|
9
|
+
When a task needs the model to **look** at a screenshot, UI state, error dialog,
|
|
10
|
+
or rendered mockup:
|
|
14
11
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
12
|
+
1. Use the current model's native image capability first. This means the main
|
|
13
|
+
model for executor work or the configured auditor model for detached audit
|
|
14
|
+
work.
|
|
15
|
+
2. Do not switch models merely to obtain vision.
|
|
16
|
+
3. If native image input is unavailable, use an external vision provider only
|
|
17
|
+
after its availability has been explicitly confirmed. MMX is an optional
|
|
18
|
+
example, not a default or package requirement:
|
|
18
19
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
- Keep the question short and specific: *"What does this screenshot show?"*,
|
|
23
|
-
*"Is there an error dialog?"*, *"What is the terminal output?"*.
|
|
24
|
-
- Reading the returned description is the agent's job — no model switch
|
|
25
|
-
needed. (Verified 2026-08-07: `mmx vision describe` returns clean JSON/text
|
|
26
|
-
with `status_code: 0`.)
|
|
20
|
+
```bash
|
|
21
|
+
mmx vision describe --image <path-or-url> --prompt "<question>" --quiet --non-interactive
|
|
22
|
+
```
|
|
27
23
|
|
|
28
|
-
|
|
24
|
+
4. If neither native vision nor a confirmed external provider is available,
|
|
25
|
+
state that visual evidence is unavailable and request a supported capture or
|
|
26
|
+
user description. Never invent a visual observation or silently assume MMX.
|
|
29
27
|
|
|
30
|
-
|
|
31
|
-
NOT in the `forbiddenModels` policy:
|
|
28
|
+
## The preapproval gate (model switches)
|
|
32
29
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
- `/glla` → **Keep-going** → **Forbidden models** edits the list;
|
|
37
|
-
`blockForbiddenModelSwitches` (default on) reverts an explicitly forbidden
|
|
38
|
-
selection to the previous model.
|
|
39
|
-
- Every switch to a forbidden model is ledgered as `forbidden_model_switch`
|
|
40
|
-
(with `blocked: true|false`).
|
|
41
|
-
- With vision assist on (default), the same event also appends a
|
|
42
|
-
`vision_assist` ledger entry — the routing alternative: `{ route:
|
|
43
|
-
"mmx-vision", blockedSwitch: <ref>, reason: "forbidden_model_switch" }`.
|
|
30
|
+
A model switch is not the default solution to a visual check. A preapproved
|
|
31
|
+
model may be selected only when the user explicitly requests it or it is needed
|
|
32
|
+
for the ordinary task—not as an assumed vision workaround.
|
|
44
33
|
|
|
45
|
-
|
|
46
|
-
|
|
34
|
+
- Default `forbiddenModels` is empty; users may add patterns such as `gpt-5.5`,
|
|
35
|
+
`sonnet`, or `opus`.
|
|
36
|
+
- `/glla` → **Keep-going** → **Forbidden models** edits that list.
|
|
37
|
+
- `blockForbiddenModelSwitches` (default on) blocks explicitly forbidden
|
|
38
|
+
selections and records `forbidden_model_switch`.
|
|
39
|
+
- Vision routing is recorded as `vision_assist`, including the selected route
|
|
40
|
+
(`main-model`, confirmed `mmx-vision`, `model-switch`, or `unavailable`).
|
|
47
41
|
|
|
48
42
|
## The setting
|
|
49
43
|
|
|
50
44
|
`visionAssist` (default **on** — opt-out):
|
|
51
45
|
|
|
52
|
-
- **on** →
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
- **off** → no vision guidance is injected; the `forbiddenModels` gate still
|
|
57
|
-
stands (forbidden switches remain blocked/ledgered).
|
|
46
|
+
- **on** → continuation prompts carry the native-vision-first guidance and
|
|
47
|
+
forbidden-switch events can record a `vision_assist` entry.
|
|
48
|
+
- **off** → no vision guidance is injected; the forbidden-model gate still
|
|
49
|
+
stands.
|
|
58
50
|
|
|
59
51
|
Edit: `/glla` → **Keep-going** → **Vision assist**, then choose **off**.
|
|
60
52
|
|
|
@@ -63,13 +55,15 @@ Edit: `/glla` → **Keep-going** → **Vision assist**, then choose **off**.
|
|
|
63
55
|
| Piece | Where |
|
|
64
56
|
|---|---|
|
|
65
57
|
| Guidance block (single source of truth) | `extensions/vision-assist.ts` → `VISION_ASSIST_GUIDANCE` |
|
|
66
|
-
|
|
|
67
|
-
| Routing rule (pure) | `routeVisionCheck(request)` —
|
|
58
|
+
| Optional MMX command builder | `visionDescribeCommand(imagePath, question?)` |
|
|
59
|
+
| Routing rule (pure) | `routeVisionCheck(request)` — native main-model route by default; confirmed MMX is optional; forbidden target never forces an unconfirmed tool |
|
|
68
60
|
| Ledger payload builder | `visionAssistLedger(route, request)` |
|
|
69
|
-
| Continuation injection | `extensions/goal-continuation.ts` pushes `VISION_ASSIST_GUIDANCE` into
|
|
61
|
+
| Continuation injection | `extensions/goal-continuation.ts` pushes `VISION_ASSIST_GUIDANCE` into continuation directives (gated on `visionAssist !== false`) |
|
|
62
|
+
| Visual audit prompt | `extensions/goal-loop-auditor.ts` requires fresh evidence and does not assume an external tool |
|
|
70
63
|
| Forbidden-switch hook | forbidden-model gate in the settings editors/model pickers (`extensions/loops/goal-settings-ui.ts`, `extensions/loops/goal-activation.ts`) → `forbidden_model_switch` + `vision_assist` ledger entries |
|
|
71
|
-
| Setting | `extensions/goal-settings.ts` (default true), menu row in `extensions/settings-menu.ts
|
|
64
|
+
| Setting | `extensions/goal-settings.ts` (default true), menu row in `extensions/settings-menu.ts` |
|
|
72
65
|
| Tests | `tests/vision-assist.test.ts` |
|
|
73
66
|
|
|
74
|
-
The `vision_assist` ledger
|
|
75
|
-
|
|
67
|
+
The `vision_assist` ledger entry is the audit trail: it says whether the check
|
|
68
|
+
used the current model, a confirmed optional provider, an explicitly allowed
|
|
69
|
+
model switch, or had no safe visual path.
|