pi-goal-list-loop-audit 0.35.64 → 0.35.65
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 +21 -0
- package/INSTALL.md +177 -331
- package/README.md +390 -774
- package/docs/INDEX.md +4 -2
- package/extensions/goal-agents-panel.ts +84 -17
- package/extensions/goal-heartbeat.ts +60 -8
- package/extensions/goal-loop-display.ts +52 -55
- package/extensions/loops/goal-ui.ts +8 -6
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,26 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.35.65 — status surfaces and worker liveness (2026-08-26)
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
The persistent footer now stays compact and global, while the detailed
|
|
7
|
+
widget and `/glla agents` share one evidence-backed worker projection. Active
|
|
8
|
+
non-auditor workers expose sanitized identity/purpose, queued/running/hung/
|
|
9
|
+
ended status, coarse phase, elapsed time, silence age, and ownership-aware
|
|
10
|
+
lifecycle evidence. Narrow widgets retain essential liveness fields and
|
|
11
|
+
point explicitly to `/glla agents` when rows overflow.
|
|
12
|
+
|
|
13
|
+
### Changed
|
|
14
|
+
Detached completion-auditor evidence remains a separate verification HUD;
|
|
15
|
+
it is not mixed into the worker roster or duplicated in the global footer.
|
|
16
|
+
Existing command names, lifecycle, persistence, recovery, and auditor
|
|
17
|
+
semantics are unchanged.
|
|
18
|
+
|
|
19
|
+
### Tests
|
|
20
|
+
Focused status and worker-lifecycle coverage, fresh active/queue/recovery/
|
|
21
|
+
auditor fixtures, the full release gate, TypeScript checking, offline auditor
|
|
22
|
+
validation, and npm packaging were completed for this release.
|
|
23
|
+
|
|
3
24
|
## 0.35.64 — bounded recovery for frozen subagents (2026-08-25)
|
|
4
25
|
|
|
5
26
|
### Fix
|
package/INSTALL.md
CHANGED
|
@@ -1,387 +1,233 @@
|
|
|
1
|
-
# Install
|
|
1
|
+
# Install and first run
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
GLLA is a pi extension for long-running, high-leverage autonomous work. It
|
|
4
|
+
keeps a high-level objective moving across turns, preserves state, recovers
|
|
5
|
+
bounded failures, and requires an independent evidence check before accepting
|
|
6
|
+
completion.
|
|
7
|
+
|
|
8
|
+
For the product overview and the decision between `/goal`, `/list`, and
|
|
9
|
+
`/loop`, start with [`README.md`](README.md). This file is the practical
|
|
10
|
+
installation path.
|
|
11
|
+
|
|
12
|
+
## Requirements
|
|
13
|
+
|
|
14
|
+
- [pi](https://github.com/badlogic/pi-mono) with extension support;
|
|
15
|
+
- Node `22.19.0+` for the detached auditor and helper scripts;
|
|
16
|
+
- a model/provider that pi can authenticate normally;
|
|
17
|
+
- optionally, [Bun](https://bun.sh/) if you are developing GLLA or running its
|
|
18
|
+
test suite.
|
|
19
|
+
|
|
20
|
+
## Install from npm
|
|
4
21
|
|
|
5
22
|
```bash
|
|
6
23
|
pi install npm:pi-goal-list-loop-audit
|
|
7
24
|
```
|
|
8
25
|
|
|
9
|
-
|
|
10
|
-
session that was already open).
|
|
26
|
+
GLLA loads into new pi sessions. If pi is already open, reload that session:
|
|
11
27
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
28
|
+
```text
|
|
29
|
+
/reload
|
|
30
|
+
```
|
|
15
31
|
|
|
16
|
-
|
|
32
|
+
### Recommended companions
|
|
17
33
|
|
|
18
|
-
|
|
34
|
+
The structured-question companion is recommended for the intended drafting
|
|
35
|
+
and confirmation UX:
|
|
19
36
|
|
|
37
|
+
```bash
|
|
38
|
+
pi install npm:@juicesharp/rpiv-ask-user-question
|
|
20
39
|
```
|
|
21
|
-
|
|
40
|
+
|
|
41
|
+
When a goal has independent repository research or focused worker tasks,
|
|
42
|
+
add the optional parallel-worker companion:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
pi install npm:@tintinweb/pi-subagents
|
|
22
46
|
```
|
|
23
47
|
|
|
24
|
-
|
|
48
|
+
GLLA's main continuation, queue, recovery, and detached auditor work without
|
|
49
|
+
it. Other companions are optional: `@pi-unipi/notify` sends remote
|
|
50
|
+
notifications, and `pi-chrome` enables logged-in browser research. For a deeper
|
|
51
|
+
completion check, choose a stronger auditor model in `/glla`; a separate advisor
|
|
52
|
+
extension is not required. None of these companions is required for a basic
|
|
53
|
+
GLLA goal.
|
|
25
54
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
the widget (bottom-left) shows the goal, elapsed time, and last action.
|
|
30
|
-
3. **Verified completion** — when the agent calls `complete_goal`, glla
|
|
31
|
-
runs deterministic mechanical pre-audit checks first (~200ms fast-fail on
|
|
32
|
-
compiler/test failures) before queueing the **detached auditor worker process** (a
|
|
33
|
-
fresh pi RPC session with no extensions). It re-runs your checks and
|
|
34
|
-
demands raw output per contract item without holding the main pi turn.
|
|
35
|
-
Done sticks only when the auditor approves with evidence.
|
|
55
|
+
Do not run another extension that drives agent turns at the same time as GLLA.
|
|
56
|
+
Likewise, avoid a second task queue or overlapping retry/compaction supervisor
|
|
57
|
+
for the same active work. One supervisor should own continuation scheduling.
|
|
36
58
|
|
|
37
|
-
|
|
59
|
+
## First goal in 60 seconds
|
|
38
60
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
61
|
+
Start pi in the project directory where the work belongs:
|
|
62
|
+
|
|
63
|
+
```text
|
|
64
|
+
/goal "Improve the login flow.
|
|
65
|
+
|
|
66
|
+
Done when:
|
|
67
|
+
- failed logins return a safe, useful error;
|
|
68
|
+
- regression tests cover the behavior and pass;
|
|
69
|
+
- the change is documented and committed."
|
|
42
70
|
```
|
|
43
71
|
|
|
44
|
-
|
|
72
|
+
A complete `Done when:` clause starts directly. For a new or ambiguous
|
|
73
|
+
objective, use bare `/goal` instead: GLLA interviews you, helps shape the
|
|
74
|
+
contract, and waits for Confirm. `/goal start "..."` skips that interview only
|
|
75
|
+
when you explicitly want it skipped.
|
|
76
|
+
|
|
77
|
+
The first run proceeds like this:
|
|
78
|
+
|
|
79
|
+
1. GLLA records the objective and its acceptance contract.
|
|
80
|
+
2. pi researches and implements the work across supervised turns.
|
|
81
|
+
3. Optional subagents can handle independent research or implementation.
|
|
82
|
+
4. GLLA persists progress and recovers bounded provider/session stalls.
|
|
83
|
+
5. `complete_goal` saves the claim and queues a detached auditor.
|
|
84
|
+
6. The goal archives only after the auditor accepts evidence for the contract.
|
|
85
|
+
|
|
86
|
+
Inspect the status widget, `/glla status`, or `/goal status` whenever you want
|
|
87
|
+
to know whether the work is active, queued, paused, recovering, auditing, or
|
|
88
|
+
waiting for a decision.
|
|
89
|
+
|
|
90
|
+
## Other work shapes
|
|
91
|
+
|
|
92
|
+
```text
|
|
93
|
+
/list "refactor the cache. Done when: tests pass"
|
|
94
|
+
/list plan.md
|
|
95
|
+
/list
|
|
96
|
+
/list next
|
|
97
|
+
/list resume
|
|
98
|
+
|
|
99
|
+
/loop
|
|
100
|
+
/loop start "reduce flaky tests" measure="..." direction=min
|
|
101
|
+
/loop start "keep improving the spec" measure=none max=20
|
|
102
|
+
/loop audit
|
|
103
|
+
```
|
|
45
104
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
goal markdown in `goals/`, finished goals in `archive/`.
|
|
50
|
-
- **Tools for the agent** (only while a goal is active): `complete_goal`,
|
|
51
|
-
`pause_goal`, `complete_task`, `update_task_status`.
|
|
105
|
+
Use `/goal` for one outcome, `/list` for several independently auditable
|
|
106
|
+
outcomes, and `/loop` for an improvement process without one final item. See
|
|
107
|
+
the README for the full command semantics.
|
|
52
108
|
|
|
53
|
-
##
|
|
109
|
+
## Modes
|
|
54
110
|
|
|
55
|
-
|
|
111
|
+
The three surfaces are intentionally different policies on one durable state
|
|
112
|
+
machine. Read [`LIST-PHILOSOPHY.md`](LIST-PHILOSOPHY.md) for the short decision
|
|
113
|
+
table and guidance on choosing a goal, list, or loop.
|
|
56
114
|
|
|
57
|
-
|
|
58
|
-
git clone https://github.com/DraconDev/pi-goal-list-loop-audit.git # or use the local dir
|
|
59
|
-
cd pi-goal-list-loop-audit
|
|
60
|
-
pi install . # installs from local path
|
|
61
|
-
```
|
|
115
|
+
## State and recovery
|
|
62
116
|
|
|
63
|
-
|
|
117
|
+
Default state is stored in the project:
|
|
64
118
|
|
|
65
|
-
```
|
|
66
|
-
pi
|
|
119
|
+
```text
|
|
120
|
+
<working-directory>/.pi-glla/
|
|
67
121
|
```
|
|
68
122
|
|
|
69
|
-
|
|
123
|
+
`/glla` offers an opt-in `sessionDir` state root using pi's canonical session
|
|
124
|
+
directory. The host must admit that root first; unresolved session roots fail
|
|
125
|
+
closed rather than writing into an ambiguous cwd. Changing the root does not
|
|
126
|
+
silently migrate or delete the old working-directory state.
|
|
127
|
+
|
|
128
|
+
GLLA records goals, queue items, pauses, retries, audit claims, and archived
|
|
129
|
+
results as inspectable state. If a saved list item needs repair, its repair
|
|
130
|
+
card preserves the original target and gives one bounded
|
|
131
|
+
`propose_task_list` bootstrap turn. Confirm the redraft; use `/list resume` for
|
|
132
|
+
an intentional retry and `/list next` to choose another item. Automatic repeat
|
|
133
|
+
refires are fenced.
|
|
134
|
+
|
|
135
|
+
Useful controls:
|
|
136
|
+
|
|
137
|
+
```text
|
|
138
|
+
/glla status
|
|
139
|
+
/glla pause
|
|
140
|
+
/glla resume
|
|
141
|
+
/goal status
|
|
142
|
+
/goal resume
|
|
143
|
+
/list resume
|
|
144
|
+
/loop resume
|
|
145
|
+
```
|
|
70
146
|
|
|
71
|
-
|
|
147
|
+
`/glla pause` freezes supervisor automation without killing active work.
|
|
148
|
+
`/glla resume` releases it. A user abort means stop; recovery is not silently
|
|
149
|
+
re-fired behind your back.
|
|
72
150
|
|
|
73
|
-
|
|
74
|
-
need it to get started.
|
|
151
|
+
## Auditor model requirement
|
|
75
152
|
|
|
76
|
-
|
|
153
|
+
The completion auditor runs in a detached fresh pi RPC process with no
|
|
154
|
+
extensions, skills, prompt templates, themes, or context files by default. Its
|
|
155
|
+
model therefore needs to work with a built-in pi provider in an extension-less
|
|
156
|
+
session. If your normal session model comes from an extension provider, select
|
|
157
|
+
a compatible model in `/glla` under the Auditor settings.
|
|
77
158
|
|
|
78
|
-
The
|
|
79
|
-
|
|
80
|
-
model itself. The resolution is just:
|
|
159
|
+
The worker resolves `pi` from `PATH` and inherits normal provider configuration.
|
|
160
|
+
If required, point it at a specific binary:
|
|
81
161
|
|
|
82
|
-
|
|
83
|
-
|
|
162
|
+
```bash
|
|
163
|
+
GLLA_PI_BINARY=/absolute/path/to/pi
|
|
164
|
+
```
|
|
84
165
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
with the two fixes: switch pi's model to a built-in provider, or choose a
|
|
88
|
-
working auditor model in `/glla → Auditor model`.
|
|
166
|
+
Credentials are not written into `.pi-glla/audit-jobs/` or command arguments.
|
|
167
|
+
The auditor checks evidence; it does not implement the goal.
|
|
89
168
|
|
|
90
|
-
|
|
169
|
+
## Install from source
|
|
91
170
|
|
|
92
171
|
```bash
|
|
93
|
-
|
|
172
|
+
git clone https://github.com/DraconDev/pi-goal-list-loop-audit.git
|
|
173
|
+
cd pi-goal-list-loop-audit
|
|
174
|
+
pi install .
|
|
94
175
|
```
|
|
95
176
|
|
|
96
|
-
|
|
97
|
-
`PI_CODING_AGENT_DIR`/provider environment. Set `GLLA_PI_BINARY=/absolute/path/to/pi`
|
|
98
|
-
when the CLI is not on the worker's PATH; credentials are never written into
|
|
99
|
-
`.pi-glla/audit-jobs/` or command arguments.
|
|
100
|
-
|
|
101
|
-
## Loop behavior: the multi-signal stuck gate (v0.25.1)
|
|
102
|
-
|
|
103
|
-
A `/loop` iteration is judged STUCK only when **every** progress signal is
|
|
104
|
-
zero — no file writes (`write`/`edit`/`multi_edit`/`write_file` tool
|
|
105
|
-
results), no git commits since the iteration began (HEAD advance), no
|
|
106
|
-
`spec_item_progress` ledger events, and no *paired* forward transition
|
|
107
|
-
("Next step (iter-N…)" text only counts when the same iteration also wrote
|
|
108
|
-
a file or committed — narration alone is the narrate-but-don't-ship loop)
|
|
109
|
-
— **and** the legacy same-tool-same-result check also fires.
|
|
110
|
-
|
|
111
|
-
Why it changed: the v0.24.0 single-signal detector (same tool + same
|
|
112
|
-
result hash 3×) killed two real user loops that were shipping work with
|
|
113
|
-
stable verification output — stable verification is the GOAL state of a
|
|
114
|
-
metricless loop, not the stuck state. See `docs/DESIGN.md` for the shipped
|
|
115
|
-
design overview. `/loop start toolsamerepeat=0`
|
|
116
|
-
disables the legacy check entirely; `/loop finish [reason]` ends a loop
|
|
117
|
-
cleanly with stopReason `completed: <reason>` (distinct from
|
|
118
|
-
stuck/plateau/stopped-by-user).
|
|
119
|
-
|
|
120
|
-
## Provider recovery + aggressive mode
|
|
121
|
-
|
|
122
|
-
**Reason-agnostic retry.** Provider wording and upstream retry hints are not
|
|
123
|
-
used as availability or quota checks. Any retriable auditor failure is
|
|
124
|
-
infrastructure, not a verdict: the goal pauses with one eager 5-second retry,
|
|
125
|
-
then retries at the next `:00:30` slot after each hour starts. The durable
|
|
126
|
-
attempt and 24-hour bounds prevent an unbounded worker storm. `/goal resume`
|
|
127
|
-
retries immediately; a user pause is never stomped. Main-model recovery uses
|
|
128
|
-
the same generic policy and an ordered backup chain when configured.
|
|
129
|
-
|
|
130
|
-
**Aggressive mode** (Settings → Aggressive mode in `/glla`) flips the
|
|
131
|
-
continuation DEFAULTS toward keep-going:
|
|
132
|
-
|
|
133
|
-
| Key | default | aggressive |
|
|
134
|
-
|---|---|---|
|
|
135
|
-
| autoResume | default (hold on session load) | on (GLOBAL-only since v0.29.5 — project keys inert) |
|
|
136
|
-
| auditCap | 5 | 10 |
|
|
137
|
-
| stuckMaxInterventions | 5 | 10 |
|
|
138
|
-
| wedgeAlertMinutes | 30 | 0 (off) |
|
|
139
|
-
|
|
140
|
-
Explicit per-key settings always win — aggressiveMode flips defaults, never
|
|
141
|
-
your choices. Under aggressive mode an audit-cap disapproval streak does
|
|
142
|
-
NOT pause: the auditor's objections become a TODO list (`pendingTasks`)
|
|
143
|
-
rendered into every continuation, and the goal stays ACTIVE. Every
|
|
144
|
-
auto-event announces itself with a one-line notify.
|
|
145
|
-
|
|
146
|
-
## Subagent stall action (v0.35.64)
|
|
147
|
-
|
|
148
|
-
The subagent watchdog warns after short no-progress windows. A top-level
|
|
149
|
-
tracked child that remains frozen for the longer
|
|
150
|
-
`subagentHangEscalationMinutes` threshold (default `30`) receives one
|
|
151
|
-
child-specific abort request; the parent goal is not aborted. Set the value to
|
|
152
|
-
`0` under `/glla` for warning/telemetry only. Unreachable, nested, or
|
|
153
|
-
ownership-ambiguous children remain warning-only, and partial output stays
|
|
154
|
-
available for inspection.
|
|
155
|
-
|
|
156
|
-
## Subagent model inheritance (v0.24.6)
|
|
157
|
-
|
|
158
|
-
If you use `@tintinweb/pi-subagents`: its default `Explore` agent pins
|
|
159
|
-
`anthropic/claude-haiku-4-5`, so `Explore` subagents run on a **different
|
|
160
|
-
provider and quota pool than your session** — a quota-capped key (e.g.
|
|
161
|
-
OpenRouter) 403s after a few concurrent spawns even while the parent
|
|
162
|
-
session is fine.
|
|
163
|
-
|
|
164
|
-
glla fixes this by default: at session start it manages
|
|
165
|
-
`~/.pi/agent/agents/Explore.md` (pi-subagents' native override mechanism)
|
|
166
|
-
without the model pin, so subagents inherit your session model. Your own
|
|
167
|
-
same-named files are never touched (glla only edits files carrying its
|
|
168
|
-
`x-managed-by` marker).
|
|
169
|
-
|
|
170
|
-
Control it via `/glla` → Settings:
|
|
171
|
-
|
|
172
|
-
- **Subagent model strategy** — `inherit-parent` (default, subagents share
|
|
173
|
-
your session model + quota) or `agent-default` (upstream: Explore pins
|
|
174
|
-
haiku — cheap search, separate quota).
|
|
175
|
-
- **Subagent Explore model pin** — e.g. `minimax/MiniMax-M3`; always wins
|
|
176
|
-
over strategy.
|
|
177
|
-
|
|
178
|
-
Changes apply to NEW pi sessions (pi-subagents registers agents at its own
|
|
179
|
-
session start).
|
|
180
|
-
|
|
181
|
-
Release-workflow note: installing into the local extension tree
|
|
182
|
-
(`~/.pi/agent/npm`) requires `--legacy-peer-deps` — a pre-existing
|
|
183
|
-
`@pi-unipi/notify` peer pin on `@earendil-works/pi-coding-agent@^0.78.0`
|
|
184
|
-
conflicts with the current pi release.
|
|
185
|
-
|
|
186
|
-
## Run the tests
|
|
177
|
+
To try a local checkout without installing it globally:
|
|
187
178
|
|
|
188
179
|
```bash
|
|
189
|
-
|
|
180
|
+
pi -e /absolute/path/to/pi-goal-list-loop-audit
|
|
190
181
|
```
|
|
191
182
|
|
|
192
|
-
|
|
193
|
-
Counts change as bounded regressions are added; use the command output
|
|
194
|
-
as the source of truth ("N pass / 0 fail").
|
|
183
|
+
## Development checks
|
|
195
184
|
|
|
196
|
-
|
|
185
|
+
Install development dependencies, then run:
|
|
197
186
|
|
|
198
187
|
```bash
|
|
188
|
+
npm test
|
|
199
189
|
npm run check
|
|
190
|
+
npm run release:check
|
|
200
191
|
```
|
|
201
192
|
|
|
202
|
-
|
|
193
|
+
The release gate runs the serialized Bun tests, TypeScript, the jiti state
|
|
194
|
+
reproduction, offline auditor-extension validation, and npm pack. Require
|
|
195
|
+
`0 fail`; test counts change as regressions are added.
|
|
203
196
|
|
|
204
|
-
##
|
|
197
|
+
## Troubleshooting
|
|
205
198
|
|
|
206
|
-
|
|
199
|
+
### GLLA is not visible after installation
|
|
207
200
|
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
/goal start "
|
|
211
|
-
Add a /healthz endpoint to src/server.ts that returns {status:'ok'} JSON.
|
|
201
|
+
Run `/reload`, then start a new goal. Confirm that pi is using the project or
|
|
202
|
+
user installation you intended.
|
|
212
203
|
|
|
213
|
-
|
|
214
|
-
- curl -fsS localhost:3000/healthz returns 200 with body {\"status\":\"ok\"}
|
|
215
|
-
- The file is committed
|
|
216
|
-
"
|
|
217
|
-
```
|
|
218
|
-
2. The orchestrator creates `.pi-glla/goals/<id>.md`, schedules continuation, and the agent starts.
|
|
219
|
-
3. The agent reads the goal, makes the change, runs the verification, and calls `complete_goal`.
|
|
220
|
-
4. The orchestrator queues a detached auditor worker and returns control to the main turn.
|
|
221
|
-
5. The worker inspects files, runs `curl`, reads `git log`, and writes an identity-checked result.
|
|
222
|
-
6. Either `<approved/>` → goal archived; or `<disapproved/>` → loop continues.
|
|
204
|
+
### The auditor cannot authenticate
|
|
223
205
|
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
206
|
+
The detached auditor does not inherit extension-registered providers. Choose a
|
|
207
|
+
built-in-provider model in `/glla` under Auditor settings and verify it in a
|
|
208
|
+
clean directory if necessary:
|
|
227
209
|
|
|
228
210
|
```bash
|
|
229
|
-
|
|
230
|
-
cat .pi-glla/active.jsonl | tail -5
|
|
231
|
-
cat .pi-glla/goals/<id>.md # current goal markdown
|
|
232
|
-
ls .pi-glla/archive # past goals
|
|
211
|
+
PI_CODING_AGENT_DIR=/tmp/bare-agent pi -p "say ok" --model "provider/model-id"
|
|
233
212
|
```
|
|
234
213
|
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
(approved / disapproved / infra errors), average turns and file writes per
|
|
256
|
-
goal, premature-success count, total tokens, and last activity.
|
|
257
|
-
|
|
258
|
-
**Premature success** = an approved goal with < 50 turns AND < 5 file
|
|
259
|
-
writes AND < 8 bash calls — the "claimed done in 12 turns with 0 file
|
|
260
|
-
writes" pattern an auditor should have caught. `/glla stats premature`
|
|
261
|
-
lists only those projects, worst ratio first. Goals archived before
|
|
262
|
-
v0.25.2 have no telemetry and are never flagged retroactively.
|
|
263
|
-
|
|
264
|
-
`/glla stats json` emits the same rows as JSON (pipe to `jq`);
|
|
265
|
-
`/glla stats project=~/Dev/xyz` scopes to one project. `total_cost` is
|
|
266
|
-
measured in tokens (this rig has no per-provider price table).
|
|
267
|
-
|
|
268
|
-
## Modes (v0.25.3)
|
|
269
|
-
|
|
270
|
-
The three loops are not redundant — each long-runs differently:
|
|
271
|
-
|
|
272
|
-
| Mode | Item size | Long-running by |
|
|
273
|
-
|---|---|---|
|
|
274
|
-
| `/goal` | ONE big multi-hour task | Scope |
|
|
275
|
-
| `/list` | N items × short (minutes each) | Queue depth |
|
|
276
|
-
| `/loop` | 1 metric × infinite polish | Bounds |
|
|
277
|
-
|
|
278
|
-
`/list` items should fit in a single agent run; hundreds of them in the
|
|
279
|
-
queue is the right framing. `/list depth` shows queue depth, oldest item
|
|
280
|
-
age, and average item duration. Drafting cross-recommends: multi-hour
|
|
281
|
-
seeds in `/list` get pointed at `/goal`, aggregate "N items, one commit
|
|
282
|
-
each" seeds get shaped into N short items. See **LIST-PHILOSOPHY.md**
|
|
283
|
-
for the full hierarchy and the wrapper-goal anti-pattern it prevents.
|
|
284
|
-
|
|
285
|
-
## Auditing the auditor (v0.25.4)
|
|
286
|
-
|
|
287
|
-
Every audit verdict is appended to `.pi-glla/audits.jsonl` (goal id,
|
|
288
|
-
verdict, model, full report) — the durable trail for "where are we weak"
|
|
289
|
-
reviews. `/glla audits` lists the last 10 verdicts, `/glla audits 30`
|
|
290
|
-
shows more, `/glla audits full` prints the latest report. Reports are
|
|
291
|
-
think-block-stripped; disapprovals end with a `## Required fixes`
|
|
292
|
-
actionable tail, which is also what capped executor feedback keeps.
|
|
293
|
-
|
|
294
|
-
## Reviewer (postaudit since v0.27.5) — post-completion follow-up enqueuer
|
|
295
|
-
|
|
296
|
-
When a `/goal` completes or a `/list` queue empties, the reviewer fires:
|
|
297
|
-
it reads the archive + audit reports, extracts findings, classifies them
|
|
298
|
-
by **leverage**, writes a report to `.pi-glla/reviews/<goal-id>-<ts>.md`,
|
|
299
|
-
and cascades:
|
|
300
|
-
|
|
301
|
-
| Finding class | Action | Confirm? |
|
|
302
|
-
|---|---|---|
|
|
303
|
-
| Bug (`TODO`, `FIXME`, `bug`, `regression`, `broken`) | `/list` items | No — fix-without-confirm |
|
|
304
|
-
| Refactor (`duplicated`, `could be cleaner`, `left out`) | `/list` items | No |
|
|
305
|
-
| Architectural (`rewrite`, `new dependency`, `schema change`) | `/goal` proposal | Yes |
|
|
306
|
-
| Strategic (`should we…`, `deprecate`) | notify only | — |
|
|
307
|
-
| Clean completion (no findings) | audit `/goal` proposal | Yes |
|
|
308
|
-
|
|
309
|
-
The leverage principle: if you'd never say no to fixing a bug, the
|
|
310
|
-
reviewer doesn't ask. Decisions stay with you.
|
|
311
|
-
|
|
312
|
-
**Modes** (`/glla postaudit` → Mode — `/glla reviewer` is a kept alias —
|
|
313
|
-
or `/review <id> <mode>` for a one-shot override):
|
|
314
|
-
|
|
315
|
-
| Mode | Problems / improvements found | Architectural | Clean completion |
|
|
316
|
-
|---|---|---|---|
|
|
317
|
-
| `off` | reviewer never fires | — | — |
|
|
318
|
-
| `on` (default) | `/list` items, no Confirm | `/goal` proposal (Confirm) | audit `/goal` proposal (Confirm) |
|
|
319
|
-
| `auto` | `/list` items, no Confirm | `/list` items, no Confirm | audit enqueued as a `/list` item, no Confirm |
|
|
320
|
-
| `aggressive` | `/list` items, no Confirm | `/list` items + the first finding **relaunched as the next active `/goal`** | the regression-scan audit **relaunched as `/goal`** directly |
|
|
321
|
-
|
|
322
|
-
(v0.27.9 replaced the old `default`/`report` modes with this 4-mode set:
|
|
323
|
-
`default` → `on`; `report` was dropped — a silent report with no cascade
|
|
324
|
-
was the do-nothing mode.)
|
|
325
|
-
|
|
326
|
-
`auto` is the **auto-loop**: run it once and the cascade keeps rolling
|
|
327
|
-
through everything it finds — problems, improvements ("consider
|
|
328
|
-
adding…", "could be improved", "enhancement" are extracted too), then
|
|
329
|
-
the regression-scan audit — until the findings run dry. `aggressive`
|
|
330
|
-
goes one step further: the queue is skipped for the headline item — the
|
|
331
|
-
first architectural finding (or the clean-completion audit) relaunches
|
|
332
|
-
as the next ACTIVE goal with no Confirm at all, so the unattended rig
|
|
333
|
-
never stops. Strategic
|
|
334
|
-
findings (`should we…`) stay notify-only in every mode: decisions never
|
|
335
|
-
auto-fire. Extraction ignores code lines, markdown tables, code spans, and the
|
|
336
|
-
reviewer's own report vocabulary (v0.26.3), and findings are mined only
|
|
337
|
-
from the archive plus DISAPPROVED/error audit reports — an approved
|
|
338
|
-
report is the executor's self-claims, zero finding signal (v0.26.4,
|
|
339
|
-
after a second live self-match on the 0.26.3 completion). Stalls are
|
|
340
|
-
watched three ways: refire streaks and a pending-latch watchdog (a queued
|
|
341
|
-
continuation whose turn trigger was dropped — seen post-compaction) both
|
|
342
|
-
escalate to a loud pause/stop, and busy-session wedges alert at 30m
|
|
343
|
-
(v0.26.5). The heartbeat never suppresses itself on "recent ship" — that
|
|
344
|
-
heuristic self-sustained via state-file mtime (v0.26.6, after a 9.1h
|
|
345
|
-
darklord stall). In `auto` the 5-minute refire window is skipped for
|
|
346
|
-
list-complete events (the queue emptying is the cascade's natural
|
|
347
|
-
rhythm); the per-day cap (`maxReviewsPerDay`, default 20) still bounds
|
|
348
|
-
everything.
|
|
349
|
-
|
|
350
|
-
Safety: no firing on aborts/pauses, a 5-minute refire window blocks
|
|
351
|
-
runaway recursion, `maxReviewsPerDay: 20` caps the day, and `/loop`
|
|
352
|
-
never triggers it. Configure per-project via `/glla postaudit`
|
|
353
|
-
(mode, triggers, cascade steps, caps) — the block lives
|
|
354
|
-
in `.pi-glla/settings.json` under `postaudit` (the legacy `reviewer` key
|
|
355
|
-
is still read). Re-review any archived goal with
|
|
356
|
-
`/review <goal-id>` (bypasses the trigger gates).
|
|
357
|
-
|
|
358
|
-
## Stall handling (v0.26.1) — the zombie killer
|
|
359
|
-
|
|
360
|
-
Motivating incident (hegemon, 2026-07-25/26): a metricless spec loop
|
|
361
|
-
stopped producing turns; the heartbeat re-fired every 60s for **23.5
|
|
362
|
-
hours** (619 refires, zero turns, zero tokens) while the status line
|
|
363
|
-
still read "active". Three gaps made it invisible: the send path was
|
|
364
|
-
silent, the nudge counter counts *turns* (a zombie runs none), and no
|
|
365
|
-
compaction hook existed.
|
|
366
|
-
|
|
367
|
-
What ships:
|
|
368
|
-
|
|
369
|
-
- **Send-path ledger instrumentation** — `loop_turn_sent` /
|
|
370
|
-
`loop_turn_send_failed` (with the error text) and
|
|
371
|
-
`goal_continuation_sent` / `goal_continuation_send_failed` are now in
|
|
372
|
-
`.pi-glla/active.jsonl`. A stall is diagnosable from the ledger alone:
|
|
373
|
-
refires without matching `*_sent` = the send is throwing; `*_sent`
|
|
374
|
-
without a following turn = the turn trigger is dead.
|
|
375
|
-
- **Refire-streak escalation** — consecutive heartbeat refires that
|
|
376
|
-
produce no real agent turn are counted (reset only by `agent_end` /
|
|
377
|
-
`tool_call`, never by the refire itself). At the threshold (default 5;
|
|
378
|
-
edit Stall escalation refires in `/glla`, 0 = never) the supervisor stops spinning:
|
|
379
|
-
the loop stops / the goal pauses with `stalled: continuation not
|
|
380
|
-
landing`, a `stall_escalated` ledger event, a TUI warning, and an
|
|
381
|
-
external notify. The fix on the box: restart pi, resume.
|
|
382
|
-
- **Compaction hook** — `session_compact` now re-arms the continuation
|
|
383
|
-
chain ~2s after compaction when the session is idle with nothing
|
|
384
|
-
scheduled (`session_compact` + `compaction_refire` ledger events), so
|
|
385
|
-
post-compaction recovery no longer waits for the 60s heartbeat.
|
|
386
|
-
- **Stall surface** — the status line and widget show `stalls:N` while
|
|
387
|
-
the streak is nonzero, so a spinning supervisor is visible at a glance.
|
|
214
|
+
### Work restored but not running
|
|
215
|
+
|
|
216
|
+
That is a consent/supervision state, not proof of loss. Inspect `/glla status`
|
|
217
|
+
and use `/goal resume`, `/list resume`, `/list next`, or `/loop resume` as
|
|
218
|
+
appropriate. Keep `Auto-resume` enabled only when automatic restart after
|
|
219
|
+
session load is intentional.
|
|
220
|
+
|
|
221
|
+
### Another loop is also active
|
|
222
|
+
|
|
223
|
+
Do not run two continuation drivers in one session. Stop or pause the other
|
|
224
|
+
supervisor, or let it own the session instead of GLLA.
|
|
225
|
+
|
|
226
|
+
## Further reading
|
|
227
|
+
|
|
228
|
+
- [`README.md`](README.md) — product overview, first-use guide, commands,
|
|
229
|
+
companion policy, autonomy model, recovery, and maintainer map;
|
|
230
|
+
- [`docs/DESIGN.md`](docs/DESIGN.md) — architecture and design decisions;
|
|
231
|
+
- [`docs/INDEX.md`](docs/INDEX.md) — shipped and repository-only documentation;
|
|
232
|
+
- [`docs/RELEASING.md`](docs/RELEASING.md) — release process;
|
|
233
|
+
- [`CHANGELOG.md`](CHANGELOG.md) — version history.
|