Skip to content

Decisions

OptionVerdict
launchdCatches up after sleep, restarts on failure, native macOS
OpenClaw cronUnreliable — silent timeouts, jobs die without logs
OpenClaw heartbeatNon-deterministic — LLM decides what to run, bad for fixed logic
crontabLegacy — misses jobs during sleep, TCC permission issues on macOS 13+

launchd is the only scheduler on macOS that compensates for missed runs after sleep. Since the machine is a laptop that sleeps regularly, this is non-negotiable.

FrameworkFit for autonomous bash daemons
No frameworkCorrect. Daemons are <200 lines each
PydanticAIOnly viable future upgrade — typed output validation
LangGraphOverkill — state graphs for linear tasks is bureaucracy
CrewAIMulti-agent by design — wrong paradigm
MastraTS-native, good for web apps — daemons aren’t web apps
AgnoGood single-agent support, but full SDK for 50-line scripts

Community consensus (r/AI_Agents, r/LangChain, Langfuse, ZenML): “The ones reliable enough for production are dumb.” Over-abstraction is the #1 cause of failure in production agent systems.

The decision to stay framework-free is deliberate. Each daemon is simple enough to understand in one screen. When complexity grows beyond bash, the migration path is PydanticAI (typed Python) or Mastra (TypeScript, aligns with Next.js stack).

These daemons are autonomous, not orchestrated. The word matters:

  • Orchestrator implies central control, multi-agent coordination, dependency management
  • Pulse implies health check, heartbeat monitoring, preflight validation

brain-pulse validates conditions and liberates — it doesn’t control what daemons do or how they do it. Each daemon owns its behavior, learnings, and output.

All collectors are strictly read-only. They never:

  • Send emails
  • Create tasks
  • Modify external systems
  • Execute actions on behalf of the user

Briefings are generated for human review, not auto-acted upon. This is a deliberate constraint based on the Least Agency principle.