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

## Session Summary

Started as incident response for Valley Wide Plastering: after the weekend G: file-share
migration (SERVER3 → VWP-FILES), the whole office lost G:. Diagnosed via GuruRMM across all
27 VWP agents — the file server (VWP-FILES) was healthy with 0 active SMB sessions, and every
workstation's live G: mapping was a stale persistent `\\192.168.0.20\G-drive` (legacy SERVER3
IP that no longer answers SMB). The GPP drive-map action was "Update", which can't override an
existing persistent drive letter, so the GPO's correct `\\VWP-FILES\G-drive` never applied.
Fixed durably by flipping the `MappedDrives` GPO G: entry to **action=Replace** (+ GPT.ini/AD
versionNumber bump, replicated to PDC + VWP_ADSRVR), then remapped 13 logged-in workstations
live and verified G: accessible. Billed 1.0h warranty on ticket #32418 and emailed the client.

Pivoted to CryoWeave: "mail isn't getting to recipients." Found cryoweave.com is on M365 (not
the IX webserver). SPF already authorized M365 and aligned; the gaps were no DKIM and no DMARC.
Published DMARC (`p=none` → hardened to `p=quarantine`), removed a stale `mail.cryoweave.com`
CNAME pointing at the old Neptune Exchange, onboarded the cryoweave tenant to the ComputerGuru
remediation suite (single-consent link → provision), created an ACG Global-Admin break-glass
`sysadmin@cryoweave.com`, published the M365 DKIM selector CNAMEs and enabled signing (verified
`Status=Valid` and a real Gmail-delivered test showing spf=pass / dkim=pass(d=cryoweave.com) /
dmarc=pass). Stood up a reusable DMARC reporting pipeline: `rua@azcomputerguru.com` shared
mailbox + the cross-domain `_report._dmarc` authorization on azcomputerguru.com's Cloudflare
zone. A message trace showed Greg barely sends via M365 (2 sends/10d, both delivered) — the
real failing mail is likely a non-M365 path (Gmail send-as), which now fails the hardened DMARC.

