Know the impact of every network change before deployment.

Optimesh builds a deterministic digital twin of your network from its configurations and tests every proposed change against it.

Change is accelerating. Review can’t keep up.

Automation and AI now write changes faster than any team can review them. Optimesh tests every one first.

  1. Manual

    Device by device.

  2. Automated

    Hundreds of devices at once.

  3. AI-generated

    Faster than review.

  4. Tested first

    Every change, on a digital twin.

Every change is tested before it is approved.

A one-line firewall change, blocked before merge.

Describe it. Config Studio writes it.

Every draft is tested on the twin before an engineer sees it.

Reviewable. Exact config lines, with evidence.
Independent. AI never grades its own work.
Config Studio · chat
Ask Config Studio to make a change…

Built for the enterprise

Multi-vendor and multi-cloud

Cisco, Juniper, Arista, Palo Alto Networks, Fortinet, AWS, Azure, GCP and Kubernetes.

Supported platforms

Integrated with existing workflows

Pull requests, ServiceNow, Jira and Terraform.

Integrations

Deployed on your infrastructure

Self-hosted, with no access to production devices.

Security
Example change review

The change and its verdict, side by side.

Config Studio · illustrative workflowdemo · read-only
{ } Generated change
Auto-filled
Target device
Vendor
Intent
Routers
48 / 48 verified
Switches
71 / 72 online
Firewalls
12 / 12 verified
Cloud SGs
320 / 320 clean
Illustrative dashboardSample data

See the network impact before you deploy.

Every verdict comes with the routes, flows, and rules behind it. Hammerhead checks what it models and returns UNKNOWN for the rest; the support matrix lists both.

optimesh · verify --pr 482blocked
$ optimesh verify --pr 482
ingest3 files changed · core-sw-02, edge-fw, k8s/netpol
diagnoseACL drift on Vlan40 — guest VLAN can reach finance
simulateforwarding model from configs  ✓ complete
checksreachability 8/8 · isolation ✓ · loops ✓ · acl ✗
✗BLOCKED. app-sg → 0.0.0.0/0 opens on line 42. The merge is stopped and the failed check is attached to the review.
Product architecture

Hammerhead is the engine behind every workflow.

Digital twin · Hammerhead

A deterministic twin of your network

Builds current and proposed forwarding models from your configs and compares routes, paths, reachability, and policy.

  • 138 of 138 routes match real FRR on our 10-router lab (run 38685150242). Earlier runs scored 137: one route both sides drop was labelled differently. Same behaviour; we fixed the scorer. How
  • Deterministic, with a reproducible evidence record per run
  • CLI, Python SDK, REST API, CI and Jupyter. Docs
Application · Config Studio

AI-assisted remediation

A language model diagnoses the issue and drafts a diff. Hammerhead checks the result.

  • Drafting and checking are separate steps
  • Small diffs, for human review
  • Deployment and data flows documented during evaluation
Preflight results

PASS, ADVISORY, FAIL, or UNKNOWN.

Each result names the routes, flows, rules, and coverage behind it. If Hammerhead can’t evaluate part of a change, it says so instead of guessing.

Explicit unknowns. Failed checks block. Anything outside the model is flagged for review.
verdict.json
"status": "BLOCKED",
"reason": "ACL flow disposition changed",
"flow": "app-sg → 0.0.0.0/0",
"rule": "permit ip any any (line 42)",
"reachability": "8/8 preserved",
"safe_to_deploy": false
reachable-from-internet · exposure scan
On-prem ACL AWS security groups Azure NSG GCP firewall Kubernetes NetworkPolicy

One model across on-prem, cloud, and Kubernetes policy. Coverage per platform is in the support matrix.

Expanding coverage

A twin of the network first. Broader infrastructure next.

Networks come first. Cloud and Kubernetes analysis already ship; the support matrix shows how deep each goes.

Failure and maintenance simulation. Drain a device, drop a link, or withdraw a prefix in the model, not on the network.

See the blast radius before you deploy.

The paths a change puts at risk, including “redundant” ones that share a dependency.

Change detectedimpact · sw-02 · Vlan40
edge sw-01 sw-02 sw-03 web billing orders db carrier-x critical service checkout flow
at risk from this changeshared carrier (fake redundancy)Illustrative topology · sw-02 affects billing + orders · failover shares carrier-x
Pull-request gate

Block failed changes before merge.

A failed verdict fails the check, cites the reason, and can block the merge.

Built for CI. Fits a pull request on our generated-fabric benchmark.
Checks · pull request #482
✓ build
✓ lint
✓ unit tests
✗ optimesh / verify
Blocked: app-sg → 0.0.0.0/0 opens · rule: permit ip any any (line 42)
Merging is blocked until all checks pass
CHG0031847 · Firewall ACL update
Risk assessmentOptimesh, automated
Reachability8 / 8 preserved, 1 new exposure
Attached evidenceverdict.json
RecommendationDo not deploy
ServiceNow & Jira

Evidence on the ticket

The verdict and its evidence go back to the change record. Reviewers see the reachability diff and cited rules without leaving the ticket.

Informed approvals. Approve on modeled impact, not just the requester’s word.
Terraform & CI

Test the plan on the twin, not just the syntax

terraform plan says what changes. Optimesh checks what that does to the network, against your declared invariants, in any CI that can run a CLI.

Fails closed. A non-zero exit stops the apply.
ci · verify step
$ terraform plan -out tf.plan
$ optimesh verify --plan tf.plan
✓ parse configs · 14 devices
✓ simulate configuration-derived FIB
✓ reachability probes · 8/8 preserved
✗ acl flow-safety · app-sg → 0.0.0.0/0
optimesh: change blocked (exit 1)
Supported platforms

What Hammerhead reads, and what it models.

Config formats, collection methods, and modeling depth per protocol. Docs →

Why now

Infrastructure now changes faster than people can review it.

Writing the change is no longer the bottleneck. Knowing what it will do is.

01

Infrastructure became code.

Cloud APIs, IaC, Kubernetes, and CI/CD put every change behind an API.

02

Agents are entering the change path.

They diagnose, draft, and propose changes faster than anyone can read them.

03

Review wasn’t built for machine speed.

Peer review checks intent. Tickets record approval. Monitoring watches production. None models the consequences first.

04

Networks make it concrete.

One local edit can change forwarding several hops away. So the twin starts here.

Named alternatives

How Hammerhead compares.

What each product says publicly, next to Hammerhead. “None found” means we found no public source.

ProductWorks fromVendorsChecks a change before it shipsDeploymentPublished accuracy evidence
HammerheadConfig files; optional collection over SSH, SNMP, config-manager archives, cloud APIs15 config formats parsed; SSH drivers for 6Yes: preflight, pass / fail / advisory / unknownYour hardware: CLI and self-hosted API138 of 138 routes match real FRR on our 10-router lab (run 38685150242); 134 incidents reconstructed into a regression suite
Forward NetworksLive collection of config and state [1]“30+” [1]Yes: Forward Predict, May 2026, for routing, ACL, NAT and firewall [2][3]SaaS or on-prem VM [4]“Mathematically accurate”; no figure published [1]
IP FabricLive discovery and snapshots [5]42 vendor families [6]Pre- and post-change impact summaries [5]On-prem appliance; needs no internet [7]None found
NetBrainLive CLI, SNMP and API data [8]“Over 400 device types” [8]Change agent announced for October 2026; method not published [9][10]On-prem or SaaS [11]“90%” of real issues handled [12]
Batfish (open source)Config files [13]Cisco, Juniper, Arista, Palo Alto, Nokia SR OS and others [13]Yes: differential analysis of candidate configs [13]Library or container [13]None found
Cisco Nexus DashboardLive telemetry from Cisco fabrics [14]Cisco only [15]Pre-change analysis, ACI only [14]On-prem [15]None found

Where Hammerhead is ahead

It checks a change from configs alone, without live telemetry or deploying it; of the products above, only Batfish also works this way. It returns “unknown” and names the gap instead of passing. It runs entirely on your hardware.

Where Hammerhead is behind

The others collect continuously across 30 to 400+ platforms; Hammerhead parses 15 config formats. They model what the network is doing; Hammerhead models what the configs say. Its console is far simpler.

How it’s tested

Against FRR routers in a pinned container lab, against Batfish across 351 test snapshots, and on 134 public outages rebuilt from the public record. How we test →

