Skip to content

Change Requests

A change request (CR) is the atomic unit of work in Nexplane. Every infrastructure action — rotating a key, isolating a host, updating a firewall rule — is modeled as a structured change request with a defined target, parameters, safety review, approval gate, execution, and typed rollback.

Lifecycle

Draft → Planned → Awaiting Approval → Approved → Executing → Verifying → Completed
                                                                        ↘ Rolled Back
                                                                        ↘ Failed
State Description
Draft Created, not yet submitted
Planned Safety review passed, submitted for approval
Awaiting Approval Waiting for required approvers
Approved All approvals received
Executing Connector or agent is running the change
Verifying Post-execution check running
Completed Change applied successfully
Rolled Back Change reversed via rollback
Failed Execution error; rollback may be available

Safety Review

Before a CR can be submitted for approval, the Safety Engine evaluates it:

  • Risk score — calculated from change type inherent risk, asset environment (prod vs staging), blast radius (how many systems depend on this asset), and rollback availability
  • Blocking conditions — some scenarios prevent submission entirely (e.g., a critical-asset change with no rollback strategy defined, or a freeform shell command)

See Safety Engine for the full ruleset.

Approval Tiers

Risk Level Score Approval Required
Low 1–3 None (auto-approved in non-prod)
Medium 4–6 1 approver
High 7–8 1 approver (approver or admin role)
Critical 9–10 2 approvers (approver + admin)

Approval policies are configurable per organization.

Rollback

Every change type defines its own inverse operation. Rollback is a first-class action: it goes through the same approval flow as the original change and produces its own audit log entry.

Rollback availability is shown on every CR. Some change types explicitly mark rollback_supported: false (e.g., promote_db_replica) and display a blast radius warning at approval time.

Audit Trail

Every state transition is recorded immutably with a timestamp, the acting user, and the full request/response payload. Audit events are queryable via GET /audit-events/.

Change Freeze

If a change freeze is active, the approve and execute endpoints return 423 Locked. Emergency bypass requires the ir_responder role, a mandatory justification header, and produces an audit log entry. See Compliance & Governance.