# Go MCP cutover — full test report **Run ID:** `2026-09-29T162528Z-go-mcp-cutover` **Finished (UTC):** 2026-09-29T16:28:00Z (approx) **Subject under test:** Go `verae-mcp-timestamping-server` on ns1 replacing Python **Binary:** `/opt/verae/verae-mcp-timestamping-server-go/bin/verae-mcp-timestamping-server` **Git (local):** `a249564` (+ Caddy fix for `mcp.georgelambert.org` during this run) **Forgejo:** https://git.georgelambert.org/marchon/verae-mcp-timestamping-server-go ## Executive summary | Metric | Value | | --- | --- | | Cases run | **15** | | Passed | **15** (after L5/L7 retest) | | Failed | **0** | | Go MCP live path | **Healthy** (`127.0.0.1:8000`, embedded NATS `127.0.0.1:4229`) | Initial run had 2 laptop-auth failures (expired `~/.verae/auth.properties`). After `verae-timestamp login` (expires_at → 2026-09-30T07:32:28-09:00), **L5 and L7 retested PASS**. ## Deploy snapshot | Setting | Value | | --- | --- | | systemd unit | `verae-mcp-timestamping.service` | | Drop-ins | `go-cutover.conf`, `verae-ai.conf` | | `VERAE_MCP_PORT` | `8000` | | `VERAE_NATS_LISTEN` | `127.0.0.1:4229` | | `VERAE_MCP_REQUIRE_BEARER` | `0` (host-token fallback) | | `VERAE_AUTH_PROPERTIES` | `/var/lib/verae-mcp/auth.properties` | | Public hosts | `mcp.verae.ai`, `mcp.veraetime.net`, `mcp.georgelambert.org` → `127.0.0.1:8000` | **During this run:** `mcp.georgelambert.org` Caddy upstream was corrected from `10.1.10.128:8000` (502) to `127.0.0.1:8000`. A `.bak` file that caused “ambiguous site definition” was moved out of `/etc/caddy/sites/`. ## Results matrix | ID | Case | Status | Notes | | --- | --- | --- | --- | | U1 | Go unit tests (`go test ./...`) | **PASS** | authctx, embednats, ledger, server, tools, veraetime, digest, tsnats | | U2 | Python client unit tests | **PASS** | 47 passed | | U3 | Python server unit tests | **PASS** | 34 passed | | L1 | Public MCP suite (`mcp.verae.ai`) | **PASS** | tools/list (7 tools), global hash_report, local stamp+verify, session valid admin | | L2 | MCP global stamp (unique digest) | **PASS** | host-token fallback | | L3 | MCP 20× same digest global stamp | **PASS** | unique=1, same=True, ~3.92s, CID `QmXgqQn8…` | | L4 | Python `ApplicationClient` via MCP | **PASS** | local stamp, verify, hash_report | | L5 | `ApplicationClient` direct VeraeTime | **PASS** (retest) | After `verae-timestamp login`; hash_report global ≥1 receipt | | L6 | CLI `verae-timestamp hash` | **PASS** | 64-hex digest | | L7 | `transaction_log_test.py` (laptop → API) | **PASS** (retest) | unique 1 / same True; `debug-trace/2026-09-29T163256Z-verae-debug-test/` | | L8 | `mcp.veraetime.net` tools/list | **PASS** | same Go process | | L9 | `mcp.georgelambert.org` MCP | **PASS** | after Caddy upstream fix; session OK | | L10 | `pkg/tsnats` → embedded NATS `:4229` | **PASS** | local stamp via SSH tunnel | | L11 | Static site pages on `mcp.verae.ai` | **PASS** | `/`, developers, ways, openapi, app, explorer | | L12 | ns1 loopback 5× global idempotent | **PASS** | unique=1, same CID `QmXgqQn8…` | ## Case details ### U1 — Go unit tests All packages green. No FAIL lines in `logs/u1-go-unit.txt`. ### U2 / U3 — Python suites Client 47 passed; server 34 passed. Confirms Application Client and Python GlobalClient libraries still build/test while Go owns production MCP. ### L1 — Public MCP suite (`https://mcp.verae.ai/mcp`) 1. `initialize` → `Mcp-Session-Id` present (stateful). 2. `tools/list` → `create_user`, `hash_report`, `login`, `session`, `signup`, `stamp`, `verify`. 3. `hash_report` global on Verae-Debug-Test digest → receipt `QmXgqQn8eu6bpBmJ1Fm8xKUePfLREJdghsUkYijStGjVMQ`. 4. `stamp` scope=local → receipt issued; `verify` OK. 5. `session` → `valid: true`, `username: admin`, `role: admin` (host-token keeper). ### L2 / L3 — Global stamp paths - L2: fresh digest stamped globally without client Bearer (`REQUIRE_BEARER=0`). - L3: 20 sequential global stamps of digest `469e6159…` all returned the same CID; elapsed ~3.92s. ### L4 — ApplicationClient (MCP transport) Local stamp → verify → hash_report through `https://mcp.verae.ai/mcp` succeeded. ### L5 / L7 — Laptop direct VeraeTime **Initial fail:** expired laptop JWT (`expires_at=2026-09-29T06:20:17-09:00`). **Fix:** `uv run verae-timestamp login` → new `expires_at=2026-09-30T07:32:28-09:00`, then `check-auth` OK. **Retest:** - L5: `ApplicationClient.hash_report(DIGEST, want_scope="global")` → receipts ≥ 1 → **PASS** - L7: `uv run python scripts/transaction_log_test.py` → unique 1, same True → **PASS** Output: `debug-trace/2026-09-29T163256Z-verae-debug-test/` ### L6 — CLI hash `verae-timestamp hash` produced a valid SHA-256. ### L8 / L9 — Sibling public hostnames - `mcp.veraetime.net`: PASS. - `mcp.georgelambert.org`: initially 502 (wrong upstream); after Caddy fix → PASS. ### L10 — Embedded NATS client `pkg/tsnats.Connect(nats://127.0.0.1:14229)` (tunnel to ns1 `:4229`) → `Stamp` scope=local → receipt ID returned. ### L11 — Static docs site HTTP 200 for index, developers, ways, OpenAPI YAML, app, explorer. ### L12 — On-host MCP idempotency From ns1 to `127.0.0.1:8000` with `Host: mcp.verae.ai`, 5× global stamp of Verae-Debug-Test → one CID. ## Failures — root cause and remediation | ID | Root cause | Remediation | Status | | --- | --- | --- | --- | | L5 | Expired laptop JWT | `verae-timestamp login` then retest | **Fixed** | | L7 | Same expired laptop JWT (20× 401) | Same login; retest wrote new debug-trace | **Fixed** | ## Artifacts | Path | Contents | | --- | --- | | `results.csv` | Machine-readable PASS/FAIL | | `logs/` | Per-case stdout/stderr | | `logs/deploy-state.txt` | systemd drop-in snapshot | | `logs/l3-20stamp.txt` | 20× CID list | | `logs/l7-txlog.txt` | Laptop transaction_log output (401) | Laptop `transaction_log_test` also wrote: `verae-mcp-timestamping-server/debug-trace/2026-09-29T162648Z-verae-debug-test/` ## Conclusion The Go MCP service on ns1 is **production-viable** for AI MCP clients and NATS bulk clients under the tested cases. Public tool parity, local ledger, global VeraeTime via host-token fallback, embedded NATS, and static docs all passed. Remaining fails are local developer credentials for direct API scripts. ## Rollback (reference) ```sh sudo rm /etc/systemd/system/verae-mcp-timestamping.service.d/go-cutover.conf sudo systemctl daemon-reload sudo systemctl restart verae-mcp-timestamping.service ```