Forum Discussion
AutoSave disabled when opening SharePoint-synced files from Finder after macOS Tahoe 26.6 update
Root cause: the sync root is registered with Office in NFC while the filesystem holds NFD
avallesalas is right, and I think it is the cause rather than a contributing factor. I hit this on my own organisation's tenant, then reproduced it deliberately on an unrelated tenant, with a control that differs by exactly one character. Here is the reproduction, the measurement, and the part that surprised me: correcting the plist is not enough.
1. Minimal reproduction — any tenant, any Mac, five minutes
In a SharePoint site where you can create libraries, create two document libraries whose names differ only by an accent:
Documents (ASCII)
Documentì (accented)Same site, same permissions, same File Provider domain, same client, same Mac, same minute. Put a couple of .xlsx in each — files that have never been opened on that Mac — and sync both with the Sync button. Open one file from each library from Finder, and with each workbook open ask Excel what it thinks it has:
osascript -e 'tell application "Microsoft Excel" to get full name of active workbook'Observed:
Documents → https://<tenant>.sharepoint.com/sites/<site>/Documents/s-8.xlsx
Documentì → /Users/<user>/Library/CloudStorage/OneDrive-.../<site> - Documentì/7.xlsxA https:// answer means Office has the cloud identity: AutoSave on, co-authoring works. A /Users/... answer means it does not. Replicated on a second Mac, same account, same result. No client restart is needed for a shared library — the registration is written in the composed form at the first sync.
2. The check, if you want to know whether you are in this case
Read-only, 30 seconds:
python3 - <<'EOF'
import os, plistlib, subprocess, unicodedata
P = os.path.expanduser("~/Library/Group Containers/UBF8T346G9.OfficeOneDriveSyncIntegration/Library/Preferences/UBF8T346G9.OfficeOneDriveSyncIntegration.plist")
d = plistlib.loads(subprocess.run(["defaults", "export", P, "-"], capture_output=True).stdout)
for sid, e in sorted(d["SyncEngineProviders_OneDrive"].items()):
mp = e.get("MountPoint")
if not mp:
continue
parent, want = os.path.dirname(mp), os.path.basename(mp)
real = next((v for v in os.listdir(parent) if unicodedata.normalize("NFC", v) == unicodedata.normalize("NFC", want)), None)
if real is None:
print("MISSING ", mp)
continue
print("%-10s %s" % ("SAME" if real == want else "DIFFERENT", mp))
if real != want:
print(" registry %s" % want.encode().hex(" "))
print(" disk %s" % real.encode().hex(" "))
EOFIt compares each registered scope path against the name the directory actually reports, byte for byte, and prints the two byte sequences when they differ.
DIFFERENT on a scope means that scope is affected. SAME everywhere means you have something else, and that matters — see point 6.
3. Caught in the act on a personal OneDrive
I captured the provider registry immediately before and immediately after quitting and relaunching the OneDrive client, changing nothing else, and diffed the two. Excluding timestamps the diff has exactly one entry, and the two lines look identical to the eye:
registry directory on disk result
before the restart NFD cc 80 NFD cc 80 co-authoring WORKS
after the restart NFC c3 a0 NFD cc 80 co-authoring DEADThe correct form is written on the account-setup path and the composed form on every subsequent start. That is why, for a personal OneDrive whose tenant display name carries an accent, this comes back at every login, and why deleting the account's local state and re-adding the account is the only thing that restores it. In my case it held for 2 days and 7 hours — exactly the interval in which the client happened never to be restarted.
4. Correcting the plist is not sufficient — this is the part I did not expect
I rewrote MountPoint and BackingMountPoint with the exact spelling the filesystem reports, resolved component by component, flushed cfprefsd, and fully quit and relaunched Excel so that it re-read the registry. Verified afterwards: registry matches disk byte for byte, and the path Office holds for the document matches the registered MountPoint byte for byte as an exact prefix.
The document is still treated as local. Same outcome on two independent scopes, on two different tenants.
So the comparison that fails is not the one between Office and the plist — the plist entry is a downstream copy. The composed form is throughout the client's own persisted state: SyncEngineDatabase.db, OCSI.db, the account .ini, UXDatabase.db, the whole ListSync tree. A raw byte census over those trees gave me about 1900 composed occurrences against 114 decomposed. Office's own storage, by contrast, is mostly decomposed — which is what you would expect from something that receives its paths from the filesystem.
Please do not spend your afternoon rewriting that plist. I did, twice, and it changes nothing.
5. An objective counter, instead of squinting at the AutoSave toggle
D=$(dirname "$(grep -l <your-tenant-host> ~/Library/Application\ Support/OneDrive/settings/Business*/ClientPolicy.ini | head -1)")
sqlite3 "$D/OCSI.db" "select count(*) tot, coalesce(sum(lastSetPropsResult is not null),0) setprops, datetime(max(lastSetPropsTime),'unixepoch','localtime') last from ocsi_property_records;"setprops counts the documents for which Office completed the registration handshake. On my two healthy accounts it is in the thousands; on the affected one it stood at 0 out of 2898 tracked documents — the handshake had never once succeeded for that account on that machine.
One trap, and it cost me two days: a document that was registered at some point in the past does not increment the counter. Every measurement has to be made with a file that has never been opened before on that Mac — otherwise you will measure a false negative and conclude you are fine.
6. If you have no accent anywhere — please run the check in point 2 and say so
Several of you report this with no special character in sight, which is why avallesalas hedged. Three possibilities, and they are worth separating before they get merged into one:
- the accent is in the site or library name rather than the tenant name (that is qostech_madion 's case, and it is why the language trick doesn't cover it);
- the accent is in the localised OneDrive folder name — which is exactly why Levitas ' "switch the OneDrive app to English and restart" works when it works, and why it is unreliable: it only helps where the localised name is the thing carrying the character;
- or you genuinely have a byte-identical registry and are hitting a different defect that happens to share the symptom. If the check prints SAME for every scope and you are still broken, that is a distinct bug and it deserves to be reported as one rather than folded into this.
7. One last thing, for anyone who has been told to reinstall
Windows clients in the same tenants are unaffected — APFS preserves whichever form it was given and decomposes by default, NTFS does not — so this looks like a problem with the individual Mac when it is nothing of the sort. serkantekkesin reinstalled macOS and Office over this. If your check in point 2 prints DIFFERENT, no amount of reinstalling will help, and it is worth saying so to support before they send you down that road.
For reference, the matching step is documented behaviour: per the Cloud Storage Partner Program docs, Office "checks if the path of the local file passed in subsumes the path under the third-party mountpoint", and on macOS NSURLIsUbiquitousItemKey returns true if the registered domain "is a subpath of the local file path". A path-prefix test is exactly what two spellings of the same path defeat.
If a couple of you can run the five-minute A/B in point 1 on your own tenants, this stops being a single report.
Marco
Thanks, Marco!
I followed the diagnostic steps and can confirm that we have the same NFC/NFD mismatch. The registered OneDrive path is NFC-normalized, while the corresponding folder name on the file system is NFD-normalized.
Our company name contains an “ü”, and the mismatch occurs in that part of the OneDrive root path. This strongly suggests that the Unicode normalization issue is contributing to the problem in our environment.