Guide for network engineers

How to verify a network change: pre- and post-checks by vendor

A change is not verified because the commands ran and nobody called. Capture state before the window, capture it again after, compare the two against what you intended, and record one verdict with the evidence in the change ticket.

15-minute read · Free Excel workbook

The method: capture, change, capture, compare

Every verification follows the same four steps, whatever the platform.

  1. Write the intent and the rollback trigger first. One sentence on what should change, a list of what must not change (the invariants), and the measurable condition that makes you roll back. Example: “Allow VLAN 230 on the uplink trunks of dist-1 and dist-2; no other VLAN, port-channel or spanning-tree root changes; roll back if any access switch loses its uplink for more than 60 seconds.”
  2. Capture the pre-state. Run the same command set on every device in scope, including both members of every redundant pair, as close to the window as you can. Save each output to a file named with the change number, the device, pre or post, and the time.
  3. Make the change, then capture the post-state twice. Once immediately after the window, and once after a delay: 30 minutes at least, longer if the change affects traffic that peaks later. ARP and MAC aging, BGP hold timers and DHCP leases mean some failures only appear later.
  4. Compare. Diff the configuration against the pre-change copy and read every changed line against the intent. Then compare state: neighbors, route counts, port-channel members, redundancy roles, MAC and ARP counts, counters and probe results.

Three habits make the comparison trustworthy:

  • Complete captures. Disable paging first: terminal length 0 on Cisco (opens in a new tab) IOS XE, Cisco NX-OS (opens in a new tab) and Arista EOS (opens in a new tab), set cli screen-length 0 on Juniper (opens in a new tab) Junos (opens in a new tab), set cli pager off on PAN-OS.
  • Two reads, not cleared counters. Read counters twice, a known interval apart. A counter that rises between two reads tells you what is happening now; a cumulative total does not, and clearing counters erases history someone else may need.
  • The data plane, not only the control plane. A neighbor can be up while traffic is dropped. Keep a list of probes (ping, TCP connect, application checks) across the paths the change touches, and run the same list before and after.

Words in capitals in the commands below (PEER, NAME, INTERFACE, ADDRESS, CHG-NUMBER) are placeholders for your values.

What to check for each change type

Match the checks to the change. For each type, the list says what must be true afterward.

  • Routing (BGP). Every session that was established is established again. Prefixes received and advertised per neighbor match the baseline, or differ exactly as intended. Best paths for your key prefixes are unchanged unless the change targeted them. No new flaps in the log.
  • Routing (OSPF). The same neighbors in FULL state (on a broadcast segment, 2WAY between two routers that are neither DR nor BDR is normal). Route counts per area and source match the baseline. Interface costs are as intended.
  • Interfaces and port-channels (LAGs). Every interface in scope is up, with no new input or CRC errors between two reads. Every port-channel has the same members bundled as before, and the LACP partner on each member is the device you expect.
  • ACL or firewall policy. The traffic you meant to permit passes and the traffic you meant to block does not, tested with a policy lookup and a live probe. Hit counters rise on the new or changed entries. An explicit final deny does not start climbing.
  • VLAN and spanning tree. The VLAN exists, is active, and is allowed on exactly the intended trunks; the rest of each allowed list is unchanged. The root bridge for each VLAN or instance is unchanged. The topology-change count stops rising after the window. MAC table counts return close to the baseline.
  • First-hop redundancy (HSRP, VRRP). Each group is active (HSRP) or master (VRRP) on the intended router, with a standby or backup present. Preemption and tracking behave as designed.
  • MLAG and vPC. Peer link and keepalive up, consistency checks passing, every MLAG or vPC interface active on both peers, no new orphan ports.
  • HA pairs (firewalls, supervisors, stacks). Both members present, roles as expected, configuration and state synchronized, and no unplanned failover during the window.
  • Software upgrades. The intended release is running, and committed where the platform asks for it, on every member. Modules, transceivers and licenses match the baseline; neighbor, route, MAC and ARP counts are back to the baseline; no new crash or error messages. Separate the lines a new release adds by default from lines that disappeared: a missing line after an upgrade is a regression until proven otherwise.