Built two skills: **discord-dm** (DM org members/channels via the bot — for copy-paste-friendly
delivery of wrapped command lines) and **rmm-search** (flexible, client-scoped machine finder so
queries can't bleed across clients). Then built a fleet-wide **error-logging system**: a canonical
`log-skill-error.sh` helper capturing three categories — execution failures, user **corrections**
of bad assumptions, and preventable **friction** (token-wasting self-inflicted errors). Made it
mandatory in CLAUDE.md + skill-creator, retrofitted ~30 skill scripts (3 parallel sub-agents),
and seeded this session's real corrections + friction. Finished with a memory-dream run that
cross-referenced the new errorlog: merged a true duplicate DM memory I'd just created, corrected
the stale "suite has no Mail.Send" claim, fixed an index dup, and logged a memory-dream defect.

## Key Decisions

- **VWP G: fix = GPP action Replace, not per-machine remap only.** Replace authoritatively
  deletes+recreates G: every refresh, beating leftover persistent `.20` maps for all profiles —
  durable across users/machines. Live remap of logged-in users was the immediate-relief layer.
- **CryoWeave warranty (1.0h) on the migration ticket #32418, customer-visible note.** The outage
  was fallout from our weekend work; logged as warranty, emailed via Syncro (no separate mailbox send).
- **DMARC hardened only to `p=quarantine`, not `p=reject`.** No aggregate-report data yet and an
  unverified non-M365 sender (IX website); quarantine is recoverable. Promote to reject after ~1
  week of clean reports (coord todo `b4b9036e`).
- **DMARC rua → reusable `rua@azcomputerguru.com`, NOT INKY.** INKY is only for INKY-onboarded
  domains. Cross-domain auth needs a per-domain `<domain>._report._dmarc.azcomputerguru.com` record
  (a single `*` wildcard can't match a 2-label reported domain).
- **rmm-search: flexible over faithful.** Per Mike, optimize for first-try correctness (multi-field,
  normalized, subsequence) rather than replicating the UI Omnibox exactly.
- **Error log generalized beyond skills.** Captures corrections + friction too; repeats of documented
  gotchas are the highest-value entries (a rule/memory isn't working). One file, type-tagged, for linting.
- **Retrofit delegated to 3 parallel sub-agents** (disjoint file sets) for speed + consistency;
  coverage verified by grep, not trusted (one agent's "prior pass" claim was misattribution).

## Problems Encountered

- **`is_connected` null fleet-wide** in the RMM API — used `last_seen` recency (<5min) for online state.
- **Fresh-onboard EXO app-only 401** for ~20 min after consent (role/Exchange.ManageAsApp propagation);
  Graph worked immediately. Waited and retried; DKIM/trace then succeeded.
- **GA role assignment 404** right after creating sysadmin@ — new-user directory replication lag; retried, 201.
- **"Suite has no Mail.Send" was wrong** — I read the EXO-audience token's roles; the Exchange Operator
  app has Graph Mail.Send. Mint a Graph-audience token before concluding a permission is missing.
- **memory-dream `--apply-safe` created a duplicate index line** from a false-orphan (keys on `name:`
  slug, not the `(file.md)` link). Removed the dup; logged the defect to errorlog.
- **Friction (logged):** Git-Bash `/tmp` path mismatch, shell env not persisting between Bash calls,
  argv length limit passing large JSON, PowerShell variable case-insensitivity ($guid/$gUid collision).

## Configuration Changes

New:
- `.claude/scripts/log-skill-error.sh`, `.claude/scripts/discord-dm.sh`, `.claude/scripts/rmm-search.sh`, `.claude/scripts/rmm-search.py`
- `.claude/skills/discord-dm/SKILL.md`, `.claude/skills/rmm-search/SKILL.md`, `.claude/commands/discord-dm.md`, `.claude/commands/rmm-search.md`
- Memories: `feedback_dmarc_rua_inky_onboarded_only.md`, `reference_cloudflare_access.md`, `feedback_rmm_search_skill.md`

Modified:
- `.claude/CLAUDE.md` (error-logging mandate: exec + correction + friction)
- `.claude/skills/skill-creator/SKILL.md` (require log helper in new skills)
- `errorlog.md` (broadened header + seeded corrections/friction/defect entries)
- ~30 skill scripts retrofitted with `log-skill-error.sh` (b2/bitdefender/mailprotector/packetdial/coord py; remediation-tool + onboard365 bash; vault, rmm-auth, post-bot-alert, agy, grok, 1password, run-onboarding-diagnostic)
- Memory cleanup: merged `feedback_dm_wrapped_command_lines.md` → `feedback_dm_wrapping_commands_to_mike.md` (deleted the former); `feedback_365_remediation_tool.md` (Mail.Send + token-audience correction); `MEMORY.md` index fixes
- `.claude/skills/remediation-tool/references/tenants.md` (cryoweave onboarded)

DNS (cryoweave.com zone on IX/whmapi1): added `_dmarc` TXT (p=quarantine), added `selector1/2._domainkey` CNAMEs, removed stale `mail` CNAME. azcomputerguru.com (Cloudflare): added `cryoweave.com._report._dmarc` TXT `v=DMARC1;`.

## Credentials & Secrets

- **sysadmin@cryoweave.com** — ACG-owned Global Admin (break-glass) created in the CryoWeave M365
  tenant. Password VAULTED at `clients/cryoweave/m365-sysadmin.sops.yaml` (field `credentials.password`)
  AND in 1Password "Clients" vault item "CryoWeave - M365 SysAdmin (ACG Global Admin)". No license/mailbox;
  password set to not expire. MFA not yet registered. (Not transcribed here — vault is the source of truth;
  repo never holds plaintext secrets.)
- **rua@azcomputerguru.com** — shared mailbox (DMARC reports) in ACG's M365 tenant; no license; mike@ has FullAccess.
- Cloudflare API: `services/cloudflare.sops.yaml` (`credentials.api_token_full_dns`; zone_id_azcomputerguru `1beb9917c22b54be32e5215df2c227ce`).

## Infrastructure & Servers

- **CryoWeave M365 tenant:** `44705a37-b5d8-4bb1-882d-e18775612ada` (cryoweave.onmicrosoft.com + cryoweave.com). MX → cryoweave-com.mail.protection.outlook.com. DKIM Enabled/Valid (selector1/2). DMARC p=quarantine.
- **azcomputerguru.com tenant:** `ce61461e-81a0-4c84-bb4a-7b354a9a356d`. DNS on Cloudflare.
- **VWP-FILES:** 172.16.9.132 + 192.168.0.20 (dual-homed; .20 = old SERVER3 IP). G: share Everyone:Full. GPO `MappedDrives` GUID `{7D1AAC5B-2E39-4D6C-9248-AEC511E2A86D}`, G: action now R, version 5046272.
- VWP DCs: VWP-DC1 (PDC, 172.16.9.2), VWP_ADSRVR (192.168.0.25). IX webserver 172.16.3.10 / 72.194.62.5.

## Commands & Outputs

- Find machines: `bash .claude/scripts/rmm-search.sh hyperv valleywide` (client-scoped).
- DM Mike: `bash .claude/scripts/discord-dm.sh mike "<link>"`.
- Log an error: `bash .claude/scripts/log-skill-error.sh "<ctx>" "<msg>" [--correction|--friction] [--context "k=v"]`.
- EXO via app: mint Graph token with `computerguru-exchange-operator` client creds (`scope=https://graph.microsoft.com/.default`) for `POST /users/<upn>/sendMail`; `get-token.sh exchange-op` is EXO-audience only.
- Gmail header on the cryoweave test: spf=pass, dkim=pass (header.d=cryoweave.com, s=selector1), dmarc=pass (p=QUARANTINE dis=NONE) — delivered to inbox.

## Pending / Incomplete Tasks

- **Promote cryoweave DMARC to p=reject** after ~1 week of clean reports in rua@ (coord todo `b4b9036e`).
- **Confirm Greg's send path** — message trace shows almost no M365 outbound; likely Gmail send-as (would now fail DMARC). Move him onto the M365 mailbox or have him send a comparison test.
- **Register MFA (or CA-exclude) on sysadmin@cryoweave.com** (break-glass decision).
- **Fix memory-dream false-orphan/duplicate-index detector** (logged in errorlog).
- **WIN-AD-SRVR-2 SYSVOL** convergence for the VWP GPO edit (AD replicated; DFSR was catching up).

## Reference Information

- Syncro ticket #32418 (VWP G-Drive Migration, id 112613439) — 1.0h warranty, Resolved.
- Commits: `73a67870` (error-logging system) → `9960da5f`; `9b9513f6` (memory cleanup) → `55acc7f9`.
- DKIM CNAME targets: `selector1-cryoweave-com._domainkey.cryoweave.w-v1.dkim.mail.microsoft` (+ selector2).
- ComputerGuru apps: Sec Inv `bfbc12a4`, Exchange Operator `b43e7342`, User Manager `64fac46b`, Tenant Admin `709e6eed`.
- GPO backup on VWP-DC1: `C:\Temp\gpo-backup\`.
