wiki: compile gururmm (fold policy-ui Fleet-Policy Console + WS-looper comms-durability; agent 0.6.79 beta / server 0.3.103, mig 068)

This commit is contained in:
2026-07-05 23:13:26 -07:00
parent d70cdd88e4
commit 355c5f1e3f
2 changed files with 24 additions and 7 deletions

View File

@@ -1,6 +1,6 @@
# Wiki Index
Last updated: 2026-07-05
Last updated: 2026-07-06
Compiled by: HOWARD-HOME/claude-main
This wiki is LLM-maintained. Do not edit articles manually — run `/wiki-compile` to update.
@@ -68,7 +68,7 @@ Run `/wiki-lint` to check for stale entries and broken backlinks.
| Article | Summary | Last Compiled |
|---|---|---|
| [GuruRMM](projects/gururmm.md) | RMM platform, Rust/Axum server + React dashboard + cross-platform agent; **agent v0.6.78 fleet-wide / server v0.3.99 / dashboard v0.2.83 beta**; ~360 enrolled; 67 migrations (through 067_policy_folders). Merge to main = build+deploy; channel default now FAIL-CLOSED beta (BUG-023), explicit promote to stable. Recent (2026-07-04/05): four bug-fix batches v0.3.95->v0.3.99 (easy-bugs, repair batch 2 w/ comms-durability Phase 1 COMPLETE + BUG-001 WMI thermal proven live, batch 3 w/ BUG-003 CLOSED + visible_agents view/trigger + --migrate-only deploy gate, batch 4 w/ command TTL + status reconciler + update supersede); **policy-core deployed** (Mike — policy folder tree + inheritance, migration 067, backfill gated; policy-ui spec next); **BUG-024 OPEN/CRITICAL** — Linux glibc incident, Linux binaries QUARANTINED pending glibc-floor build; 4 chronic one-way-WS agents fingerprinted (packet capture next). Active development | 2026-07-05 |
| [GuruRMM](projects/gururmm.md) | RMM platform, Rust/Axum server + React dashboard + cross-platform agent; **agent v0.6.78 fleet-wide stable / 0.6.79 beta / server v0.3.103 / dashboard = Fleet-Policy Console**; ~360 enrolled; migrations through 068_visible_agents_folder_id. Merge to main = build+deploy; channel default FAIL-CLOSED beta (BUG-023), explicit promote to stable. Recent (2026-07-06): **Fleet-Policy Management Console** shipped to PROD (policy-ui — folder tree table / place-devices / effective-policy viewer / version-history / backfill; migration 068, folder_id in API); **WS-looper comms-durability** hardening (bounded WS write-timeout + heartbeat-count blackhole-vs-stall diagnostic + AIMD adaptive keepalive; agent 0.6.79 beta / server 0.3.102). Prior (2026-07-04/05): four bug-fix batches v0.3.95->v0.3.99 + policy-core (migration 067). **BUG-024 OPEN/CRITICAL** — Linux glibc incident, Linux binaries QUARANTINED (re-quarantined every build) pending glibc-floor fix; 4 chronic one-way-WS agents now have a server-visible blackhole diagnostic. Active development | 2026-07-06 |
| [GuruConnect](projects/guruconnect.md) | ACG's proprietary Rust remote-access/remote-support tool (ScreenConnect-class) — Windows agent + web dashboard; **v0.3.0 production** at connect.azcomputerguru.com; versioned integration contract with GuruRMM; co-located on the physical .30 box (shares the PG cluster); next: SPEC-018 session broker / capture worker as SYSTEM | 2026-06-12 |
| [GPS -> GuruRMM Coverage Audit](projects/gps-rmm-audit.md) | Verify every GPS-billed client is fully enrolled in GuruRMM with services real (backup/AV/email); enrollment 111/189 (baseline 46); staging auto-enroll pipeline + 30-min harvest loop; found+fixed GuruRMM cross-site dup bug (v6.77); Phase 4 AV matrix (8 clients/20 devices NO-AV); billing findings HELD for Winter/Mike; AV migration BD->EDR (exception: Glaztech only) | 2026-07-04 |
| [Dataforth DOS — Test Datasheet Pipeline](projects/dataforth-dos.md) | DOS update system + TestDataDB pipeline (Node.js, PostgreSQL, Hoffman API); 469K records, 458.5K live on website; 2025 crypto attack recovery; security incident 2026-03-27; SCMVAS/SCMHVAS extension; email notifications via Graph API | 2026-05-24 |