Sources, all accessed September 26, 2026
  1. Forward Networks, “Why Forward” (forwardnetworks.com/why-forward)
  2. Forward Predict datasheet V04, May 19, 2026
  3. Help Net Security, “Forward launches Predict”, May 21, 2026
  4. Forward Networks integrations page and ServiceNow blog, August 26, 2025
  5. GlobeNewswire, IP Fabric v8.1, September 23, 2026
  6. IP Fabric support matrix 8.0.0 (matrix.ipfabric.io)
  7. IP Fabric documentation FAQ and network-verification product page
  8. NetBrain multivendor product page (netbrain.com/product/multivendor)
  9. Business Wire, NetBrain agentic NetOps agents, September 22, 2026
  10. Converge Digest, NetBrain change and assessment agents, September 2026
  11. NetBrain product FAQ
  12. Network World, NetBrain R12.3, 2026
  13. github.com/batfish/batfish, release v2026.08.27
  14. Cisco, Nexus Dashboard 4.2.1: Analyzing and Troubleshooting, updated June 24, 2026
  15. Cisco blog, Cisco Nexus One, July 2, 2026
What we're building

Start with networks. Expand where agents act.

Today · Networks

Test network changes on a twin

Hammerhead builds a digital twin from your configurations and tests each change against the reachability and policy you declare.

Next · Infrastructure

Deepen cloud, Kubernetes, and IaC coverage

Capability by capability, only where the model gives useful evidence and states its limits.

Long term · Agents

Test what infrastructure agents do

The same deterministic twin, checking actions proposed by AI agents before they run.

Review sees the diff. The twin sees the impact.

Two minutes, for the people who approve change.

Tested against 134 public outages

Rogers, 2022. Facebook, 2021. Hammerhead detected the cause of every one.

Approve changes on evidence.

A clear verdict

Pass, fail, advisory, or unknown. Always with evidence.

A complete audit trail

Every test and approval, tamper-evident.

An executive summary

What changes, in plain terms.

Company

We started with networks because small changes can have system-wide effects.

A configuration edit on one device can alter reachability several hops away. Optimesh began by modeling that behavior accurately enough to evaluate a change, and fast enough to run before deployment.

Newsroom
Read
The team

Experience in networked systems and performance engineering.

The team’s background spans networked systems, performance engineering, and software for environments where failures have real consequences.

Built by engineers from

What exists, and what comes next

The engine is built. Customer evaluations are next.

Built the network model

Hammerhead parses supported configuration, reconstructs routing and forwarding behavior, and compares proposed states.

Next: production evaluations

The next step is to run Hammerhead on customer configurations, healthy historical changes, and real deployment workflows.

Applied it to remediation

Config Studio uses a language model to draft a candidate change. Hammerhead checks the resulting modeled state.

Applied it to training

PacketDojo is a browser lab where network engineers repair router configurations to fix static routing, OSPF, BGP and ACL incidents. Hammerhead scores each repair.

Who backs us

An angel round from investors including operators who have run production networks. NVIDIA supports us through Inception, its program for startups.

Extending the twin

Each new infrastructure domain needs explicit coverage, useful evidence, and clear unknowns before Optimesh treats it as supported.

Long-term direction

A twin for autonomous infrastructure

Over time, the same architecture can sit between infrastructure agents and the systems they operate.

What we believe

UNKNOWN is a valid result.

Evidence over confidence

The twin returns the result, its reasons, and what it could not evaluate. AI confidence does not affect the verdict.

Fast enough for CI

The generated-fabric benchmark shows that the engine can run in a pull-request workflow.

Your network stays yours

Hammerhead runs entirely on your hardware, including air-gapped environments.

Hammerhead

The deterministic digital twin behind Optimesh.

Hammerhead builds a digital twin of your network from its configurations: it runs the same routing protocols your devices run until they settle, then works out where every packet would go. Run a proposed change on the twin and compare it with today’s network, without touching a live device.

Deterministic means the same configurations and the same change always give the same answer. If a change reaches beyond what the twin covers, Hammerhead returns UNKNOWN and names the gap. It never shows a pass it can’t back up.

Hammerhead access is by request. The docs are public, so you can judge it before you ask.

134 public outages rebuilt · deterministic results
hammerhead
Demos

Rehearse the change before you push it.

A demo for the engineer, an overview for the executive, and a walkthrough of the command line. The terminals show real output from the tool.

Demo · 3:34

Catching a bad change before it ships

For the engineer holding the change window.

A three-line OSPF change that passed peer review. First, what the model says happens if you push it straight. Then the same change, checked with Hammerhead before it ships.

Overview · 1:59

Approved.

For the executive who signs off on the risk.

A change that passed review, what it does to the network, and the gate it goes through first while your engineers still approve and your tools still deploy.

Walkthrough · 4:09

Thirteen commands.

For the engineer at the keyboard.

One command per chapter, typed and run: what it found in a folder of configs, what it could not read, and what a change does.

Narration is a synthetic voice; English captions are in each player.

Public outages, rebuilt

134 public outages, rebuilt. Hammerhead flags every one.

We rebuilt 134 public network outages from the public record and encoded each failure mode as a test. Hammerhead flags every rebuild for the reason the network broke, and all 134 rerun on every change to the engine.

How we test →

77 CLI subcommands

Network validation in one CLI.

77 subcommands. See every one in the docs →

Parse & simulate

Read raw configs, run protocol convergence, build the routing and forwarding tables.

parsesimulateribfib

Query

Ask where a packet goes. Reachability, traceroutes, path joins, IP ownership.

reachabilitytraceroutesnapshot

Analyze

Diff snapshots, detect loops, scan for single points of failure, audit ACLs.

diffloopsfailure-analysis

Verify

Check configs against a YAML compliance DSL. CIS, PCI, and SOC 2 templates included.

policy-checkCISPCI
Supported platforms

What it reads, and what it models.

Review supported configuration formats, collection methods, and the modeling depth for each protocol. “Partial” means the listed behavior is not fully modeled.

Interfaces

CLI, Python SDK, REST API, and CI.

CLI

A single binary. No Docker, no JVM, no server. Reference →

Python SDK

Notebook-native. from hammerhead import Hammerhead SDK docs →

REST API

An HTTP server with 56 routes, JWT authentication, and three roles for programmatic integration. API docs →

CI pipeline

Run a before-and-after check and return the verdict as a merge gate. CI docs →

Jupyter

9 tutorial notebooks: BGP analysis, traceroute, change validation, drift, ACL walkthroughs.

Model and lab comparisons

Compared with Batfish across 351 internal test snapshots and with a pinned 10-router FRR container lab. How →

Config Studio

Describe the change. Config Studio writes it. The twin tests it.

Tell Config Studio what is wrong or what you need, in plain English. It finds the likely cause and drafts the configuration change. Hammerhead runs that draft on the digital twin separately, and both appear side by side for an engineer to approve.

config-studio · example workflow
Candidate diagnosis
BGP session down · review required
Suspect edge-2. Neighbor ASN mismatch on peer 10.0.4.1.
- remote-as 65099
+ remote-as 65020
✓ Declared Hammerhead checks passed · modeled offline
Review candidateReject
Product architecture

Writing and testing are separate.

The language model drafts the candidate. Hammerhead evaluates it against supported checks before review.

Manual workflow
Review
diagnose, draft, inspect, and test the candidate
→
With Config Studio
Gated
candidate drafted and independently checked
1
Sanitize
input
Remove untrusted instructions hidden in configuration comments before the configuration is sent to the language model.
2
Diagnose
model
Identify a candidate fault and the device or policy involved. The diagnosis remains a proposal.
3
Patch
candidate
Draft a minimal, reviewable configuration diff for the stated intent.
4
Verify
engine
Hammerhead evaluates the resulting modeled state and rejects failed checks before a human reviews the candidate.
Interfaces

Use Config Studio interactively or from a pull request.

/studio

Chat + config editor

A chat connected to 15 network tools and an in-session configuration editor. Ask in plain English, review the proposed diff, and inspect Hammerhead’s result separately.

/changes

Pull-request gating

A webhook receiver that runs diagnose → patch → verify on every commit, posts a verdict comment with a deep link, and can gate the merge.

Config Studio uses a language model. Where it runs and where your data goes are specified in writing for each evaluation.

RuleHawk · Free

Find risky firewall rules in your browser.

Paste a supported ACL or firewall configuration. RuleHawk flags shadowed, redundant, and overly permissive rules without sending the configuration to Optimesh.

Audit reportinstant
Rule #42 is shadowed by Rule #18
permit tcp 10.0.0.0/8 any eq 443 — already matched above
Rule #7 allows any → any on ports 1-65535
3 Critical7 Warnings52 Clean
What it detects

Six categories of firewall risk.

Shadowed rules

Rules that never fire because a broader rule matches first.

Overly permissive access

Wide source and destination ranges, any-any patterns.

Redundant rules

Duplicates that add complexity without changing policy.

Ordering issues

First-match semantics producing unintended outcomes.

Compliance gaps

Missing deny-all defaults and logging gaps.

Unused rules

Zero-hit candidates for cleanup.

RuleHawk audits the rules you paste, in your browser. To see what a change does across the network, run it through Hammerhead.

