{"version":"2.1.236","anchor":"skills-sync-refuses-to-touch-an-unsafe-root-matching-plugins","canonical_anchor":"skills-sync-refuses-to-touch-an-unsafe-root-matching-plugins","heading":"Skills sync refuses to touch an unsafe root, matching plugins","tier":"notice","area":"Elsewhere","scope":null,"heads_up":null,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.236\/e\/skills-sync-refuses-to-touch-an-unsafe-root-matching-plugins","release_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.236","markdown":"### Skills sync refuses to touch an unsafe root, matching plugins\n\nSkill sync now refuses to write when its root looks unsafe, matching plugin sync.\n\n**What**\n\nSkill syncing now checks its skills root, trash root and config home before doing anything and throws instead of writing when that root is refused, the same protection plugin sync already had. This is on for everyone in this build.\n\n**Details**\n\n- Refusals are reported at both the extract and sweep phases and recorded as `skills_sync_root_refused`, mirroring the plugin side's `plugins_sync_root_refused`.\n- The skills manifest is now read through schema parsing with per-field defaults, so a partly corrupt manifest loses only the bad fields instead of being discarded whole.\n- Plugin sync landing failures now report a cause: `download`, `root_refused`, `extract`, `local` or `deferred`, plus a `plugins_sync_unexpected_landing_cause` warning for the case that should not occur.\n\n**Evidence**\n\n`skills_sync_root_refused`\n\n- Area: Elsewhere\n- Tier: You'll notice\n- Useful: 2\/5\n- Signal: 1\/5"}