# 2026-06-12 — GuruRMM log-analysis → Claude Haiku, old-VM decommission, wiki VM/build-chain sweep

## User
- **User:** Mike Swanson (mike)
- **Machine:** GURU-5070
- **Role:** admin

## Summary
Started from a `gururmm_server::api::logs` error: "Log analysis unavailable: Ollama unreachable
(http://100.101.122.4:11434/api/chat)". Diagnosed, fixed, and shipped a cutover off Ollama; then
decommissioned the old GuruRMM VM, swept stale "VM" + Windows-build-chain framing across wiki/memory,
ran wiki-lint, compiled 5 missing wiki articles, seeded GuruConnect, and patched the wiki-compile skill.

## Root cause (the headline)
"Ollama unreachable" was a **mislabeled 120s reqwest timeout, NOT a reachability problem.**
- `100.101.122.4` already IS Beast (GURU-BEAST-ROG). The server `.30` reaches Beast fine for
  `/api/tags` and short warm `/api/chat` (warm "say OK" = 1.1s), but a fleet-sized `/api/chat`
  (~1500 logs) never completes — warm fleet-size curl from `.30` hit the 300s ceiling.
- Cause: qwen3:14b minutes-long inference on a big prompt over a flaky cross-LAN tailnet
  (`.30` behind symmetric NAT `MappingVariesByDestIP:true`; Beast on Wi-Fi `10.2.51.228`).
  reqwest's 120s `.timeout()` surfaced as "error sending request … Check Tailscale".
- Beast also had a duplicate-Ollama bind conflict (tray app's `ollama serve` couldn't bind 11434;
  older PID 14144 held `0.0.0.0:11434` and served) — noisy, not the cause.

## Fix shipped — log analysis now uses Claude Haiku 4.5
- `server/src/api/logs.rs`: `analyze_logs_with_ollama` → `analyze_logs_with_claude`. POSTs
  `https://api.anthropic.com/v1/messages` (plain HTTPS, no tailnet), `x-api-key` from env,
  `ANTHROPIC_API_KEY` (required) + `ANTHROPIC_MODEL` (default `claude-haiku-4-5`). Structured
  outputs (`output_config.format` + json_schema) → guaranteed-parseable findings JSON.
- Verified end-to-end against Haiku, then live via `/api/logs/analyze`: **1500 logs → 10 findings
  in 24s** (was timing out at 120s). The findings even surfaced the old self-logged "Ollama
  unreachable" errors — the problem we just fixed.
- ZDR (zero data retention) requested from Anthropic, **pending**. Test fleet OK in the meantime.

## Old VM decommissioned + mgmt IP dropped
- Migration to the physical box completed 2026-06-11; soak signed off → deleted the parked old VM.
- Jupiter (172.16.3.20): `virsh destroy GuruRMM` + `undefine` + removed `/mnt/user/domains/GuruRMM`
  (vdisk1.img, 64 GB). Did NOT use `--remove-all-storage` (would have wiped the shared Ubuntu ISO).
  `.46` down; Pluto (`Claude-Builder`) + ISO intact.
- `.30` netplan: removed the secondary `172.16.3.47/22` (backup saved `.bak`), `netplan apply`;
  `eno1` now carries only `172.16.3.30`. Route + service intact, 216 agents.

## Wiki / knowledge sweeps
- Retired "GuruRMM VM / Linux VM on Jupiter" framing → `.30` is a **physical box** (Lenovo
  ThinkCentre M83, Ubuntu 26.04): overview, index, jupiter, gururmm-build, internal-infrastructure,
  POWER_FAILURE_RUNBOOK + 4 memory files. HOST_MIGRATION_RUNBOOK header flipped to COMPLETE.
- Windows build chain corrected everywhere: **Beast PRIMARY, Pluto FALLBACK**
  (`attempt_build beast || attempt_build pluto`, verified in build-windows.sh): index, overview,
  projects/gururmm, systems/pluto, internal-infrastructure + reference_pluto_build_server memory +
  build-pipeline doc comments.
- `/wiki-lint` run: found+fixed 2 missed gaps (internal-infrastructure + pluto backlink). Pre-existing
  backlog (missing/broken/index) left as-is. `guru-rmm.md` is an intentional redirect tombstone (kept);
  the tailscale-enroll.ps1 "dead" link was a false positive (script exists).
- Compiled 5 missing articles via 5 parallel Sonnet sub-agents: clients gonzvar-tax-services,
  tohono-oodham-doit (Syncro 33069069), tucson-golden-corral (3859123); projects gururmm-agent
  (artifact-based), msp-tools (umbrella). Deduped the duplicate `system:neptune` compile-queue entry.
- Seeded **GuruConnect** wiki article (v0.3.0 production, ScreenConnect-class Rust tool; artifact-based
  from guru-connect @ origin/main ded99c5). `[[guruconnect]]` backlinks now resolve.
- Per-client fixes: Gonzvar found via fuzzy `query=` ("Gonzvar Tax Service" singular, id **1830740**,
  break-fix ~$175/hr, 6 assets). Golden Corral email = **Neptune Exchange** (per Mike; IX cPanel kept
  as a caveat). **TGC-SERVER is colocated at ACG main office** (behind ACG office net, not a naked
  public box at the restaurant).
- Patched wiki-compile Phase 2a: fuzzy `query=` + fallback ladder instead of near-exact `name=`
  (root cause of the Gonzvar miss).

## Credentials / access (vault paths — no secrets inlined)
- Anthropic API key (GuruRMM log analysis): vault `projects/gururmm/anthropic-api` `credentials.api_key`.
  Deployed to `.30` at `/opt/gururmm/.env` as `ANTHROPIC_API_KEY` (root-only file).
- `.30` SSH: `~/.ssh/gururmm-physical` → `guru@172.16.3.30`; sudo password = vault
  `infrastructure/gururmm-server.sops.yaml` `credentials.password` (`sudo -S`).
- Jupiter: `ssh -i ~/.ssh/id_ed25519 root@172.16.3.20`.
- Beast (Windows build PRIMARY): `guru@100.101.122.4` (tailnet), key `~/.ssh/id_ed25519`.

## Infrastructure touched
- `.30` (physical GuruRMM/build host) — code deploy + .env + restart + netplan.
- Jupiter (.20) — deleted GuruRMM virsh domain.
- Beast (100.101.122.4) — inspected (duplicate Ollama).

## Files changed / pushed
- gururmm repo: `c869e4d` (logs.rs→Claude), runbook `37c8593`/`8b301bf`, build-pipeline docs `a794a7f`.
- ClaudeTools: multiple — Claude-cutover memory, VM-sweep, build-chain, wiki-lint fixes, 5 compiled
  articles + index, GuruConnect, per-client fixes, wiki-compile fuzzy-search fix (through `401ed7d4`).
- vault: `c1c9744` (Anthropic key entry).

## Pending / follow-ups
- **ZDR** confirmation from Anthropic before pointing a production fleet at the key.
- Golden Corral: reconcile whether IX cPanel mail accounts/forwarders remain vs all-Neptune.
- Gonzvar: confirm contact name/email (Syncro record has phone only).
- `guru-connect` is an untracked standalone clone under `projects/msp-tools/` — consider making it a
  proper submodule like guru-rmm.
- Optional: a server-side Ollama fallback in logs.rs (try Claude → fallback) — deferred; Beast path
  is no longer used.
