Concepts

How dispelnet works

From identifying a device to collecting evidence, building a network model and drawing conclusions.

dispelnet architectureProbe identifies the device. Discovery recipe produces stored facts, from which the model is computed. Facts and model feed deterministic analysis. Unsupported output goes through a proposal and human quarantine review before becoming an approved recipe.yesnoadded to recipesProbeWhat are you?Discovery recipeWhat do youknow?Supported?FactWhat did youreport?ModelWhat does it meantogether?Analysis recipeWhat can weconclude?ProposalHow could thisoutput be read?QuarantineHas a humanapproved it?Approved recipe

Identification and collection

First dispelnet identifies the device. Then it works out which questions that device can answer. Probes and discovery recipes are YAML files, updated separately from the binary, so device support can grow without upgrading dispelnet.

dispelnet/discovery-recipes

Probe

One test dispelnet uses to identify a device family.

A probe runs one read-only command and checks the response. dispelnet can run several. Each match claims a device family.

Several may match. A router running FRR is also a Linux host, so both probes match.

Tiers decide which claim wins. The most specific one does.

TierClaims
vendora network OS that names itself
osa routing stack on a general-purpose host
genericthe host underneath
probes/linux.yaml
# Anything Linux-shaped, and deliberately the last rung: several network
# operating systems run on Linux and must be recognised as themselves first.
# That is what the `generic` tier means.

id:        linux
tier:      generic
transport: ssh
command:   uname -sr

is:
  - {field: 1, equals: Linux}

family:   linux
verified: linux 7.0.0-30-generic

Discovery recipe

Answers one question for one device family and its versions.

A probe asks “What are you?” A recipe asks “What do you know?” It gives a command and says how to read the output: which rows to pick, and which field goes into which part of the answer. Inside, it is a graph of steps. So a value from a parent row, such as an interface name or a VRF, is still available to the rows below it.

applies: is required and lists the versions the recipe is written for. verified: records that someone ran it against that device at that version. The two are separate. A recipe can apply to a range and be verified on one release.

Every recipe comes with the device output it was written from, and dispelnet recipes verify checks that the recipe can still read it. A recipe without that output is rejected.

linux/addresses.yaml
family:   linux
question: addresses
applies:  ["*"]
verified: linux 7.0.0-30-generic

command: ip -j neigh
select:  "[*]"
fields:
  address: dst
  state:   state[*]

  # Which interface the neighbour was seen on. A device resolves addresses on
  # every interface it has, including the one it is managed through, and those
  # are not the same kind of fact: one is a device on a shared segment, the
  # other may be what is on the end of a cable.
  port:    dev

What a walk produces

A walk writes a log. Everything you read afterwards is computed from that log, offline, without going back to a device.

Fact

One structured answer, stored with its evidence.

A fact is structured data, not plain text. It also records where it came from: which device, which recipe, which platform, when, and the raw output. The claim and its evidence are stored together, so you can always check a fact.

Facts are repeatable. Run the recipe again on an unchanged device and the same fact comes back. No AI is involved at any step.

The store is a log. New facts are only ever added, and every run is kept.

a fact, with the evidence behind it
leaf1   neighbor   address:10.1.0.11        resolved → h1

  leaf1  frr / addresses         ip -j neigh
  h1     linux / local-addresses ip -j addr

Model

The log read back as devices, links and gaps.

The model is built from the fact log. dispelnet model reads a finished run and reports what the network looks like. The model is not stored. It is rebuilt each time you ask.

This is why the model can change without touching the network. Collect once, then rebuild the model as the recipes get better. Moving to another database also means a rebuild, not a migration.

Gaps are results too. If no device in the run claims an address, it stays unknown instead of being guessed.

Facts are stored. The model is computed.
dispelnet model --links
$ dispelnet model --links
13 links

leaf1            h1               neighbor
leaf1            spine1           bgp, lldp, neighbor
spine1           spine2           bgp, lldp, neighbor

Adding device support

What happens when no probe recognises a device, or no recipe answers a question for it. AI learns how to read your infrastructure. It never operates it.

Proposal

A draft recipe for output nothing can read yet.

You supply the command and its output. A language model suggests how to read that output. It never chooses what runs on a device. If a draft changes the command, that change is ignored, because the output came from the command you already ran.

dispelnet propose recipe --family cisco_asa --question hostname --command "show version" --from ./show-version.txt

It shows what the draft read, not what it wrote. A template can match the wrong text and still look fine, but a wrong row is easy to spot in seconds. It also shows how many attempts and tokens it used. The more attempts it needed, the less you should trust the result.

  1. command + transcript you supply both
  2. language model only suggests how to read it
  3. quarantined draft reports the rows it read
The command is an input, not an output.

Quarantine

Where a draft stays until a person approves it.

A draft is saved with quarantine: true, and nothing will load a file marked that way. It is also saved next to the recipe cache, not inside it. Nothing reads it, even by accident.

To approve a draft, delete that line. There is no approve command, because you are already reading the file. To publish it, open a pull request. CI then runs dispelnet recipes verify on every recipe and probe, so the draft is checked against all of them, not only against itself.

Nothing an AI writes reaches a device without a review.
  1. quarantine: true nothing will load it
  2. you delete that line this is the approval
  3. pull request checked against every recipe

Questions about the network

Reading the facts you already collected, rather than the devices you collected them from.

Analysis recipe

Answers a question about a network by reading facts.

An analysis recipe reads facts, never devices. Which links have mismatched MTU. Where OSPF is adjacent on one side only. Which devices are past end of life.

It produces findings, not facts. A fact is something a device reported. A finding is a conclusion dispelnet draws from facts, and it always links back to those facts.

Analysis gives the same result every time. Language models write proposals. They never write findings.

Try these concepts on your own network.

Get started → Browse device recipes →