Symptom
Connecting the Obsidian directory ("On My iPhone/Obsidian") shows the advisory "The folder you selected is itself a vault…" even though the selected folder is the vault container, and the vault list stays empty — the user-visible impression is that the Obsidian root is detected wrongly and vaults are not listed.
Cause (traced on device, 2026-07-08)
The container's top level held a stray .obsidian/ directory (plus .stfolder/.stignore leftovers of an earlier whole-root sync — the offering peer's vault config was synced straight into the root back then). The classification "is the selected root itself a vault?" relied solely on the presence of a top-level .obsidian/:
Layout observed (names genericized):
Obsidian/ ← selected container
.obsidian/ ← stray leftover
.stfolder/ .stfolder.removed-*/ .stignore
VaultA/ [real vault]
FolderB/ ← no .obsidian yet
Fix
A root holding at least one vault subfolder (direct subdirectory containing .obsidian/) classifies as a container, never as vault-as-root — one pure core (VaultManager.rootIsItselfVault) feeds every classification site. Decision record 014; regression suite VaultRootClassificationTests.
Related UX finding (same report)
Detected-but-not-yet-syncing vaults were invisible in the vault list (only synced folders produce rows), which amplified the "vaults are not listed" impression. Fixed by listing detected vaults as passive "not syncing yet" rows.
Symptom
Connecting the Obsidian directory ("On My iPhone/Obsidian") shows the advisory "The folder you selected is itself a vault…" even though the selected folder is the vault container, and the vault list stays empty — the user-visible impression is that the Obsidian root is detected wrongly and vaults are not listed.
Cause (traced on device, 2026-07-08)
The container's top level held a stray
.obsidian/directory (plus.stfolder/.stignoreleftovers of an earlier whole-root sync — the offering peer's vault config was synced straight into the root back then). The classification "is the selected root itself a vault?" relied solely on the presence of a top-level.obsidian/:VaultManager.grantAccess→ wrong selection advisoryVaultManager.acceptPendingShare→baseIsVault=true, soresolveSharePathcollapses the next incoming share into the container root instead ofroot/<name>— nesting every existing vault inside that share's synced tree (Multiple vaults are syncing to the same local path #45 family). Only the Label-default accept can sync into an existing non-empty, unconfigured folder (implicit merge) #54 merge confirmation stood in between.Layout observed (names genericized):
Fix
A root holding at least one vault subfolder (direct subdirectory containing
.obsidian/) classifies as a container, never as vault-as-root — one pure core (VaultManager.rootIsItselfVault) feeds every classification site. Decision record 014; regression suiteVaultRootClassificationTests.Related UX finding (same report)
Detected-but-not-yet-syncing vaults were invisible in the vault list (only synced folders produce rows), which amplified the "vaults are not listed" impression. Fixed by listing detected vaults as passive "not syncing yet" rows.