# 2026-07-14 — MSP360 backup fleet list → Discord DMs

## User
- **User:** Howard Enos (howard)
- **Machine:** Howard-Home
- **Role:** tech

## Session Summary

Howard asked for a list of all users and clients being backed up by Computer Guru, delivered to himself and Winter via Discord. Used the `msp360` skill (authoritative source for "is X backing up") to pull the live monitoring feed and users list from the MBS API: 35 companies, 59 backup users, 66 active backup plans, 88.43 TB total stored.

Built a per-company report (company, total space, each backup user/machine account with space used, plus flags for companies with zero active plans and plans in warning/failed state), chunked it under Discord's 2000-char limit (2 chunks), and sent via the `discord-dm` skill.

First send went to Mike and Winter — misresolved "me" in the request to Mike (from the userEmail context hint) despite identity.json saying Howard. Howard corrected this; re-sent the report to Howard, logged the correction to errorlog.md, and strengthened the existing `feedback_identity_precedence` memory to explicitly cover pronoun resolution ("me"/"I"/"my" = identity.json user for all send/notify/assign targets).

## Key Decisions

- Used MSP360 monitoring feed (not B2 bucket contents) as the source of truth for "being backed up" — per skill doc, a bucket with files does not prove a recent backup ran.
- Report grouped by company with per-user space and two flag types: `[WARNING: no active backup plans]` (users exist, nothing running) and `[N plan(s) warning/failed]`.
- Chunked messages at 1900 chars on line boundaries to stay under Discord's 2000-char limit.
- Did not re-send to Winter on the correction pass — she received the identical report in the first send.
- Updated the existing `feedback_identity_precedence` memory rather than creating a new one (same root trap, new manifestation via pronoun).

## Problems Encountered

- **Misrouted DM:** resolved "send to me and winter" as Mike + Winter; identity.json user is Howard. Howard never got the DM. Fixed by re-sending to Howard; logged `--correction` to errorlog.md; memory `feedback_identity_precedence` amended.

## Configuration Changes

- Modified: `.claude/memory/feedback_identity_precedence.md` — added pronoun-resolution rule ("me" = identity.json user) with 2026-07-14 incident.
- Appended: `errorlog.md` — correction entry (discord-dm, "me"=identity.json user).
- Scratch files (`./.msp_mon.json`, `./.msp_users.json`, `./.msp_chunk_*.txt`) created and deleted in-session.

## Credentials & Secrets