One trunk mistake is worth checking every time. On Cisco (opens in a new tab) IOS XE and Cisco NX-OS (opens in a new tab), switchport trunk allowed vlan 230 replaces the whole allowed list, while switchport trunk allowed vlan add 230 adds to it. Compare the allowed list before and after any trunk change.

Cisco IOS XE pre- and post-checks

Run each command before and after the change on every device in scope. On a Catalyst stack, run them on the active switch; the output covers every member.

Save a copy of the running configuration before you start. After the change, show archive config differences with that file name compares it with the running configuration. With no file name, the same command compares the startup configuration with the running configuration, which is the quickest way to find unsaved work before the window.

Cisco IOS XE
CheckCommandWhat good looks like
Unsaved changes before you startshow archive config differencesNo differences between the startup and running configuration, so the window starts from a saved, known state
Pre-change configuration copycopy running-config flash:CHG-NUMBER-pre.cfgFile saved in flash before the first change
Configuration diff after the changeshow archive config differences flash:CHG-NUMBER-pre.cfgOnly the lines the change intended: + marks lines added since the copy, - marks lines removed
BGP sessionsshow ip bgp summaryEvery neighbor that was established shows a prefix count in State/PfxRcd (not Idle or Active); counts match the baseline or the intended change
BGP prefixes advertisedshow ip bgp neighbors PEER advertised-routesOnly the prefixes your policy intends; the total matches the baseline
OSPF neighborsshow ip ospf neighborSame neighbors as the baseline, in FULL (2WAY between two DROTHER routers is normal)
Routing table sizeshow ip route summaryCounts per source (connected, static, OSPF, BGP) match the baseline or the intended delta
Path to a key destinationshow ip route ADDRESSSame next hop and outgoing interface as the baseline, unless the change targeted this path
Interface stateshow ip interface briefEvery interface in scope up/up; nothing that was up is now down
Interface errorsshow interfaces INTERFACEInput errors and CRC counters do not rise between two reads a minute apart
Port-channel membersshow etherchannel summaryEach port-channel in use (SU or RU) with the same members bundled (P) as the baseline
LACP partnershow lacp neighborThe partner system ID on every member is the device you expect
ACL hitsshow ip access-lists NAMEMatches rise on the intended entries; an explicit final deny does not climb (the implicit deny keeps no counter)
VLANsshow vlan briefVLAN present, active and assigned to the intended access ports
Trunksshow interfaces trunkVLAN allowed and forwarding on the intended trunks; allowed lists otherwise unchanged
Spanning-tree rootshow spanning-tree rootRoot bridge for each VLAN unchanged
Spanning-tree topology changesshow spanning-tree detail | include ieee|occurr|fromTopology-change count stops rising after the window; the last change came from a port you touched, if any
MAC table (Catalyst switches)show mac address-table countCounts per VLAN close to the baseline once hosts have returned
HSRPshow standby briefActive and Standby routers per group as in the baseline; no group stuck in Init
VRRPshow vrrp briefMaster and Backup per group as in the baseline
Supervisor, route processor or stack redundancyshow redundancyPeer in STANDBY HOT; redundancy mode as in the baseline
Stack members (Catalyst)show switchEvery member Ready, with the same roles as the baseline
Software releaseshow versionIntended release on every device; uptime shows only the planned reload
Install state (install mode)show install summaryTarget release activated and committed (C); nothing left activated but uncommitted (U)
Hardware inventoryshow inventorySame modules and transceivers as the baseline
Log since the windowshow loggingNo new tracebacks, err-disabled ports, neighbor flaps or duplicate addresses

Syntax varies by platform and software version; test in a lab first.

Cisco NX-OS pre- and post-checks