Pricing

Optimesh is priced to fit the size of your network and the teams that change it. Tell us about your environment and we will put together a proposal for Hammerhead and Config Studio, including a technical evaluation on your own configurations.

Contact usFree firewall audit

RuleHawk, the free firewall audit, needs no sign-up and runs entirely in your browser.

Hammerhead docs

What you need to judge Hammerhead before you talk to us: how it installs, a five-minute run, all 77 commands, the Python SDK, the REST API and CI. The output on this page is real, from hammerhead 0.2.1 on the labs that ship with it.

Hammerhead 0.2.1 · page updated October 2026

Access

Hammerhead is private. There is no public download, package, container or self-serve trial. We send binaries to teams we have given access. These docs are public so you can decide whether it is worth asking.

Install

Hammerhead is one executable, hammerhead. It needs no JVM, Python runtime, database or server. Each release archive also carries hammerhead-api, the optional REST server.

PlatformTargetLive collection built in
Linux x86_64 (glibc 2.35+: Ubuntu 22.04+, Debian 12+)x86_64-unknown-linux-gnuSSH, SNMP, ICMP, gNMI state polling, REST connectors, cloud fetch
Linux arm64 (glibc 2.35+)aarch64-unknown-linux-gnuSNMP, REST connectors
macOS, Apple siliconaarch64-apple-darwinSSH, SNMP, ICMP, gNMI state polling, REST connectors, cloud fetch
macOS, Intelx86_64-apple-darwinSSH, SNMP, ICMP, gNMI state polling, REST connectors, cloud fetch
Windows x86_64x86_64-pc-windows-msvc (zip)SNMP, REST connectors

Analysis of a directory of config files works the same on every platform. The last column only matters if you want Hammerhead to fetch configs itself (see how configs get in). A linux/amd64 container image is also available to teams with access.

# after download: check, unpack, run
shasum -a 256 -c hammerhead-<version>-x86_64-unknown-linux-gnu.tar.gz.sha256
tar xzf hammerhead-<version>-x86_64-unknown-linux-gnu.tar.gz
./hammerhead-<version>-x86_64-unknown-linux-gnu/hammerhead --version
hammerhead 0.2.1
Signing. Each archive comes with a SHA-256 checksum file. The archives are not code-signed yet.

Licence key

Every command except license, --help, --version and --emit-schemas needs a licence key. Without one, hammerhead exits 1 before doing any work and hammerhead-api exits 1 before binding a socket. We issue the key with access: a signed token (HH1.…) naming your organisation, your plan and its end date. It is checked offline against a public key built into the binary, so nothing is sent anywhere and air-gapped estates work.

hammerhead license install HH1.eyJ...   # verifies, then saves to $HAMMERHEAD_LICENSE_FILE if set, else ~/.config/hammerhead/license
hammerhead license status               # licensee, plan, expiry, where it was found

The binaries look for the key in $HAMMERHEAD_LICENSE (the token itself), then the file named by $HAMMERHEAD_LICENSE_FILE, then ~/.config/hammerhead/license. In CI, store the token as a secret and pass it as HAMMERHEAD_LICENSE. In its last week a licence prints a warning on stderr; once expired, it is refused.

Quickstart

Five steps, once the licence key is installed. The first four use a three-router OSPF lab that the binary can write for you; the fifth checks a change on a four-router spine-leaf.

1. Point it at a config directory

init scans a directory of configs (one file per device), says what it found and suggests next commands. --example seeds the lab first.

$ hammerhead init ./configs --example
  ✓  Seeded ./configs with R1/R2/R3 OSPF triangle (2196 bytes)

  hammerhead v0.2.1

  ✓  Found 3 config files (3 cisco_ios)
  ✓  Discovered 3 devices, 9 interfaces, 3 L3 links
  ✓  Simulated 18 FIB entries across all devices
  ✓  Protocols: OSPF (area 0)
  ✓  Completed in 1ms

On your own configs, read the vendor counts init prints. A file it cannot identify is parsed as Cisco IOS, so a surprising count usually means a file it did not recognize.

2. Build the model

$ hammerhead simulate ./configs
== R1 ==
RIB: 6 entries (3 connected, 0 static, 3 ospf, 0 bgp, 0 eigrp, 0 isis)
FIB: 6 entries
OSPF: 2 adjacencies, 3 LSAs across area(s) 0
… R2 and R3 follow

3. Ask a reachability question

$ hammerhead reachability ./configs --from R1 --src 1.1.1.1 --dst 3.3.3.3
Reachable: yes

4. Trace the packet

$ hammerhead traceroute ./configs --from R1 --src 1.1.1.1 --dst 3.3.3.3
Traceroute from R1 (1.1.1.1) to 3.3.3.3 [tcp dst-port 80]
  1  R1         - -> GigabitEthernet0/1 (R3 GigabitEthernet0/0)   forwarded
Disposition: Delivered

5. Check a change before you push it

preflight compares a before and an after directory. Here the candidate moves LEAF-2 into OSPF area 2. Output trimmed.

$ hammerhead preflight ./before ./after
  routes changed:   15 (20.0% of FIB entries)
  devices impacted: 4 (100.0% of estate) — LEAF-1, LEAF-2, SPINE-1, SPINE-2
  flows lost:       6 (of 4 of 4 endpoint(s) probed, 0 gained)
    probed per pair:  tcp/80 http, tcp/22 ssh, tcp/179 bgp, udp/53 dns, icmp echo
    ✗ LEAF-1(10.255.1.1) → LEAF-2(10.255.1.2)
    …
VERDICT: FAIL
  ✗ blast radius 100.0% of devices exceeds --max-blast-radius 5%
  ✗ routing adjacencies: 2 lost between devices that are both still present — OSPF LEAF-2 <-> SPINE-1, OSPF LEAF-2 <-> SPINE-2
  ✗ reachability regression: 6 endpoint pair(s) delivered before are not delivered after
$ echo $?
2

A candidate that changes no routes and loses no flows returns VERDICT: PASS and exit 0. The exit code is the contract CI relies on:

ExitVerdictMeaning
0pass or advisoryNo gate failed. Advisory findings are printed but do not fail.
2failA gate failed. Each failure is listed with the flows, routes or rules behind it.
3unknownThe change touches something the model does not cover. The blockers are named; it never reports a pass it cannot back.
1errorAn operational error, such as a missing directory.

CLI reference

All 77 subcommands, grouped by job. Each summary is the command's own --help text, with internal references removed. hammerhead help <command> prints every flag.

Global options: --format text|json|csv|dot (JSON is stable for scripting; CSV suits tabular output such as fib, rib, reachability; DOT suits traceroute) and -v/-vv/-vvv for logging.

