Capability security
Declare where change is allowed.
Primary root
Relative DSL paths resolve against --root, or the invocation working directory if omitted. They never resolve against the script’s directory.
undo plan ./scripts/migrate.undo --root /opt/acme
undo run ./scripts/migrate.undo --root /opt/acme --yesAdditional roots
An absolute path outside the primary root is denied unless it maps beneath a repeatable allowed directory. The most-specific capability wins.
undo run migrate.undo --root /opt/acme \
--allow-path /etc/acme --allow-path /var/lib/acme --yesTraversal boundary
Go os.Root handles enforce actual access. UndoLang also rejects lexical .. escapes, symlink mutation parents, undeclared absolute paths, capability-root deletion, and the primary root’s reserved .undo tree.
Symlinks
Deleting or moving a symlink acts on the link entry. Copying a symlink is rejected. Directory traversal never follows symlink directories implicitly.
Concurrency limit: roots are locked independently. Two roots with overlapping
--allow-path trees can race; no global capability lock exists.