Create a checkpoint before every change. checkpoint NAME saves the configuration in a form NX-OS (opens in a new tab) can diff and roll back to, and show diff rollback-patch checkpoint NAME running-config shows exactly what changed since. Checkpoint names must be unique and must not start with the word system.

Add vrf all, or vrf NAME, to routing commands when your design uses VRFs. ACL hit counts appear per entry only when the ACL includes statistics per-entry.

Cisco NX-OS
CheckCommandWhat good looks like
Unsaved changes before you startshow running-config diffNo differences between the running and startup configuration
Checkpoint before the changecheckpoint NAMECheckpoint listed in show checkpoint summary
Configuration diff after the changeshow diff rollback-patch checkpoint NAME running-configOnly the lines the change intended
BGP sessionsshow ip bgp summary vrf allEvery neighbor that was established shows a prefix count; counts match the baseline or the intended change
BGP prefixes advertisedshow ip bgp neighbors PEER advertised-routesOnly the prefixes your policy intends
OSPF neighborsshow ip ospf neighbors vrf allSame neighbors in FULL (2WAY between two DROTHER routers is normal)
Routing table sizeshow ip route summary vrf allCounts per protocol match the baseline or the intended delta
Interface stateshow interface briefEvery interface in scope up; nothing that was up is now down
Interface errorsshow interface counters errorsNo error counter rises between two reads
Port-channel membersshow port-channel summaryEach port-channel SU or RU, with the same members (P) as the baseline
LACP partnershow lacp neighborThe partner system ID on every member is the device you expect
ACL hitsshow ip access-lists NAMEMatches rise on the intended entries (per-entry counts need statistics per-entry in the ACL)
VLANsshow vlan briefVLAN present and active on the intended ports
Trunksshow interface trunkVLAN allowed and forwarding on the intended trunks
Spanning treeshow spanning-tree summaryMode, and the VLANs this switch is root for, match the baseline
Spanning-tree topology changesshow spanning-tree detailTopology-change counts stop rising after the window
MAC tableshow mac address-table countCounts close to the baseline once hosts have returned
HSRPshow hsrp briefActive and Standby per group as in the baseline
VRRPshow vrrpMaster and Backup per group as in the baseline
vPC statusshow vpcPeer adjacency formed, keepalive peer alive, consistency status success, every vPC up
vPC consistencyshow vpc consistency-parameters globalLocal and peer values match for every parameter
Orphan portsshow vpc orphan-portsNo new orphan ports compared with the baseline
Supervisor redundancy (modular chassis)show system redundancy statusOther supervisor in HA standby
Software releaseshow versionIntended release on every switch
Modulesshow moduleEvery module in the same state as the baseline (active, ha-standby or ok)
Upgrade impact, before the windowshow install all impact nxos bootflash:IMAGEImpact per module is what the plan assumed (disruptive or non-disruptive)
Log since the windowshow logging logfileNo new errors, flaps or crashes
Who changed whatshow accounting logConfiguration commands in the window match the change

Syntax varies by platform and software version; test in a lab first.

Arista EOS pre- and post-checks

Make the change in a configuration session. configure session NAME holds the change until you commit it, show session-config diffs shows exactly what the commit will do, and that diff is the one you attach to the ticket. Inside the session, commit timer 00:10:00 commits with an automatic rollback unless you confirm with configure session NAME commit before the timer expires. Both commits are state-changing and belong in the approved window.

ACL hit counts appear per entry only when the ACL includes counters per-entry.

