# Datto -> SharePoint FULL reconciliation - COMPLETE - 2026-07-02/03

## Outcome

**557 missing files recovered; all 5 site mappings independently verified at zero genuinely-missing.**

| Site | Datto files | Missing found | Recovered | Verified residual |
|---|---|---|---|---|
| Donor Services | 57,329 | 74 | 73 | 1 = intentional ghost-skip ("26-02328 - Copy.pdf", same-size renamed sibling in SP) |
| Admin | 6,301 | 472 | 468 + 4 (long-path retry) | 0 |
| Birth Biologic Activity Reports | 1 | 1 | 1 | 0 |
| Quality (QSD) | 3,768 | 11 | 11 | 0 |
| Supply Management | 160 | 0 | - | 0 |

sp-only counts (files in SP not in Datto: staff's new post-migration work) and size-diffs
(docx uniformly larger in SP = SharePoint Office property promotion; content-harmless) are
expected and documented per-site in C:\GuruCompare\ on ACG-DWP-X-BB.

## Root cause (answers "how was it missing after the sync to 0")

The 6/27 delta upload used simple Graph PUTs which **silently skip files >=4MB**; the
"reconciled to 0" claim trusted the uploader's own success reporting. Quality got the
chunked-upload fix 6/30; Donor Services and Admin were never re-verified. Admin was worst
(472 files, incl. >260-char long-path victims in consultant folder trees). Staff had begun
manually recreating missing donor PDFs (e.g. 26-04085.pdf, Mary Ster, 7/2).

## Method (repeatable)

`C:\GuruCompare\bb-fix-all.ps1` on ACG-DWP-X-BB (source in ClaudeTools scratch/session log):
per-site full inventory diff (path+size, case-insensitive) + rail-guarded fix:
- chunked upload sessions for >=4MB, simple PUT below
- conflictBehavior=fail (never overwrites SP)
- same-size-in-folder ghost detection (never resurrects renamed files)
- \\?\ long-path file opens; FileShare::ReadWrite (Datto service can stay running)
- fail-hard SP enumeration w/ 429 retry; sanity-abort if SP looks empty; per-site fresh token

Run via GuruRMM per site: `powershell -File C:\GuruCompare\bb-fix-all.ps1 -Site <n>`
(fresh Graph token to C:\GuruCompare\tok.txt first). Logs: C:\GuruCompare\<site>-fix-log.txt.

## Gotchas hit (memorialized)

- PS5.1 under RMM powershell -File: `-Headers $H` script-scope hashtable sent EMPTY
  Authorization ("Access token is empty") - build headers inline. Memory: ps51-invoke-restmethod-headers-variable.
- Two failed runs masqueraded as token expiry / clock skew; capturing the Graph error BODY
  was what cracked it.
- ACG-DWP-X-BB clock was NTP-corrected 8:03 PM 7/2 (had drifted while parked).

## Open items

- OneDrive placeholder mirror on ACG-DWP-X-BB for standing local comparisons: policies ready
  to push; needs interactive OneDrive sign-in as sysadmin@birthbiologic.com via ScreenConnect.
- Datto Workplace service on the VM left RUNNING (catch-net for the still-active
  donor-scan-to-Datto workflow; 2 scans from 6/29 + HR file were among the recovered).
  Decide: keep as ongoing catch-net vs re-freeze.
- Client comms: staff can stop manually recreating missing April/May donor records.
