- [ ]**Module test coverage** — `modules.go` is 1,434 LOC with zero tests. Each module (service, file, template, command, copy, apt, yum) needs unit tests with mocked SSH sessions.
- [ ]**Error propagation** — Verify all SSH errors are wrapped with `core.E()` including host context. Currently some errors may lose the host identifier.
- [ ]**Fact gathering** — Test fact collection from different Linux distros (Ubuntu, CentOS, Alpine). Mock `/etc/os-release` parsing.
- [ ]**Become/sudo** — Test privilege escalation paths. Verify password prompt handling.
- [ ]**Idempotency checks** — Modules should report `changed: false` when no action needed. Verify for file, service, template modules.
## Phase 2: Infrastructure API Robustness
- [ ]**Retry logic** — Add configurable retry with exponential backoff for Hetzner Cloud/Robot and CloudNS API calls. Cloud APIs are flaky.
- [ ]**Rate limiting** — Hetzner Cloud has rate limits. Detect 429 responses, queue and retry.
- [ ]**DigitalOcean support** — Currently referenced in config but no implementation. Either implement or remove.
- [ ]**API client abstraction** — Extract common HTTP client pattern from hetzner.go and cloudns.go into shared infra client.
## Phase 3: Release Pipeline Testing
- [ ]**Publisher integration tests** — Mock GitHub API for release creation, Docker registry for image push, Homebrew tap for formula update. Verify dry-run mode produces correct output without side effects.
- [ ]**SDK generation tests** — Generate TypeScript/Go/Python clients from a test OpenAPI spec. Verify output compiles/type-checks.
- [ ]**Breaking change detection** — Test oasdiff integration: modify a spec with breaking change, verify detection and failure mode.