- None new. MSP360 API creds read from vault `msp-tools/msp360-api.sops.yaml`; Discord bot token from `projects/discord-bot/bot-token.sops.yaml` (both via their skills' standard paths).

## Infrastructure & Servers

- MSP360 MBS API: `https://api.mspbackups.com`
- Fleet snapshot (2026-07-14): 35 clients, 59 users, 66 plans, 88.43 TB stored.
- Companies with NO active backup plans (billed users, nothing running): Air Pros, Arizona Medical Transit, Martell and Associates, Rincon Vista Veterinary, Sorensen (0 GB stored!), Stamback Services, plus 5 unassigned users (incl. admin@azcomputerguru.com 15.21 TB, mike@azcomputerguru.com 428 GB).
- Plans with warnings/failures: Dataforth (2), Valleywide Plastering (2), Jimmy Company (2); one each: ACG-Internal, Anaise David, Cascades of Tucson, Desert RV, Financial Safeguards, Hartman, Instrumental Music, Rohrbach, Tucson Coin and Autograph.

## Commands & Outputs

- `py .claude/skills/msp360/scripts/msp360.py monitoring --json` / `users --json` — clean pulls.
- `bash .claude/scripts/discord-dm.sh <user>` (stdin) — sends OK; message ids: mike 1526659401262563493/1526659414612906034, winter 1526659426726055986/1526659439187202310, howard 1526713224869707817/1526713238270644365.
- `bash .claude/scripts/log-skill-error.sh "discord-dm" "..." --correction` — OK.

## Pending / Incomplete Tasks

- Offered but not started: triage of no-plan and failing clients (`msp360 monitoring --failed`, `--stale N`). Sorensen at 0 GB and the six no-plan companies are the obvious follow-ups.

## Reference Information

- Skills used: `msp360`, `discord-dm`, memory rule `feedback_identity_precedence`.
- MSP360 status codes: 0/1 OK, 2 warn, 3 fail, 4 running, 6 interrupted, 7 completed-with-warnings.

## Update: 17:41 PT — backup triage + expired-license fix attempt

### Summary

Triaged the failing and no-plan backup clients (Air Pros and Tucson Coin excluded per Howard). Pulled `monitoring --failed`, `monitoring --stale 30`, and the full license pool.

Key finding: the 2026-07-01 monthly renewal rolled 41 licenses to 2026-08-01, but 4 Server seats did NOT renew and expired — CS-SERVER (Cascades of Tucson), VWP-FILES + WINFileSvr (Valleywide Plastering), DESKTOP-BMBTQLI (Len's Auto). All four machines throw MBSLicense Critical; all are in automatic license mode (LicMode=2). Free pool has only ONE valid Server seat (exp 2026-08-01, id 7454b8e3-5aa7-43a1-b3c1-eb7605bad6c2); the other 9 free Server seats are also expired.

Attempted the fix via API (release expired + regrant). BLOCKED: `/api/Licenses/Release` returns HTTP 400 "Licensing API methods are not enabled for your account" — Grant/Release/Revoke are feature-gated off, same class as the /api/Computers gate. Fix is console-only.

### Triage results

P1 failures (non-license):
- Hartman / DESKTOP-EVA4H1A: daily plan hard-FAILED (ran 2026-07-14, no error detail in monitoring feed — needs agent-side log).
- Jimmy Company / Blaster2: local destination FULL (Critical, code 1506) on both plans incl. image/system-state.
- Financial Safeguards / FSG-SRV-02: no full backup scheduled -> retention policy cannot apply (code 1537).

P1 no-plan (billed users, zero plans reporting): Arizona Medical Transit (148 GB), Martell and Associates (3.27 TB), Rincon Vista Veterinary (1.87 TB), Stamback Services (3 TB), Sorensen (0 GB — never landed data). Need per-client human decision: reinstall agent or stop billing.

P2 stale successes: Instrumental Music IMC1 images (last 2024-10-24), Glaztech GTI-INV-VMHOST image+Hyper-V (2025-10-26/28), Tedards (2025-07-12, 0 GB), Tucson Safety TSAM-SERVER (2026-02-25), Desert RV local (2026-05-07), Len's Auto LAB-SVR image (2026-06-07), Dataforth SAGE-SQL old interrupted restore plan (cosmetic).

P3 benign: path-missing/file-in-use/skip-mask warnings (Anaise, Desert RV, Rohrbach, Dataforth PBX); IMC1 SQL LSN mismatch self-healed via forced full. "Consistency check" rows stuck Running/never look like UI artifacts.

### Key Decisions

- Fix order proposed: license seats -> Jimmy disk full -> Hartman failure -> no-plan decisions -> stale sweep.
- Did not experiment with granting expired pool seats; blocked by API gate anyway.
- License renewal = spending money + console access = Mike's call; proposed ask-forum DM to Mike (renew 4 Server seats + enable Licensing API methods), awaiting Howard's go.

### Problems Encountered

- `release-license --user-id` alone -> HTTP 400 (LicenseID field required). Retried with `--license-id`; logged to errorlog.
- `/api/Licenses/Release` with full payload -> HTTP 400 "Licensing API methods are not enabled for your account" — hard blocker, console-only fix.
- `billing --json` not a valid flag (billing subcommand has no --json; plain output is already JSON).

### Credentials & Secrets

- None new. Vault has ONLY the MSP360 API creds (`msp-tools/msp360-api.sops.yaml`, login kY9PvDdWki); NO console login stored — console admin is Mike's account (created API creds 2026-05-18).

### Reference Information

- Expired license IDs: WINFileSvr=93b3412b-9746-4949-a592-5369cd29d1c7, VWP-FILES=0a120352-aa4a-4785-bfdb-4e0c2980dd3c, CS-SERVER=7d26ae45-8af9-4fd0-8bed-011d18e82631, DESKTOP-BMBTQLI=52e2b4a4-da50-4980-bfad-61f3b397e559
- User IDs: WINFileSvr=30d7edce-1d60-4657-abc1-58ad30210e81, VWP-FILES=634e86db-b3e5-4f4e-ae9b-74d83eeb21de, CS-SERVER=08d55d69-bf76-40b5-ae45-b1bbe0064c14, DESKTOP-BMBTQLI=06109a61-2ba2-4547-8294-f88d5e1799ba
- Only valid free Server seat: 7454b8e3-5aa7-43a1-b3c1-eb7605bad6c2 (exp 2026-08-01)
- MSP360 status codes: 2 warn / 3 fail / 6 interrupted / 7 completed-with-warnings; error codes: 1407 MBSLicense, 1506 NotEnoughSpaceOnLocalDestination, 1537 retention-without-full, 1601 PathNotFound, 1605 file-in-use, 1811 SQL LSN mismatch.

### Pending / Incomplete Tasks

- AWAITING GO: ask-forum DM to Mike — renew 4 Server seats in MSP360 console + optionally enable Licensing API methods (and Remote Management API).
- Jimmy Company Blaster2: clear/expand full local backup destination.
- Hartman DESKTOP-EVA4H1A: investigate hard-failing daily plan (agent logs).
- Financial Safeguards FSG-SRV-02: schedule full backup or enable Forever-Forward-Incremental.
- No-plan clients (AMT, Martell, Rincon Vista, Sorensen, Stamback): reinstall-or-stop-billing decision per client.
- Stale P2 sweep (Instrumental, Glaztech, Tedards, Tucson Safety, Desert RV, Len's LAB-SVR).
- Deferred per Howard: Air Pros, Tucson Coin.
