What
Before writing, sync now checks every path component from the config home down to the sync root and its staging and staging_pid folders, and aborts the whole round if any of them is a symlink or not a directory. Failures show up as "sync root refused (a symlink or stray file is in the way, or it was removed mid-round)" instead of silently writing through.
Details
- The root is re-verified partway through each round, when files are landed.
- Replacing an existing plugin directory now moves the old one aside, either renaming it to a
.replaced-<pid>-<rand>directory or moving it to a trash directory under the config home, and restores it if the replacement fails. - New warning telemetry:
plugins_sync_root_refused,skills_sync_root_refused,plugins_sync_trash_move_failed,plugins_sync_promotion_failed,skills_sync_manifest_unreadable. - No flag guards this; it is the sync path for everyone on this build.
Evidence
sync root refused (a symlink or stray file is in the way, or it was removed mid-round)
Strings lifted out of the shipped bundle, so the claim above can be checked against them.