workspace/skills/network-data-analysis/SKILL.md
Ad-hoc read-only SQL analysis over exported network data (Zeek logs, Suricata eve.json, generated reports) using DuckDB. Use when aggregating across a packet capture's sessions, correlating IDS alerts with connection metadata, or answering counting and grouping questions that a per-log view cannot
npx skillsauth add automateyournetwork/netclaw network-data-analysisInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
analysis-mcp (NetClaw-authored, spec 092)analysis_status, analysis_datasets, analysis_queryLoads files from an allowlist of roots — ~/.openclaw/nsm/runs (Zeek/Suricata output
from nsm-mcp), the workspace output directory, and ~/.openclaw/analysis for your own
exports.
NetClaw's own stores are permanently unreachable: ~/.openclaw/memory/,
~/.openclaw/rag/, ~/.openclaw/n2n/ and ~/.openclaw/gait/, plus .ssh, .aws, .kube
and .env. A generic SQL surface over those would be a backdoor, not an analysis tool.
That is not enforced by pattern matching. Datasets are materialised, then DuckDB's own
enable_external_access=false and lock_configuration=true close every filesystem and
network path irreversibly for the life of the process. Verified: read_csv('/etc/passwd'),
glob('/home/**'), ATTACH of the memory or RAG stores, COPY … TO, INSTALL/LOAD, and
re-enabling access all raise.
If you need a file analysed, put it under ~/.openclaw/analysis — do not try to reach it in
SQL, because you cannot.
nsm_analyze (skill nsm-session-pivot) writes Zeek logs and
Suricata eve.json. Without a run, this surface has nothing to read and says so.analysis_status — is the sandbox locked, how many datasets loaded, what are the caps?analysis_datasets — table names, row counts, columns. Read the columns before writing
SQL; guessing column names wastes a round trip.analysis_query — one read statement per call.Zeek tables carry their real column names (id_orig_h, id_resp_p, uid), lifted from
the log's #fields header. Without that they would be column0…columnN and unusable.
Every Zeek log shares uid with conn.log, so a join is the session pivot — and unlike
walking logs one at a time, it aggregates:
SELECT c.id_orig_h, c.id_resp_h, c.service, h.method, h.host, h.uri
FROM zeek_<run>_conn c
LEFT JOIN zeek_<run>_http h USING (uid)
ORDER BY c.ts
Counting questions a per-log view cannot answer:
-- top talkers by connection count
SELECT id_orig_h, count(*) AS conns FROM zeek_<run>_conn
GROUP BY 1 ORDER BY conns DESC LIMIT 20
-- which services appeared at all
SELECT service, count(*) FROM zeek_<run>_conn GROUP BY 1 ORDER BY 2 DESC
-- Suricata alert signatures by frequency
SELECT json_extract_string(alert, '$.signature') AS sig, count(*)
FROM suricata_<run>_eve WHERE event_type = 'alert' GROUP BY 1 ORDER BY 2 DESC
truncated: true means you are looking at a page. Never present a capped result as a
total — run COUNT(*) for the real number. The tool reports this in gaps.CAST(duration AS DOUBLE)) and say that you did.notes; a per-table row cap applies. Check analysis_status before
claiming completeness.0 datasets means no exports exist, never "the network was quiet."nsm-session-pivot) — and SQL over an incomplete
log is confidently wrong. Check the posture of the run you are querying.INSERT/UPDATE/DELETE/DROP/CREATE/ATTACH/COPY/INSTALL/SET
are refused, and independently impossible after lockdown.| Skill | How They Work Together |
|-------|----------------------|
| nsm-session-pivot | Produces the Zeek logs this queries; use it for single-session detail |
| nsm-ids-triage | Produces eve.json; use SQL here to aggregate alerts across a capture |
| packet-analysis | Drop to individual packet decode once SQL narrows the field |
| document-generation | Turn a query result into a report table |
| gait-session-tracking | Record all analysis runs |
ANALYSIS_QUERY_TIMEOUT — per-query seconds (default 30)ANALYSIS_MAX_RESULT_ROWS — result cap (default 500)ANALYSIS_EXTRA_ROOTS — extra allowlisted roots, os.pathsep-separatedANALYSIS_MAX_FILE_BYTES / ANALYSIS_MAX_ROWS — load capstools
Zoom meeting intelligence — correlates a live or referenced Zoom meeting discussion against NetClaw's historical meeting record (via the official Zoom Meetings MCP) and today's actual network state. Use when someone in a Zoom meeting references a past discussion or incident ('didn't we have this issue before?'), or asks to search prior meetings for a topic. Does not itself recognize live in-meeting questions — that happens automatically inside zoom-rtms-mcp's own extractor (spec 118) before this skill is ever invoked.
tools
Manage Lantronix out-of-band (OOB) infrastructure via Percepxion central management platform: device inventory, serial port inspection via SLC CLI, firmware compliance, config management, security auditing, and closed-loop incident remediation. Use during outages, maintenance windows, compliance cycles, and AI-assisted automation workflows.
tools
Federate your NetClaw with other NetClaw operators over the BGP mesh — exchange capability inventories and ask your claw what a peer can do. (US1; remote invocation and chat land in later phases.)
tools
Track token consumption, enforce session budgets, and display cost for every NetClaw interaction.