Arista EOS
CheckCommandWhat good looks like
Unsaved changes before you startshow running-config diffsNo differences between the running and startup configuration
Pre-change configuration copycopy running-config flash:CHG-NUMBER-pre.cfgFile saved in flash before the first change
Review the change before commit (inside the session)show session-config diffsOnly the lines the change intends
BGP sessionsshow ip bgp summary vrf allEvery peer that was Estab is Estab again, with prefix counts as in the baseline
BGP prefixes advertisedshow ip bgp neighbors PEER advertised-routesOnly the prefixes your policy intends
OSPF neighborsshow ip ospf neighborSame neighbors in FULL (2WAY between two DROTHER routers is normal)
Routing table sizeshow ip route summaryCounts per source match the baseline or the intended delta
Interface stateshow interfaces statusEvery interface in scope connected; nothing newly notconnect or errdisabled
Interface errorsshow interfaces counters errorsNo error counter rises between two reads
Port-channel membersshow port-channel denseSame active members per port-channel as the baseline
ACL hitsshow ip access-lists NAMEMatches rise on the intended entries (per-entry counts need counters per-entry in the ACL)
VLANsshow vlanVLAN present and active on the intended ports
Trunksshow interfaces trunkVLAN allowed and forwarding on the intended trunks
Spanning treeshow spanning-treeRoot bridge and port roles as in the baseline
MAC table for a VLANshow mac address-table vlan VLAN-IDEntries for the VLAN present again, close to the baseline count
VRRPshow vrrpMaster and backup per group as in the baseline
VARP virtual routershow ip virtual-routerVirtual addresses active on both switches (a VARP gateway is active on both)
MLAG statusshow mlagState active, negotiation connected, peer-link up; no inactive or active-partial MLAG ports
MLAG consistencyshow mlag config-sanityNo inconsistencies reported
MLAG interfacesshow mlag interfacesEvery MLAG active-full
Supervisor redundancy (modular systems)show redundancy statusPeer supervisor in standby and ready for switchover
Software releaseshow versionIntended release on every switch
Boot imageshow boot-configBoot image points to the intended release
Extensionsshow extensionsSame extensions installed as before the upgrade
Reload causeshow reload causeOnly the planned reload
Log since the windowshow loggingNo new errors, flaps or crashes

Syntax varies by platform and software version; test in a lab first.

Juniper Junos pre- and post-checks

Junos (opens in a new tab) has no running and startup split: the committed configuration is active, and it is what the device boots. Use the commit tools instead. commit check validates the candidate. commit confirmed 10 commits with an automatic rollback after 10 minutes unless you confirm with commit; it is state-changing, so run it only in the approved window. commit comment "CHG-NUMBER" ties the commit to the ticket.

After the change, show configuration | compare rollback 1 shows what the last commit changed. If the change took several commits, find the right rollback number in show system commit. set cli timestamp prints the time above every output, and appending | save /var/tmp/FILE to a show command keeps the output on the device.

Juniper Junos
CheckCommandWhat good looks like
Uncommitted changes (configuration mode)show | compareNothing pending in the candidate before you start
What the last commit changedshow configuration | compare rollback 1Only the lines the change intended
Commit historyshow system commitCommits in the window match the change, with the change number in the comment
BGP sessionsshow bgp summaryEvery peer that was Established shows active/received/accepted counts as in the baseline
BGP prefixes advertisedshow route advertising-protocol bgp PEEROnly the prefixes your policy intends
BGP prefixes receivedshow route receive-protocol bgp PEERSame prefixes as the baseline, or the intended delta
OSPF neighborsshow ospf neighborSame neighbors in Full (2Way between two DROther routers is normal)
Routing table sizeshow route summaryCounts per table and protocol as in the baseline
Interface stateshow interfaces terseAdmin and link up on every interface in scope
Interface errorsshow interfaces INTERFACE extensiveInput errors and framing errors do not rise between two reads
LAG membersshow lacp interfacesEvery member collecting and distributing; partner as expected
Firewall filter countersshow firewallCounters on the intended terms rise; discard counters do not jump (terms need a count action)
VLANsshow vlansVLAN present with the intended interfaces
Spanning-tree rootshow spanning-tree bridgeRoot bridge as in the baseline; topology-change count stops rising
Spanning-tree portsshow spanning-tree interfacePort roles and states as in the baseline
MAC table sizeshow ethernet-switching table | countLine count close to the baseline once hosts have returned
VRRPshow vrrp summaryMaster and backup per group as in the baseline
MC-LAG peeringshow iccpICCP connection to the peer established and liveness detection up
MC-LAG interfacesshow interfaces mc-aeLocal and peer status as designed; no member down
Virtual Chassisshow virtual-chassisEvery member present, with the same roles as the baseline
Routing Engine redundancyshow chassis routing-engineOne Routing Engine in the primary (master) role and the other backup, as in the baseline
Graceful switchover readiness (run on the backup Routing Engine)show system switchoverGraceful switchover on; configuration and kernel databases ready
Software releaseshow versionIntended release on every member
System alarmsshow system alarmsNo new alarms
Chassis alarmsshow chassis alarmsNo new alarms
Log since the windowshow log messages | last 200No new errors, flaps or crashes

