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 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 & try
1
+ # Install and first run
2
2
 
3
- ## Install (the usual way)
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
- That's it pi loads the extension into every session (run `/reload` in any
10
- session that was already open).
26
+ GLLA loads into new pi sessions. If pi is already open, reload that session:
11
27
 
12
- > **Persistence note**: `pi update` can overwrite `~/.pi/agent/npm/node_modules/`.
13
- > If the plugin disappears after an update, re-run `pi install`. For a permanent
14
- > install, copy the package into your project's `.pi/extensions/` directory instead.
28
+ ```text
29
+ /reload
30
+ ```
15
31
 
16
- ## Your first goal in 60 seconds
32
+ ### Recommended companions
17
33
 
18
- In any pi session, in the project you want worked on:
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
- /goal "Fix the login timeout bug. Done when: `npm test` passes"
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
- What happens:
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
- 1. **Draft + Confirm** glla shows the goal contract (objective + Done-when);
27
- nothing activates unconfirmed.
28
- 2. **The loop drives** after every agent turn, glla nudges the work forward;
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
- Then the other two modes:
59
+ ## First goal in 60 seconds
38
60
 
39
- ```
40
- /list add "refactor the cache layer" "add tests for the parser" # an audited queue
41
- /loop audit # forever project-audit cadence
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
- ## What you should see
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
- - **Commands**: `/goal`, `/list`, `/loop`, `/glla` (settings), `/review`.
47
- - **Widget**: live goal/loop status objective, elapsed time, last tool action.
48
- - **State on disk**: `.pi-glla/` in your project — ledger `active.jsonl`,
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
- ## Install from source (developers)
109
+ ## Modes
54
110
 
55
- Prerequisites: Node 22.19.0+ and bun (the test runner `bun test`), pi-coding-agent, TypeScript 5.9+ (for `tsc --noEmit`).
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
- ```bash
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
- ## Try it without installing
117
+ Default state is stored in the project:
64
118
 
65
- ```bash
66
- pi -e /home/dracon/Dev/pi-goal-list-loop-audit
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
- ## Operator notes (by release)
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
- Everything below is reference material written as features landed — you don't
74
- need it to get started.
151
+ ## Auditor model requirement
75
152
 
76
- ## Auditor model: the built-in-provider rule
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 auditor runs in a **detached fresh pi RPC process with no extensions**, so it can only use **built-in providers** (opencode, openrouter, minimax, google, anthropic, …).
79
- You select the model in pi; the auditor uses it. The plugin never picks a
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
- 1. your explicit auditor pick — `/glla → Auditor model`, else
83
- 2. the pi session model — whatever you selected in pi.
162
+ ```bash
163
+ GLLA_PI_BINARY=/absolute/path/to/pi
164
+ ```
84
165
 
85
- If your session model's provider is extension-registered, the auditor's
86
- extension-less session cannot auth it and the plugin says so at session start,
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
- Whatever you choose must work extension-less. Verify with:
169
+ ## Install from source
91
170
 
92
171
  ```bash
93
- PI_CODING_AGENT_DIR=/tmp/bare-agent pi -p "say ok" --model "provider/model-id"
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
- The detached worker resolves `pi` from `PATH` and inherits the normal
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
- npm test
180
+ pi -e /absolute/path/to/pi-goal-list-loop-audit
190
181
  ```
191
182
 
192
- Expected output at v0.35.3: 1363 passing tests across 113 files (1 env-gated skip).
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
- ## Run the type-check
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
- Expected output: no TypeScript errors.
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
- ## End-to-end smoke test
197
+ ## Troubleshooting
205
198
 
206
- After installing:
199
+ ### GLLA is not visible after installation
207
200
 
208
- 1. In a pi session, run:
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
- Done when:
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
- ## Reading the state
225
-
226
- While the loop runs:
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
- ls .pi-glla/ # see live state
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
- ## v0.1.0 verification status (2026-07-20, all live-verified)
236
-
237
- - [x] Live `agent_end` loop fires after agent returns.
238
- - [x] `complete_goal` triggers the isolated auditor session.
239
- - [x] Auditor session correctly isolates (no extensions — discovered the built-in-provider rule).
240
- - [x] `<approved/>` archives the goal with clean history.
241
- - [x] `<disapproved/>` / auditor error continues or pauses with feedback.
242
- - [x] 5-consecutive-error auto-pause fires (verified via live 403 storm).
243
- - [x] Stale-ctx safety after session replacement (lastCtx pattern).
244
- - [x] `npm test` 24/24. `npm run check` clean.
245
-
246
- Current behavior: completion audits are detached from the main pi process.
247
- Use `/goal status` to distinguish queued/running/recovery-pending work and
248
- `/goal cancel` to discard a pending claim; a fresh `/goal resume` starts a new
249
- attempt after lifecycle replacement.
250
-
251
- ## Reading your glla telemetry (v0.25.2)
252
-
253
- `/glla stats` scans `.pi-glla/active.jsonl` across every project on the
254
- rig and prints a per-project rollup: goals created, audit verdicts
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.