Start here3 commands
CommandWhat it does, and usage
initScan a config directory and show what Hammerhead found — vendors, devices, protocols, and suggested next commands. The fastest way to get started
hammerhead init [OPTIONS] <CONFIG_DIR>
connectGuided onboarding wizard: point Hammerhead at a system you already run (SolarWinds, ManageEngine, an Ansible repo — or a built-in demo), validate the connection, write a ready-to-use inventory.yaml + secrets env file, and optionally run the first collect + simulate immediately. Interactive on a TTY; fully drivable by flags (secret via HH_CONNECT_SECRET) in CI
hammerhead connect [OPTIONS]
licenseShow or install the Hammerhead licence. Every other command needs a valid licence key from Optimesh (issued with every plan that includes Hammerhead); this one runs without one so you can install it
hammerhead license [OPTIONS] <COMMAND>
Parse & simulate14 commands
CommandWhat it does, and usage
parseParse all configs in a directory and report parse coverage
hammerhead parse [OPTIONS] <CONFIG_DIR>
parse-coveragePer-device parse coverage histogram (lines parsed vs unparsed)
hammerhead parse-coverage [OPTIONS] <CONFIG_DIR>
topoDiscover topology from a config directory
hammerhead topo [OPTIONS] <CONFIG_DIR>
simulateRun the full simulation pipeline (parse → topo → OSPF → FIB)
hammerhead simulate [OPTIONS] <CONFIG_DIR>
ribShow the per-device RIB
hammerhead rib [OPTIONS] --device <DEVICE> <CONFIG_DIR>
fibShow the per-device FIB, with preflight’s coverage verdict on the snapshot. When coverage is degraded the FIB is still printed, the devices and lines are named on stderr, or in the coverage object with --format json, and it exits 3 (from v0.2.1)
hammerhead fib [OPTIONS] --device <DEVICE> <CONFIG_DIR>
init-issuesPybatfish-parity init report: severity-tagged init issues plus defined / referenced named structures
hammerhead init-issues [OPTIONS] <CONFIG_DIR>
sessionsReport BGP / OSPF session compatibility and adjacency edges. From v0.2.1, BGP rows in JSON carry ipv4_unicast, and an established session without IPv4 unicast carries a reason
hammerhead sessions [OPTIONS] --protocol <PROTOCOL> <CONFIG_DIR>
snapshotEmit static snapshot-input reports (ip-owners, subnets, FHRP, L1/L2 edges) or multipath consistency reports
hammerhead snapshot [OPTIONS] --report <REPORT> <CONFIG_DIR>
ipsec-statusReport IPSec crypto-map session compatibility per Batfish ipsecSessionStatus
hammerhead ipsec-status [OPTIONS] <CONFIG_DIR>
vxlan-vnisEmit VXLAN VNI properties per Batfish vxlanVniProperties
hammerhead vxlan-vnis [OPTIONS] <CONFIG_DIR>
vxlan-edgesEmit overlay VTEP→VTEP edges per Batfish vxlanEdges
hammerhead vxlan-edges [OPTIONS] <CONFIG_DIR>
profilePer-phase wall-clock profile of the simulation pipeline
hammerhead profile [OPTIONS] <CONFIG_DIR>
reconvergeIncrementally reconverge a snapshot after a single-file config edit.
hammerhead reconverge [OPTIONS] <CONFIG_DIR>
Query19 commands
CommandWhat it does, and usage
tracerouteTrace a packet through the simulated network
hammerhead traceroute [OPTIONS] --from <FROM> --src <SRC> --dst <DST> <CONFIG_DIR>
reachabilityYes/no reachability check between two IPs
hammerhead reachability [OPTIONS] --from <FROM> --src <SRC> --dst <DST> [CONFIG_DIR]
loopsScan the forwarding plane for packets that would circulate indefinitely. Also available under the alias detect-loops [aliases: detect-loops]
hammerhead loops [OPTIONS] <CONFIG_DIR>
symbolic-reachBDD-based symbolic reachability between two devices, with an optional differential mode against a second snapshot. CAVEAT: the BDD engine does not yet model NAT header rewrites — on estates with NAT rules, prefer nat-aware-traceroute for flows that cross a translating device; the command warns when it detects NAT in the snapshot
hammerhead symbolic-reach [OPTIONS] --from <FROM> --to <TO> <CONFIG_DIR>
bidirectional-reachBDD-based bidirectional reachability (A→B ∩ B→A)
hammerhead bidirectional-reach [OPTIONS] --from <FROM> --to <TO> <CONFIG_DIR>
bidirectional-traceForward + reverse traceroute with an asymmetry flag
hammerhead bidirectional-trace [OPTIONS] --from <FROM> --src <SRC> --to <TO> --dst <DST> <CONFIG_DIR>
search-filtersFind every ACL line overlapping a symbolic packet constraint
hammerhead search-filters [OPTIONS] <CONFIG_DIR>
test-filtersEvaluate every ACL against one concrete packet
hammerhead test-filters [OPTIONS] --src <SRC> --dst <DST> <CONFIG_DIR>
nqe-routesAd-hoc route query with protocol / prefix / ECMP / device filters, optionally aggregated via --group-by
hammerhead nqe-routes [OPTIONS] --config-dir <CONFIG_DIR>
nqe-devicesAd-hoc device query with protocol / route-count filters, sortable by name / routes / links
hammerhead nqe-devices [OPTIONS] --config-dir <CONFIG_DIR>
nqe-pathsAd-hoc path-traversal query. Returns all (src, dst) pairs matching the filter with their hop-by-hop paths
hammerhead nqe-paths [OPTIONS] --config-dir <CONFIG_DIR>
nqlCypher-subset ad-hoc graph query over the simulated topology. Speaks a read-only subset of Cypher (MATCH / WHERE / RETURN with aggregation, ORDER BY, LIMIT, DISTINCT, variable-length paths)
hammerhead nql [OPTIONS] <CONFIG_DIR> <QUERY>
searchGlobal free-text search across the simulated snapshot. One box resolves any IP, MAC, hostname, prefix, ACL line, VLAN, BGP / OSPF neighbour, NAT rule, VRF, EVPN VNI, MPLS label, or FIB next-hop into a ranked hit list
hammerhead search [OPTIONS] --query <QUERY> <CONFIG_DIR>
mpls-traceMPLS LFIB / LDP label-stack walker. Synthesises an LDP-DU distribution from loopback /32 prefixes and walks the label stack. RSVP-TE is a follow-up
hammerhead mpls-trace [OPTIONS] --from <FROM> --to <TO> <CONFIG_DIR>
sr-traceSegment Routing path / policy walker. Without --policy, dumps every device's prefix-SID label table. With --policy <headend>:<color>:<endpoint>, prints the policy's candidate paths and which one would be active
hammerhead sr-trace [OPTIONS] <CONFIG_DIR>
all-pathsEnumerate every forwarding path from a source device to a destination IP, including every ECMP branch.
hammerhead all-paths [OPTIONS] --from <FROM> --src <SRC> --dst <DST> [CONFIG_DIR]
askAsk a question in plain English, offline. The question is matched against a fixed grammar and resolved to ONE existing command, whose exact command line is printed before it runs in-process. A question that is not understood, is ambiguous, or names a device, interface or address that is not in the snapshot is REFUSED (exit 1) with the supported forms listed; it is never guessed at
hammerhead ask [OPTIONS] <CONFIG_DIR> <QUESTION>
nat-aware-tracerouteTraceroute that follows NAT translations hop by hop.
hammerhead nat-aware-traceroute [OPTIONS] --from <FROM> --src <SRC> --dst <DST> [CONFIG_DIR]
reachability-matrixAll-pairs reachability across the estate. Probes every ordered endpoint pair with a TCP/80 packet and renders the result as a matrix. Endpoints default to one address per device (loopback first); constrain them with --endpoints / --endpoints-file
hammerhead reachability-matrix [OPTIONS] [CONFIG_DIR]
Change validation5 commands
CommandWhat it does, and usage
diffDiff FIBs between two config directories
hammerhead diff [OPTIONS] <BEFORE_DIR> <AFTER_DIR>
diff-routesPer-(device, prefix) RIB delta between two snapshots
hammerhead diff-routes [OPTIONS] <BEFORE_DIR> <AFTER_DIR>
diff-aclsACL line-level delta between two snapshots
hammerhead diff-acls [OPTIONS] <BEFORE_DIR> <AFTER_DIR>
failure-analysisSimulate a device/interface failure (or scan every device) and report pre-convergence blast radius
hammerhead failure-analysis [OPTIONS] --config-dir <CONFIG_DIR>
preflightPre-change blast-radius gate: diff a before/after config pair, score blast radius against thresholds (and optionally a policy file), and exit non-zero on gate failure so CI / Ansible pre_tasks can halt a rollout before it touches devices
hammerhead preflight [OPTIONS] <BEFORE_DIR> <AFTER_DIR>
Audit & compliance15 commands
CommandWhat it does, and usage
acl-auditFind shadowed and unused ACL entries
hammerhead acl-audit [OPTIONS] <CONFIG_DIR>
audit-configAudit named-structure references: undefined refs, unused structures, parse warnings
hammerhead audit-config [OPTIONS] <CONFIG_DIR>
policy-checkVerify a YAML policy file against the simulated network and report per-policy pass/fail with severity
hammerhead policy-check [OPTIONS] --config-dir <CONFIG_DIR> --policies <POLICIES>
nqe-libraryRun the bundled NQE library of intent checks (or list its catalog).
hammerhead nqe-library [OPTIONS]
pbr-auditWalk every interface bound to ip policy route-map ..., list the route-map clauses (match + set), and flag every clause whose set ip next-hop may bypass an inbound ACL bound on the same device.
hammerhead pbr-audit [OPTIONS] <CONFIG_DIR>
wccp-auditList WCCPv2 service groups and per-interface redirect bindings recovered from lines the parser did not model.
hammerhead wccp-audit [OPTIONS] <CONFIG_DIR>
qos-auditSurface Cisco MQC class-map / policy-map / service-policy declarations from lines the parser did not model. MVP scope: classification + marking only — scheduler, queue depth, and starvation analysis are not modeled
hammerhead qos-audit [OPTIONS] <CONFIG_DIR>
ip-sla-auditList per-device IP SLA probes (recovered from lines the parser did not model) and track <id> objects (parsed). Cross-references each track id against any static route that names it via track <id>
hammerhead ip-sla-audit [OPTIONS] <CONFIG_DIR>
driftConfig-vs-golden semantic drift detector. Runs across a paired set of golden + observed config directories and emits one row per finding
hammerhead drift [OPTIONS] --golden <GOLDEN> --observed <OBSERVED>
rpki-auditAudit a network's ROAs against what it announces: a ROA whose maxLength authorises more-specifics the AS does not announce lets a forged-origin announcement validate Valid (RFC 9319). Exit 2 on a loose ROA, 3 when a ROA for this snapshot's ASes could not be judged or none was
hammerhead rpki-audit [OPTIONS] --roas <FILE> <CONFIG_DIR>
fhrp-auditHSRP / VRRP / GLBP standby-group consistency audit. Discovers every speaker, runs the FHRP election engine, and reports per-group active/standby roles plus structural warnings
hammerhead fhrp-audit [OPTIONS] <CONFIG_DIR>
cve-auditJoin a NIST NVD JSON or Tenable .nessus XML vulnerability feed against the parsed device inventory and report every (CVE, device) pair that fires. Exits non-zero when any finding's severity meets --severity-floor (default medium)
hammerhead cve-audit [OPTIONS] --feed <FEED> <CONFIG_DIR>
mlag-auditAudit MLAG / vPC / CLAG configuration consistency across the snapshot. Surfaces five finding kinds (missing peer, keepalive subnet mismatch, member port mismatch, orphan member, peer-link missing). Exits non-zero when any finding ≥ --severity-floor (default high) fires, so the command is wirable as a CI gate ahead of a vPC / MLAG roll
hammerhead mlag-audit [OPTIONS] <CONFIG_DIR>
convergence-auditPre-event correctness checks for fast-reroute, uRPF, and CoPP.
hammerhead convergence-audit [OPTIONS] --config-dir <CONFIG_DIR>
exec-reportProduce a self-contained executive HTML exposure report — headline RAG verdict, SPOF chokepoints, segmentation exposure, compliance rollup, and a remediation appendix — from a single config directory
hammerhead exec-report [OPTIONS] <CONFIG_DIR>
Segmentation4 commands
CommandWhat it does, and usage
segmentation-auditAudit a YAML segmentation intent against the simulated network and classify each cross-zone flow as allowed, isolated, leaked, or missing connectivity
hammerhead segmentation-audit [OPTIONS] --config-dir <CONFIG_DIR> --intent <INTENT>
segmentation-inferAuto-derive a YAML segmentation intent from a set of observed 5-tuple flows plus the configuration-derived topology. Output is the same YAML shape segmentation-audit consumes, so the observation → derive → audit loop closes in one hop
hammerhead segmentation-infer [OPTIONS] --flows <FLOWS> --config-dir <CONFIG_DIR>
segmentation-recommendGenerate vendor-neutral ACL rule recommendations from a segmentation audit (or zero-trust baseline from intent alone)
hammerhead segmentation-recommend [OPTIONS] --config-dir <CONFIG_DIR> --intent <INTENT>
segmentsPer-segment rollup: devices, policy violations, segmentation leaks, unparsed forwarding-relevant lines and a red / unknown / yellow / green status for each segment (intent zones, or derived zones)
hammerhead segments [OPTIONS] <CONFIG_DIR>
Cloud & Kubernetes3 commands
CommandWhat it does, and usage
k8s-reachKubernetes pod-to-pod reachability verdict against the snapshot's NetworkPolicies (v1, Calico GlobalNetworkPolicy, Cilium CiliumNetworkPolicy)
hammerhead k8s-reach [OPTIONS] --config-dir <CONFIG_DIR> --src-pod <SRC_POD> --dst-pod <DST_POD> --port <PORT>
cloud-fetchFetch a live cloud snapshot (AWS / K8s via their SDKs; Azure ARM and GCP Compute over REST, all or nothing) and write the JSON files that simulate already consumes
hammerhead cloud-fetch [OPTIONS] --provider <PROVIDER> --output <OUTPUT>
cloud-costAnnotate an AWS pseudo-topology path with per-GB egress-cost estimates at every billing boundary (internet egress, NAT GW, TGW, inter-AZ) plus a monthly projection. Rates are documented defaults, overridable via --pricing-file
hammerhead cloud-cost [OPTIONS] --config-dir <CONFIG_DIR> --src <SRC> --dst <DST>
Collection & operations8 commands
CommandWhat it does, and usage
watchWatch a config directory and emit a JSON-Lines event stream
hammerhead watch [OPTIONS] [CONFIG_DIR]
collectCollect running-configs from a YAML inventory of devices and write them into an on-disk snapshot directory that simulate can ingest. SSH (--features ssh) and SNMP (--features snmp) reach real devices; a build without them refuses those rows by name, and gNMI / NETCONF config collection is not implemented. An SSH row's vendor: picks its driver: nxos, eos, junos, fortios, panos and frr / cumulus (or their parser labels and Ansible ansible_network_os names) take their own transcript; ios, iosxr, asa, a10 or no vendor: get the generic show running-config; any other value is refused by name
hammerhead collect [OPTIONS] --inventory <INVENTORY> --out <OUT>
endpointsEndpoint attribution: merge ARP / CAM / LLDP JSON dumps and emit one (mac, ips, switch, port, vlan, is_lldp?) row per endpoint
hammerhead endpoints [OPTIONS] --arp <ARP> --cam <CAM>
snapshot-pruneApply a YAML TTL policy to a snapshot store. --dry-run computes the same plan without mutating the store
hammerhead snapshot-prune [OPTIONS] --root <ROOT> --ttl-policy <TTL_POLICY>
alertsOperator surface for the alert lifecycle engine: list / show / ack / silence / resolve / watch (SSE) / history over the API (--api-url or HAMMERHEAD_API_URL, bearer via HAMMERHEAD_API_TOKEN). list --fail-on-firing exits 2 when any alert is firing — the CI contract
hammerhead alerts [OPTIONS] <COMMAND>
monitorLong-running scheduler daemon: fires cron jobs (collect / snapshot / policy / drift / observe / runbook) from a schedule YAML with a crash-safe journal, and POSTs job outcomes to the API's /ingest/observations when --api-url is set. --once evaluates a single tick; --dry-run prints the plan without executing
hammerhead monitor [OPTIONS] --schedule <SCHEDULE>
observeOne operational-state poll cycle over the inventory (per-row observe: transports: TCP/ICMP/SNMP/gNMI/controller REST), emitting observation events locally (--format json is the ingest wire format) or pushing them via --push-url
hammerhead observe [OPTIONS] --inventory <INVENTORY>
remediateAir-gapped manual remediation loop: emit-request builds a Config Studio request from an event, gate runs the strict preflight + gate-under-failure on a candidate (exit 2 on fail), verify checks drift-clean + alert-cleared (exit 2 when not verified)
hammerhead remediate [OPTIONS] <COMMAND>
Integrations & automation6 commands
CommandWhat it does, and usage
mcp-serveServe the simulated network as a Model Context Protocol (MCP) endpoint over stdio so an AI agent (Claude, Cursor, …) can answer questions grounded in the digital twin. Every tool result carries preflight’s coverage verdict, as {"coverage": …, "result": …}, with a warning when coverage is degraded (from v0.2.1)
hammerhead mcp-serve [OPTIONS] --config-dir <CONFIG_DIR>
hooks-validateValidate a hooks YAML file: warns on missing endpoints, missing secret_ref where required, or bad regex in trigger conditions
hammerhead hooks-validate [OPTIONS] --hooks <HOOKS>
hooks-planCompute the dispatch plan for a set of canned events without firing any HTTP/SMTP traffic. Useful for previewing what would be sent to ServiceNow / PagerDuty / Slack on a real failure
hammerhead hooks-plan [OPTIONS] --hooks <HOOKS>
hooks-fireFire a dispatch plan against live endpoints. Defaults to dry-run unless the binary was built with --features hooks-live (HTTP) or --features hooks-live-smtp (SMTP) on hammerhead-cli
hammerhead hooks-fire [OPTIONS] --hooks <HOOKS>
runbook-runExecute an event-driven runbook YAML. Walks the steps in order, shells out to hammerhead for each verb, captures stdout, substitutes $VAR references, and emits a single RunbookExecution record. MVP: sequential only, no parallel fan-out / no retries / no state persistence
hammerhead runbook-run [OPTIONS] --runbook <RUNBOOK_PATH>
runbook-validateValidate a runbook YAML — checks step kinds, duplicate names, and $VAR resolution. Exits non-zero on issues so the command is wirable as a CI gate
hammerhead runbook-validate [OPTIONS] --runbook <RUNBOOK_PATH>

