fix: codex review — safe ack, dream stops worker, graceful errors

Worker:
- Only ack inbox items if Claude succeeds (prevents losing work on crash)
- Graceful error if colony not in PATH (no panic)
- Check colony inbox exit code before parsing
- Per-agent prompt path (/tmp/colony-{name}-prompt.md)

Dream:
- Stops worker service before dreaming (prevents file races)
- Restarts worker after dream completes
- Posts error message if dream fails
- Uses COLONY_AGENT env var for service name

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-29 23:03:28 +02:00
parent 67c81fc518
commit d47905a68f
2 changed files with 56 additions and 27 deletions

View File

@@ -13,12 +13,17 @@ pub fn run_dream() {
return;
}
// 2. Announce dream
// 2. Stop worker to prevent file races
let agent_name = std::env::var("COLONY_AGENT").unwrap_or_else(|_| "agent".into());
let worker_service = format!("agent-{}-worker", agent_name);
let _ = Command::new("systemctl").args(["stop", &worker_service]).status();
// 3. Announce dream
let _ = Command::new("colony")
.args(["post", "general", "💤 dreaming... back in a few minutes", "--type", "plan", "--quiet"])
.status();
// 3. Invoke Claude for dream cycle
// 4. Invoke Claude for dream cycle
eprintln!("dreaming... ({} lines of memory)", line_count);
let prompt = format!(
@@ -31,7 +36,7 @@ pub fn run_dream() {
line_count
);
let status = Command::new("claude")
let dream_ok = match Command::new("claude")
.args([
"--dangerously-skip-permissions",
"-p",
@@ -39,16 +44,24 @@ pub fn run_dream() {
"--max-turns",
"10",
])
.status();
.status()
{
Ok(s) if s.success() => { eprintln!("dream completed"); true }
Ok(s) => { eprintln!("dream exited with status: {}", s); false }
Err(e) => { eprintln!("failed to run claude for dream: {}", e); false }
};
match status {
Ok(s) if s.success() => eprintln!("dream completed"),
Ok(s) => eprintln!("dream exited with status: {}", s),
Err(e) => eprintln!("failed to run claude for dream: {}", e),
// 5. Restart worker
let _ = Command::new("systemctl").args(["start", &worker_service]).status();
// 6. Announce return
if dream_ok {
let _ = Command::new("colony")
.args(["post", "general", "👁 back from dreaming", "--type", "plan", "--quiet"])
.status();
} else {
let _ = Command::new("colony")
.args(["post", "general", "⚠ dream failed, back online", "--type", "error", "--quiet"])
.status();
}
// 4. Announce return
let _ = Command::new("colony")
.args(["post", "general", "👁 back from dreaming", "--type", "plan", "--quiet"])
.status();
}