Syntax varies by platform and software version; test in a lab first.

Palo Alto Networks PAN-OS pre- and post-checks

Save a copy of the configuration before you start, then review the pending change with show config diff, or with Preview Changes in the commit dialog of the web interface, before you commit. test security-policy-match tells you which rule a flow would hit without sending traffic: run the same test flows before and after. Run the HA checks on both firewalls of a pair.

The routing commands below apply to the legacy routing engine. If the Advanced Routing Engine is enabled, the routing show commands differ; use the CLI reference for your release.

Palo Alto Networks PAN-OS
CheckCommandWhat good looks like
Disable pagingset cli pager offComplete output in your capture
Release and content versionsshow system infoPAN-OS and content versions as intended, and the same on both HA peers
Pending changes before commitshow config diffOnly the changes you intend to commit
Pre-change configuration copy (configuration mode)save config to CHG-NUMBER-pre.xmlSaved before the first commit
Commit resultshow jobs allCommit job finished with result OK; any warnings read and understood
HA state (both firewalls)show high-availability stateRoles as in the baseline; running configuration synchronized
Rule lookuptest security-policy-match from ZONE-A to ZONE-B source SRC-IP destination DST-IP protocol 6 destination-port PORTThe intended rule and action for each test flow; flows through rules you did not touch match the same rules as before
Rule hit countsshow rule-hit-count vsys vsys-name vsys1 rule-base security rules allHits rise on new or changed rules; the cleanup or default deny does not start climbing
Drop countersshow counter global filter delta yes severity dropNo new drop reasons, or only those the change explains (delta shows the change since the previous run)
Sessionsshow session infoActive session count in line with the baseline for the time of day
Interfacesshow interface allEvery interface in scope up, in the intended zone and virtual router
Routes (legacy routing engine)show routing routeRoutes for key prefixes as in the baseline
BGP (legacy routing engine)show routing protocol bgp summaryPeers established, with prefix counts as in the baseline
OSPF (legacy routing engine)show routing protocol ospf neighborSame neighbors in full state
IPsec tunnelsshow vpn ipsec-saSecurity associations present for every tunnel in scope
System log since the windowshow log system direction equal backwardNo new HA, routing or interface errors (newest entries first)

Syntax varies by platform and software version; test in a lab first.

How to decide the verdict

“Completed” is a workflow state, not an outcome. Record one of five verdicts, and decide in this order:

  1. Blocked. The change did not start, or stopped before its first state-changing step, because a pre-check or the go/no-go gate failed. Example: the pre-check found the standby firewall out of sync. The evidence is the failed pre-check.
  2. Rolled back. The change was made and then reversed, because the rollback trigger fired or the team chose to back out, and the post-rollback checks show the baseline restored. If the rollback did not restore the baseline, you have an incident: open one and record Degraded.
  3. Degraded. The change is in place, but the intent was only partly met, or something outside the intent changed and stayed changed. Example: an upgrade completed and reachability held, but a DHCP relay line disappeared from one of two cores. Record the regression, its owner and the fix.
  4. Inconclusive. No regression found, but the evidence is incomplete: no baseline for a device in scope, a post-check not run, the delayed check skipped. Say what is missing and what would close the gap.
  5. Verified. The intent was met, every invariant held, every difference between pre and post is explained by the intent, and the delayed check passed.