Python SDK

The hammerhead Python package (Python 3.9+, uses pandas) comes with access as a source distribution. It is not on PyPI.

pip install ./hammerhead-python

The SDK drives the hammerhead binary and reads its JSON output, so a notebook and the CLI always give the same answer. It finds the binary on your PATH, or you pass Hammerhead(binary="/path/to/hammerhead").

from hammerhead import Hammerhead

hh = Hammerhead().load_snapshot("configs/")
hh.reachability("R1", "1.1.1.1", "3.3.3.3")   # True
hh.traceroute("R1", "1.1.1.1", "3.3.3.3")     # TracerouteResult: Delivered, 1 hop
hh.routes(device="R1")                         # DataFrame: device, prefix, protocol, next_hop_ip, egress_interface

Methods: load_snapshot, simulate, routes, traceroute, reachability, diff, diff_routes, loops, failure_analysis, spof_scan, policy_check, nqe_routes, nqe_devices, nqe_paths, acl_audit.

Jupyter tutorials

Nine notebooks come with the SDK: Getting started · Pandas essentials for network analysis · Route analysis · BGP analysis · Traceroute and reachability · Change validation · Detecting configuration drift · ACL and firewall analysis · SDK cookbook.

REST API

hammerhead-api serves the same engine over HTTP. It binds to 127.0.0.1:8080 by default and will not start until you name the config directories it may read (HAMMERHEAD_API_ALLOWED_ROOTS). Request bodies are capped at 2 MB.

