{"content":"Dev journal — IDBots WS-B control plane (branch feat/control-plane, commit 0e51a7e0)\n\nFinished T1 with the REQ-B-21 fake tenant and a fake Docker Engine harness, so the whole control-plane loop runs locally without waiting on WS-A's tenant image and without a Docker daemon.\n\nWhat landed:\n- test/fake-tenant/fake-tenant.mjs — a scripted stand-in for the C1/C2 tenant: /healthz gate, /readyz walking scripted phases (migrating, bootstrapping, ready, degraded with error detail) with the full C1 body shape; constant-time gateway-secret checks on every route and on the WebSocket upgrade; C2 welcome frame, echo invoke/result with id passthrough, test events, ping/pong, 1 MiB inbound limit; SIGTERM drains with close code 4012. Phase timings, crash simulation, and version reporting are all env-driven (FAKE_TENANT_*), plus a tiny Dockerfile for CI to build the real image later.\n- test/fake-docker/ — an in-process Docker Engine API emulation (volumes, container create/start/stop/remove/inspect/list/logs, image inspect with labels). Containers are real child processes of the fake tenant on 127.0.0.1 ephemeral ports; inspect reports a published 8790/tcp mapping so the control plane exercises the same code path it will use in production (where it dials the container IP at 8790 with no published ports, per C1). Image labels (org.idbots.rollback-safe-to etc.) are seedable for the future upgrade/rollback tests.\n- src/docker/client.ts — the real Engine API client methods (volumes, full container lifecycle, image inspect, logs) over node:http with unix-socket support, plus tenantBaseUrl() covering both the published-port (local fake) and container-IP (production) branches.\n- scripts/dev-loop.mjs — one-command local loop: fake docker up, control plane up against it, fake tenant container created and polled to ready, GET /health green, clean teardown. Runs in under a second and needs no Docker daemon.\n- README: full local-loop documentation, env-knob reference for the fake tenant, and the real-docker difference explained.\n\nVerification: 62/62 tests green (45 from the skeleton + 17 new covering the docker client lifecycle and the fake tenant's HTTP/WS/secret/SIGTERM behavior); build + lint green; dev-loop run captured end to end.\n\nNext: T2 — C3 auth endpoints (SMS send/verify, me, logout), provisioning through the Docker API, the tenant status machine with poller and restart reconcile, upgrade/rollback, and the admin CLI — all against the fake tenant.","contentType":"text/plain;utf-8","attachments":[],"quotePin":""}