pi-loop-mode 2.5.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 ADDED
@@ -0,0 +1,29 @@
1
+ # Changelog
2
+
3
+ ## 2.5.0
4
+
5
+ - **Rescue model** (`--rescue-model M`): after 3 consecutive stuck interventions, a stronger model takes over for a single cleanup turn (fix one thing, rewrite `PROGRESS.md`, update the `IMPROVEMENTS.md` backlog, leave a `NEXT:` line), then control returns to the loop model.
6
+ - **Anti-repetition sampling penalties**: after any stuck intervention, `frequency_penalty`/`presence_penalty` (0.5) and slightly raised temperature for 3 turns (OpenAI-compatible completions APIs only, e.g. vLLM/Ollama).
7
+ - **Automatic context compaction**: after 5 consecutive stuck interventions the context is compacted, with repetitive filler explicitly excluded from the summary.
8
+ - **Backlog-driven improvement mode**: after `LOOP_DONE` in endless mode, work is driven by an `IMPROVEMENTS.md` checklist with file paths and acceptance criteria; vague items are forbidden.
9
+ - **Per-iteration JSONL log** (`.pi-loop-log.jsonl`) and `/loop stats`: event distribution, interventions, productive iterations/hour, score trend.
10
+ - **Prompt jitter**: "continue" prompts are slightly varied to avoid deterministic repetition.
11
+ - Fix: `/loop run --rescue-model M` was parsed but not applied.
12
+
13
+ ## 2.4.0
14
+
15
+ - **Degenerate-generation kill switch**: one sentence repeated within a single response is detected (≥ 4 repeats), the stream is aborted live (≥ 6 repeats), the stored message is truncated after the first repetition, and poisoned context is sanitized before every LLM call.
16
+
17
+ ## 2.3.0
18
+
19
+ - **Near-duplicate detection**: consecutive responses ≥ 80 % similar (Jaccard on word trigrams, digits masked) count as stuck — catches rephrased repetition that exact fingerprints miss.
20
+ - **Window repetition**: the same response 3+ times in the recent window (catches alternating A-B-A-B loops).
21
+ - **Tool-call requirement**: 3 turns without any tool call trigger a stuck intervention; loop prompts forbid narration-only turns.
22
+ - **Hard-reset escalation**: from the 3rd consecutive stuck intervention, recent response openings are injected as banned phrases and the turn must start with a tool call.
23
+
24
+ ## 2.2.0
25
+
26
+ - Separate goal/prepare/run phases with per-phase model selection (`/loop goal`, `/loop prepare --model M`, `/loop run --model M`).
27
+ - Objective goal function (`--check "CMD"`) with `SCORE:` tracking and regression prompts.
28
+ - Endless mode by default; `--until-done` for verified completion.
29
+ - Error retry with exponential backoff, auto-resume after restart/reload, stuck detection with rotating recovery strategies, no-progress audit, persistence via session entries.
@@ -0,0 +1,628 @@
1
+ # Loop-Modul — Dokumentation
2
+
3
+ Unbeaufsichtigter Loop-Modus für [pi](https://github.com/earendil-works/pi): Du gibst dem Agenten **ein Ziel**, und er arbeitet in kleinen Iterationen daran — stunden- oder tagelang — bis **du** ihn stoppst. Funktioniert mit kommerziellen Modellen (Claude, GPT, Gemini) genauso wie mit Open-Source-Modellen (Qwen, GLM, gpt-oss, …), weil der Loop selbst gegen typische Schwächen schwacher Modelle abgesichert ist: Wiederholungsschleifen, falsche Fertig-Behauptungen, Provider-Abbrüche.
4
+
5
+ ---
6
+
7
+ ## Inhalt
8
+
9
+ 1. [Installation](#1-installation)
10
+ 2. [Schnellstart](#2-schnellstart)
11
+ 3. [Grundkonzept](#3-grundkonzept)
12
+ 4. [Befehlsreferenz](#4-befehlsreferenz)
13
+ 5. [Optionen im Detail](#5-optionen-im-detail)
14
+ 6. [Die Goal-Funktion (`--check`)](#6-die-goal-funktion---check)
15
+ 7. [Fehler- und Störfallverhalten](#7-fehler--und-störfallverhalten)
16
+ 8. [Praxisbeispiele](#8-praxisbeispiele)
17
+ 9. [Best Practices für Mehrtagesläufe](#9-best-practices-für-mehrtagesläufe)
18
+ 10. [Statusanzeige und Monitoring](#10-statusanzeige-und-monitoring)
19
+ 11. [Interna & Tuning-Konstanten](#11-interna--tuning-konstanten)
20
+ 12. [FAQ](#12-faq)
21
+
22
+ ---
23
+
24
+ ## 1. Installation
25
+
26
+ ```bash
27
+ pi install npm:pi-loop-mode
28
+ ```
29
+
30
+ Oder aus einem lokalen Checkout:
31
+
32
+ ```bash
33
+ pi install /pfad/zu/pi-loop-mode
34
+ ```
35
+
36
+ Danach pi neu starten oder `/reload` ausführen. Der Befehl `/loop` ist dann verfügbar.
37
+
38
+ **Dateien des Pakets:**
39
+
40
+ ```text
41
+ pi-loop-mode/
42
+ ├── package.json # pi-Paketdefinition
43
+ ├── README.md # Übersicht (englisch)
44
+ ├── DOCUMENTATION.md # Diese Datei
45
+ ├── CHANGELOG.md # Versionshistorie
46
+ ├── LICENSE # MIT
47
+ ├── extensions/index.ts # Die Loop-Extension (gesamte Logik)
48
+ ├── skills/loop-skill/SKILL.md # Verhaltensregeln für das Modell im Loop
49
+ └── prompts/loop-prompt.md # Prompt-Template
50
+ ```
51
+
52
+ ---
53
+
54
+ ## 2. Schnellstart
55
+
56
+ **Empfohlener Workflow — Ziel setzen, vorbereiten, starten (getrennt, mit Modellwahl):**
57
+
58
+ ```text
59
+ /loop goal Baue eine Task-Management-REST-API in ./taskapi: CRUD, Auth, SQLite, Tests, Docs. Committe inkrementell in git.
60
+ /loop prepare --model anthropic/claude-opus-4-6 # starkes Modell schreibt GOAL.md + check.sh
61
+ /loop run --model vllm-omega/qwen3-coder-30b # günstiges/lokales Modell arbeitet den Loop ab
62
+ ```
63
+
64
+ **Oder alles in einem Schritt** (ohne Vorbereitung, mit aktuellem Modell):
65
+
66
+ ```text
67
+ /loop start Baue eine Task-Management-REST-API in ./taskapi: CRUD, Auth, SQLite, Tests, Docs. Committe inkrementell in git.
68
+ ```
69
+
70
+ **Zuschauen:**
71
+
72
+ ```text
73
+ /loop status
74
+ ```
75
+
76
+ **Stoppen:**
77
+
78
+ ```text
79
+ /loop stop
80
+ ```
81
+
82
+ **Weitermachen:**
83
+
84
+ ```text
85
+ /loop resume
86
+ ```
87
+
88
+ Das ist alles, was du für den Grundbetrieb brauchst.
89
+
90
+ ### Der 3-Phasen-Workflow im Detail
91
+
92
+ | Phase | Befehl | Was passiert | Typisches Modell |
93
+ |-------|--------|--------------|------------------|
94
+ | **1. Ziel setzen** | `/loop goal <Ziel> [Flags]` | Speichert Ziel + Konfiguration. **Startet nichts.** | — (kein LLM-Aufruf) |
95
+ | **2. Vorbereiten** (optional) | `/loop prepare [--model M]` | Ein Modell analysiert das Projekt und schreibt `GOAL.md` (Spezifikation, Meilensteine, Annahmen) plus ein Check-Script. Endet mit `GOAL_READY:`. Danach kannst du `GOAL.md` reviewen und editieren. | Starkes Modell (Opus, GPT-5, …) |
96
+ | **3. Loop starten** | `/loop run [--model M]` | Startet den eigentlichen Endlos-Loop. Die erste Iteration liest `GOAL.md` als Spezifikation. | Günstiges/lokales Modell (Qwen, GLM, Sonnet, …) |
97
+
98
+ Die Idee: **Planung und Ausführung entkoppeln.** Ein teures, starkes Modell schreibt einmalig eine präzise Spezifikation — ein günstiges oder lokales Modell arbeitet sie über Tage ab. `GOAL.md` liegt im Projekt, überlebt Compaction/Neustarts und wird in jedem Loop-Prompt referenziert („read it whenever you lose track of the plan“).
99
+
100
+ ---
101
+
102
+ ## 3. Grundkonzept
103
+
104
+ Der Loop funktioniert so:
105
+
106
+ ```
107
+ ┌─────────────────────────────────────────────────────┐
108
+ │ /loop start <Ziel> │
109
+ └──────────────────┬──────────────────────────────────┘
110
+
111
+ ┌─── Loop-Iteration ────────────────────┐
112
+ │ 1. Loop-Prompt an das Modell │
113
+ │ (Ziel, Kriterien, Regeln, │
114
+ │ Check-Status, Iterationszähler) │
115
+ │ 2. Modell macht EINEN konkreten │
116
+ │ Fortschritts-Batch (Tools, Edits) │
117
+ │ 3. Goal-Check läuft (falls --check) │
118
+ │ 4. Auswertung: │
119
+ │ Fehler? → Retry mit Backoff │
120
+ │ Wiederholung? → Stuck-Strategie │
121
+ │ Regression? → Fix-Prompt │
122
+ │ Fertig? → weiter verbessern │
123
+ │ (oder Stopp bei --until-done) │
124
+ │ Sonst → nächste Iteration │
125
+ └───────────────┬───────────────────────┘
126
+ │ (bis /loop stop)
127
+
128
+ ```
129
+
130
+ **Kernprinzipien:**
131
+
132
+ - **Kleine Iterationen**: Jede Antwort max. 1.200 Zeichen, ein Fortschritts-Batch pro Turn. Dadurch bleibt der Kontext klein und pi's normale Compaction funktioniert über Tage hinweg.
133
+ - **Endlos per Default**: Kein Iterationslimit. `LOOP_DONE:` vom Modell stoppt den Loop *nicht* — stattdessen geht es mit Verbesserungsarbeit weiter (Features, Tests, Bugfixes, Refactoring, Docs).
134
+ - **Nie auf Menschen warten**: Fehlende Infos → Modell trifft eine dokumentierte Annahme (`ASSUMPTIONS.md`) und arbeitet weiter.
135
+ - **Objektive Wahrheit**: Mit `--check` entscheidet ein Shell-Kommando über Fortschritt und Completion — nicht die Selbsteinschätzung des Modells.
136
+ - **Persistenz**: Loop-Zustand liegt in der Session. Nach pi-Neustart/Reload läuft ein aktiver Loop nach 3 Sekunden automatisch weiter.
137
+
138
+ ---
139
+
140
+ ## 4. Befehlsreferenz
141
+
142
+ | Befehl | Beschreibung |
143
+ |--------|--------------|
144
+ | `/loop goal <Ziel> [Flags]` | Ziel + Konfiguration setzen, **ohne zu starten**. |
145
+ | `/loop goal` | Aktuelles Ziel und Konfiguration anzeigen. |
146
+ | `/loop prepare [--model M] [--file F]` | Spezifikation (`GOAL.md`) + Check-Script von einem (starken) Modell schreiben lassen. |
147
+ | `/loop run [--model M]` | Den Loop starten — optional mit anderem Modell als bei der Vorbereitung. |
148
+ | `/loop start <Ziel> [Flags]` | Abkürzung: Ziel setzen + sofort starten (ein Schritt). |
149
+ | `/loop <Ziel>` | Kurzform für `/loop start <Ziel>`. |
150
+ | `/loop resume [--max N] [--check "CMD"] [--model M] [--rescue-model M]` | Gestoppten/pausierten Loop fortsetzen, optional mit neuem Limit/Check/Modell. |
151
+ | `/loop status` | Vollständigen Zustand anzeigen. |
152
+ | `/loop stats` | Statistik aus dem Iterations-Log (`.pi-loop-log.jsonl`): Events, Interventionen, produktive Iterationen/h, Score-Verlauf. |
153
+ | `/loop stop` | Stoppen, Zustand bleibt erhalten. |
154
+ | `/loop end` | Beenden und Zustand löschen. |
155
+ | `/loop help` | Kurzhilfe. |
156
+
157
+ **Flags** (gültig bei `goal`, `start` und teils bei `prepare`/`run`/`resume`):
158
+
159
+ | Flag | Beschreibung |
160
+ |------|--------------|
161
+ | `--max N` | Iterationslimit (Default: ∞). |
162
+ | `--delay S` | Pause zwischen Iterationen in Sekunden. |
163
+ | `--check "CMD"` | Objektive Goal-Funktion (siehe [Abschnitt 6](#6-die-goal-funktion---check)). |
164
+ | `--check-timeout S` | Check-Timeout in Sekunden (Default 120). |
165
+ | `--file GOAL.md` | Name der Spezifikationsdatei (Default `GOAL.md`). |
166
+ | `--model M` | Modell für diese Phase: `provider/id` (z. B. `anthropic/claude-opus-4-6`) oder eindeutiger Teilname (z. B. `qwen3-coder`). |
167
+ | `--rescue-model M` | Stärkeres Modell, das nach 3 Stuck-Interventionen in Folge für **einen** Aufräum-Turn übernimmt (siehe [Abschnitt 7](#7-fehler--und-störfallverhalten)). |
168
+ | `--until-done` | Loop stoppt bei verifizierter Completion. |
169
+
170
+ **Syntax des Ziels:** Alles vor `Done when:` ist das Ziel, alles danach sind die Kriterien:
171
+
172
+ ```text
173
+ /loop start Implementiere Feature X. Done when: Tests grün und README aktualisiert.
174
+ ```
175
+
176
+ Ohne `Done when:` läuft der Loop im reinen Verbesserungsmodus („continuous improvement until the operator stops the loop“).
177
+
178
+ ### Modellwahl (`--model`)
179
+
180
+ Jede Phase kann ein eigenes Modell verwenden:
181
+
182
+ ```text
183
+ /loop goal Baue X … # kein LLM-Aufruf
184
+ /loop prepare --model anthropic/claude-opus-4-6 # Planung: starkes Modell
185
+ /loop run --model vllm-omega/qwen3-coder-30b # Ausführung: lokales Modell
186
+ ```
187
+
188
+ - Format: `provider/id` (exakt) oder ein eindeutiger Teilstring der Modell-ID (`--model qwen3-coder` findet `vllm-omega/qwen3-coder-30b`).
189
+ - Das bei `run` gewählte Modell wird als **Loop-Modell gespeichert**: Nach pi-Neustart/Reload stellt der Auto-Resume dieses Modell wieder her (mit Warnung, falls nicht verfügbar — dann läuft der Loop mit dem aktuellen Modell weiter).
190
+ - Unbekanntes Modell oder fehlender API-Key → klare Fehlermeldung, der Loop startet **nicht**.
191
+ - Ohne `--model` verwendet die jeweilige Phase einfach das aktuell aktive Modell.
192
+ - Mitten im Lauf wechseln: `/loop stop`, dann `/loop resume --model <anderes Modell>`.
193
+
194
+ ### Rescue-Modell (`--rescue-model`)
195
+
196
+ Für lange Läufe mit schwachen/lokalen Modellen dringend empfohlen:
197
+
198
+ ```text
199
+ /loop run --model vllm-omega/qwen3-coder-30b --rescue-model anthropic/claude-sonnet-4-5
200
+ ```
201
+
202
+ Bleibt das Loop-Modell 3× in Folge hängen, übernimmt das Rescue-Modell für genau **einen Turn**: Es inspiziert den Projektzustand, erledigt eine konkrete Sache, schreibt `PROGRESS.md` neu (nächste 3 eindeutige Schritte mit Dateipfaden), aktualisiert das `IMPROVEMENTS.md`-Backlog und hinterlässt eine `NEXT:`-Zeile. Danach läuft der Loop mit dem regulären Modell weiter — schwache Modelle folgen einem klaren fremden Plan deutlich besser, als selbst einen zu erstellen.
203
+
204
+ ### Die Vorbereitung (`/loop prepare`)
205
+
206
+ `/loop prepare` schickt einen einmaligen Auftrag an das Modell (kein Loop!):
207
+
208
+ 1. Projektzustand inspizieren (Dateien, README, Tests).
209
+ 2. `GOAL.md` schreiben: verfeinertes Ziel, Scope & Non-Goals, messbare Fertig-Kriterien, Meilenstein-Roadmap in kleinen Schritten, Qualitätsstandards (Tests, Docs, git-Commits), explizite Annahmen.
210
+ 3. Falls objektiv prüfbar: ein Check-Script (`check.sh`) erzeugen und in `GOAL.md` referenzieren.
211
+ 4. Abschluss mit `GOAL_READY: <Zusammenfassung>` — daran erkennt die Extension die fertige Vorbereitung und empfiehlt das exakte `--check`-Kommando.
212
+
213
+ Danach: **`GOAL.md` reviewen und bei Bedarf von Hand editieren** — erst `/loop run` startet den Loop. Der Loop-Prompt verweist ab dann in jeder Iteration auf die Spezifikation; die erste Iteration beginnt explizit mit dem Lesen von `GOAL.md`.
214
+
215
+ ---
216
+
217
+ ## 5. Optionen im Detail
218
+
219
+ ### `--max N` — Iterationslimit
220
+
221
+ Default: **unbegrenzt** (∞). Mit `--max 50` pausiert der Loop nach 50 Iterationen. `/loop resume` setzt fort — ist das Limit ausgeschöpft, wird automatisch auf unbegrenzt umgestellt (mit Hinweis).
222
+
223
+ Sinnvoll für: erste Testläufe mit einem neuen Modell, Kostenkontrolle bei kommerziellen APIs.
224
+
225
+ ### `--delay S` — Pause zwischen Iterationen
226
+
227
+ Default: **0 s**. Mit `--delay 30` wartet der Loop 30 Sekunden zwischen den Iterationen.
228
+
229
+ Sinnvoll für: Rate-Limits bei kommerziellen APIs, Schonung lokaler GPU-Ressourcen, wenn parallel andere Jobs laufen.
230
+
231
+ ### `--until-done` — Klassischer „bis fertig"-Modus
232
+
233
+ Default: **aus** (Endlos-Modus). Mit `--until-done` stoppt der Loop bei Completion:
234
+
235
+ - **Mit `--check`**: Der Loop stoppt, sobald das Check-Kommando Exit-Code 0 liefert — *verifizierte* Completion, unabhängig davon, was das Modell behauptet.
236
+ - **Ohne `--check`**: Der Loop stoppt, wenn das Modell `LOOP_DONE:` meldet (Selbstauskunft — bei schwachen Modellen unzuverlässig, daher `--check` empfohlen).
237
+
238
+ ### `--check "CMD"` / `--check-timeout S`
239
+
240
+ Siehe nächster Abschnitt.
241
+
242
+ ---
243
+
244
+ ## 6. Die Goal-Funktion (`--check`)
245
+
246
+ Die Goal-Funktion ist ein Shell-Kommando (ausgeführt via `bash -lc`), das **nach jeder Iteration** läuft. Sie ist die objektive Fitness-Funktion des Loops.
247
+
248
+ ### Vertrag
249
+
250
+ | Signal | Bedeutung |
251
+ |--------|-----------|
252
+ | **Exit-Code 0** | Fertig-Kriterien erfüllt. Bei `--until-done`: Loop stoppt (verifizierte Completion). |
253
+ | **Exit-Code ≠ 0** | Kriterien noch nicht erfüllt. Loop läuft weiter. |
254
+ | **`SCORE: <Zahl>`** im Output (optional) | Numerischer Fortschritts-Score, höher = besser. Auch negativ/dezimal erlaubt. Bei mehreren Vorkommen zählt das letzte. |
255
+
256
+ ### Was der Check dem Loop gibt
257
+
258
+ 1. **Verifizierte Completion** — Bei `--until-done` entscheidet der Exit-Code, nicht die Behauptung des Modells. Meldet das Modell `LOOP_DONE:`, während der Check fehlschlägt, wird die Behauptung zurückgewiesen: *„Completion is decided by the check, not by your claim. Fix exactly what the check reports"* — inklusive Check-Output im Prompt.
259
+ 2. **Regressions-Erkennung** — Fällt der Score gegenüber dem letzten Lauf, bekommt das Modell sofort einen Regression-Prompt: aktuelle Änderungen prüfen (`git diff`/`git log`), Regression fixen, bevor irgendetwas anderes passiert. Kritisch bei Mehrtagesläufen, wo ein Refactoring still Tests bricht.
260
+ 3. **Echter Fortschrittsnachweis** — Ein neuer Best-Score zählt als messbarer Fortschritt und füttert den No-Progress-Audit (siehe [Abschnitt 7](#7-fehler--und-störfallverhalten)).
261
+ 4. **Objektives Feedback** — Jeder Loop-Prompt enthält den aktuellen Check-Status:
262
+
263
+ ```text
264
+ Goal check: `./check.sh` → FAILING (streak 3) · score 34 (best 41 @ iteration 87)
265
+ ```
266
+
267
+ Das Modell optimiert damit gegen eine messbare Größe statt gegen die eigene Selbsteinschätzung.
268
+
269
+ ### Beispiel-Check-Scripts
270
+
271
+ **Einfach — Tests müssen durchlaufen:**
272
+
273
+ ```bash
274
+ /loop start Fixe alle Bugs in ./app. Done when: Testsuite grün --check "cd app && npm test" --until-done
275
+ ```
276
+
277
+ **Mit Score — Anzahl grüner Tests:**
278
+
279
+ ```bash
280
+ #!/usr/bin/env bash
281
+ # check.sh — Fitness-Funktion für einen API-Bau-Lauf
282
+ cd taskapi || { echo "SCORE: 0"; exit 1; }
283
+
284
+ # Build muss funktionieren, sonst Score 0
285
+ npm run build >/dev/null 2>&1 || { echo "SCORE: 0"; exit 1; }
286
+
287
+ # Score = Anzahl bestandener Tests
288
+ passed=$(npm test 2>/dev/null | grep -oE '[0-9]+ passing' | grep -oE '[0-9]+' || echo 0)
289
+ echo "SCORE: $passed"
290
+
291
+ # Fertig ab 50 bestandenen Tests
292
+ [ "$passed" -ge 50 ] && exit 0 || exit 1
293
+ ```
294
+
295
+ **Mehrdimensionaler Score — Tests + Coverage − Lint-Warnungen:**
296
+
297
+ ```bash
298
+ #!/usr/bin/env bash
299
+ cd myproject || { echo "SCORE: -1000"; exit 1; }
300
+ go build ./... >/dev/null 2>&1 || { echo "SCORE: -1000"; exit 1; }
301
+
302
+ tests=$(go test ./... 2>/dev/null | grep -c '^ok' || echo 0)
303
+ coverage=$(go test -cover ./... 2>/dev/null | grep -oE '[0-9]+\.[0-9]+%' | tr -d '%' | awk '{s+=$1; n++} END {print (n ? int(s/n) : 0)}')
304
+ lint=$(golangci-lint run 2>/dev/null | wc -l | tr -d ' ')
305
+
306
+ score=$(( tests * 10 + coverage - lint ))
307
+ echo "SCORE: $score"
308
+
309
+ # Fertig: alle Pakete ok, Coverage ≥ 80 %, keine Lint-Warnungen
310
+ [ "$coverage" -ge 80 ] && [ "$lint" -eq 0 ] && go test ./... >/dev/null 2>&1 && exit 0
311
+ exit 1
312
+ ```
313
+
314
+ **Webprojekt — Endpunkte + E2E:**
315
+
316
+ ```bash
317
+ #!/usr/bin/env bash
318
+ cd webapp || exit 1
319
+ npm run build >/dev/null 2>&1 || { echo "SCORE: 0"; exit 1; }
320
+ unit=$(npx vitest run --reporter=json 2>/dev/null | jq '.numPassedTests' 2>/dev/null || echo 0)
321
+ e2e=$(npx playwright test --reporter=json 2>/dev/null | jq '.stats.expected' 2>/dev/null || echo 0)
322
+ echo "SCORE: $(( unit + e2e * 5 ))" # E2E-Tests höher gewichten
323
+ [ "$e2e" -ge 10 ] && exit 0 || exit 1
324
+ ```
325
+
326
+ ### Score-Ideen
327
+
328
+ - Anzahl bestandener Tests / E2E-Tests
329
+ - Test-Coverage in Prozent
330
+ - Anzahl implementierter API-Endpunkte (z. B. via `grep -c 'app\.\(get\|post\|put\|delete\)'`)
331
+ - Negierte Fehleranzahl: `SCORE: -$(eslint . 2>/dev/null | wc -l)`
332
+ - Feature-Checkliste: `SCORE: $(grep -c '^\- \[x\]' FEATURES.md)`
333
+ - Kombinationen mit Gewichtung (siehe oben)
334
+
335
+ ### Regeln für gute Check-Scripts
336
+
337
+ - **Schnell halten** (< 2 min; sonst `--check-timeout` erhöhen). Der Check läuft nach *jeder* Iteration.
338
+ - **Deterministisch**: keine flaky Tests im Check — jeder Score-Sprung nach unten löst einen Regression-Prompt aus.
339
+ - **Robust**: das Script selbst darf nie hängen; nutze eigene Timeouts für Teilschritte (`timeout 60 npm test`).
340
+ - **Monoton sinnvoll**: der Score soll steigen, wenn das Produkt besser wird. Nicht: „Anzahl Dateien" (lädt zu Müllproduktion ein).
341
+ - Schlägt das Check-Kommando selbst fehl (z. B. nicht gefunden), zeigt der Loop eine Warnung und läuft **ohne Blockade** weiter.
342
+
343
+ ---
344
+
345
+ ## 7. Fehler- und Störfallverhalten
346
+
347
+ Der Loop ist darauf ausgelegt, tagelang ohne Aufsicht zu laufen. Übersicht aller Situationen:
348
+
349
+ | Situation | Verhalten |
350
+ |-----------|-----------|
351
+ | **Model-/Provider-Fehler** (Crash, Rate-Limit, Timeout, leere Antwort, `stopReason: "error"`) | Automatischer Retry mit exponentiellem Backoff: 5 s → 10 s → 20 s → … → max. 5 min. Danach „recover"-Prompt: kurz orientieren, weitermachen — nicht von vorn anfangen. **Gibt nie auf.** |
352
+ | **Modell wiederholt dieselbe Antwort** (Fingerprint-Vergleich, 2× identisch) | Stuck-Intervention: rotierende Recovery-Strategie wird injiziert (siehe unten), mit eskalierendem Delay 2 s → 4 s → … → 60 s. **Pausiert nie.** |
353
+ | **Modell wiederholt fast dieselbe Antwort** (≥ 80 % Ähnlichkeit auf Wort-Trigrammen, Zahlen maskiert — fängt Umformulierungen wie „Already exists. Let me continue with improvements…" ab) | Ebenfalls Stuck-Intervention. |
354
+ | **Dieselbe Antwort 3×+ im jüngeren Verlauf** (auch alternierend A-B-A-B) | Ebenfalls Stuck-Intervention. |
355
+ | **3 Turns ohne einen einzigen Tool-Aufruf** (reines Erzählen statt Arbeiten) | Ebenfalls Stuck-Intervention. |
356
+ | **Degenerierte Generierung** (derselbe Satz ≥ 4× in *einer* Antwort, z. B. „Let me continue with improvements…" × 40) | Antwort wird gekürzt gespeichert (Kontext-Hygiene) + Stuck-Intervention. Bei ≥ 6 Wiederholungen **noch während des Streamens**: Turn wird sofort abgebrochen statt den Kontext vollzumüllen. |
357
+ | **Dasselbe Tool-Ergebnis/-Fehler 3× hintereinander** | Ebenfalls Stuck-Intervention. |
358
+ | **Dieselbe Frage 2× wiederholt** | Ebenfalls Stuck-Intervention. |
359
+ | **3 Stuck-Interventionen hintereinander** | Hard-Reset-Eskalation: die letzten Antwort-Anfänge werden als verbotene Formulierungen injiziert; die erste Aktion des Turns **muss** ein Tool-Aufruf sein (kein Text davor). Falls `--rescue-model` gesetzt: stattdessen Rescue-Turn (siehe unten). |
360
+ | **5 Stuck-Interventionen hintereinander** | Auto-Compaction: der Kontext wird komprimiert (repetitive Füllsätze werden explizit aus der Zusammenfassung ausgeschlossen), damit das Wiederholungsmuster aus dem Kontextfenster verschwindet. |
361
+ | **8 Iterationen ohne konkrete Änderung** (keine Datei-Writes/Edits, kein Score-Anstieg) | Audit-Prompt: „Hör auf zu analysieren, produziere jetzt ein greifbares Artefakt: Dateiänderung, grüner Test, gefixter Bug oder Commit." |
362
+ | **Modell meldet `LOOP_DONE:`** (Endlos-Modus) | Loop läuft weiter mit „improve"-Prompt: wertvollste nächste Verbesserung wählen und umsetzen. |
363
+ | **Modell meldet `LOOP_DONE:`, Check schlägt fehl** (`--until-done`) | Behauptung wird zurückgewiesen; „check_failed"-Prompt mit Check-Output. |
364
+ | **Check-Score fällt** | Sofortiger „regression"-Prompt: Diffs prüfen, Regression fixen. |
365
+ | **Check besteht** (`--until-done`) | Verifizierte Completion — Loop stoppt. |
366
+ | **Modell meldet `LOOP_BLOCKED:`** | Loop pausiert **nicht**. „unblock"-Prompt: sinnvollste Annahme treffen, in `ASSUMPTIONS.md` dokumentieren, weiterarbeiten. |
367
+ | **Operator drückt Esc** (Turn abgebrochen) | Loop pausiert bewusst (Operator-Wille). `/loop resume` setzt fort. |
368
+ | **pi-Neustart / `/reload`** | Aktiver Loop resumed automatisch nach 3 s (mit Hinweis und Abbruchmöglichkeit via `/loop stop`). |
369
+ | **`--max N` erreicht** | Loop pausiert. `/loop resume` setzt fort (entfernt das Limit, wenn ausgeschöpft). |
370
+
371
+ ### Die rotierenden Stuck-Strategien
372
+
373
+ Bei erkannter Wiederholung wird reihum eine dieser Strategien injiziert:
374
+
375
+ 1. Drei wirklich unterschiedliche Ansätze in je einer Zeile auflisten, den vielversprechendsten sofort ausführen.
376
+ 2. Zu einem anderen Teilbereich des Ziels wechseln, der zuletzt nicht angefasst wurde.
377
+ 3. `PROGRESS.md` schreiben/aktualisieren: aktueller Stand, was versucht wurde, was scheiterte, nächste 3 Schritte — dann Schritt 1 ausführen.
378
+ 4. Build/Testsuite laufen lassen, genau **einen** Fehler oder eine Warnung fixen.
379
+ 5. Letzte Änderungen reviewen (`git diff` / `git log`), Korrektheit prüfen, gefundene Probleme fixen.
380
+
381
+ Diese Rotation verhindert, dass die Intervention selbst zur Schleife wird — wichtig bei schwächeren Open-Source-Modellen.
382
+
383
+ Zusätzliche Schutzmechanismen gegen Endlos-Geschwafel schwächerer Modelle:
384
+
385
+ - **Near-Duplicate-Erkennung**: Antworten werden nicht nur exakt (Hash), sondern per Trigramm-Ähnlichkeit verglichen (Zahlen maskiert). Leicht umformulierte Wiederholungen („Already exists. Let me continue with improvements…") werden so trotzdem erkannt.
386
+ - **Tool-Pflicht**: Jeder Loop-Prompt fordert mindestens einen Tool-Aufruf pro Turn. Drei Turns ohne Tool-Nutzung lösen eine Stuck-Intervention aus.
387
+ - **Hard-Reset-Eskalation**: Ab der 3. Stuck-Intervention in Folge werden die letzten Antwortanfänge als verbotene Phrasen mitgegeben und der Turn muss mit einem Tool-Aufruf beginnen.
388
+ - **Degenerations-Kill-Switch**: Wiederholt das Modell denselben Satz vielfach innerhalb einer Antwort, wird der Stream live abgebrochen (ab 6 Wiederholungen), die Antwort in der Session nach der ersten Wiederholung abgeschnitten und vor jedem LLM-Call zusätzlich der Kontext bereinigt — der Müll kann sich also nicht selbst verstärken (repetitive Muster im Kontext erhöhen sonst die Wahrscheinlichkeit weiterer Wiederholung massiv).
389
+ - **Sampling-Penalties**: Nach jeder Stuck-Intervention werden für 3 Iterationen `frequency_penalty`/`presence_penalty` (0.5) gesetzt und die Temperature leicht erhöht — nur bei OpenAI-kompatiblen APIs (vLLM, Ollama). Das bekämpft Wiederholung auf Sampling-Ebene, wo Prompts allein oft nicht reichen.
390
+ - **Rescue-Modell** (`--rescue-model M`): Ab 3 Stuck-Interventionen in Folge übernimmt ein stärkeres Modell für einen Turn, räumt auf und hinterlässt einen klaren Plan (`PROGRESS.md`, `IMPROVEMENTS.md`, `NEXT:`-Zeile).
391
+ - **Auto-Compaction**: Ab 5 Stuck-Interventionen in Folge wird der Kontext komprimiert — ein frisches Kontextfenster bricht Fixpunkte oft besser als jede Prompt-Intervention.
392
+ - **Prompt-Variation**: Der „continue"-Prompt wird leicht variiert formuliert — identische Prompts begünstigen identische (repetitive) Antworten.
393
+ - **Backlog-getriebener Improve-Modus**: Nach `LOOP_DONE` im Endlos-Modus arbeitet der Loop über ein `IMPROVEMENTS.md`-Backlog: konkrete Items mit Dateipfaden und Akzeptanzkriterium; vage Items („add support for other platforms") sind verboten. Oberstes Item umsetzen, abhaken.
394
+
395
+ ### Iterations-Log und `/loop stats`
396
+
397
+ Jedes Loop-Ereignis (continue, stuck, rescue, compact, error, done, …) wird als JSONL-Zeile in `.pi-loop-log.jsonl` im Arbeitsverzeichnis protokolliert (Timestamp, Iteration, Event, Modell, Score, Stuck-Streak). `/loop stats` fasst zusammen: Event-Verteilung, Interventionen, produktive Iterationen pro Stunde, Score-Verlauf (erster/bester/letzter). Damit lässt sich vergleichen, welches Modell bzw. welche Goal-Formulierung stabil läuft.
398
+
399
+ ---
400
+
401
+ ## 8. Praxisbeispiele
402
+
403
+ ### Beispiel 1: 5-Tage-Produktlauf mit Modell-Trennung (dein Kern-Use-Case)
404
+
405
+ ```text
406
+ # Phase 1: Ziel definieren (startet nichts)
407
+ /loop goal Baue in ./taskapi eine produktionsreife Task-Management-REST-API (Node.js/Express, SQLite): CRUD für Tasks/Projekte/Tags, JWT-Auth, Validierung, OpenAPI-Doku, umfassende Tests. Arbeite in git, committe jede abgeschlossene Einheit. Verbessere kontinuierlich: neue Features, mehr Tests, Bugfixes, Refactoring, Performance. --check "cd taskapi && ./check.sh" --delay 10
408
+
409
+ # Phase 2: Starkes Modell schreibt GOAL.md + check.sh (~1 Turn, dann GOAL_READY)
410
+ /loop prepare --model anthropic/claude-opus-4-6
411
+
412
+ # → GOAL.md reviewen, ggf. anpassen …
413
+
414
+ # Phase 3: Lokales/günstiges Modell arbeitet tagelang
415
+ /loop run --model vllm-omega/qwen3-coder-30b
416
+ ```
417
+
418
+ mit `taskapi/check.sh`:
419
+
420
+ ```bash
421
+ #!/usr/bin/env bash
422
+ cd "$(dirname "$0")" || exit 1
423
+ npm run build >/dev/null 2>&1 || { echo "SCORE: 0"; exit 1; }
424
+ passed=$(timeout 90 npm test 2>/dev/null | grep -oE '[0-9]+ passing' | grep -oE '[0-9]+' || echo 0)
425
+ endpoints=$(grep -rcE 'router\.(get|post|put|delete)' src/routes/ 2>/dev/null | awk -F: '{s+=$2} END {print s+0}')
426
+ echo "SCORE: $(( passed * 2 + endpoints ))"
427
+ exit 1 # Endlos-Modus: nie "fertig", immer weiter verbessern
428
+ ```
429
+
430
+ Der Loop läuft endlos, der Score wächst mit Tests und Endpunkten, Regressionen werden sofort erkannt. Das Qwen-Modell folgt der von Opus geschriebenen Spezifikation. Nach 5 Tagen: `/loop stop`.
431
+
432
+ **Modell mitten im Lauf wechseln** (z. B. weil das lokale Modell an einem Meilenstein scheitert):
433
+
434
+ ```text
435
+ /loop stop
436
+ /loop resume --model anthropic/claude-sonnet-4-5
437
+ ```
438
+
439
+ ### Beispiel 2: Bug-Jagd bis alles grün ist
440
+
441
+ ```text
442
+ /loop start Fixe alle fehlschlagenden Tests in diesem Repo. Done when: gesamte Testsuite grün. --check "npm test" --until-done
443
+ ```
444
+
445
+ Stoppt automatisch und verifiziert, sobald `npm test` mit Exit 0 durchläuft — egal was das Modell zwischendurch behauptet.
446
+
447
+ ### Beispiel 3: Test-Coverage hochtreiben
448
+
449
+ ```text
450
+ /loop start Erhöhe die Testabdeckung von ./src auf mindestens 90 %. Schreibe sinnvolle Tests, keine Mocks von allem. --check "./coverage-check.sh" --until-done --check-timeout 300
451
+ ```
452
+
453
+ ```bash
454
+ #!/usr/bin/env bash
455
+ # coverage-check.sh
456
+ cov=$(npx vitest run --coverage 2>/dev/null | grep -oE 'All files[^0-9]+[0-9]+\.[0-9]+' | grep -oE '[0-9]+\.[0-9]+' | head -1)
457
+ cov=${cov%%.*}
458
+ echo "SCORE: ${cov:-0}"
459
+ [ "${cov:-0}" -ge 90 ] && exit 0 || exit 1
460
+ ```
461
+
462
+ ### Beispiel 4: Vorsichtiger Erstlauf mit einem neuen Open-Source-Modell
463
+
464
+ ```text
465
+ /loop start Refactoriere ./legacy nach TypeScript, Modul für Modul. Committe nach jedem Modul. --max 20 --delay 15 --check "cd legacy && npx tsc --noEmit && npm test"
466
+ ```
467
+
468
+ `--max 20` begrenzt den Testlauf. Danach Ergebnis prüfen und mit `/loop resume --max 100` (oder ohne Limit) weiterlaufen lassen.
469
+
470
+ ### Beispiel 5: Doku-Pflege über Nacht
471
+
472
+ ```text
473
+ /loop start Vervollständige die Dokumentation in ./docs: jede öffentliche Funktion dokumentiert, Beispiele für alle Module, README auf aktuellem Stand. Verbessere kontinuierlich Klarheit und Vollständigkeit.
474
+ ```
475
+
476
+ Ohne `--check` (Doku-Qualität ist schwer messbar) — der No-Progress-Audit sorgt trotzdem dafür, dass tatsächlich Dateien geändert werden.
477
+
478
+ ### Beispiel 6: Lint-Schulden abbauen (negativer Score)
479
+
480
+ ```text
481
+ /loop start Beseitige alle ESLint-Warnungen und -Fehler im Repo, ohne Funktionalität zu ändern. Done when: eslint meldet nichts mehr. --check "./lint-check.sh" --until-done
482
+ ```
483
+
484
+ ```bash
485
+ #!/usr/bin/env bash
486
+ count=$(npx eslint . 2>/dev/null | grep -cE 'warning|error')
487
+ echo "SCORE: $(( -count ))"
488
+ [ "$count" -eq 0 ] && exit 0 || exit 1
489
+ ```
490
+
491
+ Score startet z. B. bei −347 und arbeitet sich Richtung 0. Jede neue Warnung (Regression) fällt sofort auf.
492
+
493
+ ---
494
+
495
+ ## 9. Best Practices für Mehrtagesläufe
496
+
497
+ 1. **In einem git-Repository arbeiten** und das im Ziel explizit fordern („committe jede abgeschlossene Einheit"). Commits überleben Compaction, Neustarts und Kontextverlust — und Regressionen lassen sich per `git diff` finden.
498
+ 2. **Immer `--check` verwenden**, wenn irgendetwas messbar ist. Die Goal-Funktion ist der stärkste Hebel gegen Modell-Halluzinationen.
499
+ 3. **`PROGRESS.md` einfordern** — steht auch in den Skill-Regeln. Nach Compaction oder Neustart orientiert sich das Modell daran.
500
+ 4. **`--delay` bei kommerziellen APIs** setzen (z. B. 10–30 s), um Rate-Limits und Kosten zu steuern; bei lokalen Modellen meist 0.
501
+ 5. **Erstlauf mit `--max 15–25`** bei einem unbekannten Modell: Verhalten prüfen, dann `/loop resume` ohne Limit.
502
+ 6. **Ziel konkret formulieren**: Technologie, Verzeichnis, Qualitätsansprüche, Verbesserungsrichtungen. „Baue etwas Cooles" produziert Drift; das Beispiel 1 oben ist das richtige Detailniveau.
503
+ 7. **Sandbox beachten**: Der Loop arbeitet unbeaufsichtigt mit vollen Tool-Rechten. Für lange Läufe ein dediziertes Verzeichnis/Repo verwenden, idealerweise VM/Container, keine Produktionssysteme im Zugriff.
504
+ 8. **Check-Script versionieren** (ins Repo committen) — dann kann das Modell es lesen und versteht, woran es gemessen wird. Aber im Ziel klarstellen, dass das Check-Script nicht manipuliert werden darf.
505
+
506
+ ---
507
+
508
+ ## 10. Statusanzeige und Monitoring
509
+
510
+ **Statusbar** (Footer, live):
511
+
512
+ ```text
513
+ Loop 142/∞ · 1d 7h 23m · err 3 · score 87: Baue in ./taskapi eine produktionsreife…
514
+ ```
515
+
516
+ - `142/∞` — Iterationen / Limit
517
+ - `1d 7h 23m` — Laufzeit
518
+ - `err 3` — Model-/Provider-Fehler gesamt (alle automatisch überstanden)
519
+ - `score 87` — letzter Check-Score (oder `check ✓`/`check ✗` ohne Score)
520
+
521
+ **`/loop status`** zeigt den vollen Zustand:
522
+
523
+ ```text
524
+ Active: true
525
+ Status: running
526
+ Goal: Baue in ./taskapi eine produktionsreife Task-Management-REST-API …
527
+ Criteria: - (endless improvement)
528
+ Mode: endless
529
+ Iterations: 142/∞
530
+ Delay: 10s
531
+ Check: cd taskapi && ./check.sh (timeout 120s)
532
+ Check status: failing (streak 2), score 87 (best 91 @ iter 138)
533
+ Goal file: GOAL.md (prepared)
534
+ Loop model: vllm-omega/qwen3-coder-30b
535
+ Rescue model: anthropic/claude-sonnet-4-5
536
+ Elapsed: 1d 7h 23m
537
+ Errors: 3 total, 0 consecutive
538
+ Interventions: 7 (stuck streak: 0)
539
+ Done signals: 2, blocked signals: 1
540
+ Last notice: -
541
+ Session entries: 4211
542
+ ```
543
+
544
+ Interessante Felder:
545
+ - **Interventions** — wie oft Stuck-/Audit-/Regression-Prompts nötig waren (hoher Wert → Modell kämpft; Ziel ggf. konkreter fassen oder stärkeres Modell wählen).
546
+ - **Done signals** — wie oft das Modell „fertig" gemeldet hat (im Endlos-Modus normal und harmlos).
547
+ - **Check status** — `streak` zählt aufeinanderfolgende Fehlschläge des Checks; `best @ iter` zeigt, wann der Bestwert erreicht wurde.
548
+
549
+ **`/loop stats`** wertet das Iterations-Log `.pi-loop-log.jsonl` aus (aktueller Lauf, sonst alle Läufe):
550
+
551
+ ```text
552
+ Loop stats (current run, 214 entries, .pi-loop-log.jsonl):
553
+ Events: continue 187, stuck 14, done 6, rescue_start 3, compact 1, error 3
554
+ Interventions: 18 (rescue 3, compact 1)
555
+ Productive iterations/h: 11.2
556
+ Score: first 12, best 91, last 87
557
+ ```
558
+
559
+ Damit vergleichst du, welches Modell bzw. welche Goal-Formulierung stabil läuft (wenig Interventionen, hohe produktive Rate, steigender Score). Die Datei liegt im Arbeitsverzeichnis — ggf. in `.gitignore` aufnehmen.
560
+
561
+ ---
562
+
563
+ ## 11. Interna & Tuning-Konstanten
564
+
565
+ Konstanten am Anfang von `extensions/index.ts`:
566
+
567
+ | Konstante | Wert | Bedeutung |
568
+ |-----------|------|-----------|
569
+ | `BASE_BACKOFF_SECONDS` | 5 | Start-Backoff nach Model-Fehler. |
570
+ | `MAX_BACKOFF_SECONDS` | 300 | Backoff-Obergrenze (5 min). |
571
+ | `NO_PROGRESS_WINDOW` | 8 | Iterationen ohne konkrete Änderung bis zum Audit-Prompt. |
572
+ | `AUTO_RESUME_DELAY_MS` | 3000 | Wartezeit vor Auto-Resume nach Neustart. |
573
+ | `MAX_STORED_TEXT` | 280 | Snippet-Länge für persistierte Fingerprints. |
574
+ | `SIMILARITY_THRESHOLD` | 0.8 | Jaccard-Schwelle für Near-Duplicate-Antworten. |
575
+ | `REPEAT_WINDOW_COUNT` | 3 | Gleicher Fingerprint N× im jüngeren Verlauf = stuck. |
576
+ | `MAX_TOOLLESS_TURNS` | 3 | Turns ohne Tool-Aufruf bis zur Stuck-Intervention. |
577
+ | `HARD_RESET_AFTER` | 3 | Stuck-Streak bis zur Hard-Reset-Eskalation. |
578
+ | `DEGENERATE_REPEATS` | 4 | Satz-Wiederholungen in einer Antwort = degeneriert. |
579
+ | `DEGENERATE_STREAM_REPEATS` | 6 | Wiederholungen, ab denen mid-stream abgebrochen wird. |
580
+ | `RESCUE_AFTER` | 3 | Stuck-Streak bis zum Rescue-Turn (falls `--rescue-model`). |
581
+ | `COMPACT_AFTER` | 5 | Stuck-Streak bis zur Auto-Compaction. |
582
+ | `PENALTY_TURNS` | 3 | Iterationen mit Sampling-Penalties nach einer Intervention. |
583
+ | `LOG_FILE` | `.pi-loop-log.jsonl` | Iterations-Log für `/loop stats`. |
584
+
585
+ **Wie die Erkennung funktioniert:**
586
+
587
+ - *Wiederholungserkennung*: SHA-256-Fingerprint über normalisierten Antworttext (Whitespace/ANSI entfernt, lowercase, erste 4.000 Zeichen). Verglichen werden die letzten 5 Assistant-Antworten und die letzten 10 Tool-Ergebnisse. Fehler-Turns (`stopReason: error/aborted`) fließen nicht in die Fingerprints ein.
588
+ - *Fortschrittserkennung*: `write`/`edit`-Toolaufrufe, Erfolgs-Keywords in Tool-Outputs (`created`, `passed`, `committed`, …) oder ein neuer Check-Bestscore.
589
+ - *Persistenz*: Zustand wird als Custom-Session-Entry (`loop-state`) via `pi.appendEntry()` gespeichert — landet **nicht** im LLM-Kontext.
590
+ - *Goal-Check*: läuft via `pi.exec("bash", ["-lc", CMD])` mit Timeout; `SCORE:`-Parsing per Regex (letztes Vorkommen zählt, auch negative/dezimale Werte).
591
+ - *Kontexthygiene*: Der Loop injiziert pro Iteration nur einen kompakten Prompt (Ziel + Regeln + Check-Status) und erlaubt pi's normale Compaction — die Session wird nie komplett re-injiziert.
592
+
593
+ ---
594
+
595
+ ## 12. FAQ
596
+
597
+ **Warum stoppt der Loop nicht, wenn das Modell „fertig" sagt?**
598
+ Weil das dein Anwendungsfall ist: ein Produkt, das über Tage kontinuierlich wächst. `LOOP_DONE:` führt im Endlos-Modus zum „improve"-Prompt (nächstes Feature, mehr Tests, Bugfix, …). Willst du klassisches „bis fertig", nutze `--until-done` — idealerweise mit `--check`.
599
+
600
+ **Das Modell behauptet, Tests seien grün, aber sie sind es nicht.**
601
+ Genau dafür gibt es `--check`. Der Loop glaubt nur dem Exit-Code des Check-Kommandos, nie der Behauptung des Modells.
602
+
603
+ **Was passiert bei einem Rate-Limit mitten in der Nacht?**
604
+ Retry mit exponentiellem Backoff bis max. 5 min zwischen Versuchen, unbegrenzt oft. Am Morgen zeigt `err N` in der Statusbar, wie oft es geklemmt hat.
605
+
606
+ **Kann ich Planung und Ausführung mit verschiedenen Modellen machen?**
607
+ Ja — das ist der empfohlene Workflow: `/loop goal <Ziel>` (setzt nur das Ziel), `/loop prepare --model <starkes Modell>` (schreibt `GOAL.md` + Check-Script), `/loop run --model <günstiges Modell>` (arbeitet die Spezifikation ab). Das Loop-Modell wird gespeichert und beim Auto-Resume nach Neustart wiederhergestellt.
608
+
609
+ **Was passiert mit GOAL.md nach der Vorbereitung?**
610
+ Sie liegt als normale Datei im Projekt — du kannst sie vor `/loop run` reviewen und editieren. Der Loop verweist in jedem Prompt darauf; das Arbeitsmodell liest sie in der ersten Iteration und immer dann, wenn es den Faden verliert.
611
+
612
+ **Kann ich während des Loops eingreifen?**
613
+ Ja. Eine normale Nachricht wird als Steering in den Loop eingespeist. `Esc` pausiert den Loop (bewusst — Operator-Wille), `/loop resume` setzt fort.
614
+
615
+ **Frisst der Loop nicht irgendwann den ganzen Kontext?**
616
+ Nein. Antworten sind auf 1.200 Zeichen begrenzt, Loop-Prompts sind kompakt, und pi's automatische Compaction bleibt aktiv. Für die Langzeit-Orientierung sorgen `PROGRESS.md` und git-Historie im Projekt, nicht der Chat-Kontext.
617
+
618
+ **Was, wenn das Check-Script selbst kaputt ist?**
619
+ Warnung im UI, der Loop läuft ungestört weiter (der Check blockiert nie). `/loop resume --check "korrigiertes CMD"` setzt ein neues Check-Kommando.
620
+
621
+ **Funktioniert das mit lokalen Modellen (Ollama/vLLM)?**
622
+ Ja — der Loop ist modellunabhängig und gerade für schwächere Modelle gehärtet (Wiederholungs- und Degenerations­erkennung, Sampling-Penalties, Rescue-Modell, Auto-Compaction, Fertig-Verifikation per Check, Fehler-Retry). Empfehlung für kleine Modelle: konkreteres Ziel, `--check` immer, `--rescue-model <starkes Modell>` setzen, ggf. `--max` für den Erstlauf.
623
+
624
+ **Das Modell wiederholt ständig denselben Satz („Let me continue with improvements…") — was tun?**
625
+ Nichts — genau dafür gibt es mehrere Verteidigungslinien: Near-Duplicate-Erkennung fängt umformulierte Wiederholungen, der Degenerations-Kill-Switch bricht Satz-Schleifen mid-stream ab und schneidet sie aus dem Kontext, Sampling-Penalties bekämpfen die Wiederholung auf Modell-Ebene, und bei hartnäckigem Feststecken übernimmt das Rescue-Modell bzw. eine Auto-Compaction bricht den Fixpunkt. Wenn es trotzdem häufig passiert: `/loop stats` prüfen — viele `stuck`/`compact`-Events deuten auf ein zu schwaches Modell oder ein zu vages Ziel.
626
+
627
+ **Wie stoppe ich alles und fange neu an?**
628
+ `/loop end` löscht den Zustand vollständig. `/loop start <neues Ziel>` ersetzt den Loop ebenfalls komplett.