Authentication

Protected routes take a bearer JWT from your identity provider. Configure the issuer and audience (HAMMERHEAD_AUTH_JWT_ISSUER, HAMMERHEAD_AUTH_JWT_AUDIENCE) and exactly one key source: an HS256 secret, an RS256 public key file, or a JWKS URL. Tokens map to three roles, viewer < operator < admin. With no JWT settings, every protected route returns 401. There is no OIDC discovery and no native SAML or SCIM; use an identity bridge such as Keycloak or Auth0 for those.

Routes

56 routes. Analysis routes are rate-limited.

NeedsRoutes
viewer · analysisPOST /parse POST /topo POST /topo/l2 POST /device POST /endpoints POST /traceroute POST /traceroute/explain POST /reachability POST /rib POST /fib POST /loops POST /acl-audit POST /audits GET /segments
operator · analysisPOST /simulate POST /diff POST /preflight POST /search POST /snapshots/route-diff
viewerPOST /stream/ticket GET /estates GET /alerts GET /alerts/history GET /alerts/:fingerprint GET /observations GET /remediation/cases GET /remediation/cases/:id GET /snapshots GET /snapshots/:id GET /snapshots/:id/devices/:hostname GET /health
operatorPOST /alerts/:fingerprint/ack POST /alerts/:fingerprint/silence POST /alerts/:fingerprint/resolve POST /ingest/alertmanager POST /ingest/observations POST /remediation/cases/:id/approve POST /remediation/cases/:id/verify POST /status POST /snapshots POST /snapshots/diff
adminGET /audit GET /audit/verify POST /snapshots/prune
no token: UI and healthGET / GET /ui GET /ui/assets/:name GET /classic GET /health/live GET /health/ready GET /health/summary GET /status
stream ticket or tokenGET /stream GET /stream-diff GET /alerts/stream
Config Studio service tokenPOST /remediation/cases/:id/candidate

The UI routes serve the built-in operator console. The streaming routes check a single-use ticket (from POST /stream/ticket) or a bearer token themselves.

CI integration

Hammerhead gates a pipeline through exit codes, so it works in any CI that can run a binary. Keep the base branch's configs in one directory and the proposed ones in another, run preflight, and let a non-zero exit fail the job.

# any CI: fail the job unless the change passes
git worktree add ../base "$BASE_SHA"
hammerhead preflight ../base/configs ./configs --format json > preflight.json

# optional: your own rules, YAML; --strict exits 2 on a high or critical failure
hammerhead policy-check --config-dir ./configs --policies network-policy.yaml --strict

Teams with access also get:

  • GitHub Action. A composite action that runs preflight on a pull request and posts the verdict as a comment. Inputs include license (your licence key, from a secret), config-dir, base-config-dir, max-blast-radius (default 5%) and policy; outputs include gate-verdict, gate-exit-code, gate-blockers, changed-routes and lost-flow-count. It needs a token that can read the private release.
  • GitLab CI template. Fails the pipeline unless the verdict is exactly pass, and can post the result to a ServiceNow change record.
  • Ansible. A role for pre_tasks gating, and an Event-Driven Ansible source.

We have no Jenkins example yet; the plain-CLI pattern above works there.

Environment

VariableUsed byPurpose
HAMMERHEAD_LICENSE, HAMMERHEAD_LICENSE_FILEhammerhead, hammerhead-apiThe licence token itself, or the path of a file holding it; otherwise ~/.config/hammerhead/license is read
HAMMERHEAD_API_BINDhammerhead-apiListen address; default 127.0.0.1:8080
HAMMERHEAD_API_ALLOWED_ROOTShammerhead-apiConfig directories the server may read; required
HAMMERHEAD_AUTH_JWT_*hammerhead-apiIssuer, audience and key source for bearer tokens
HAMMERHEAD_AUDIT_DIRhammerhead-apiTurns on the hash-chained audit trail (see Security)
HAMMERHEAD_API_URL, HAMMERHEAD_API_TOKENCLI alerts, observeWhere the CLI reaches your API server, and its token
HH_CONNECT_SECRETCLI connectSecret for the onboarding wizard when run non-interactively in CI

Questions these docs don't answer: ask us, and we will add the answer here.

How we rebuilt 134 outages, and what "flagged" means

We say Hammerhead flags the cause of 134 outages rebuilt from the public record. This page says how the rebuilds were made, what counts as a flag, and what the number does not show.

Methodology · September 2026

The claim, exactly

We rebuilt 134 network outages from public reports. For each, we ran the change behind it through Hammerhead. Every one ends in a failing verdict or an audit finding whose stated reason is the cause the public record gives, some only once you declare facts about your network, as described below.

Three things the claim is not:

  • It is not the operators' configurations. None of them is public. Every rebuild is our reconstruction.
  • It is not a claim that Hammerhead would have prevented any of these outages.
  • It is not a blind test. See what it doesn't show.

Which outages

Four literature searches produced 314 incidents. We sorted each by whether its cause lives where Hammerhead looks, in device configuration or a command run against it: 73 were in scope, 88 partly in scope and 153 out of scope. Of the 161 in or partly in scope, we rebuilt 134 and excluded 27, each exclusion with a written reason.

Each incident carries a search-confidence grade for how well its public record supports the facts we used. For the 134: 72 high, 56 medium, 6 low. Not every entry has been re-checked against its sources since it was first catalogued.

How we rebuild one

  1. Facts. A write-up of the public record, quoted and cited, with our own choices kept apart under a separate heading of assumptions. 125 of the 134 list their sources in the catalog; the other 9, built by hand, cite them in their own write-ups.
  2. The smallest network with the same failure. Usually a before and an after directory of configs, often with a control case beside it. Topology and syntax are ours. Where many incidents share a mechanism, such as route leaks, the networks are generated from a template for that family.
  3. The change. The difference between before and after. One exception: Microsoft's 2023 WAN outage was caused by a command, not a config line, so that rebuild feeds Hammerhead the command. Microsoft never named the vendor or the command, so we assumed both.

No outside party has checked that our rebuilds match the public reports. The full catalog, with each incident's sources and assumptions, is available to evaluators on request.

What "flagged the cause" means

A flag is a failing result where the check that fired names the reason the network actually broke. A failure for some other reason does not count. Automated tests pin both the verdict and the text of the reason for every one of the 134, and they run on every change to Hammerhead, on Linux and macOS.

Four kinds of run count:

RunWhat fires
preflight on the changeA fail verdict (exit 2) naming the lost flow, route, adjacency or rule.
Intent-check library auditA finding on the configuration itself.
rpki-auditA route origin authorization that lets a forged origin validate.
driftA semantic difference from the golden config.

Details that matter:

  • 30 of the 134 are flagged by auditing the configuration, not by a verdict on a change. These are the accepting-network (18), layer-2 (8) and redundancy (4) families.
  • The size gate never counts. Every replay runs with the blast-radius gate turned off (--max-blast-radius 100). On a four-router lab almost any change exceeds the default 5% of devices, which would "catch" everything for the wrong reason.
  • Some catches need facts you supply. Several families are caught only once you declare your network boundary, your ROAs or your link capacities. Of 28 route mis-originations, 17 pass with a caveat when checked from the originating router with nothing declared. Microsoft 2023 is caught only when the command is listed; the same command on Cisco IOS returns unknown.

What the number doesn't show

The 134 were caught after fixes. On the first run, many verdicts were pass. We changed Hammerhead until each was caught, and every fix started as a failing test. The 134 are a regression suite we built the tool against, not a sample it had never seen. They show Hammerhead can represent and flag these failure modes. They do not estimate how often it would catch the next outage.

