Repository navigation
Corrected in 0.3.3: Verdict Corpus v2 is 16 of 17 deterministic cases, not 17/18 (case 18 gives different verdicts on the same build and is now left out of the score). 0.3.2 could also pass an FRR change whose config line was rejected at boot: see the advisory. Upgrade to 0.3.3.
The agent contract. 0.3.2 is about what an AI agent needs to choose Netdryrun, read its result and act on it safely. The CLI, its exit codes, the JSON report and the GitHub Action keep their behaviour, apart from the fixes below.
Breaking change for agents: the pass verdict is renamed. The MCP result's pass verdict SAFE TO PROCEED is now CHECKS PASSED (only what the checks cover): a pass covers only what the checks look at. An agent, prompt or AGENTS.md rule that matched the old text no longer sees it, so it treats a pass as not-a-pass (it fails closed). Decide on the status field, not the verdict text. The three verdict strings are now frozen for v1.
- A typed result.
dry_runandrun_checksresults follow a published JSON Schema, mcp-result-v1.json. A failed result lists each failed check with a one-line reason, an evidence excerpt and one read-onlynext_diagnosticcommand for its node. - Results name what they tested:
testedgives thenetdryrun.ymlthat ran and a sha256 of it, the topology and every file the topology uses, read before the run. A verdict applies to those exact files. - Tool descriptions carry the rules, because small models read only the tool text: write the change first, a failed run means fix and rerun, inconclusive means stop, never weaken checks, use
record_baselinewhen there are none. An agent skill (skills/netdryrun/SKILL.md) and anAGENTS.mdsnippet carry the same rules. - A router whose BGP config never loaded no longer passes its leak guards. A node the file says runs BGP that still reports no BGP neighbors at the convergence gate's cap now fails its post-convergence checks as "not evaluated". Found by this release's multi-vendor AI audit. Still a limit: a peer with a long advertisement interval can deliver a route late; raise
--settleand--holdabove it. - A lab that never reached a testable state is inconclusive (exit 3), with failure scenarios in the file too, and when the only readable answers were pings with no replies (bgpd off on every router).
- MCP paths: a relative path is read from
NETDRYRUN_MCP_ROOTwhen that is one folder, and refused with an example when it names two different files; the report is written to a new file and renamed into place. - An IPv6 scope in a check address must be an interface name: text after
%reached device CLI commands. - Network Change Verdict v1, an open spec for the report format: spec/verdict-v1.
- Verdict Corpus rerun on the built 0.3.2 package in the release gate: every verdict matches the published results (v1 24/30, v2 17/18).
- How this release was checked: releases/0.3.2/GATE.md records static checks, unit tests on Python 3.10–3.14, mutation testing of the verdict logic, the live lab matrix with chaos tests, and review.md: a cold code review and a multi-vendor AI audit (Grok, ChatGPT and a local open model), with every finding and its decision.
Full list: CHANGELOG.