№ 0672GitHub
MuseFactory
A personal software factory built on Muse agents and Erlang/OTP principles: a markdown backlog goes in, and each run takes one item through planning, dual review, TDD, code review and verification.
MuseFactory
A personal software factory: a backlog markdown doc goes in, reviewed and verified code comes out — built on the Erlang/OTP design principles: files are message queues, workers are workers, and everything is designed to crash and recover.
How it works
- The user keeps a plain markdown backlog — top-level bullets are items, sub-bullets are detail, order is priority. The backlog is the message queue; nothing reads it "live" or triages the whole thing anymore.
- One
dev-factoryworkflow run processes exactly one backlog item, then terminates with a typed terminal envelope (done,awaiting-approval,blocked, orfailed). The run works the item through thedevelopskill: orient → plan → dual plan review (product + technical) → isolated worktree → TDD implementation → debugging → code review → verification → report. - The supervisor (an LLM, following
SUPERVISOR.md) applies the envelope to the backlog and checkpoint state via deterministic scripts, and asks any unanswered questions again — byte-identically — in the project side chat. A reply in that chat is the real-time event; resume happens inline in that chat turn. - A per-project liveness tick (2-minute cron, delivered to the project side chat) exists for exactly one reason: silent worker death has no event. The tick detects dead runs, crash loops, and week-long stalls — nothing else.
Design principles
- Files are message queues, workers are workers (Erlang/OTP). Checkpoints and backlogs are state, not orchestration; the workflow does no supervision and the supervisor does no work.
- One run = one item. No queue loops, no self-relaunch, no backlog edits by workers.
- Nothing is implicitly approved. An ambiguous reply to an approval gate gets a one-line confirmation question, never a resume.
- Crash-only design. Every race-sensitive protocol is a deterministic script, not LLM prose. A crash at any point converges on re-run: mutations are idempotent, envelopes are applied exactly once via a
handled_run_idsledger, and all shared-state changes go through a single project-wide mutex with compare-and-swap preconditions. - The supervisor supervises; scripts serialize. The LLM never edits state directly — every mutation is a script invocation held for milliseconds.
- **Reviews ar






