Every write command — items enrich, tags audit fix, items duplicates resolve, items create/update/move/delete, import apply, vault push — flows through one mutation envelope with identical, predictable semantics. You never have to remember which command is dangerous; they all behave the same way.
Preview is the default. You get a plan/result envelope with zero changes. --yes applies; --dry-run always wins.
--agent does not auto-apply. Agent mode sets JSON + non-interactive defaults, but a write still needs an explicit --yes.
Gates cap the blast radius.--max-changes defaults to 500 (50 under --agent); irreversible ops (merge, permanent delete, empty-trash) refuse to run without --allow-destructive.
Read-your-writes. An applied write is replayed into the local mirror immediately, and the post-write item state comes back in the envelope — a re-audit sees the fix with no follow-up sync.
Journaled + reversible. Every applied run is recorded append-only (journal list / journal show). journal undo <run-id> reverses the reversible ops (tag renames, collection membership) and loudly refuses the rest (merges, deletions, field overwrites) rather than guessing.
zotiotagsauditfix--agent# preview: the merge plan, zero changeszotiotagsauditfix--agent--yes# applyzotiojournallist# find the run idzotiojournalundo<run-id># reverse the tag renames