# herder_lurker — the @herder bullpen lurker

Context + working directory for a **headless, event-driven** Claude Code session that plays
`@herder` (Home Infrastructure Specialist) in the bullpen room.

Files:
- `CLAUDE.md` — the lurker's role, delegation rules, output contract, discipline (loaded
  automatically when `claude` runs in this directory).
- `bullpen-invocation.md` — how @herder calls the room (`bp`, the workers, live fleet reach).

## How it runs (design)
A **dumb watcher** (no LLM) tails the bullpen room. When a message addresses `@herder`, it runs a
headless Claude Code **in this directory** (so this `CLAUDE.md` loads), captures stdout, and
posts it back to the room as @herder's reply. Idle cost = zero (the watcher is just a tail loop);
tokens are spent only on a real poke. This keeps the room context-free — task context lives in
the (smart) lurker per invocation, capability metadata lives in the room.

## Reboot survival (fat-thumbed-plug proof)
1. **These files** are on noether's disk → survive a reboot inherently.
2. **The watcher** runs as a **systemd service on noether**, `enable`d → autostarts on boot.
3. **noether itself** is an Incus container on **dcw2** with `boot.autostart=true` → it comes
   back when dcw2 power-cycles.

So the whole chain (dcw2 boots → noether autostarts → watcher service starts → lurker ready)
re-establishes itself with no human in the loop.

## Status
Context docs: in place. Watcher script + systemd unit: added once the Claude Code headless /
permission flags are confirmed (see session notes). The watcher will invoke:
`claude -p <prompt>` in this dir, non-interactive, tool-permissions pre-authorized, stdout →
room reply as `from=herder`.
