Was macht Away Run (Abwesenheitslauf)?
Der Operator verlässt den Arbeitsplatz; eine Warteschlange wird abgearbeitet. Jeder Eintrag läuft in einem frischen kopflosen Prozess, sodass ein Nutzungslimit oder ein Absturz eine Iteration kostet, nicht die ganze Nacht. Der Zustand wird auf der Platte im Run-Ordner gespeichert; das Beenden des Prozesses ersetzt /clear. Markiere Fakten für claude -p im Skill headless-claude.
Repo-Konfiguration und Profil. <repo>/.claude/project-workflow.json ist optional; dieses Skill liest seine Schlüssel projects_dir (Standard my-projects), profile (Standard <projects_dir>/WORKFLOW.md), backlog_file (Standard <projects_dir>/backlog.md) und bootstrap (eine argv-Liste oder null). Lies den Abschnitt § Away Run des Profils, wenn die Datei existiert: Testbefehle, Erkennungsquellen, automatisch erlaubte Klassen. Wo sich Profil und dieses Skill unterscheiden, gewinnt das Profil.
Phasen — lade eine Datei, beim Eintreten der Phase
| Phase | Wer | Liest |
|---|---|---|
| Arm (Ausrüsten) | Operator anwesend | § Arm unten, dann discover.md zum Aufbau der Warteschlange |
| Iteration | away-orchestrator, einer pro Prozess | iteration.md |
| Status, Disarm (Entschärfen) | Operator | § Status, § Disarm unten |
project-workflow und away-run teilen sich Dateien (die Backlog-Datei, <projects_dir>/proposals/open/), keine Aufrufe, mit einer Ausnahme: eine project-Zeile ruft /project-workflow über das Skill-Tool im unbeaufsichtigten Modus auf.
Eine Projektwelle umfasst mehrere project-Zeilen, eine wave.md § Session shape Schrittgruppe pro Zeile (1; 2-3; 4-7). Jede Zeile arbeitet von den Schrittnamen ## Resume bis zum Ende ihrer Gruppe, committet chore(<NNNN>): checkpoint wave N at step <n> und hängt die Folgeseile für den nächsten Schritt an, es sei denn, die Grenze wurde erreicht. Eine Zeile hängt eine an, attempts 0, nur wenn sie mindestens einen Schritt abgeschlossen hat; eine Zeile, die keinen abgeschlossen hat, bleibt claimed und wiederholt es mit eigenem attempts. Dies terminiert: jede Folgeseile folgt mindestens einem der sieben Schritte der Welle, und die Versuchsobergrenze beendet einen Schritt, der nie abgeschlossen wird.
Der Checkpoint und ## Resume sind die einzige Übergabe (iteration.md § 3).
Layout
<repo>-worktrees/away-<date>/ Worktree, Branch away/<date> basierend auf main
<run folder>/ getrackt auf away/<date>; arm.ps1 -RunFolder,
queue.md decisions.md log.md Standard <projects_dir>/away/<date>/
morning-report.md geschrieben von der Abschlussiteration
<repo>-worktrees/away-<date>-run/ Scratch, ungetrackt: away.env, watchdog.sh,
entry-prompt.md, watchdog.log, iter-NNN.*, locks
Geplanter Task away-<repo>-<date> alle 15 Minuten bis zum harten Stopp
Warteschlangenzeilen
templates/queue.md enthält das Schema. Spalten: id | item | agent | status | claimed_by | lease_until | attempts | evidence. agent ist mechanical-worker, stream-worker, researcher, project oder discover. Jede Warteschlangenbearbeitung nimmt die Sperre: mkdir <scratch>/queue.lock (atomar; wenn es fehlschlägt, alle 10 s für 2 Minuten wiederholen; ein Sperrordner, der vor mehr als 10 Minuten geändert wurde, ist veraltet, mit oder ohne owner-Datei: entfernen), bearbeiten, rm -rf der Sperre. Was nach einem fehlgeschlagenen 2-minütigen Wiederholungsversuch passiert, steht in iteration.md § 2 und § 4. Eine Beanspruchung setzt claimed_by auf das Beanspruchungstag der Iteration (iter-NNN, genau wie vom Eingabe-Prompt gegeben) und lease_until; eine abgelaufene Leasing bedeutet eine tote Iteration und die Zeile ist wieder beanspruchbar, attempts + 1.
Arm (Ausrüsten) (Operator anwesend)
- Warteschlange. Baue sie mit
discover.md: nur Zeilen der Stufe 1, jede mit einer benannten Prüfung. Arbeiten der Stufe 2 werden zu Vorschlägen. Benenne den Standard für jede Entscheidung, die eine Zeile treffen kann; eine Zeile mit einer offenen Entscheidung ohne Standard wird nicht in die Warteschlange gestellt. - Haltung. Sage klar: Der Run verwendet
--permission-mode bypassPermissions, sodass jeder Tool-Aufruf unaufgefordert ausgeführt wird; globale Verweigerungsregeln gelten weiterhin. „Keine Tore“ (offene Fragen werden zu benannten Standards, Fehler überspringen und wiederholen) ist pro Run opt-in, gesetzt alsgates: noneim Warteschlangenkopf; niemals von einem früheren Run abgeleitet. - Arm (Ausrüsten). Zuerst trocken, dann für echt, von PowerShell aus:
powershell -NoProfile -File <skill>/arm.ps1 -Repo <path> -StopAt "<YYYY-MM-DD HH:MM>" -Queue <queue.md> -WhatIf. Es schneidet den Worktree aufaway/<date>vonmainab, befüllt den Run-Ordner austemplates/und committet ihn mit der Warteschlange, führt diebootstrapargv des Configs aus ({worktree}ersetzt durch den Worktree-Pfad, cwd der main Checkout; übersprungen, wenn der Schlüssel fehlt oder null ist) und wartet darauf, kopiertwatchdog.shundentry-prompt.mdin den Scratch-Ordner, schreibtaway.envund registriert den Task (Register-ScheduledTask, niemalsschtasks /Create: PowerShell 5.1 verstümmelt/TR-Zitierung). Ein Nicht-Null-Bootstrap-Exit lehnt ab, bevor ein Task existiert; der Worktree und Branch bleiben zur Inspektion. Der Task hat keinen Principal, läuft also nur, während der Operator angemeldet ist, in einem Konsolenfenster, dessen Schließen ihn beendet: Sperre den Bildschirm, melde dich nicht ab. - Überprüfen.
Get-ScheduledTask -TaskName 'away-*'zeigt den Task; die erste Ausführung schreibtwatchdog upinwatchdog.log. - Spätere Warteschlangenbearbeitungen. arm.ps1 committet die Warteschlange einmal. Committe jede nach dem Ausrüsten vorgenommene Warteschlangenbearbeitung auf
away/<date>selbst (unter der Warteschlangensperre, sobald der Task ausgeführt wurde): Iterationen behandeln uncommittete Arbeiten, die sie nicht selbst erstellt haben, als fremd und stagen sie nie.
Was der Watchdog tut (watchdog.sh)
- Startet
claude -p --agent away-orchestrator --max-turns N, Prompt auf stdin. Modell und Aufwand kommen aus dem Agent-Frontmatter; kein--effort, kein TTL-Flag, kein--disable-slash-commands(es würde Skill deaktivieren). - Bewertet eine Iteration anhand von
is_error/api_error_statusund ob sichqueue.mdgeändert hat, niemals anhand vonnum_turns. Drei Iterationen ohne Warteschlangenänderung beenden sie. - Nutzungslimit: schläft bis zum von der Nachricht genannten Reset. „Du hast dein Opus-Limit erreicht“ fährt auf Sonnet fort (
--model sonnet) nur fürmechanical-workerZeilen; wenn keine beanspruchbar ist, schläft es bis zum Reset. - Budgetüberschreitung (
subtypeerror_max_budget_usd, kindbudget): kein Schlaf, da die Obergrenze pro Prozess ist. Es behält die Beanspruchung der Zeile, sodass die nächste Iteration die nächste Zeile nimmt und diese zurückkommt, wenn ihr Leasing abläuft; Überschreitungen zählen wie Fehler zuFAIL_MAX. - Quotenreserve: bei
WINDOW_CAP_USDgeschätzten Ausgaben in einem rollierenden 5-Stunden-Fenster schläft es, bis das Fenster frei wird; die letztenRESERVE_MINMinuten gehen an den Abschluss. - Warteschlange leer: eine Abschlussiteration schreibt den Morgenbericht, dann beendet sie sich. Jedes andere Beenden hinterlässt einen vom Watchdog geschriebenen Berichtsstub. Jedes Beenden schreibt
STOP, sodass spätere Taskausführungen No-Ops sind; lösche es, um fortzufahren. - Nach jeder Elementiteration lässt es die unter dem Beanspruchungstag dieser Iteration gehaltenen Leasings verfallen, sodass eine durch ein Limit oder einen Fehler abgeschnittene Zeile wiederholt wird, nicht bis zum Abschluss gestrandet bleibt. Es überspringt dies nach dem Abschluss, der nichts beansprucht, und nach einer Budgetüberschreitung (oben).
- Protokolliert
claude: <pfad>bei jedem Iterationsstart: die Binärdatei, die es ausführen wird. - Weigert sich, auf
main, auf einem main-Checkout oder auf einem Branch zu laufen, der nichtaway/*ist. - Trockenlauf:
CLAUDE=<Stub-Skript> AWAY_NO_SLEEP=1 bash watchdog.sh <away.env>gegen einen Scratch-Worktree aufaway/*; Schlafphasen werden protokolliert, nicht ausgeführt. EinCLAUDEoderPY, das in der Umgebung gesetzt ist, gewinnt über das, dasaway.envnennt, sodass der Stub sogar mit einem durch Arm geschriebenenaway.envläuft; bestätige durch dieclaude: <stub>Logzeile.
Status
Taille <scratch>/watchdog.log; lese queue.md. Bevor du vertraust, dass „ein anderer Watchdog aktiv ist“, bestätige einen claude.exe Prozess (tasklist) und eine aktuelle iteration N starting Zeile: eine verwaiste Sperre parkt jede Ausführung stillschweigend. Git Bash hat kein pgrep.
Disarm (Entschärfen)
powershell -NoProfile -File <skill>/disarm.ps1 -Repo <path> -Date <date>: es schreibt STOP, hebt die Task-Registrierung auf und prüft, dass Get-ScheduledTask -TaskName 'away-*' nichts zurückgibt. Ein registrierter Task erzeugt weiterhin alle 15 Minuten eine Bash. Der Worktree und Branch bleiben zur Überprüfung: lese den Morgenbericht, merge dann away/<date> über den üblichen Weg des Repos oder lösche ihn.
Warum es so gebaut ist
- Resilienz lebt außerhalb der CLI.
CronCreate durable:truekam sitzungsgebunden zurück (2026-09-19);/loopbetritt dieselbe Sitzung erneut; einnohup … &von einem Bash-Tool-Aufruf ist an diese Shell gebunden; Git Bash hat keinsetsid. - Ein Nutzungslimit wird bis zum von der Nachricht genannten Reset ausgeschlafen, nicht durch eine wachsende Backoff, und eine Iteration wird niemals wegen einer niedrigen
num_turnsals fehlgeschlagen beurteilt: Ein Backoff überschreitet den Reset, und eine Iteration kann eine Zeile in einem gemeldeten Turn abschließen.