Status: canonical. Implement against this document; do not reinvent worker/state/dispatch/acceptance.
StrawManagerAgent ≠ Coding Agent
StrawManagerAgent = Orchestrator / Policy / State / Acceptance Layer
Executors (OpenCode, Cursor, future others) are pluggable via ExecutorRegistry.
- Sole spawn path:
DispatchService.spawn()with mode invariant +dispatch_keyidempotency + lease. RecoveryServiceturns expired leases intoBLOCKED+ retryable (workerLOST).- PASS = Deterministic ∧ Diff Policy ∧ LLM Reviewer, persisted as
AcceptanceEvidence. - Task status ≠ Worker status.
- Events: SQLite durable +
SecretRedactor+ SSELast-Event-ID. - Memory: SQLite canonical;
MEMORY.md/USER.mdare projections. - Network:
CloudflareTunnel|CustomDNS|LAN_mDNS(not DHCP). - OpenCode
ServerRunneris v1.x, not MVP blocker.
- Manager — no clarifying questions; auto-approved plan; dispatchable immediately.
- Team Leader —
waiting_approvaluntil human approve. - Developer — task must be confirmed before dispatchable.