@@ -165,16 +165,33 @@ implemented and green (`make ci` + `make determinism`):
165165 (shared engines) + ` php.nginx ` → ` php.laravel.nginx ` (extends) + ` node.vite ` .
166166- ` internal/lock ` — the flock spine (with a concurrency test).
167167- ` internal/state ` — modernc SQLite ledger, WAL/busy_timeout/foreign_keys, versioned
168- migrations + backup, the spec-08 tables, keyed by Docker context.
168+ migrations + backup, the spec-08 tables, keyed by Docker context. ** M2 CRUD layer**
169+ (` ledger.go ` ): ref-counting, port allocation, the provisioning ownership ledger,
170+ shared-service rows + reconcile/orphan queries — all under the flock.
169171- ` internal/xdg ` — XDG paths, WSL2 detection, ` /mnt/* ` refusal, 9p/networked-FS detection.
170- - ` internal/docker ` — read-only ` Client ` interface (+ ` MockClient ` ), moby-backed impl,
171- compose≥2.20 / git≥2.30 preflight.
172+ - ` internal/docker ` — read-only ` Client ` (+ ` MockClient ` ), moby-backed impl,
173+ compose≥2.20 / git≥2.30 preflight. ** M2** : ` EnsureNetwork ` /` NetworkExists ` /
174+ ` ListManaged ` (label-filtered, All=true, one-offs excluded) + the ` Compose ` CLI
175+ driver (up/down/stop/build via an injectable ` Runner ` ; ` CmdError ` carries cmd+code+stderr).
176+ - ` internal/provision ` * (M2)* — idempotent per-project Postgres role/db via guarded
177+ SQL behind a testable ` Conn ` interface; pgx/v5-backed impl + DSN builder (D8).
178+ - ` internal/workspace ` * (M2, the differentiator)* — resolves shared instances per
179+ ` (engine,major) ` , ref-counting register/unregister, self-healing reconcile from
180+ live containers, ` shared status ` projection, and host-port allocation (ledger ∪
181+ bind-test ∪ Docker-published union). Unit+race tested with the mock client.
172182- ` internal/alias ` — registry + symlink installer; ` internal/version ` — ldflags target.
173- - CI (` .github/workflows/ ` ), ` .goreleaser.yaml ` , ` Makefile ` .
174-
175- ** Build order follows the ROADMAP** : M0 spine → M1 config+templating+generation →
176- M2 shared services + workspace lifecycle (the differentiator) → M3 multi-repo git →
177- then secrets (M4) / networking (M5) / onboarding+doctor+health+hooks (M6) / GA (M7).
183+ - CI (` .github/workflows/ ` : ci + release + installer + release-dryrun + determinism),
184+ ` .goreleaser.yaml ` , ` Makefile ` , ` install.sh ` (curl|sh installer). Tagged ** v0.1.0** .
185+
186+ ** Build order follows the ROADMAP** : M0 spine ✅ → M1 config+templating+generation ✅
187+ → M2 shared services + workspace lifecycle (the differentiator) — ** core landed**
188+ (ledger CRUD, docker network/compose driver, provisioning, ref-counting/reconcile,
189+ ` shared status ` ); ** remaining** : the ` up ` /` down ` saga + ` shared gc ` (daemon
190+ orchestration — needs the dind/integration lane to build responsibly), and one
191+ design call to resolve first: ** provisioning runs pgx from the host, so the shared
192+ Postgres needs a ledger-allocated published host port** (the default is no host
193+ ports) — wire that into generation + the up saga. → M3 multi-repo git → secrets
194+ (M4) / networking (M5) / onboarding+doctor+health+hooks (M6) / GA (M7).
178195Anything that mutates shared state goes through ` internal/lock ` from its first commit.
179196
180197## Conventions specific to this repo
0 commit comments