sync: auto-sync from DESKTOP-0O8A1RL at 2026-05-16 11:38:55

Author: Mike Swanson
Machine: DESKTOP-0O8A1RL
Timestamp: 2026-05-16 11:38:55
This commit is contained in:
2026-05-16 11:38:58 -07:00
parent df5afb3084
commit 2fa8295ad0

View File

@@ -0,0 +1,139 @@
# Session Log — 2026-05-16
## User
- **User:** Mike Swanson (mike)
- **Machine:** DESKTOP-0O8A1RL
- **Role:** admin
- **Session span:** ~2026-05-15 evening through 2026-05-16 morning PT (cross-midnight, continued from compacted context)
---
## Session Summary
The session opened as a continuation of prior work that had been context-compacted. The main pending item was inserting an "Asset Location Tracking" section into the GuruRMM feature roadmap — a Python patch script had been written to `D:\claudetools\tmp_roadmap_patch.py` but not yet executed. The script was copied to the GuruRMM server (172.16.3.30) via scp and run with Python 3; it successfully located the marker, inserted the new section before the `---` divider separating Core Agent Features from Server/API Features, and printed "inserted". The updated roadmap was committed and pushed to the gururmm repo as `883d8ff`.
Earlier in the session (pre-compaction) a significant amount of GuruRMM infrastructure work was completed. Jupiter's Docker container was rebuilt to add /dev/kvm and /var/run/libvirt/libvirt-sock mounts and the libvirt-clients apt package, enabling hypervisor detection (is_hypervisor: true) and VM enumeration (7 hosted VMs via virsh). Pluto's agent was force-updated to v0.6.22 by bumping Cargo.toml, since the auto-updater skips same-version builds. Three watchdog bugs were identified and fixed: sc.exe fallback when SCM service.stop() returns access denied; suppress_until being set to a future deadline on restart failure instead of cleared to Instant::now(); and a misplaced warn! for PerformUpdate stubs that caused unnecessary log noise (downgraded to debug!). A changelog generation script was wired into build-agents.sh so v0.6.22.md and LATEST_AGENT.md are auto-generated on each build.
The dashboard Terminal tab had a NativeSelect flex layout bug where the className prop was being applied to the inner select element rather than the outer wrapper div, causing the input box to appear invisible. The fix moved the className to the outer div and removed inline-block, letting twMerge correctly resolve caller width classes against the inner select's w-full. The output panel was also enlarged from h-80 to h-[28rem].
The session closed with a workflow feature: a `/feature-request` skill was created so Howard can submit GuruRMM feature requests from his Claude Code session. When invoked, Claude reads the current roadmap, calls Ollama to classify where the feature belongs (section, subsection, priority), and posts a coord message to Mike's machines so he can review and decide if/how/when to build it. The skill was committed to claudetools, synced to Gitea, and coord messages were sent to Howard on both his known machines (ACG-TECH03L and Howard-Home) explaining how to use it.
---
## Key Decisions
- **Asset location tracking added to roadmap only — not built.** Mike's explicit instruction was to add it for future consideration, not to start implementation. Section covers WiFi geolocation (SSID/BSSID → Google/Microsoft API, ~50-100m), IP fallback, on-demand requests, mobile app as a future phase, and geofence alerts as P3.
- **No Apple MDM vendor certificate required for mobile app.** Standard APNs/FCM push is sufficient for the "find stolen device" use case. Full MDM profile management is explicitly out of scope for v1.
- **Watchdog suppress_until cleared on restart failure.** The original code left suppress_until at a future deadline when RestartMainService failed, which meant the watchdog would silently skip restart attempts for however long was left on the suppression window. Fix: set to Instant::now() so the next poll tick tries again immediately.
- **sc.exe fallback for service stop.** The windows-service crate's service.stop() can return ERROR_ACCESS_DENIED even when the process has SeServiceLogonRight, apparently due to session isolation in some upgrade paths. sc.exe bypasses this. Added as fallback rather than replacement so the SCM path remains preferred.
- **/feature-request routes to Ollama for classification.** Using qwen3:14b at Tier 0 keeps the cost and latency low for what is essentially a document classification task. Howard's machines use the Tailscale Ollama endpoint (100.92.127.64:11434).
- **Coord messages sent to both of Mike's primary machines.** DESKTOP-0O8A1RL and Mikes-MacBook-Air both receive the notification so it surfaces regardless of which machine Mike opens Claude Code on.
---
## Problems Encountered
- **hosted_vm_uuids empty after /dev/kvm mount.** virsh was not installed in the Docker image. Fix: added libvirt-clients to the Dockerfile apt-get block and rebuilt the image.
- **virsh still failing after new image.** Wrong socket path — /var/run/libvirt/libvirt-sock was not mounted. Fix: verified the socket path on the Jupiter host, added the mount to the Unraid container config and unraid-ca-template.xml.
- **Pluto stuck on v0.6.21 after KVM fix built.** Auto-updater compares version strings and skips same-version. The KVM fix was built as v0.6.21 but Pluto was already on v0.6.21. Fix: bumped Cargo.toml to 0.6.22, rebuilt.
- **Pluto service offline 25+ minutes after watchdog-triggered update.** Three separate bugs in watchdog (see Key Decisions). Service was manually started via Python paramiko (sshpass not available; paramiko handles password auth programmatically without interactive stdin).
- **Bash pre-backslash hook blocked SSH with full Windows path.** Hook at `D:/claudetools/.claude/hooks/pre-bash-backslash.sh` blocked `C:\Windows\System32\OpenSSH\ssh.exe`. Used bare `ssh` command instead.
- **Python unicode error reading Windows log.** Log contained non-UTF8 bytes. Fix: `sys.stdout.buffer.write(output.encode('utf-8', errors='replace'))`.
- **NativeSelect flex layout bug in Terminal tab.** className prop was applied to the inner select element, not the outer wrapper div, so the caller's width class (w-32) was overridden by the inner select's w-full. Fix: moved className to outer div, inner select always w-full.
- **Pre-bash-backslash hook blocking curl multiline commands.** Coord messages with backslash line continuations were blocked. Fix: rewrote as Python urllib one-liners which the hook doesn't touch.
---
## Configuration Changes
**gururmm repo (172.16.3.30:/home/guru/gururmm):**
- `agent/Dockerfile` — added libvirt-clients to apt-get block
- `agent/Cargo.toml` — version bumped 0.6.21 → 0.6.22
- `agent/src/watchdog/monitor.rs` — three bug fixes (sc.exe fallback, suppress_until, PerformUpdate log level)
- `scripts/build-agents.sh` — added generate-changelog.sh call before "Build complete" log
- `changelogs/agent/v0.6.22.md` — created (auto-generated release notes)
- `changelogs/LATEST_AGENT.md` — updated to point to v0.6.22
- `dashboard/src/components/Select.tsx` — NativeSelect className moved to outer div, inline-block removed
- `dashboard/src/components/CommandTerminal.tsx` — NativeSelect w-32 shrink-0, output panel h-[28rem]
- `docs/FEATURE_ROADMAP.md` — Asset Location Tracking section inserted (commit 883d8ff)
**claudetools repo (D:\claudetools):**
- `.claude/commands/feature-request.md` — new skill file
- `.claude/CLAUDE.md` — /feature-request added to Commands table
- `projects/msp-tools/guru-rmm/docs/unraid-ca-template.xml` — /dev/kvm and libvirt-sock mount entries added
- `projects/msp-tools/guru-rmm/agent/Dockerfile` — updated to match live repo
---
## Credentials & Secrets
- **Pluto (172.16.3.36) administrator password:** `Paper123!@#` — NOT YET IN VAULT. Pending vault entry at `infrastructure/pluto-build-server.sops.yaml`.
---
## Infrastructure & Servers
| Host | IP | Role | Notes |
|------|----|------|-------|
| Jupiter | 172.16.3.20 | Unraid primary / KVM hypervisor | Docker container rebuilt with /dev/kvm + libvirt-sock mounts |
| Saturn | 172.16.3.30 | GuruRMM server + ClaudeTools API | Gitea at :3000, RMM server at :3001, ClaudeTools API at :8001 |
| Pluto | 172.16.3.36 | Windows build server | Agent running v0.6.22 post-watchdog fix; is_virtual_machine: true, hypervisor: Jupiter |
**GuruRMM agent v0.6.22** — deployed to all enrolled agents via auto-update after build pipeline ran.
---
## Commands & Outputs
```bash
# Copy and run roadmap patch on server
scp D:/claudetools/tmp_roadmap_patch.py guru@172.16.3.30:/tmp/roadmap_patch.py
ssh guru@172.16.3.30 "python3 /tmp/roadmap_patch.py"
# Output: inserted
# Commit roadmap update
ssh guru@172.16.3.30 "cd /home/guru/gururmm && git add docs/FEATURE_ROADMAP.md && git commit -m 'docs: add Asset Location Tracking section to feature roadmap' && git push origin main"
# Output: [main 883d8ff] ... To 172.16.3.20:azcomputerguru/gururmm.git d9ec476..883d8ff main -> main
# Send coord messages to Howard (Python urllib, avoids backslash hook)
py -c "import urllib.request, json; ..."
# Output: ACG-TECH03L/claude-main 201 / Howard-Home/claude-main 201
```
---
## Pending / Incomplete Tasks
- **Pluto vault entry** — create `infrastructure/pluto-build-server.sops.yaml` with password `Paper123!@#` and standard fields (hostname, IP, role, admin credentials)
- **Pluto SSH key** — add DESKTOP-0O8A1RL public key to Pluto authorized_keys so paramiko password auth is no longer needed
- **GURU-BEAST-ROG enrollment** — not in GuruRMM; Mike may want to enroll it (site assignment TBD)
- **macOS agent** — build-agents.sh has TODO-MACOS; no Docker/install path implemented
- **Live terminal (xterm.js + PTY bridge)** — deferred; CommandTerminal is input-only for now
- **Policy wiring** — plan at `ticklish-questing-stallman.md` exists; deferred
- **BB-SERVER enrollment loop** — pre-existing duplicate key constraint, not addressed
- **PowerShell command_type bug on Windows PS 5.1** — agent prepends flags incorrectly; not addressed
- **Dashboard VM badges** — verify Jupiter (hypervisor) and Pluto (VM guest) display correctly after data fix
---
## Reference Information
- GuruRMM repo: `http://172.16.3.20:3000/azcomputerguru/gururmm`
- Asset Location Tracking roadmap commit: `883d8ff` (gururmm repo)
- /feature-request skill commit: `83e8e44` (claudetools repo)
- Coord API: `http://172.16.3.30:8001/api/coord`
- Ollama Tailscale endpoint (Howard's machines): `http://100.92.127.64:11434`
- Unraid CA template: `projects/msp-tools/guru-rmm/docs/unraid-ca-template.xml`
- Policy wiring plan: `C:\Users\guru\.claude\plans\ticklish-questing-stallman.md`