View File

@@ -2,11 +2,14 @@
type: project
name: gururmm
display_name: GuruRMM
last_compiled: 2026-07-05
last_compiled: 2026-07-06
compiled_by: Howard-Home/claude-main
aliases:
- guru-rmm
sources:
- "gururmm@origin/main f0320a4: policy-ui Fleet-Policy Console (migration 068_visible_agents_folder_id, folder_id in API d028ca1, dashboard rebuild bd25fa9), PROD deploy; agent 0.6.79 / server 0.3.103"
- "gururmm@origin/main 07307e3: WS-looper comms-durability (write-timeout + heartbeat-count diagnostic + AIMD keepalive, cd9e799), agent 0.6.79 beta / server 0.3.102"
- "projects/msp-tools/guru-rmm/session-logs/2026-07/2026-07-05-howard-ws-looper-comms-durability.md"
- "gururmm@origin/main 01d962a: migrations 066-067, policy-core merge e7e90c2, FEATURE_ROADMAP BUG-003/018/023/024"
- "gururmm@origin/main: server/migrations/066_visible_agents_view.sql, 067_policy_folders.sql"
- "gururmm@origin/main: server/src/api/mod.rs (route surface at 01d962a — policy-folders endpoints, 39 modules)"
@@ -144,7 +147,7 @@ backlinks:
GuruRMM is a Remote Monitoring & Management platform built by Arizona Computer Guru LLC for internal MSP operations and eventual productization. The server (Rust/Axum) and dashboard (React/TypeScript) are production-deployed at https://rmm.azcomputerguru.com with approximately 360 enrolled agents (~229 fresh/online at last sample) across multiple client sites. The agent runs on managed Windows, Linux, and macOS endpoints.
**Current version (2026-07-05):** agent 0.6.78 fleet-wide (Windows amd64, ~229+ agents, promoted stable 2026-07-05 after a channel-race incident — see BUG-023) / server v0.3.99 / dashboard v0.2.83 beta. Migrations end at `067_policy_folders.sql`. Active `server_error` alerts: 0.
**Current version (2026-07-06):** agent 0.6.78 fleet-wide stable (Windows amd64, ~229+ agents) with **0.6.79 soaking on beta** (WS-looper comms-durability hardening) / server **v0.3.103** / dashboard rebuilt with the **Fleet-Policy Console** (policy-ui, PROD). Migrations end at `068_visible_agents_folder_id.sql`. Active `server_error` alerts: 0 (last verified 2026-07-06 03:22Z).
**Policy folders + inheritance ("policy-core") deployed 2026-07-05 (Mike, migration 067, merge `e7e90c2`):** the biggest architectural change of this compile window. An org-rooted **policy folder tree** now sits on top of the existing policy engine — each client gets a folder tree (exactly one root), any folder optionally references a library policy, and a device sits in exactly one folder, inheriting the merged policies of its folder ancestry (root->leaf) plus an optional per-asset override. This replaces the fixed System->Client->Site->Agent stack with a per-client tree while preserving identical effective-policy output during migration (the backfill is a deliberate, gated, dry-run-verified step — landing the migration changes zero behavior, since `agents.folder_id` is NULL fleet-wide until backfilled). Ships folder-tree CRUD + placement + version history REST API, recompute-and-push on policy edit (scoped to affected agents only), and policy versioning (`policy_versions`, immutable snapshot per edit, for diff/rollback). Migration renumbered 066->067 after colliding with `066_visible_agents_view.sql`, which landed on main in the same window from an unrelated bug-fix arc. Explicitly out of scope for this phase: module editor UI, drag-and-drop, simulate/dry-run preview UI, subtree RBAC, tags/multi-folder membership, conditional modules, compliance compare engine, App Store UI, and any agent-side wire-format change (none — this is server+dashboard only). A follow-on **policy-ui** shape spec (folder management dashboard UI) was added the same day (`01d962a`) — implementation not started.
@@ -176,6 +179,18 @@ GuruRMM is a Remote Monitoring & Management platform built by Arizona Computer G
## Recent Work
### 2026-07-06 — Fleet-Policy Management Console + agent folder_id in API (policy-ui, merge f0320a4, migration 068, PROD deploy)
The follow-on **policy-ui** work — scoped only as a thin component-assembly MVP the day before — was built out and merged to prod as a full **Fleet-Policy Management Console**. `PolicyFolders.tsx` was rebuilt (999-line rewrite; +2614/-526 across 12 dashboard files) into a console with a folder **tree table** (`FolderTreeTable`), folder CRUD/rename/move dialogs (`PolicyFolderDialogs`), a **place-devices** flow (`PlaceDevicesDialog` + `FolderPicker`), an **effective-policy viewer** with source attribution (`EffectivePolicyView`), a per-edit **version-history** diff view (`VersionHistoryDialog`), and an admin **backfill** trigger (`BackfillDialog`); `AgentDetail.tsx` was slimmed as folder assignment moved into the console. Server-side, `d028ca1` exposed `agents.folder_id` in the agent API and migration **068** (`068_visible_agents_folder_id.sql`) recreated the `visible_agents` view to add the column — the BUG-018 column-freeze convention in practice (any `ALTER TABLE agents ADD COLUMN` must recreate the `SELECT *` view or listings 500 fleet-wide). Direction was locked as "tri-model, full scope" (`0bd5f67`) before the build. Server advanced to v0.3.103, agent to 0.6.79.
---
### 2026-07-06 — WS-Looper Comms-Durability: Write-Timeout + Heartbeat Diagnostics + AIMD Keepalive (Howard-Home, merge 07307e3, agent 0.6.79 beta / server 0.3.102)
Follow-up on the chronic WS loopers (BUG-023/T2 field data): the four boxes cycle auth -> total agent->server silence -> 90s evict -> reconnect, and updating them did not clear it — a per-site network blackhole no cadence change can cure. The core keepalive-inversion (30s agent heartbeat), server half-open eviction (T2), and CommandAck durable delivery (T3) were all already shipped, so this session delivered the code-fixable + observability layers. **(1) Bounded WS writes** (`send_bounded`, `WRITE_STALL_TIMEOUT=90s`): the outbound + Pong sends were unbounded `write.send().await` sharing the `select!` arm with the reconnect timer, so a backpressured half-open socket (send buffer fills, no error for ~15 min) froze the whole loop **including reconnect** — a latent hang, now time-bounded -> force-reconnect. **(2) Heartbeat-count diagnostic:** the agent counts heartbeats written per session and reports the previous session's count in the auth payload; the server logs it — **nonzero + a prior "no inbound" eviction proves an agent->server network blackhole; 0 proves a local send stall** — making the blackhole-vs-stall verdict server-visible with no on-site packet capture. **(3) Adaptive keepalive / AIMD** (new `transport::keepalive` module): the heartbeat interval self-tunes per site across reconnects (halve on a short authenticated session, +5s when stable), clamped **5-45s** (max kept under the server's 90s evict window), persisted to disk, and gated on an authenticated-session flag so a server outage cannot drag the fleet to the floor. A 15-agent high-effort code review drove 5 fixes (AIMD firing on unauthenticated sessions -> fleet-to-floor collapse; max>evict window; pre-auth counter reset losing the diagnostic on the very failure it targets; write-timeout dropping large slow-link frames; duplicated bounded-write). Deployed agent 0.6.79 to **beta** (soaking); server 0.3.102 live+clean; the diagnostic fired on first reconnect; DESKTOP-3USU20B beta-pinned for an early read. **BUG-024 recurrence caught during deploy:** the build re-published a fresh glibc-2.43 Linux 0.6.79 straight into downloads — re-quarantined to hold the "scanner offers nothing for Linux" invariant; this recurs on every merge until the glibc floor lands.
---
### 2026-07-05 — Policy Folders + Inheritance ("policy-core") Deployed (Mike, merge e7e90c2, migration 067)
Replaced the fixed System->Client->Site->Agent policy stack with a per-client **folder tree**: each client gets exactly one root folder; any folder may optionally reference a library policy; a device sits in exactly one folder and inherits the merged policies of its folder ancestry (root->leaf) plus an optional per-asset override. Nine tasks: folder-tree schema + inheritance resolution + versioning (migration 067, renumbered from 066 after a same-window collision with `066_visible_agents_view.sql`); recompute+push on policy edit scoped to affected agents only (not a fleet-wide recompute); folder tree REST API (`/clients/:id/policy-folders`, `/policy-folders/:id[/rename|/policy|/parent]`, `/agents/:id/folder`); migration backfill job with a verification gate + dry-run mode (`/policy-folders/backfill`); integration tests. `policy_versions` gives every policy edit an immutable snapshot for diff/rollback and per-device "what changed."
@@ -391,7 +406,8 @@ Agent<->server communication is a persistent authenticated WebSocket with auto-r
- **No dedicated dashboard UI yet** — this is API/backend-only as of this compile (verify before claiming a management screen exists).
### Policy & Configuration Management
- **Policy folders + inheritance ("policy-core", NEW, deployed 2026-07-05, migration 067, merge e7e90c2):** per-client **folder tree** replacing the fixed global->client->site->agent stack for agents placed in a folder. Exactly one root folder per client; any folder optionally references a library policy (`policy_folders.policy_id`); `agents.folder_id` places a device in the tree; effective policy is the merged ancestry root->leaf plus an optional per-asset override. Recompute+push on policy edit is scoped to affected agents only. `policy_versions` gives every policy edit an immutable snapshot for diff/rollback and per-device "what changed." **Non-breaking migration by construction:** every new column/table is nullable, `folder_id` is NULL fleet-wide until an explicit, verification-gated, dry-run-capable backfill job runs (`POST /policy-folders/backfill`) — until then effective-policy resolution stays on the legacy path. **API:** `GET/POST /clients/:id/policy-folders`, `DELETE /policy-folders/:id`, `PUT /policy-folders/:id/rename`, `PUT /policy-folders/:id/policy`, `PUT /policy-folders/:id/parent` (move), `PUT /agents/:id/folder` (placement), `POST /policy-folders/backfill`. **Explicitly out of scope this phase:** module editor UI, drag-and-drop, simulate/dry-run preview UI, subtree RBAC, tags/multi-folder membership, conditional modules, compliance compare engine, App Store UI — no agent-side change (wire format unchanged). **No dashboard UI yet** — a follow-on `policy-ui` shape spec (folder tree view, agent placement, effective-policy viewer with source attribution, version history, admin backfill trigger) was added 2026-07-05 (`01d962a`), implementation not started.
- **Policy folders + inheritance ("policy-core", NEW, deployed 2026-07-05, migration 067, merge e7e90c2):** per-client **folder tree** replacing the fixed global->client->site->agent stack for agents placed in a folder. Exactly one root folder per client; any folder optionally references a library policy (`policy_folders.policy_id`); `agents.folder_id` places a device in the tree; effective policy is the merged ancestry root->leaf plus an optional per-asset override. Recompute+push on policy edit is scoped to affected agents only. `policy_versions` gives every policy edit an immutable snapshot for diff/rollback and per-device "what changed." **Non-breaking migration by construction:** every new column/table is nullable, `folder_id` is NULL fleet-wide until an explicit, verification-gated, dry-run-capable backfill job runs (`POST /policy-folders/backfill`) — until then effective-policy resolution stays on the legacy path. **API:** `GET/POST /clients/:id/policy-folders`, `DELETE /policy-folders/:id`, `PUT /policy-folders/:id/rename`, `PUT /policy-folders/:id/policy`, `PUT /policy-folders/:id/parent` (move), `PUT /agents/:id/folder` (placement), `POST /policy-folders/backfill`. **Explicitly out of scope for policy-core:** module editor UI, drag-and-drop, subtree RBAC, tags/multi-folder membership, conditional modules, compliance compare engine, App Store UI — no agent-side change (wire format unchanged).
- **Fleet-Policy Management Console (policy-ui, SHIPPED 2026-07-06, merge f0320a4, migration 068, PROD):** the dashboard `PolicyFolders.tsx` page is now a full console — folder **tree table**, folder CRUD/rename/move, a **place-devices** flow, an **effective-policy viewer** with source attribution, a per-edit **version-history** diff, and an admin **backfill** trigger. `agents.folder_id` is exposed in the agent API (`d028ca1`) and migration **068** (`068_visible_agents_folder_id.sql`) recreated `visible_agents` to add the column. Replaces the "no dashboard UI yet" state from the policy-core phase.
- **Legacy inheritance chain (agents not yet placed in a folder):** global -> client -> site -> agent; server computes merged effective policy, pushes via `ConfigUpdate`.
- Checks engine (`018`/`019`): cpu, memory, disk, ping, port, script, service. Policy-attached check templates (`024`).
- Remote registry (Windows): enumerate/read routed; write paths exist in the agent but are not routed yet [verify].
@@ -408,8 +424,9 @@ Agent<->server communication is a persistent authenticated WebSocket with auto-r
- Self-updater: server sends version + URL + SHA256; agent downloads, verifies, atomically swaps, restarts, auto-rolls-back on failed reconnect.
- Auto-update gated on effective policy `auto_update`. Force via `POST /agents/:id/update`.
- **Channel model:** new builds tag **beta**; agents default to **stable**; promotion is a deliberate re-tag. **Fail-closed as of 2026-07-05 (BUG-023 fix, server v0.3.98):** a missing or malformed `.channel` sidecar now classifies **beta**, not stable — closing a publish/tag race where a late "MARK AS BETA" pipeline phase left a multi-minute window during which an untagged build could be mass-offered to the entire stable fleet (incident detail in Recent Work / History). `build-windows.sh` now writes the beta sidecar atomically at publish; `promote_version` keys on agent binaries (not pre-existing sidecar files) and creates/overwrites `stable` sidecars, failing the request (500) rather than recording a rollout row that disagrees with disk on a partial write.
- **Agent WS transport durability (comms-durability, agent 0.6.79 beta, merge 07307e3):** update pushes and commands ride the persistent WS, so its liveness governs delivery. Three hardening layers shipped: **bounded WS writes** (`WRITE_STALL_TIMEOUT=90s`) so a half-open socket can no longer freeze the agent's send loop (incl. the reconnect timer); a **heartbeat-write counter** reported in the auth payload and logged server-side (nonzero count + a prior half-open eviction = agent->server network blackhole; 0 = local send stall — a server-visible verdict replacing on-site packet capture); and an **AIMD adaptive keepalive** (`transport::keepalive`) self-tuning the heartbeat interval per site 5-45s (kept under the 90s eviction window), persisted, gated on authenticated sessions. Targets the chronic per-site WS loopers (BUG-023/T2); a total agent->server blackhole stays network-layer (uncurable in code) — this hardens the freeze bug and makes the diagnosis server-visible.
- **Update-scanner platform coverage fixed 2026-07-05 (server v0.3.95):** the scanner's self-check previously tried to execute every binary regardless of platform to read its embedded version, dropping macOS/Linux artifacts entirely because they can't run on the Linux build host — **macOS/Linux agents had never been offered an update**. Now uses host-native-vs-foreign self-check regimes: foreign-platform binaries trust the filename-embedded version; host-native binaries stay a hard `--version` gate (with a best-effort exec-bit repair for suspected 0644 CI-copy artifacts). Post-fix: scanner indexes 8 platform/arch combos (was 4, Windows-only).
- **BUG-024 (OPEN, CRITICAL, mitigated 2026-07-05):** enabling Linux update offers for the first time (the fix above) exposed that Linux agent binaries >=0.6.77 are built against the build host's glibc 2.43 (Ubuntu 26.04) with no compatibility floor — every older-distro Linux agent that took the offer crash-looped on `GLIBC_2.39` not found (ix.azcomputerguru.com CloudLinux 9, Jupiter's Debian 12 container, a Lonestar container, presumed SL-SERVER). Mitigated by quarantining Linux binaries out of the downloads directory (scanner currently offers nothing for Linux). Real fix (glibc floor via an old-glibc build container or a musl static target, plus an `objdump -T` build gate) is pending — see History Highlights and FEATURE_ROADMAP BUG-024.
- **BUG-024 (OPEN, CRITICAL, mitigated 2026-07-05):** enabling Linux update offers for the first time (the fix above) exposed that Linux agent binaries >=0.6.77 are built against the build host's glibc 2.43 (Ubuntu 26.04) with no compatibility floor — every older-distro Linux agent that took the offer crash-looped on `GLIBC_2.39` not found (ix.azcomputerguru.com CloudLinux 9, Jupiter's Debian 12 container, a Lonestar container, presumed SL-SERVER). Mitigated by quarantining Linux binaries out of the downloads directory (scanner currently offers nothing for Linux). Real fix (glibc floor via an old-glibc build container or a musl static target, plus an `objdump -T` build gate) is pending — see History Highlights and FEATURE_ROADMAP BUG-024. **This recurs on every merge:** each build re-publishes a fresh glibc-2.43 Linux binary into downloads and must be re-quarantined by hand (done again for 0.6.79 on 2026-07-06) until the floor + gate are wired into the pipeline; the fix decision (musl vs old-glibc container) is with Mike.
- **Pending-update supersede (batch 4, server v0.3.99):** a stale `pending` update row is now superseded at re-dispatch time when a newer version exists or its target binary was pruned from disk (guarded: only rows over 1h old with a non-empty platform index) — previously all 13 pruned targets were blindly re-offered.
- **Legacy fleet build (Server 2008R2/Win7, Rust 1.77) DISABLED 2026-07-04** (`LEGACY_ENABLED=false`): the unpinned dep re-resolve pulled edition2024 crates Rust 1.77 cannot parse, fail-closing the entire Windows build. Last legacy artifact (agent 0.6.76) frozen and preserved for existing 2008R2/Win7 endpoints; modern builds advance normally. 2008R2 support returns only via a separate legacy-only rewrite (RMM_THOUGHTS Feature 12, Raw — not approved).
- **Universal self-detecting installer (Feature 9, P1 shipped v0.6.71):** one install path self-detects arch/OS and pulls the correct binary.
@@ -657,7 +674,7 @@ Gitea push to main
**Legacy variant disabled 2026-07-04 (`84a82a3`):** `LEGACY_ENABLED=false` in `build-windows.sh` gates the legacy wave/copy/deploy/symlink off entirely; the last-built legacy artifact (0.6.76) is preserved and excluded from cleanup so existing 2008R2/Win7 endpoints keep receiving that frozen build. Modern (amd64/x86/tray/debug) builds are no longer blocked by legacy dep-resolution failures.
**Channel/promotion model, downloads layout, dashboard beta/prod split, and Windows build host detail otherwise unchanged from the 2026-07-04 compile** — see History Highlights / Compilation Notes for full prior mechanics; current migration count is 067 (`067_policy_folders`).
**Channel/promotion model, downloads layout, dashboard beta/prod split, and Windows build host detail otherwise unchanged from the 2026-07-04 compile** — see History Highlights / Compilation Notes for full prior mechanics; current migration count is 068 (`068_visible_agents_folder_id`).
---