Some causes sit partly outside any configuration, and the public record says so:

  • Facebook, 2021. The withdrawal of the DNS servers' routes came from software reacting to a health check. It is in no config.
  • CenturyLink, 2020. The Flowspec rule was injected over BGP by a DDoS-mitigation system, not written into a device config.
  • Microsoft WAN, 2023. Vendor and command assumed, as above. The timing of the resulting storm is not modeled.
  • AS 7007, 1997. We rebuilt the mechanism usually taught, which has not been confirmed.
  • OVH, 2021. The mechanism is our assumption.

False positives on healthy configs

We have not measured a false-positive rate. We have no measurement of how often Hammerhead fails a healthy change, and we won't quote one until we do.

What exists instead:

  • The replay tests pin 52 passing results, 46 of them from preflight. Among them are 11 intended changes that keep required flows, 4 healthy redundancy variants and 3 RPKI controls. Others are known misses, such as the 17 mis-originations above, not controls. We wrote all of them alongside the replays, so they are expectations, not a sample of real changes.
  • Known false failures, written down and not yet fixed: a description-only edit on a BGP neighbor still fails a gate, and the default blast-radius gate trips on almost any change to a small network.

Until we have measured it on real change histories, treat the rate at which Hammerhead fails a healthy change as unknown.

The 134, by family

FamilyCount
BGP mis-origination28
Individual rebuilds23
Route leaks20
Accepting network18
Built by hand15
Required flow13
Layer 28
Redundancy4
RPKI drift3
Other: Cloudflare 2013 (Flowspec), F-root 2011 (IPv6)2
Total134

The accepting-network, layer-2 and redundancy families are flagged by auditing the configuration. The rest are flagged by preflight, rpki-audit or drift on the change.

Our other numbers

138 of 138 routes match real FRR on our 10-router lab (run 38685150242)