Any difference you cannot explain blocks Verified. “Probably noise” goes in the ticket as a question with an owner, not as a pass. See change verdict and completed is not verified.

Where to store the evidence

The change record is the record. Months later it is where the next engineer, the problem manager or an auditor will look, so the evidence belongs there, not in a chat thread or on a laptop.

  • Attach the raw files: pre, post and delayed outputs per device, the configuration diff and the probe results, named consistently, for example CHG-NUMBER_DEVICE_post_TIMESTAMP.txt.
  • Write a short work note: the verdict, one sentence of reason, the checks run, who verified and when.
  • Close with the verdict, not with “successful”. If your ITSM close codes only offer success or failure, put the verdict in a field of its own, or at the start of the closing note, so it can be reported.
  • Remove secrets (keys, community strings, password hashes) before attaching configurations. On Arista EOS (opens in a new tab), show running-config sanitized masks them.
  • Link related records: the incident a failed change caused, or the problem record a Degraded verdict opens.

Checklist

Change window checklist

Get the template

Change verification checklist

An Excel workbook with a change register, a per-device check log for pre, post and delayed results, a command library for Cisco (opens in a new tab) IOS XE, Cisco NX-OS (opens in a new tab), Arista EOS (opens in a new tab), Juniper (opens in a new tab) Junos (opens in a new tab) and PAN-OS, and the verdict rules.

Excel workbook (.xlsx) · free

  • One email with a personal download link, valid for 72 hours.
  • No attachments, no drip campaign; we may follow up once, by a person.
  • Your details are sent securely and never placed in the page URL.

With or without REAP

How REAP helps

Before a change runs, REAP assesses it against topology, reachability, security policy and known CVEs, using state snapshots and path tracing. Post-change verification, a before-and-after comparison with the evidence in the change ticket, is a Pilot deliverable today: one real change window is verified with your team in every pilot, and automated state packs, verdicts and silent-failure detection are In development. See product status.

CapabilityStatus
Change impact analysis (pre-execution)Available
Path trace: forward, reverse and at a past point in timeAvailable
Post-change verification: before-and-after comparison, evidence in the change ticketPilot deliverable

Status labels as on the product status page, September 2026 release.

Questions

Straight answers

How long after the change should the delayed check run?

Long enough for the timers and traffic the change touches. 30 minutes covers most protocol timers. Changes that affect DHCP relay, ARP or MAC aging, or traffic that peaks later in the day, need a check after that peak or after the next lease or aging cycle. Put the delayed check time in the plan so it is not skipped when the window runs late.

Should I clear counters before the change?

Usually not. Take two reads a known interval apart before the change and two after. The difference gives you the rate, and the history stays available to anyone investigating something else on the same device.

What if there is no baseline for a device?

Then that device cannot be Verified, even if everything looks fine. Capture what you can after the fact (the configuration archive, logs, neighbor state), say in the ticket what is missing, record Inconclusive unless you found a regression, and add the device to the pre-check list for the next change.

Does a change pushed by automation need the same checks?

Yes. Automation proves the commands were applied as written. It does not prove the network behaves as intended afterward. The same pre- and post-checks apply, and they are straightforward to automate alongside the change.

We backed out halfway. Is that Rolled back or Degraded?

If you reversed the change and the post-rollback checks match the baseline, record Rolled back. If part of the change remains, or the rollback left a difference from the baseline, record Degraded and open an incident or problem record for what is left.

Bring us your last P1.

Keep the root cause to yourself; in a 30-minute session we walk through how REAP would have investigated it, evidence first. The replay on your own network happens inside the proof of value.