Reference
Arcane.firewall.rollback()
After confirmation, restores only an unexpired retained projection for the current canonical policy when it preserves every current deny. Requires firewall.manage.
This focused page is derived from the mechanically checked full member inventory.
Syntax
Arcane.firewall.rollback(expectation)
Parameters
{expectedPolicyGeneration, expectedStateGeneration}
Return value
Promise<FirewallOperationResult>
Description
After confirmation, restores only an unexpired retained projection for the current canonical policy when it preserves every current deny. Requires firewall.manage.
Overview
Arcane.firewall.rollback(expectation) restores one retained Arcane-owned
projection only when it belongs to the same canonical policy, remains
unexpired, and preserves every deny in the current projection. It requires
firewall.manage, app id firewall, elevated Core authority, exclusive
mutation, fresh generations, and separate confirmation. Current success is
simulation-only.
Rollback never means “use any previous policy.” The host refuses a different policy generation/hash or a projection that would weaken current deny coverage. It reapplies the retained projection in the current installed/enabled mode.
Result, side effects, and events
The exact result is {status, receipt, operation}. The tracked operation type
is "firewall.rollback" and returned status records lastOperation: "rollback". The native receipt's operation is "install" or "enable"
because that is the concrete reapplication performed; there is intentionally no
"rollback" receipt operation. Standard operation events are emitted.
Errors and recovery
Rollback-specific failures are FIREWALL_ROLLBACK_UNAVAILABLE,
FIREWALL_ROLLBACK_POLICY_MISMATCH,
FIREWALL_ROLLBACK_PROJECTION_EXPIRED, FIREWALL_CURRENT_POLICY_STALE, and
FIREWALL_ROLLBACK_WOULD_WEAKEN_POLICY. Keep the current state on rejection.
Use a separately confirmed Disable, Install, and Enable sequence when the
retained projection cannot be safely reused.
Example
async function rollbackFirewallAfterConfirmation(confirmRollback) {
const status = await Arcane.firewall.status();
if (!status.simulation || !status.supported || status.state.recoveryRequired) {
return null;
}
if (!confirmRollback(status)) {
return null;
}
return Arcane.firewall.rollback({
expectedPolicyGeneration: status.policy.generation,
expectedStateGeneration: status.state.generation
});
}