# Edit history — 2026-04-15 ## tick-9: Phase 32 Phase B.2 image pipeline (PR #80) + tick-8 docs sync (PR #79) Two merges: ### PR #79 — `docs: sync documentation with 2026-04-14 tick-8 merge (#78)` Merge commit `d53a1287`. Tick-8 docs sync for the TenantGuard middleware. Pure docs; CLAUDE.md test count + PLAN.md tick-8 block + edit-history entry. ### PR #80 — `feat(ci): publish-platform-image → ghcr.io/molecule-ai/platform (Phase B.2)` Merge commit `c3cc8e87`. Noteworthy: ci-infra. Adds `.github/workflows/publish-platform-image.yml`: - Trigger: push to main touching `platform/**`; also `workflow_dispatch`. - Builds `platform/Dockerfile` via `docker/build-push-action@v5`. - Pushes two tags per run: `ghcr.io/molecule-ai/platform:latest` (floating) and `:sha-` (immutable, pin-friendly). - GHA cache via `cache-from/cache-to: type=gha` for warm rebuilds. - Permissions: `contents:read` + `packages:write`; authenticates to GHCR using the built-in `GITHUB_TOKEN`, no extra secrets. - OCI labels propagate source URL + commit SHA for provenance. Purpose: pairs with the private `molecule-controlplane` Fly + Neon provisioner (PR #3 there, merged `2e85d5ad`) which reads `TENANT_IMAGE=ghcr.io/molecule-ai/platform:` from env and spawns each tenant Fly Machine from this image. ### Deployment state (informational — not in any repo) - Fly apps (`molecule-cp`, `molecule-tenant`): **pending CEO** (`flyctl apps create`). - Fly billing card: **pending CEO**. - First real tenant provision: **blocked** on the two above. ### File deltas (public repo) - `.github/workflows/publish-platform-image.yml` — new. - `CLAUDE.md` — tick-9 block for the new CI workflow. - `PLAN.md` — new "Recently launched (2026-04-15 tick-9)" entry.