From 918afc5c26f05eb2f20ec44269e7825d5b9f4e5b Mon Sep 17 00:00:00 2001 From: Howard Enos Date: Mon, 1 Jun 2026 21:11:29 -0700 Subject: [PATCH] sync: auto-sync from HOWARD-HOME at 2026-06-01 21:11:22 Author: Howard Enos Machine: HOWARD-HOME Timestamp: 2026-06-01 21:11:22 --- .../session-logs/2026-06-01-session.md | 55 ++++++++ wiki/clients/attrebesch.md | 132 ++++++++++++++++++ wiki/index.md | 1 + 3 files changed, 188 insertions(+) create mode 100644 wiki/clients/attrebesch.md diff --git a/clients/attrebesch/session-logs/2026-06-01-session.md b/clients/attrebesch/session-logs/2026-06-01-session.md index b8b8efa..177415a 100644 --- a/clients/attrebesch/session-logs/2026-06-01-session.md +++ b/clients/attrebesch/session-logs/2026-06-01-session.md @@ -127,3 +127,58 @@ Re-ran the corrected pipeline: 6118 raw -> 821 unique. Investigated high "Copies - Scripts: .claude/tmp/treb-extract.ps1, treb-merge.ps1, treb-enhance.ps1 - Agent: ba173f0c-19e8-488d-834c-1b6f6dfd5699 (DESKTOP-QNP3ON5) - Syncro #31953 (address book), customer 238740 + +--- + +## Update: 21:08 MST — contact data cleaning (names/emails/dedup) + local handoff + +### Session Summary + +Extended the contact recovery into a multi-pass data-cleaning effort after Howard verified the first output and found defects. Parsing notes into structured fields (treb-enhance.ps1, non-destructive) placed phones/addresses/emails but verification surfaced a malformed source: the contacts' `E-mail Address` field held junk single letters for 666/695 rows (real email scattered across Display Name / name fields / Notes), and the merge had keyed dedup on that junk. Rewrote treb-merge.ps1 around a unified identity model: per-record EMAILS (reconstructing an email split into First/Last like "jammerdavis737@gmail."+"com") and a BEST NAME (First/Last -> FullName/FileAs/Subject -> Display Name), with union-find dedup over shared email/name/derived-name signals (transitive = same person). + +Re-extracted all 16 PSTs to capture FullName/FileAs/Subject (treb-extract.ps1 updated). Iterated the merge several times, each verification revealing another layer: handle-names (badgerbd) needed Display-Name fallback; email-as-name with no `@` in the First part needed TLD/trailing-dot rejection; truly nameless contacts now show by their clean email; email local-parts like Emily_Schroeder were derived into real names (role/no-reply addresses excluded); mangled "david."/"rystrom" recovered to "David Rystrom"; and derived-name + raw-name signals were fed back into dedup to collapse the last duplicates. + +Howard proposed moving the data to Howard-Home for local iteration. Zipped the 15 `_work` JSONs + current FINAL into treb-contacts-data.zip (0.57 MB) on the Owner machine; Howard copied it to `C:\claudetools\.claude\tmp\treb-data\`. From there the merge/enhance ran LOCALLY via Windows PowerShell (path-swapped *-local.ps1 copies) with instant iteration and no RMM round-trips. + +Final converged result: 6118 raw -> 674 unique contacts, 0 invalid emails, 0 same-name duplicate groups, CSV round-trips clean (674 rows / 48 cols) = import-ready. 532 first+last, 71 first-only, 71 email-only (no source name); 633 with email, 206 phone, 67 address, 272 notes (preserved verbatim throughout). + +### Key Decisions + +- Non-destructive enrichment (copy out of Notes, never delete) held throughout — Notes preserved on all 272. +- Unified identity model: EMAILS + BEST NAME functions feed BOTH dedup signals and output fields, so derived names also drive merging. +- Union-find dedup over shared signals (email / clean First+Last / spaced Display Name / email-derived name / raw mangled name) to collapse cross-copy AND cross-field duplicates while limiting false merges (name signal needs both parts). +- Email reconstruction priority: any `@`-bearing value across the four email fields + one rebuilt from an email split into the name. Junk single-letter Address values dropped. +- Name resolution priority: clean First+Last -> FullName/Subject/FileAs -> Display Name (incl single token) -> First.Last mangle recovery -> email-local-part derivation (role addresses excluded) -> show-by-email. Nickname variants (Dave/David) left for shared-email linking, not auto-merged. +- Moved raw JSONs to Howard-Home for local PowerShell iteration — eliminated RMM latency for the many merge passes. + +### Problems Encountered + +- Malformed source email field (junk single letters); real emails elsewhere. Fixed via multi-field reconstruction + email-as-name rebuild; verified 0 invalid emails. +- Over/under-merge churn: PowerShell single-element-array collapse ($re[0] -> [char]) fixed with @() + [string]; high copies-merged (to 39) confirmed legitimate (consistent identity), not over-merge. +- Email-as-name with no `@` in First (e.g. "jeffrey."/"com") accepted as a name until IsRealNamePair rejected TLD-last / trailing-dot. +- Same-person-different-key duplicates (email-only copy vs named copy) persisted until derived-name + raw-name signals were added to dedup -> 0 dup groups. +- A blocked Remove-Item (path guard) in a local verify command; dropped the cleanup step (timestamped files make newest unambiguous). + +### Configuration Changes (this update) + +- treb-extract.ps1: capture FullName/FileAs/Subject (_full/_fileas/_subject). +- treb-merge.ps1: full rewrite to unified identity model (EmailsOf, BestName, IsRealNamePair, SplitName, NameFromEmail/TitleCase, union-find Signals/Find/Union, name sanitize, notes concat, audit cols). +- treb-enhance.ps1: unchanged logic (phones/addresses/emails from Notes, non-destructive). +- Local working copies: .claude/tmp/treb-merge-local.ps1, treb-enhance-local.ps1 (path-swapped to C:\claudetools\.claude\tmp\treb-data). +- Data moved local: C:\claudetools\.claude\tmp\treb-data\_work\*.json (15) + FINAL CSV. + +### Results / Deliverable (this update) + +- FINAL (local): C:\claudetools\.claude\tmp\treb-data\AT-Trebesch-Contacts-FINAL-20260601-210118.csv — 674 contacts, import-ready, Outlook native headers + 3 audit cols (Source PSTs / Source folders / Copies merged; Outlook ignores on import). +- Source ZIP on Owner box: C:\Users\Owner\Desktop\Contacts\treb-contacts-data.zip. + +### Pending / Incomplete (this update) + +- DELIVERY: final CSV is on Howard-Home; the Outlook import target is the Owner box (DESKTOP-QNP3ON5). Need to push it back via RMM or Howard copies it over. +- OPTIONAL: clean copy without the 3 audit columns; Syncro #31953 time/resolution note. +- Residual (acceptable): 71 email-only contacts genuinely have no name in source (mostly businesses/role addresses), shown by email. + +### Reference (this update) + +- Local data + scripts: C:\claudetools\.claude\tmp\treb-data\, .claude/tmp/treb-merge.ps1 / treb-enhance.ps1 / treb-extract.ps1 +- Pipeline: extract (Outlook COM, user_session) -> merge (union-find identity) -> enhance (notes->fields) -> verify diff --git a/wiki/clients/attrebesch.md b/wiki/clients/attrebesch.md new file mode 100644 index 0000000..500aba7 --- /dev/null +++ b/wiki/clients/attrebesch.md @@ -0,0 +1,132 @@ +--- +type: client +name: attrebesch +display_name: AT Trebesch +last_compiled: 2026-06-01 +compiled_by: Howard-Home/claude-main +sources: + - clients/attrebesch/session-logs/2026-06-01-session.md +backlinks: + - projects/gururmm +--- + +# AT Trebesch + +Residential client in Tucson, AZ. Single workstation. Syncro customer 238740. Onboarded into GuruRMM 2026-06-01. Primary active work: PST contact consolidation (Syncro #31953). + +--- + +## Profile + +- **Company type:** Residential (individual) +- **Contract type:** [unverified — check Syncro] +- **Billing rate:** [unverified] +- **Key contact:** treb737@earthlink.net | 520-529-4999 +- **Address:** 7280 N. Cathedral Rock, Tucson AZ +- **Syncro customer ID:** `238740` +- **Open tickets:** #31953 (address book / contact recovery), #32160 (assess for threats) + +--- + +## Infrastructure + +### Workstations + +- **DESKTOP-QNP3ON5** — Windows, single local user `Owner`. Agent ID `ba173f0c-19e8-488d-834c-1b6f6dfd5699`. Outlook = Microsoft 365 Apps x64, 16.0.19929.20172. Free space: C: 593 GB, D: 915 GB. + - Runs a **third-party Explorer shell replacement** — `Win32_Process explorer.exe` owner detection returns blank. Use `Win32_ComputerSystem.UserName` to detect the logged-on user (`DESKTOP-QNP3ON5\Owner`). See memory note `reference_trebesch_qnp3on5.md`. + +### Email & Identity + +- **Outlook / PST-based** (no M365 tenant confirmed). Client uses earthlink.net email (treb737@earthlink.net). Very large PST archive collection (~155 GB across 24 files). +- **M365 tenant:** Not documented. Outlook is M365 Apps x64 but no tenant-side management confirmed. + +### Network + +- **ISP / WAN:** [unverified] +- **Firewall:** [unverified] + +--- + +## GuruRMM + +- **Client name:** AT Trebesch +- **Client ID:** `a6dbe776-c3b0-4345-8c2c-597cff8a9b4d` +- **Site name:** Main +- **Site ID:** `2df75e13-4268-49db-babe-489b66729f87` +- **Site code:** `SWIFT-LION-2892` +- **Install page:** https://rmm.azcomputerguru.com/install/SWIFT-LION-2892 +- **Agent enrollment key:** Encrypted at `clients/attrebesch/gururmm-site-main.sops.yaml` (vault; do not regenerate unless compromised) + +### Enrolled Agents + +| Agent | OS | Agent ID | User | Notes | +|---|---|---|---|---| +| DESKTOP-QNP3ON5 | Windows | `ba173f0c-19e8-488d-834c-1b6f6dfd5699` | Owner | Third-party Explorer shell; use Win32_ComputerSystem.UserName for session detection | + +--- + +## Access + +- **Remote:** GuruRMM agent on DESKTOP-QNP3ON5 +- **Vault path:** `clients/attrebesch/gururmm-site-main.sops.yaml` (enrollment key; round-trip verified 2026-06-01) +- **Syncro:** https://computerguru.syncromsp.com/customers/238740 + +--- + +## Patterns & Known Issues + +- **Third-party Explorer shell — logged-on-user detection blank.** `Win32_Process explorer.exe` .GetOwner() returns empty. Workaround: `(Get-WmiObject Win32_ComputerSystem).UserName` correctly returns `DESKTOP-QNP3ON5\Owner`. Apply this to any WMI-based session-detection scripts targeting this machine. +- **PST email field corruption.** Source address book `E-mail Address` (Email1Address) field contained junk single-letter values for ~95% of contacts (666/695 rows). Real emails were scattered across E-mail Display Name, additional email fields, and Notes free-text. Any contact-extraction pipeline for this client must reconstruct real (@-bearing) emails from all available fields and key dedup on real-email-or-name — never on Email1Address alone. +- **Contacts stored in Notes free-text.** Phone numbers, street addresses, and secondary emails are encoded in the Notes field rather than in structured columns. A parse+enrich pass is required to populate Outlook's standard phone/address/email columns. +- **Heavy PST duplication.** 24 PST files total but only 16 are unique (byte-identical copies across Desktop\Outlook\backup\ and D:\E\). Deduplicate by name+size before mounting to avoid redundant AddStore work. +- **Large unmounted PSTs take ~9s per AddStore** (Outlook reads only the store index). Two 48 GB Outlook2.pst files each took ~9s and turned out to contain real address books (793 and 725 contacts). Do not skip large archives without probing — they may hold contact data. +- **Run COM scripts in `user_session` context.** Outlook COM requires the Owner session; SYSTEM context fails. GuruRMM command context must be `user_session` for treb-extract.ps1. + +--- + +## Active Work + +| Ticket | Summary | Status | +|---|---|---| +| #31953 | Address book / contact recovery — consolidate 24 PSTs into one Outlook-importable CSV | Delivery pending (CSV on Howard-Home; needs transfer to DESKTOP-QNP3ON5 for import) | +| #32160 | Assess for threats — pairs with /rmm diagnose once agent reporting confirmed | Open | + +### PST Contact Recovery (Syncro #31953) + +**Goal:** Extract all address-book contacts from the client's 24 PSTs and consolidate into one Outlook-importable CSV. + +**Pipeline:** +1. `treb-extract.ps1` — Phase 1: Outlook COM in `user_session`; mounts each unique PST via AddStore, reads real address-book folders (excludes Suggested Contacts / Recipient Cache), captures raw JSON per PST. MaxMB cap skips large unmounted stores (mounted stores always read); $MaxMB=0 overrides. +2. `treb-merge.ps1` — Phase 2: runs as SYSTEM; union-find identity model (EmailsOf + BestName functions; dedup signals: real email, clean First+Last, FullName/FileAs/Subject, email-derived name); reconstructs real emails from all four email fields + email-split-across-name-fields; keys on real-email-or-name, never on junk Email1Address. +3. `treb-enhance.ps1` — Phase 3: non-destructive; parses phones, street addresses (high-confidence pattern), and emails from Notes into structured Outlook columns; Notes left verbatim. + +**Final result:** 6,118 raw records → 674 unique contacts. 633 with email (all valid, 0 junk), 206 with phone, 67 with address, 272 notes preserved. 532 first+last, 71 first-only, 71 email-only (legitimately nameless in source — mostly role/business addresses). 16 unique PSTs scanned; 8 contact-bearing stores. + +**Deliverable:** `C:\claudetools\.claude\tmp\treb-data\AT-Trebesch-Contacts-FINAL-20260601-210118.csv` (local, Howard-Home). 674 rows, 48 Outlook-native columns + 3 audit cols (Source PSTs / Source folders / Copies merged — ignored by Outlook on import). + +**Scripts:** `.claude/tmp/treb-extract.ps1`, `treb-merge.ps1`, `treb-enhance.ps1`, `treb-merge-local.ps1`, `treb-enhance-local.ps1` (local path-swapped copies for Howard-Home iteration) + +**Data (local):** `C:\claudetools\.claude\tmp\treb-data\` — 15 per-PST JSON files + FINAL CSV. Source ZIP on owner box: `C:\Users\Owner\Desktop\Contacts\treb-contacts-data.zip`. + +**Pending delivery steps:** +- Transfer final CSV from Howard-Home to DESKTOP-QNP3ON5 (RMM push or manual copy) +- Import into Outlook and verify with client +- Log time + resolution note on Syncro #31953 +- Optional: name-cleanup pass for handle-style names; clean up intermediate CSVs from Desktop\Contacts + +--- + +## History Highlights + +| Date | Event | +|---|---| +| 2026-06-01 | Howard: GuruRMM onboarding — client + Main site created, SWIFT-LION-2892 enrollment key vaulted. DESKTOP-QNP3ON5 confirmed enrolled and checking in. | +| 2026-06-01 | PST inventory scan: 24 files, ~155 GB. COM probe confirmed Outlook COM works in Owner session; 794/374/366 contacts in three live stores; archive1.pst contact-empty. | +| 2026-06-01 ~20:16 MST | Extraction executed (Owner session via RMM): safe set first (771 unique), then all-PSTs (826 unique — giants held real address books). | +| 2026-06-01 ~21:08 MST | Multi-pass data cleaning: email field corruption found and fixed, union-find dedup rewrite, enrichment pass (Notes → structured fields), data moved to Howard-Home for local iteration. Final: 6118 raw → 674 unique contacts, 0 invalid emails, 0 duplicate groups. CSV verified import-ready. | + +--- + +## Backlinks + +- [[projects/gururmm]] — DESKTOP-QNP3ON5 enrolled (site: Main / SWIFT-LION-2892) diff --git a/wiki/index.md b/wiki/index.md index 6ec7f32..e8e99e8 100644 --- a/wiki/index.md +++ b/wiki/index.md @@ -45,6 +45,7 @@ Run `/wiki-lint` to check for stale entries and broken backlinks. | [Anaise](clients/anaise.md) | Single workstation client; contact David (anaisedavid.office@gmail.com); DESKTOP-O8GF4SD; creds in vault at clients/anaise/desktop-o8gf4sd.sops.yaml; onboarding incomplete; M365 enrollment unconfirmed | 2026-05-24 | | [ACG Website (azcomputerguru.com)](clients/azcomputerguru.com.md) | Public website redesign (Astro); score 33/40; placeholder testimonials + no-backend form are pre-launch blockers; OKLCH token design system; see internal-infrastructure.md for ACG servers | 2026-05-24 | | [Quantum WMS](clients/quantumwms.md) | WMS company; quantumwms.com tenant (ddf3d2c9); GoDaddy decoupling + M365 migration; 2x Business Premium + Exchange Online Plan 1; deadline 2026-06-03; Tenant Admin consented 2026-05-26 | 2026-05-26 | +| [AT Trebesch](clients/attrebesch.md) | Residential, Tucson AZ; Syncro 238740; GuruRMM enrolled (DESKTOP-QNP3ON5, SWIFT-LION-2892); PST contact recovery complete (674 unique contacts from 24 PSTs, ~155 GB); delivery pending | 2026-06-01 | ## Projects