A deterministic, idempotent 0→60 build of the ai-memory v0.7.0 federated test mesh on a single local Docker host — no cloud account required. Docker Compose stands the mesh up; an idempotent provision toolkit brings every peer to a verified federated state; a verification harness proves it. Everything a reviewer needs to reproduce both the environment and the results ships inside release/v0.7.0 under deploy/docker-1461/. Two IronClaw peers + one PostgreSQL/AGE/pgvector container, all traffic TLS+mTLS, zero-touch first-party trust, every step re-runnable.
This is the local-Docker analog of the hive-1461 DigitalOcean baseline. The hive toolkit reaches cloud droplets over ssh + systemd; here every in-container probe goes through docker exec and every API probe goes through host-loopback curl over the campaign CA + client cert. Identical wire format, identical governance, identical federation + zero-touch-trust semantics — reproducible by any reviewer with Docker and a host embedder, no DigitalOcean token in sight.
One entrypoint reproduces the whole thing: make 0to60 builds the images, provisions the mesh (seed → TLS → zero-touch → up), runs the verification harness, then runs the full-spectrum suite. make down tears it all back down. Every probe in both harnesses goes over the real TLS+mTLS path; the canonical green reports are committed at deploy/docker-1461/results/.
Container names encode each node's function: docker-1461-<function>-<N>. The 2 peers form a W=2-of-N=2 write-quorum mesh on a private bridge; the harness host is the external mTLS client of that mesh, and the alpha/beta agents are distinct X-Agent-Id identities it presents over the published-port TLS path (no separate agent containers — the deliberate difference from the SSH-coupled hive).
| Container | Role | Published | Runs |
|---|---|---|---|
docker-1461-peer-1 | peer | 127.0.0.1:19280 | federated ai-memory serve (HTTPS+mTLS on :19077) + Ollama embedder reach |
docker-1461-peer-2 | peer | 127.0.0.1:19281 | federated ai-memory serve (HTTPS+mTLS on :19077) + Ollama embedder reach |
docker-1461-pg-age | data | 127.0.0.1:15433 | PostgreSQL 16 + Apache AGE 1.6.0 + pgvector; per-peer schema ic_peer_1 / ic_peer_2 |
The mesh runs on the docker-1461-mesh bridge (172.31.80.0/24, a distinct subnet so it co-exists with other local Docker meshes). The embedder is a host Ollama (nomic-embed-text, 768-dim) reached from the containers via host.docker.internal:11434. All mesh traffic is TLS + mTLS: the peer HTTPS port enforces client_auth_mandatory — a connection is accepted only if the SHA-256 of the client cert's DER bytes is on the mtls-allowlist.txt (fingerprint pinning). One shared client cert authorises the whole mesh; every server cert carries an IP:127.0.0.1 SAN so the host harness connects straight to loopback with no --resolve.
Every step is idempotent and re-runnable. make 0to60 = build provision validate test report; make provision = seed tls zerotouch up. The provision steps run in this exact deterministic order:
| Step | Script | Effect |
|---|---|---|
00 | 00_seed.sh | render run-dir tree, PG secret, init-age.sql, campaign.env |
10 | 10_build.sh | build PG/AGE/pgvector + ai-memory daemon images (sal,sal-postgres) |
40 | 40_tls.sh | campaign CA + per-peer server/client leaf certs + mTLS allowlist fan-out |
45 | 45_zero_touch.sh | mint campaign CA + per-peer credential; export trust bundle; wire peer-enrollment env (O(1) trust) |
50 | 50_up.sh | docker compose up; PG schema-init (v55); start the quorum mesh; health-gate |
The verification harness exercises the live mesh over the real TLS+mTLS path and emits a JSON + tabular report. Exit status is 0 iff every check is green. Per peer (in-container via docker exec) it asserts binary --version, container docker-health, and single-instance; per peer (over mTLS) it asserts /api/v1/health (status, version, embedder_ready, federation_enabled), storage_backend == postgres, and db_schema_version == 55; and a fleet federation-convergence probe writes a collective-scope marker to peer-1 and reads it back by id on peer-2 over the encrypted path.
Canonical green baseline committed at results/verify-baseline.{json,tsv}: TOTAL=20 PASS=20 FAIL=0 (9 per peer + 2 fleet).
The full-spectrum suite runs against the live mesh, following a green make validate. Every probe goes over the real TLS+mTLS path and authenticates with x-api-key; throwaway markers land in the _test / _verify / _zerotouch namespaces and are best-effort deleted, so the baseline corpus is never mutated. Canonical green report committed at results/test-full-spectrum.{json,tsv}: TOTAL=25 PASS=25 FAIL=0.
000); non-allowlisted client cert refused (000); wrong server CA refused (000); privileged endpoint without x-api-key → 401; with key → 200; /health exempt → 200; admin endpoint as non-admin → 403.
7/7 PASS
/sync/since (401 peer_not_enrolled, the REQUIRE_PEER_ENROLLMENT=1 gate).
4/4 PASS
agent-alpha (one X-Agent-Id) writes a collective memory to peer-1 over the network; agent-beta (a different identity) reads it back on the write peer and on the federated peer.
3/3 PASS
agent-alpha drives a live OpenRouter expand_query decision over the mesh, commits the LLM-derived term as a collective memory, and the decision converges on the federated peer — a full NHI decision → commit → federate loop.
3/3 PASS
The live AI-NHI loop is the capstone: in the canonical run, OpenRouter (google/gemma-4-26b-a4b-it) returned the term Byzantine fault tolerance, the harness committed it as a collective memory on docker-1461-peer-1, and it converged on docker-1461-peer-2 — a real LLM decision crossing the encrypted mesh and federating cross-peer.
provision/lib.sh): version 0.7.0, schema v55, EMBED_DIM=768, apache/age:release_PG16_1.6.0, embedder/LLM model ids, every port/name/path — all single-source constants, env-overridable for forks, with no hostname/region/vendor literal baked into any variable name.make validate + make test exercise the live mesh over the real TLS+mTLS path and emit JSON + tabular reports; exit 0 iff every check is green.OPENROUTER_API_KEY (peer LLM + the daemon's effective X-API-Key) is sourced from ~/.env into the compose shell only; the generated Postgres password lives only in the gitignored run dir (mode 0600). Never committed, never echoed, never on a command line.make 0to60 (teardown: make down / make clean)→
deploy/docker-1461/provision/Idempotent 0→60 toolkit: steps 00/10/40/45/50 + lib.sh pinned-constant SSOT→
results/verify-baseline.tsvCanonical green verification report — TOTAL=20 PASS=20 FAIL=0→
results/test-full-spectrum.tsvCanonical green full-spectrum report — TOTAL=25 PASS=25 FAIL=0→
ai-memory-docker-1461-daemon:latest, features sal,sal-postgres549954985755c706100686b098c3859fa6c60965014b8b55c8ba74c37e6e1854nomic-embed-text (768-dim) via host Ollama (host.docker.internal:11434)google/gemma-4-26b-a4b-itclient_auth_mandatory fingerprint-pinned allowlist; zero-touch first-party CA trustrelease/v0.7.0