A lab of 10 routers running FRR 10.7.1 in containers, with the image pinned. We wait until every adjacency is up and every routing table has been unchanged for 60 seconds, then compare 138 route entries with Hammerhead's: every prefix, route type and next hop matches. That is the recorded result of run 38685150242, on Hammerhead build fa559f5e. The routers' 39 router-local routes (each router's own addresses) are counted and not compared. Before run 38685150242, the scorer counted R3's area-range summary (10.2.0.0/16) as a miss: FRR installs it as a blackhole, Hammerhead as a null route. Both drop the traffic. The scorer now pairs a blackhole with a null route; nothing scored the other way. A run fails, unscored, if FRR refuses any line of the lab's configs or if either side's routing table cannot be read; it never scores a table it could not read as empty. The lab is meant to re-run every week against the committed result, and it does not gate merges. Until 14 October 2026 this read 135 of 136: FRR had been refusing two of the lab's config lines, and Hammerhead was not modelling them either. With both lines fixed, the lab gained two routes, and FRR and Hammerhead agree on both. It is one topology on one routing stack, not production hardware, and not the other vendors we parse.

Checked against Batfish across 351 test snapshots

351 snapshots (2,040 devices) drawn from our test corpora, demos and generated topologies, not customer networks. Batfish and Hammerhead agree on 94.41% of prefixes (267,262 of 283,098), and on the egress interface for 99.80% of the prefixes both have a route for (the shared prefixes). Scope: IPv4, default VRF, routing table only. Most disagreements are explained: 12,051 of the 16,359 come from four snapshots whose frr.conf Batfish reads with its IOS grammar, and in the 309 snapshots Batfish parsed fully (98.50% / 99.90%), 3,012 of the 3,585 are two incident replays where Hammerhead enforces a maximum-prefix limit Batfish does not. It is a comparison with another model, not with routers, and it runs weekly as a report. We quote no speed comparison with Batfish.

37 of 38 prefixes match Batfish on the corpora checked on each push to main

Every push to main runs Hammerhead and Batfish, with Batfish pinned by image digest, over four test corpora (eos, junos, nxos and triangle): 12 devices, each compared on both sides. In the run of 12 October 2026 (parity run 38218573680), they agree on 37 of 38 prefixes; of the 34 matching prefixes that name an egress interface, all 34 agree. The one difference is a prefix only Hammerhead has, on a Junos device. Like the 351-snapshot check, it is a comparison with another model, not with routers, over the devices Batfish answered for, and it does not gate merges.

Demos, speed and where the numbers come from

Every number on this site comes from our own labs, test corpora and rebuilds, not from customer networks. There are no public customer references or third-party evaluations of Hammerhead yet.

Our model-build figure, about 0.7 s for a 976-device synthetic enterprise network, comes from our own benchmark on our own machine. We don’t publish speed comparisons with other tools; production performance is measured on your network during an evaluation.

The demo films run on small synthetic labs, and nothing in them was pushed to a production network. In the engineer’s demo, the push at 01:48 is dramatized from the model’s result and labelled as such, and the Rogers 2022 segment is a rebuild from the public record. Approved. cites two incidents from the providers’ own reports as examples of change risk, not as outages Hammerhead would have prevented, and not as caused by AI. The terminal output in Thirteen commands. is real, from the labs that ship with Hammerhead, with colour added and long output clipped or excerpted.

Questions about any of this, or want to run a replay yourself? Request access and ask for the catalog.

Independent verification for infrastructure change

Why machine-speed infrastructure needs a verifier, how Hammerhead models network consequences from configuration, how we measure it, and where the model stops.

Optimesh Technologies · version 1 · September 2026 · about 8 minutes

1. The problem

A network change ships as a diff a colleague has read. The test is production. When the diff is wrong, the outage follows a familiar shape: Facebook in 2021, when a maintenance command withdrew the routes to its DNS servers, and Rogers in 2022, when a change that removed a routing filter took a national network down for most of a day. Different companies and equipment; the same pattern of a change that looked fine in review.

Most of the cost of such a night is not the fix, which is often one line. It is finding that line across a fabric, hop by hop, under pressure. And the rate of change is rising as automation, and now AI agents, propose changes faster than people can read them.

2. Why testing the live network misses it

A probe proves a path exists. Nothing you can send proves a path is absent. To show that a guest network can never reach a payment database, you would have to try every source, destination, port and protocol, a space far too large to sample. Monitoring checks the flows you thought of; the leak lives in the one you didn't.

The configuration already holds the answer. Configs, topology and routing protocols determine each device's forwarding table. Rebuild those tables faithfully and you can answer reachability for every packet from the model, before the change is applied, with no traffic sent. This is the line of work that runs from header space analysis through Veriflow and Batfish.

3. The approach

Hammerhead is a single binary that reads a directory of device configs, discovers the topology, runs the routing protocols to convergence and builds every device's forwarding table. Queries run against that model: reachability, traceroute, every ECMP path, ACL and NAT behavior, and a before-and-after comparison of two config sets.

  • Deterministic. The same inputs give the same answer and the same evidence every run.
  • Offline. It needs only the config files. It runs on your hardware and sends nothing out.
  • Fast enough for every change. On a 976-device synthetic enterprise network, building the full model takes about 0.7 seconds on our benchmark machine, which is what lets it sit in a pull request instead of a quarterly audit.

A language model can write the change; Hammerhead doesn't trust it. The check that decides is deterministic and never sees the model's confidence, so an AI-proposed change is held to the same test as a human one.

4. Four verdicts, and a list of what wasn't checked

The preflight check compares the network before and after a change and returns one of four verdicts: pass, advisory (findings to read, nothing failed), fail (with the lost flows, routes, adjacencies or rules named) or unknown. Unknown matters most. When a change touches something the model does not cover, Hammerhead says so and names it, rather than reporting a pass it cannot back. Each verdict carries a ledger of what was and was not measured.

5. How we measure it

  • Against real routers. 138 of 138 routes match real FRR on our 10-router lab (run 38685150242). Earlier runs scored 137: one route both sides drop was labelled differently. Same behaviour; we fixed the scorer.
  • Against Batfish. Across 351 test snapshots (2,040 devices), the two agree on 94.41% of prefixes, and on the egress interface for 99.80% of the shared prefixes, for IPv4 in the default VRF (routing table only). 12,051 of the 16,359 disagreements come from four snapshots whose frr.conf Batfish reads as IOS; most of the rest from a maximum-prefix limit Hammerhead enforces and Batfish does not. This compares two models, not a model with routers.
  • Against the public record. We rebuilt 134 outages from public reports, and Hammerhead flags the cause of each. These were caught after we fixed the tool to catch them, so they are a regression suite, not a blind test, and we have not yet measured how often Hammerhead fails a healthy change. The methodology has the details.

6. Where it fits

  • In CI. Run preflight on every pull request that touches config. A non-zero exit stops the merge.
  • In the change ticket. The verdict and its reasons travel with the change, so the approver decides on evidence.
  • In front of automation. Ansible and AI agents propose; the gate decides before anything reaches a device.

7. Limits

Hammerhead models what the configs say, not what the network is doing right now. It reads 15 vendor formats, at different depths; some protocols and features are partial or not modeled, and the supported platforms table lists each. It has been checked against real routers in container labs only, not on production hardware. We have no public customer references yet.

Security

Where Hammerhead runs, what it touches, who can use it, what it records, and what it does not do yet. This page covers Hammerhead, RuleHawk and this website.

Last updated October 14, 2026

Config Studio is not covered here yet. Its AI step uses a large language model. Before you evaluate it, ask us where it runs and where your data goes, and we will answer in writing.

Where it runs

  • On your machines. The hammerhead CLI and the optional hammerhead-api server run on hosts you control. Your configs stay there.
  • Nothing phones home. There is no telemetry, license check or update check. Hammerhead makes a network call only when you turn on a feature that needs one: collecting configs over SSH or SNMP, pulling from a cloud API or your config manager, fetching your identity provider's signing keys, or sending webhooks you configured.
  • Air-gap ready. Analysis needs only the config files. To install on an isolated network, copy the binary across.
  • Private by default. The API server listens on 127.0.0.1 unless you bind it elsewhere, and reads only the config directories you allow.

Changes to your devices

Hammerhead reads configs. It never pushes configuration to a device and holds no device write credentials. SSH collection runs read commands such as show running-config.

When Hammerhead proposes a fix, it hands a gated change plus a rollback file to your own automation, as an Ansible bundle for your AWX or Ansible to run. A human approves by default. Rollback is a file you apply, not an automatic action.

SSO and roles

  • The API server accepts bearer JWTs issued by your identity provider. You set the issuer, the audience and one key source: an HS256 secret, an RS256 public key, or a JWKS URL.
  • Three roles, viewer, operator and admin, are enforced route by route (see the API docs). With no token settings, every protected route refuses access.
  • Not built in: OIDC discovery, SAML and SCIM. Teams use an identity bridge such as Keycloak or Auth0 for those.
  • The CLI has no roles. It runs as the operating-system user and reads what that user can read. Control it with OS and file permissions.

Audit trail

Set HAMMERHEAD_AUDIT_DIR and the API server keeps an append-only audit log:

  • Every request that changes state, with who made it, what it asked for and the outcome, plus every denied request (401 and 403).
  • Each entry carries the SHA-256 hash of the one before it. Editing or deleting an entry breaks the chain, and GET /audit/verify (admin) reports where.
  • It never records authorization headers, query strings or request bodies. Each tenant gets its own chain.

Limits: a hash chain cannot show that the newest entries were cut off, so copy the latest hash somewhere you control. The trail covers work done through the Hammerhead server, not CLI runs on a laptop. It is off until you set the directory, except on multi-tenant servers, where it is required.

Compliance checks

Hammerhead ships rule packs that approximate these frameworks, checked offline against the model of your network with no AI model involved:

CIS (network devices, level 1) · PCI DSS (DMZ) · SOC 2 (change control) · HIPAA · ISO/IEC 27001 · NIST CSF 2.0 · DORA · NIS2

Each pack lists the controls it does not cover. They are checks labeled with control IDs, not certified mappings: passing one is evidence you can hand an auditor, not a certification. There are no DISA STIG or NERC CIP packs yet. You can write your own rules in the same YAML format with policy-check.

The software itself

  • Hammerhead is written in Rust, and the compiler forbids unsafe code in the product. The only unsafe blocks are in test and benchmark tooling.
  • Release archives come with SHA-256 checksums. They are not code-signed yet, and neither is the container image.

RuleHawk

RuleHawk analyzes your rules inside your browser, in a background worker running Python compiled to WebAssembly (Pyodide). The config you paste is not sent anywhere; the code that does this is public on GitHub under the Apache 2.0 license. The page is hosted on GitHub Pages and loads fonts from Google Fonts and Pyodide from the jsDelivr CDN, so those services see that you loaded it. To keep everything on your own machine, run the RuleHawk command line or its GitHub Action instead.

This website

No third-party analytics, advertising or tracking scripts, and no cookies. The page loads files only from optimesh.ai and sends data only to optimesh.ai, both enforced by a Content-Security-Policy header. It counts a few actions, such as button clicks and film plays, as anonymous daily totals that identify no one, and counts nothing when your browser sends Global Privacy Control or Do Not Track. The request and message forms post to our host, Netlify. Details in the privacy notice.

Report a vulnerability

Email eng@optimesh.ai with a subject starting SECURITY:. If you hear nothing, escalate to hello@optimesh.ai. We don't publish a PGP key yet; if you need an encrypted channel, send a first email with the subject SECURITY: request encrypted channel and nothing sensitive in it, and we will set one up.

StepTarget
A person acknowledges your report2 business days
Reproduced or not, severity assigned5 business days
Status updates while openat least every 10 business days
Fix or documented mitigation, critical14 days from triage
Fix or documented mitigation, high30 days from triage
Medium and lownext scheduled release

Please redact real device configs before sending anything: hostnames, public addresses, ASNs, keys and secrets.

Privacy notice

What we collect when you use optimesh.ai or our tools, and what we do with it. The short version: what you type into our forms, the request logs our host keeps, and anonymous daily counts of what visitors click.

Last updated October 14, 2026

"We" means Optimesh Technologies. Questions go to contact@optimesh.ai.

What this website collects

  • What you send us. The request-access form asks for your name, work email, company, network size, the product you're asking about and a message. The message form asks for your name, email, a subject and a message. Both are stored by our host, Netlify, and delivered to our team. If the form can't reach Netlify, your browser opens an email to us instead.
  • Request logs. Netlify serves this site and, like any web host, logs requests: IP address, browser, the page requested and when. Netlify handles these under its privacy policy, and can also give us page-view totals from them.
  • Counts of what visitors click. The page tells our server, as an anonymous count, when someone clicks a request-access, email, RuleHawk or PacketDojo button; follows a link to pricing, the docs, the methodology, the white paper, Security or Why Optimesh; starts or finishes a film; or starts or sends a form (never anything typed into it). Click and film counts also note where on the site they happened, such as the page or the header. We store only a total for each per day, with nothing that could identify you: no cookies, no IP address, no browser details. Nothing is counted when your browser sends Global Privacy Control or Do Not Track.
  • Nothing else. No third-party analytics, advertising or tracking scripts, and no cookies. The site loads no files from other domains.

How we use it

We use what you send to reply to you and to handle your request for access. We use the counts and page-view totals to see which parts of the site people use. We don't sell it, and we don't share it with anyone for their marketing. We keep it while we are talking with you and for as long as any relationship that follows needs it. Ask us and we will delete it.

Our products

  • Hammerhead runs on your machines and sends us nothing: no telemetry, no usage data, no configs. See Security.
  • RuleHawk analyzes your rules inside your browser; the config you paste is not sent to us or anyone else. The page is hosted on GitHub Pages and loads fonts from Google Fonts and code from the jsDelivr CDN, so GitHub, Google and jsDelivr see that you loaded it, under their own policies.
  • Config Studio is set up per engagement. We describe its data flows in writing before you evaluate it.

Your choices

You can ask us what we hold about you, correct it, or have it deleted, by emailing contact@optimesh.ai. Links to other sites, such as GitHub or NVIDIA, are governed by those sites' own policies. If this notice changes, we will update the date at the top.

Terms of use

The terms for using optimesh.ai.

Last updated September 28, 2026

What these terms cover

These terms cover your use of this website, run by Optimesh Technologies ("we"). Hammerhead, Config Studio and other Optimesh software are licensed only under a separate written agreement with us. Nothing on this site grants a license to them.

Site content

The site describes our products and research for information. We work to keep it accurate and say how our figures were measured (see the methodology), but products change and the site may lag behind. Demos run on small synthetic labs, as each one says. Nothing here is a promise of results on your network.

The site's text, design and our product names and logos belong to us. Other names and logos belong to their owners and are used only to identify them.

RuleHawk

RuleHawk is free and open source under the Apache License 2.0, which governs its use and says it comes without warranty. Its findings help you review rules; they don't replace your own review before you change a firewall.

Using the site

Please don't attempt to disrupt or break into the site, and don't send us, through our forms, other people's personal information without their permission, or anything malicious. If you find a security problem, report it as described on the Security page.

No warranty

The site is provided as is, without warranties of any kind. To the extent the law allows, we are not liable for any loss arising from your use of the site or reliance on its content.

If these terms change, we will update the date at the top. Questions: contact@optimesh.ai.

Contact

Talk to the people building Optimesh.

Bring a network change, a recurring incident, or a hard question about the model. A member of the founding team will respond.

Request access → Email the team

See Optimesh on your network.

Request a demo using one of your own recurring incidents.

Or email contact@optimesh.ai.

Know the impact of every change
before deployment.

OptimeshDeterministic network assurance.
© 2026 Optimesh Technologies. All rights reserved.Privacy · Terms · Security