# ADR-006: Nim for Worker Coordination CLI ## Status Accepted ## Context The multi-agent orchestration system needs a CLI tool (`worker`) for: - Spawning worker workspaces with git worktrees - State machine transitions (ASSIGNED → WORKING → IN_REVIEW → APPROVED → COMPLETED) - Heartbeat monitoring for stuck agent detection - SQLite-based message bus for coordination - Review-gate integration for quality enforcement Requirements: - Fast startup (<10ms) for CLI commands run frequently - Single static binary for deployment simplicity - SQLite with WAL mode for concurrent access - Background thread for heartbeat without shared state complexity - Easy iteration during development ## Decision Use **Nim** with ORC memory management for the worker CLI. ### Core Dependencies | Package | Purpose | |---------|---------| | `tiny_sqlite` | SQLite wrapper with RAII, statement caching | | `cligen` | Auto-generates CLI from proc signatures | | `std/json` | JSON parsing for context files | ### Why Nim **Performance:** - ~1ms startup time (vs ~50ms Python, ~20ms Go) - Compiles to native binary via C backend - No runtime initialization overhead **Developer Experience:** - Python-like syntax, low learning curve - REPL available for prototyping (`nim secret`) - Compile-time checks catch errors early - Excellent error messages **Memory Management:** - ORC (Ownership + Reference Counting) handles cycles automatically - No manual memory management needed - Deterministic cleanup via destructors - Thread-safe without shared state via channels **SQLite Integration:** - `tiny_sqlite` provides clean RAII semantics - Statement caching for performance - Proper NULL handling via Option types - WAL mode works correctly with multiple connections **CLI Generation:** - `cligen` generates CLI from proc signatures - Help text from doc comments - Type-safe argument parsing - Subcommands via `dispatchMulti` Example: ```nim proc spawn(taskId: string, description = "", fromBranch = "origin/integration") = ## Create a new worker workspace ... when isMainModule: dispatchMulti( [spawn, help = {"taskId": "Task identifier"}] ) ``` ### Alternatives Considered **Python:** - Slow startup (~50ms) unacceptable for frequent CLI calls - Packaging complexity (venv, dependencies) - Would work for prototype but not production **Go:** - Faster startup than Python (~20ms) but still slower than Nim - More verbose syntax - Good SQLite support via mattn/go-sqlite3 - Reasonable choice but Nim is more pleasant to write **Rust:** - Excellent performance and safety - Steep learning curve slows iteration - Borrow checker friction for exploratory code - Good for later rewrite if needed **Bash:** - Used for review-gate (simpler requirements) - Inadequate for state machine and SQLite operations - Error handling is painful ### Build Configuration ```nim # config.nims switch("mm", "orc") # Memory management switch("threads", "on") # Background heartbeat thread switch("d", "release") # Optimizations switch("opt", "size") # Smaller binary switch("passL", "-lsqlite3") # Link SQLite ``` Build command: ```bash nim c -d:release src/worker.nim ``` ### Architecture ``` src/ ├── worker.nim # CLI dispatch, command implementations └── worker/ ├── types.nim # Shared types, constants, error types ├── db.nim # SQLite operations, message bus ├── state.nim # State machine transitions ├── git.nim # Worktree operations ├── context.nim # Worker context file handling ├── heartbeat.nim # Background heartbeat thread ├── review.nim # Review-gate integration └── utils.nim # Common helpers ``` ## Consequences ### Positive - Sub-millisecond startup enables responsive CLI - Single binary simplifies deployment - ORC eliminates memory management burden - `cligen` reduces CLI boilerplate to near-zero - Python-like syntax enables fast iteration - Type safety catches bugs at compile time ### Negative - Smaller ecosystem than Python/Go/Rust - Fewer developers familiar with Nim - Some library quality variance - Compiler occasionally has edge case bugs ### Mitigations - Pin Nim version (2.2.x) for stability - Use well-maintained libraries (tiny_sqlite, cligen) - Keep modules small and focused for maintainability - Document patterns for future contributors ## References - [Nim Manual](https://nim-lang.org/docs/manual.html) - [tiny_sqlite](https://github.com/GULPF/tiny_sqlite) - [cligen](https://github.com/c-blake/cligen) - [ORC Memory Management](https://nim-lang.org/blog/2020/10/15/introduction-to-arc-orc-in-nim.html)