← OGENIC GOD TOOLKITCONTENT HISTORYWHAT CHANGED · RULE-BASED ANALYSIS
Update to OGENIC GOD TOOLKIT
Snapshot Sep 30, 2026 · 23:15 UTC · version 1.2.4
Collection source: not recorded for this historical snapshot.
First saved snapshot
No earlier snapshot is available to establish a change.
Compare saved observations
Download comparison JSONFull technical diff · 0 changed fields
Full snapshot data
{
"description": "Draw a network topology diagram from a netwalk scan record. Produces a self-contained SVG with a vendor logo, hostname, management IP, model, OS version and live CPU/RAM/storage/temperature per device, one box per internet uplink, and port labels on every link. Use when the user asks for a network diagram, topology map or visual of a scanned site, or wants the picture refreshed after more devices were found.",
"included_files": [
{
"relative_path": "agents/openai.yaml",
"size_in_bytes": 182
}
],
"name": "netwalk-map",
"skill_md_contents": "---\nname: netwalk-map\ndescription: Draw a network topology diagram from a netwalk scan record. Produces a self-contained SVG with a vendor logo, hostname, management IP, model, OS version and live CPU/RAM/storage/temperature per device, one box per internet uplink, and port labels on every link. Use when the user asks for a network diagram, topology map or visual of a scanned site, or wants the picture refreshed after more devices were found.\n---\n\n# netwalk-map\n\nPart of the **netwalk** read-only network survey toolkit. Toolkit lives at `{{TOOLKIT}}`.\n\n## Run it\n\n```bash\npython3 {{TOOLKIT}}/scripts/netwalk_map.py ~/.netwalk/sites/acme-hq/scan-2026-08-22.json \\\n -o ~/.netwalk/sites/acme-hq/map.svg \\\n [--public] [--title \"Acme HQ — after the switch swap\"] [--top-down] [--no-group-aps]\n```\n\nOutput is one self-contained SVG: no external fonts, no scripts, no network requests. It opens in a\nbrowser, drops into a document, and follows the reader's light/dark setting. `netwalk-fullreport`\nembeds the same renderer, so the diagram in the report and the standalone file never drift apart.\n\n`--public` drops the scan date and the unreachable-device count from the caption.\n\n## The record is the source of truth\n\nThe renderer draws only what the record says. **Never hand-edit the SVG** — fix the record and\nre-render, or the diagram and the report start telling different stories and the next scan silently\nreverts your edit.\n\nLayout is deterministic and reads **left to right**, the way a packet travels: internet uplinks in\na column on the left, then the gateway, then each layer of switching, then the edge. Devices are\nranked by BFS depth from the gateway and ordered inside each rank to minimise crossings. A rank with\nmore devices than fit in one column wraps into another column rather than running off the page.\nSame record in, same SVG out — so two scans of one site diff cleanly and a changed diagram means a\nchanged network.\n\n`--top-down` stacks it vertically instead, which suits a shallow network or a portrait page.\n\n## What the record needs for a good diagram\n\n| Field | Effect if missing |\n|---|---|\n| `devices[].vendor` | falls back to a lettered chip instead of a logo |\n| `devices[].hostname`, `mgmt_ip` | the box is hard to identify |\n| `devices[].model`, `os_version` | the version line is empty — and version is what people read a diagram for at upgrade time |\n| `devices[].role` | everything lands in one flat rank and the layout stops meaning anything |\n| `devices[].health` | no CPU/RAM/storage/temperature chips |\n| `topology_edges[].a_port` / `b_port` | links have no port labels, so nobody can trace a cable from the picture |\n| `wan_links[]` | no uplink boxes at all |\n\nChips turn red past CPU 80%, RAM 85%, storage 85%, 65 °C — so an overloaded box is visible in the\npicture, not just in a table.\n\n## Access points are grouped per switch\n\nA site with a hundred APs draws a hundred boxes and a comb of a hundred lines: accurate, unreadable,\nand not what anyone opens a diagram for. Every AP whose only uplink is one switch is collapsed into\na single node on that switch showing **how many APs, the address range they occupy, the model mix,\nand how many are up versus down**. The per-device detail is still in the report's inventory table —\nonly the picture groups them.\n\nAn AP with more than one uplink (a mesh AP, or one with a second cable) is never collapsed: its\nextra link is exactly the thing a diagram exists to show. Pass `--no-group-aps` to draw every access\npoint separately.\n\n## Conventions worth keeping\n\n- **One box per internet uplink.** Primary and backup are separate boxes with ISP, IP and speed.\n Never merge them into a single \"INTERNET\" cloud — which link is which is the whole point.\n- **Dashed = inferred.** Any edge with `discovered_via: \"inferred\"` is drawn dashed, and inferred\n devices (a suspected unmanaged switch) get a dashed red outline. Do not promote a guess to a solid\n line to make the picture tidier.\n- **Unreachable devices still appear**, dashed, with the reason on the box. A device you could not\n log into is part of the network and leaving it out makes the map a lie.\n- **`role` drives the layers**, left to right: `gateway`/`router`/`firewall` →\n `l3-switch`/`controller` → `switch` → `ap`/`server`/`nas`/`nvr` → everything else.\n- **Port names sit above a link, the link's own label below it.** A short run between two adjacent\n ranks would otherwise print the port name straight through the speed label.\n\n## Internet uplinks carry the operator's mark\n\nEach WAN box shows the ISP's own wordmark next to its name, matched from `wan_links[].isp` against\n`assets/logos/isp-<slug>.svg`. Common Thai operators resolve through an alias table, so \"AIS Fibre\",\n\"True Online\" and \"3BB Fiber\" all find the right mark. An operator with no file gets a lettered chip\n— never a blank.\n\n```bash\npython3 {{TOOLKIT}}/scripts/netwalk_logos.py isp # the built-in set\npython3 {{TOOLKIT}}/scripts/netwalk_logos.py isp \"Fibre Co\" --colour '#009688'\n```\n\nGet the real operator names from the device rather than guessing: on RouterOS the PPPoE client\ninterfaces usually carry them as comments (`/interface pppoe-client print detail`), which also gives\nyou the contracted speed. Read that, put it in `wan_links[].isp` and `link_speed`, and keep the PPPoE\naccount names out of the record — those are credentials.\n\n## Logos\n\n`{{TOOLKIT}}/assets/logos/<vendor>.svg`, 24×24 viewBox, one path or text element, monochrome so it\ncan inherit the theme colour. Omada devices come back as `vendor: \"tplink\"`, which the fetched logo set already covers.\nTo add a vendor, drop in `<vendor>.svg` matching the `vendor` string\nin the record (or add an alias in `LOGO_ALIAS` in `netwalk_map.py`). No logo is not an error — the\ndevice gets a lettered chip.\n\n## If it looks wrong\n\n- **Boxes overlapping or the picture is enormous** — usually many devices in one rank because\n `role` is missing or everything is `unknown`. Fix the roles.\n- **Very tall (left to right) or very wide (top down)** — one rank holds far more devices than the\n others. Check the AP grouping did what you expected, then consider the other orientation.\n- **A device floating with no links** — no `topology_edges` entry references it. Either you did not\n derive the edge, or it genuinely is not connected to anything you scanned; say which.\n- **Wrong parent** — a discovery frame seen on a bridge/VLAN interface was recorded as a direct\n link. Prefer the physical port when the neighbour output names one.\n- **Text clipped** — long hostnames are truncated on purpose to keep boxes uniform; the full name is\n in the report's inventory table.\n"
}SHA-256 of public snapshot: 6a44666f98073108758c16672004b806c0863ad43bf165afdfce7c79f2ae43ee