netclaw: Instructions file for Claude Code

CLAUDE.md

netclaw CLAUDE.md is an instructions file for Claude Code from automateyournetwork/netclaw. It costs 10,723 tokens per session, scanned A, original, Apache-2.0.

Development instructions for Netclaw, a stateless network-management project using Python, JavaScript, HTML, and CSS. The guide describes its technologies, project structure, commands, and coding conventions.

In plain words
What is it for?
Use it when adding or changing Azure networking services, SuzieQ integrations, MCP servers, token handling, or Canvas-based visualizations.
Why use it?
It puts the project’s many planned components in one place, reducing uncertainty about which tools, APIs, and patterns to use.

Instructions file for Claude Code

Written for Claude Code: the file is CLAUDE.md. Also seen: built for openclaw.

This is automateyournetwork/netclaw's own configuration. It tells Claude Code how to work on netclaw itself, so it is not a mod to install elsewhere. Copy it as a starting point and replace the rules that are about this project. Everything netclaw configures →

Reuse

Borrowing it

Nothing to install: this file belongs to automateyournetwork/netclaw. Take a copy, put it at the same path in your own repository, and replace the rules that are about this project with yours.

Copy the file
curl -O https://raw.githubusercontent.com/automateyournetwork/netclaw/main/CLAUDE.md
Clone the repo
git clone --depth 1 https://github.com/automateyournetwork/netclaw

Made for: Claude Code.

Wrote this? Show the measurements

A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.

agentmods badge for netclaw CLAUDE.md

README.md
[![agentmods](https://agentmods.dev/badge/instructions/automateyournetwork/netclaw/claude-md.svg)](https://agentmods.dev/instructions/automateyournetwork/netclaw/claude-md)
Your own site
<a href="https://agentmods.dev/instructions/automateyournetwork/netclaw/claude-md"><img src="https://agentmods.dev/badge/instructions/automateyournetwork/netclaw/claude-md.svg" alt="Measured on agentmods" height="20"></a>
Per session 10,723 This file is loaded in full into every session.
When invoked 10,723 The same file — it is already loaded in full.
Security scan A 0 findings. Scan, not verified.
Origin original No closer match found in the catalogue.
Token cost

What it costs to keep this loaded

Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.

ModelPer sessionOnce invoked
Fable 5.1 $0.10723 $0.10723
Opus 5 $0.05361 $0.05361
Sonnet 5 $0.02145 $0.02145
Haiku 4.5 $0.01072 $0.01072

Measured today against content hash 148e9956323b, method: parsed. Prices are Anthropic first-party input rates as of 2026-09-06, from the pricing page.

Security

Grade A, and why

netclaw CLAUDE.md scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured today.

A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.

Nothing flagged

None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.

CLAUDE.md · 245 lines

How it starts

The opening of the file, as written. The whole thing — 245 lines — stays where its author put it; the contents beside it link to each section on GitHub.

netclaw Development Guidelines

Auto-generated from all feature plans. Last updated: 2026-09-03

Active Technologies

  • N/A (stateless server; subscription state held in-memory during runtime) (003-gnmi-mcp-server)
  • Python 3.10+ + FastMCP (MCP framework), azure-mgmt-network, azure-mgmt-resource, azure-identity (DefaultAzureCredential), gait_mcp (audit logging) (004-azure-network-mcp)
  • N/A (stateless; reads from Azure ARM APIs) (004-azure-network-mcp)
  • JavaScript (ES2022) / HTML5 / CSS3 for Canvas components; SKILL.md for skill definition + OpenClaw Canvas/A2UI framework (rendering primitives), existing MCP servers (data sources) (005-canvas-a2ui-integration)
  • N/A (stateless visualization — all data fetched on demand from MCP servers) (005-canvas-a2ui-integration)
  • Python 3.10+ + FastMCP (mcp SDK), httpx (async HTTP client), python-dotenv (001-suzieq-mcp-server)
  • N/A (stateless proxy to SuzieQ REST API) (001-suzieq-mcp-server)
  • Python 3.10+ + anthropic (SDK with count_tokens), toon-format (TOON serialization), FastMCP (existing MCP framework) (006-token-optimization)
  • N/A (in-memory session ledger; no persistent storage) (006-token-optimization)
  • N/A (no server code — Jenkins plugin is Java-based and runs inside Jenkins). Skill documentation and configuration files only. + Jenkins 2.533+ with MCP Server plugin (v0.158+), MCP Java SDK 0.17.2 (007-jenkins-mcp-server)
  • N/A (stateless — Jenkins maintains all job/build state) (007-jenkins-mcp-server)
  • TypeScript/Node.js (community MCP server). No netclaw-authored server code — configuration and skill documentation only. + @zereight/mcp-gitlab (npm package), Node.js 18+ (008-gitlab-mcp-server)
  • N/A (stateless proxy to GitLab REST API) (008-gitlab-mcp-server)
  • Python 3.10+ (community MCP server). No netclaw-authored server code — configuration and skill documentation only. + mcp-atlassian (pip package), Python 3.10+ (009-atlassian-mcp-server)
  • N/A (stateless proxy to Atlassian REST APIs) (009-atlassian-mcp-server)
  • Python 3.10+ (consistent with existing NetClaw MCP servers) + FastMCP (MCP framework), asyncio (UDP receivers), pysnmp (SNMP trap decoding), python-syslog-rfc5424 (syslog parsing), xflow (IPFIX/NetFlow decoding) (010-telemetry-receivers)
  • In-memory only (data lost on restart, acceptable for demo/testing scope) (010-telemetry-receivers)
  • Markdown (documentation reorganization) + N/A (pure markdown files, OpenClaw read tool) (011-soul-optimization)
  • Filesystem (~/.openclaw/workspace/) (011-soul-optimization)
  • Python 3.10+ (consistent with existing NetClaw MCP servers) + FastMCP (MCP framework), httpx (async HTTP client), python-dotenv (environment variables) (012-gns3-mcp-server)
  • N/A (stateless proxy to GNS3 REST API) (012-gns3-mcp-server)
  • Python 3.10+ (community MCP server uses prisma_sase SDK) + prisma-sdwan-mcp (community), prisma_sase SDK (OAuth2 client) (013-prisma-sdwan-mcp-server)
  • N/A (stateless proxy to Prisma SASE REST API) (013-prisma-sdwan-mcp-server)
  • N/A (Remote MCP managed service) + Datadog MCP remote endpoint, DD_API_KEY, DD_APP_KEY (016-datadog-mcp-server)
  • N/A (stateless proxy to Datadog APIs) (016-datadog-mcp-server)
  • Python 3.10+ (consistent with NetClaw MCP servers) + blender-mcp (community, via uvx), Blender 3.0+ (user-installed) (024-blender-3d-viz)
  • N/A (stateless - visualization is ephemeral in Blender) (024-blender-3d-viz)
  • Python 3.10+ (community MCP server with Aruba CX REST API client) + aruba-cx-mcp-server (community), httpx or requests (REST client) (025-aruba-cx-mcp-server)
  • N/A (stateless proxy to Aruba CX REST API) (025-aruba-cx-mcp-server)
  • N/A (Remote MCP server - no code required) + N/A (Remote MCP managed service) (026-devnet-content-search-mcp)
  • N/A (stateless - all data from remote API) (026-devnet-content-search-mcp)
  • Python 3.10+ (MCP servers, policy scripts), Bash (installation) + NVIDIA OpenShell CLI (uv tool), Docker (container runtime), existing FastMCP servers (027-netshell-security)
  • Local filesystem for policies and audit logs; no database (027-netshell-security)
  • Bash (installation scripts), Python 3.10+ (DefenseClaw requires), Go 1.25+, Node.js 20+ + DefenseClaw (Cisco), Docker (container runtime) (027-netshell-security)
  • SQLite (DefenseClaw audit logs), optional SIEM (Splunk HEC, OTLP) (027-netshell-security)
  • Node.js 18+ (Check Point MCPs are NPM packages), Bash (install scripts) + @chkp/* NPM packages (15 total), npx (MCP execution) (031-checkpoint-mcp-integration)
  • N/A (stateless proxy to Check Point APIs) (031-checkpoint-mcp-integration)
  • Python 3.11+ + FastMCP, sqlite3 (stdlib), chromadb, sentence-transformers, torch (CPU) (033-memory-mcp)
  • SQLite (facts, decisions, links) + ChromaDB (embedded sessions) in ~/.openclaw/memory/ (033-memory-mcp)
  • Markdown (SOUL.md), Python 3.10+ (Memory MCP already implemented) + Memory MCP Server (Feature 033), GAIT, OpenClaw workspace (034-layered-memory-integration)
  • SQLite (facts, decisions, links), ChromaDB (session embeddings), MEMORY.md (long-term) (034-layered-memory-integration)
  • Markdown (documentation files) + N/A (pure documentation) (038-docs-hud-refresh)
  • Python 3.10+ (consistent with NetClaw MCP servers) + FastMCP (MCP framework), tweepy 4.x (Twitter API v2 client), python-dotenv (039-twitter-x-integration)
  • Memory MCP (tweet history for deduplication, 30-day retention) (039-twitter-x-integration)
  • Python 3.10+ (consistent with existing NetClaw MCP servers) + FastMCP (MCP framework), tweepy 4.x (Twitter API v2 client), python-dotenv (040-twitter-mentions)
  • Memory MCP (feature 033) for interaction history; in-memory tracking for processed mention IDs (040-twitter-mentions)
  • Node.js 18+ (for @twilio-alpha/mcp), Python 3.10+ (for webhook server and skills) + @twilio-alpha/mcp (NPM), FastMCP (Python webhook), Twilio SDK, openai-whisper-api (existing skill for STT) (042-twilio-voice-mcp)
  • Memory MCP (feature 033) for call logging and audit trail (042-twilio-voice-mcp)
  • Python 3.10+ (webhook server, skills), Node.js 18+ (Twilio MCP) + FastMCP, Twilio SDK, @twilio-alpha/mcp, Anthropic SDK, httpx, existing MCP servers (pyATS, CML, GNS3, PagerDuty, RFC, Memory, Twitter) (043-full-voice-integration)
  • Memory MCP (conversation context per caller ID), SQLite (call audit logs) (043-full-voice-integration)
  • Python 3.10+ (skill logic), No custom MCP server code (uses built-in UE5 MCP) + httpx (HTTP client for MCP), Unreal Engine 5.8+ (user-installed with MCP plugin) (044-ue5-mcp-network-viz)
  • N/A (stateless - visualization is ephemeral in UE5) (044-ue5-mcp-network-viz)
  • Python 3.10+ (matches the existing ue5-network-viz skill and the rest of NetClaw) + httpx (existing UE5 MCP HTTP/JSON-RPC client, ue5_mcp_client.py), no new third-party packages required (045-ue5-digital-twin)
  • N/A — all new state (sticky alert flags, live-mode status, session history buffer, manual zoom groupings) is in-memory for the lifetime of the running skill process; nothing persists across a NetClaw restart (045-ue5-digital-twin)
  • Python 3.10+ (skill logic, consistent with the rest of NetClaw) + Three.js r147 pinned ([email protected] — last release with both classic UMD core and non-module OrbitControls/GLTFLoader addons) vendored as static JS, the newly vendored community sketchfab-mcp-server (Node.js, mcp-servers/sketchfab-mcp-server/, registered as sketchfab-mcp in config/openclaw.json) for real-stencil model search/download, and NetClaw's existing topology-source skills/MCP servers (CML lab tooling, gns3-mcp-server, clab-mcp-server, eve-ng-mcp-server, nautobot-mcp-v2, netbox-mcp-server, infrahub-mcp, ipfabric integration, forward-mcp) consumed as-is, not modified (046-threejs-network-viz)
  • N/A for rendering itself; generated visualizations are written as timestamped, uniquely-named .html files to a persistent NetClaw workspace output directory (per Clarification session 2026-07-05) — never overwritten, never ephemeral (046-threejs-network-viz)
  • Python 3.10+ (matches every other script in scripts/, e.g. scan-all-mcp-source.py, register-all-mcps.py) + None beyond the Python standard library (os, json, re) — no new third-party packages (047-docs-inventory-reconciliation)
  • N/A (reads existing workspace/skills/ directory tree and config/openclaw.json; writes no persistent state) (047-docs-inventory-reconciliation)
  • Node.js 18+ (official chrome-devtools-mcp server — no NetClaw-authored server code); Bash (setup/enable script, consistent with scripts/*-enable.sh convention); Markdown (skill + MCP documentation) + chrome-devtools-mcp (npm package, official Chrome DevTools team release, MIT-style OSS), Node.js 18+, a locally installed Chrome/Chromium binary (stable channel by default) (048-chrome-devtools-browser-inspection)
  • N/A for NetClaw itself (stateless proxy to a local browser process). A persistent Chrome profile directory on disk (~/.openclaw/chrome-devtools/profile by default, overridable via CHROME_DEVTOOLS_PROFILE_DIR) holds cookies/session state for manually authenticated sites — this is Chrome's own state, not a NetClaw-managed database. (048-chrome-devtools-browser-inspection)
  • Bash (matches every existing NetClaw install/enable script and PR #96's own implementation), Python 3.10+ (for the coverage-check script, extending the existing scripts/verify-inventory-counts.py pattern) + None beyond what's already vendored — PR #96's own scripts/lib/*.sh, the repo's existing Python stdlib-only tooling convention (049-merge-modular-installer)
  • N/A (installer logic + a plain-text component manifest at ~/.openclaw/netclaw-components.conf, per PR #96's own design) (049-merge-modular-installer)
  • Bash (install function, matching every existing scripts/lib/install-steps.sh entry), Markdown (skill documentation) + OpenClaw's ClawHub computer-use skill (consumed as-is, no fork); apt packages xvfb, xfce4, xfce4-terminal, xdotool, scrot, imagemagick, dbus-x11, x11vnc, novnc, websockify (all confirmed present in this host's apt repositories; dbus-x11, imagemagick, scrot, xvfb already installed) (050-computer-use-desktop)
  • N/A — the virtual desktop's state is ephemeral (X11 session state), nothing NetClaw-managed persists across a restart (050-computer-use-desktop)
  • Python 3.10+ (daemon federation layer + n2n-mcp, matching + Existing bgp-daemon-v2.py (listener, protocol (052-n2n-federation)
  • SQLite at ~/.openclaw/n2n/federation.db (consent records, grants, (052-n2n-federation)
  • Python 3.10+ (daemon federation layer + n2n-mcp, matching + Existing bgp-daemon-v2.py + bgp/federation/* (053-n2n-ergonomics)
  • Extend the existing SQLite at ~/.openclaw/n2n/federation.db with (053-n2n-ergonomics)
  • Python 3.10+ (daemon federation layer + n2n-mcp, matching 052/053), Node.js 18+/ES2022 (HUD), Bash (installer), no new languages + Existing bgp-daemon-v2.py + bgp/federation/* (manager, channel, service, inventory, authorization, invocation, chat, gateway, negotiate, tasks, audit), FastMCP (n2n-mcp), Python stdlib json/sqlite3/asyncio/ssl/socket; cryptography (already a repo dependency, spec 003) for self-signed key generation and pinned-key verification. No new third-party packages. (056-in2n-internal-federation)
  • Extend the existing SQLite at ~/.openclaw/n2n/federation.db with iN2N tables: risk (name/description/role/enabled-stacks), member (risk-local id, pinned key, transport binding, scope, health, state), enrollment_token (single-use). Reuse delegated_task for internal delegation; internal delegations are recorded in the existing remote_invocation_record audit table with a channel_kind discriminator. Pinned keys and the risk's own key stored under ~/.openclaw/n2n/keys/. (056-in2n-internal-federation)
  • Python 3.10+ (daemon + federation package + tooling), Bash (installer/service generator glue), Node.js 18+/ES2022 (HUD posture render only) + Existing bgp-daemon-v2.py + bgp/federation/* (service, risk, router, internal_channel, audit, gateway, manager, invocation, tasks); the installed defenseclaw CLI (~/.local/bin/defenseclaw, docs/DEFENSECLAW.md); the installed openshell CLI (~/.local/bin/openshell); git (GAIT trail); systemd --user. Python stdlib only (asyncio, subprocess, sqlite3, json, pathlib, shutil, time). No new third-party packages. (057-in2n-production-enforcement)
  • Extend existing SQLite ~/.openclaw/n2n/federation.db (member health fields, per-member service binding); new GAIT git repo at ~/.openclaw/n2n/gait/ (unbounded, FR-012a); systemd units under ~/.config/systemd/user/; env under ~/.openclaw/mesh.systemd.env + per-member env files (existing pattern). (057-in2n-production-enforcement)
  • kramdown-rfc Markdown → RFCXML v3 (via kdrfc); Markdown for supporting docs. No application code. + kramdown-rfc (Ruby gem, provides kdrfc), idnits (I-D nits checker), xml2rfc (invoked by kdrfc). Ground-truth source: the reference implementation bgp/constants.py, channel.py, agent.py, internal_channel.py, negotiate.py, risk.py (read-only; cited, not modified). Reference set: RFC 2119/8174/4271/8259 + JSON-RPC 2.0 (normative); RFC 7301/6455/7435/6335/8126, MCP, A2A, draft-yan-a2a-device-agent-applicability (informative). (059-ncfed-internet-draft)
  • N/A — the deliverable is a document; no runtime state. (059-ncfed-internet-draft)
  • Python 3.10+ (daemon + bgp/federation/*, matching 052/053/056/057); Node.js 18+/ES2022 (HUD render only); Bash (installer/patch) + Existing bgp-daemon-v2.py + bgp/federation/* (channel, internal_channel, risk, service, manager, audit, gateway, negotiate); cryptography (already a repo dependency — keys, CSRs, X.509 issuance/verification); lego (single-binary ACME client, vendored/downloaded at install, drives DNS-01 across 100+ providers); Python stdlib ssl/asyncio/sqlite3/json. No new Python packages. (060-claw-cert-security)
  • Extend existing SQLite ~/.openclaw/n2n/federation.db (peer trust columns, credential + rotation-event tables); key material under ~/.openclaw/n2n/keys/ (CA, host credential, ACME account) with 0600/0700 permissions (060-claw-cert-security)
  • Python 3.10+ (server, matching repo MCP convention; memory-mcp packaging style with hatchling pyproject), Node.js 18+/ES2022 (HUD panel + Express endpoints), Bash (installer step) + fastmcp/mcp, chromadb>=0.4, sentence-transformers>=2.2 (+ torch CPU), rank_bm25, pymupdf (PDF), beautifulsoup4 + httpx (HTML/URL), python-docx, openpyxl, python-pptx, vsdx (modern office), LibreOffice headless (soffice, optional system package) for legacy DOC/XLS/PPT/VSD conversion (062-rag-mcp)
  • ~/.openclaw/rag/ — ChromaDB (chroma/, dense vectors), SQLite (rag.db: document registry, retrieval log, telemetry, schema version), BM25 pickles (bm25/<collection>.pkl), retained originals (sources/), intake dir (intake/). Never touches ~/.openclaw/memory/ (FR-030) (062-rag-mcp)
  • Python 3.10+ (daemon + bgp/*, bgp/federation/*); Bash (none new); Node/ES2022 (HUD posture render only) + existing bgp-daemon-v2.py, bgp/agent.py, bgp/session.py, bgp/federation/{tls,service,manager,channel,inventory,posture}.py; stdlib ssl/asyncio/sqlite3. No new third-party packages. (063-ncfed-wire-hardening)
  • extend existing SQLite ~/.openclaw/n2n/federation.db (reuse federation_peer.endpoint_host/endpoint_port/endpoint_updated_at); reuse keys under ~/.openclaw/n2n/keys/. No new stores. (063-ncfed-wire-hardening)
  • Python 3.10+ (daemon + bgp/federation/*, matching 052–063); Markdown (SOUL/skill docs + NCFED draft §11 for -01) + Existing only — bgp/federation/inventory.py (card), router.py (selection), invocation.py/gateway.py (retrieval turn), the feature-062 rag-mcp (rag_list, rag_search). No new third-party packages. (064-knowledge-capability-cards)
  • Reuses ~/.openclaw/rag/rag.db (documents registry, read-only for advertisement) and the issued capability card. Per-peer visibility reuses existing federation.db rows. No new store. (064-knowledge-capability-cards)
  • Python 3.10+ (daemon + bgp/federation/*, matching 052–064) + Existing only — bgp/federation/replication.py (NEW: manifest/batch client+server logic, size-cap check, task worker), tasks.py (TaskManager/delegated_task, reused as-is for the async job), authorization.py (reused, new target_type="knowledge_replica" grant), negotiate.py (TIER0_DENIED gains "knowledge/replicate"), channel.py (existing ch.call() framing, already chunks messages >64 KB), knowledge.py/inventory.py (card gains embedding_model; build_entries() excludes kind='replica' rows), rag-mcp's storage/chroma_store.py (gains a paginated collection-export read and a rename-on-verify write path) and storage/registry.py (documents.kind gains 'replica'; new nullable provenance columns). No new third-party packages. (065-chroma-vector-replication)
  • Extends the existing rag-mcp documents table in ~/.openclaw/rag/rag.db (feature 062) with a 'replica' kind and new nullable columns (source_peer_identity, source_collection_id, source_embedding_model, replicated_at). Extends the existing Chroma store at ~/.openclaw/rag/chroma/ with one collection per replica, named from source peer + source collection_id (FR-016) — no new database, no new top-level store. (065-chroma-vector-replication)
  • Python 3.10+ (daemon + bgp/federation/*, matching 052–065); Dart 3.x / Flutter 3.x (new mobile client, mobile/netclaw-mobile/) + Python: websockets (new, but already present transitively in this environment per Phase 0 research — declared explicitly in protocol-mcp/requirements.txt) for the Border-side WS listener; qrcode (new, pure-Python) for rendering the enrollment QR; existing tls.py/FederationService.host_credential() (060) reused as-is for the domain-verified SSL context; existing manager.py/risk.py enrollment-token and member-pinning code reused, extended with a node_type column. Dart: a WebSocket client package (web_socket_channel or equivalent), a QR-scanner package (mobile_scanner or equivalent), platform secure-storage packages (Keychain/Keystore-backed) for the enrollment key, and platform push packages (APNs/FCM) — exact package choices are an implementation detail of Phase 2 tasks, not fixed here. (066-netclaw-mobile-ncfed-edge)
  • Extends the existing SQLite ~/.openclaw/n2n/federation.db member table with a node_type column (agent default | service | edge); reuses its existing pinned_key/key_fingerprint columns for the edge node's TOFU-pinned key — no new table. On the phone: platform secure hardware (iOS Keychain/Secure Enclave, Android Keystore) holds the enrollment private key; app-local storage (not federation.db) holds the message feed and connection state. (066-netclaw-mobile-ncfed-edge)
  • Python 3.10+ (daemon + bgp/federation/*, matching 052–067); Dart 3.x / Flutter 3.x (extends mobile/netclaw-mobile/) + Python: none new — reuses push_to_edge(), resolve_approval(), RiskRouter/member.scope, TaskManager. Dart: local_auth (biometric gating, US1), camera (photo/video capture, US2/US3) — exact audio-recording package (distinct from 067's speech-to-text, which discards audio after transcribing) is a Phase 2 task detail. (068-ncfed-mobile-biometrics-capture)
  • No new tables — member.scope gains capture-capability entries (same column, same JSON shape 066/067 already write); approval_request's existing resolved_via column gains a new value ("biometric"), no schema change. (068-ncfed-mobile-biometrics-capture)
  • Python 3.10+ (daemon + bgp/federation/*, matching 052–066); Dart 3.x / Flutter 3.x (extends mobile/netclaw-mobile/, the same codebase 066 established) + Python: none new — reuses gateway.run_agent_turn(), tasks.py's TaskManager, edge.py's EdgeChannel/EDGE_METHODS, invocation.py's handle_task_status/result/cancel exactly as-is. Dart: an on-device speech-to-text package for US4 (voice → text before sending, research D7) and (for US5) reuses mobile_scanner (already added in 066) for the QR half of the device deep link; the netclaw://device/<id> URI-scheme half needs a deep-link/app-links package (e.g. app_links or platform intent filters) — exact package choice is a Phase 2 task detail, not fixed here. (067-ncfed-mobile-command-channel)
  • No Border-side schema change — session_key=f"n2n-edge-{member_id}" passed to run_agent_turn already gives each enrolled device its own agent session (research D6); the per-device conversation history itself (FR-007) is entirely on-device, a second JSON-Lines store mirroring 066's MessageFeedStore pattern (ConversationStore). (067-ncfed-mobile-command-channel)
  • Swift 5.0 (existing ios/Runner/*.swift, SWIFT_VERSION = 5.0 in + None new. Reuses what's already in pubspec.yaml: local_auth ^3.0.2 (071-ios-mobile-port)
  • N/A — Secure Enclave key storage is managed entirely by the Keychain/Secure Enclave (071-ios-mobile-port)
  • Swift 5.0 (new watch app target + new WatchRelayPlugin.swift on the phone + WatchConnectivity (Apple system framework, phone + watch sides — no new (072-apple-watch-companion)
  • N/A on the watch — it holds no persistent state of its own; every view (Approvals, (072-apple-watch-companion)
  • JavaScript ES2022 (ESM), Node 22+ for tooling + three.js ^0.170.0 (existing), OrbitControls, (072-hud-2-org-chart)
  • N/A — stateless client; all state from /api/n2n and /api/graph (072-hud-2-org-chart)
  • Dart 3.x / Flutter 3.x (extends mobile/netclaw-mobile/, SDK constraint ^3.12.2 per pubspec.yaml); Swift 5.0 (extends the WatchApp Watch App target from spec 072); Python 3.10+ (the one Border-side addition, authorization.py/service.py, matching specs 052-072) + flutter_local_notifications (new — local notification posting, Darwin/Android notification actions, iOS badge control); existing firebase_messaging/firebase_core (unchanged, remote-push path stays out of scope per Assumptions); existing app_links (extended, not replaced, per research D4); watchOS AVSpeechSynthesizer (system framework, no new dependency, watch-side only) (073-push-notifications-sync)
  • Extends the existing phone-local JSON-Lines MessageFeedStore and whole-file JSON ConversationStore (both under the app's documents directory) with new fields — no new store, no new database (073-push-notifications-sync)
  • Python 3.10+ (all scripts/*.py), Bash (CI wiring, catalog is a Bash array) + None — Python standard library only, per the convention every existing (075-mcp-config-reconciliation)
  • N/A — all state is existing repository files; this feature adds no datastore (075-mcp-config-reconciliation)
  • Python — interpreter choice is a live decision, not a default (see R7). + nornir 3.5.0, napalm 5.2.0, netmiko (>=4,<5 per nornir-netmiko), (076-multivendor-cli-driver)
  • No database. A generated inventory cache on disk (regenerable, credential-free); an (076-multivendor-cli-driver)
  • on-disk cache, one JSON file per (ostype, version) under ~/.openclaw/cisco-psirt/. No (078-cisco-psirt-vulnerability)
  • Python 3.10+, system interpreter. Unlike spec 076 this needs no dedicated venv — + mcp>=1.2.0,<2 and httpx>=0.27.0,<1. Two packages, identical to spec 078's (080-fortinet-coverage)
  • None. Stateless proxy to three appliance APIs. Change baselines (US3) write under a (080-fortinet-coverage)
  • Python 3.10+, system interpreter. No dedicated venv — two pure-HTTP packages move + mcp>=1.2.0,<2 and httpx>=0.27.0,<1. Identical to specs 078 and 080. The mcp (081-bgp-registry-intel)
  • None on disk. Per-source in-memory TTL cache only (clarification Q3): RPKI 5 min, routing (081-bgp-registry-intel)
  • Python 3.10+, system interpreter. No dedicated venv — the four libraries are already (082-document-generation)
  • none. Files land in workspace/output/document-mcp/ (gitignored, feature 046's convention). (082-document-generation)
  • Python 3.10+. The vendored server runs from its own virtualenv; NetClaw authors no (083-zabbix-nms)
  • none. The NMS holds the history. (083-zabbix-nms)
  • Dart 3.x / Flutter (SDK constraint ^3.12.2, matching mobile/netclaw-mobile/pubspec.yaml); Swift 5.0 (existing ios/Runner/*.swift, ios/WatchApp Watch App/*.swift); Bash (CI workflow is declarative YAML, no new scripting language) + No new Dart packages — reuses flutter_local_notifications, firebase_messaging, firebase_core, local_auth, app_links, web_socket_channel, flutter_secure_storage already in pubspec.yaml. New native-only surface: Apple's ActivityKit (Live Activity, Story 7) and WidgetKit (watchOS complication, Story 8) — both system frameworks, zero new third-party dependencies, consistent with every prior mobile spec (066-073) adding no new packages beyond what a given story strictly needs. (099-mobile-prerelease-sweep)
  • N/A — reuses existing on-device stores (MessageFeedStore, ConversationStore, ApprovalClient in-memory state, flutter_secure_storage for enrollment) for Dashboard data; no new persistence introduced. (099-mobile-prerelease-sweep)
  • JavaScript ES2022 (ESM), Node 22+ for tooling. No TypeScript in this package. + three 0.170.0 → 0.185.1 (the only dependency change); existing gsap, lil-gui, vite 5.4 unchanged. Addons consumed as-is: OrbitControls, CSS2DRenderer, EffectComposer + RenderPass/UnrealBloomPass/ShaderPass/OutputPass/SMAAPass/AfterimagePass/FilmPass/GlitchPass, VignetteShader, RGBShiftShader. No new package. (101-hud-threejs-modernization)
  • N/A — stateless client. All state from GET /api/n2n and GET /api/graph; nothing persisted. (101-hud-threejs-modernization)
  • JavaScript ES2022 (ESM), Node 22+ for tooling. No TypeScript. + [email protected]no new package. New import surfaces: three/webgpu (WebGPURenderer, PostProcessing, Lighting), three/tsl (node functions), three/addons/lighting/ClusteredLighting.js, and three/examples/jsm/tsl/display/* (BloomNode, RGBShiftNode, SMAANode, AfterImageNode, FilmNode). Force-directed solver is hand-written, not a dependency (research R4). (102-hud-webgpu-interactive-layout)
  • NEW — a single JSON file written by server.js at a fixed path, holding per-preset node positions and camera pose. First persistent state the HUD client has ever had. /api/n2n and /api/graph unchanged (FR-032). (102-hud-webgpu-interactive-layout)
  • Dart 3.x / Flutter, SDK constraint ^3.12.2 (from pubspec.yaml) + No new packages. Reuses firebase_messaging ^16.4.3, firebase_core ^4.12.1, flutter_local_notifications ^22.2.0, all already present. Continues the 066–073 and 099 precedent of adding no dependency a story does not strictly require. (107-push-render-deeplink)
  • Existing on-device stores, extended not replaced — MessageFeedStore (JSON-Lines) and, unchanged, ConversationStore. No migration of stored history. (107-push-render-deeplink)
  • Dart 3.x / Flutter (SDK per mobile/netclaw-mobile/pubspec.yaml), Swift 5.0 (ios/Runner/*.swift) — same stack as specs 066–103, unchanged. + None new. local_auth (already a dependency, already used by approval_confirmation.dart) covers US2's biometric gate. US1 is pure Flutter widget code. US3 uses Flutter's and Xcode's existing command-line toolchain (flutter build ipa, xcrun altool) — no package added. (105-ios-appstore-readiness)
  • No new storage. US1/US2 read/write the existing EnrollmentStore (ncfed_enrollment.json) exactly as today; nothing new is persisted. (105-ios-appstore-readiness)
  • Dart 3.x / Flutter (SDK ^3.12.2 per mobile/netclaw-mobile/pubspec.yaml), Swift 5.0 (ios/WatchApp Watch App/*.swift, US5's watch-side haptics only) — same stack as specs 066–108, unchanged. + Two new: flutter_markdown_plus (^1.0.12, US2 — see research.md R1) and share_plus (^13.3.0, US2 — see research.md R2). Everything else reuses existing dependencies: flutter_secure_storage (US4's app-lock preference), local_auth (US4, already used by approval_confirmation.dart), flutter_local_notifications (US3). (109-mobile-polish-pass)
  • flutter_secure_storage gains two new keys (US4: app-lock enabled/disabled boolean, grace-period duration in seconds — research.md R5). No other new persisted state; US6's search/filter state is explicitly transient (FR-015) and US7 adds no state at all, only wiring. (109-mobile-polish-pass)
  • Dart 3.x / Flutter (SDK ^3.12.2 per mobile/netclaw-mobile/pubspec.yaml), Swift 5.0 (ios/Runner/*.swift, new AppIntents target membership) — same stack as specs 066–110, unchanged. Python 3.10+ for the one Border-side addition (bgp/federation/*, matching specs 052–110). + No new Dart or Python packages. Swift: Apple's AppIntents framework (system framework, iOS 16+, ships with the SDK — not a package dependency). Reuses existing EdgeClient, EdgeAskClient, EdgeIdentityPlugin, ConversationStore, LocalNotifications, DeviceHeartbeatStore (Dart) and Authorizer (Python) as-is. (111-siri-app-intents)
  • No new store. ConversationStore's existing origin field gains one new valid value, 'siri' (research.md R5) — no schema change, no migration. (111-siri-app-intents)
  • Swift 5.0 (ios/WatchApp Watch App/ApprovalsView.swift, AskView.swift; ios/WatchComplication/HeartbeatComplication.swift, PendingApprovalComplication.swift) — same stack as specs 072/099, unchanged. No Dart/Flutter changes in this spec. + None new. SwiftUI's handGestureShortcut(_:) (watchOS 11+, system framework) and WidgetKit's .accessoryCorner WidgetFamily case (watchOS 9+, system framework) — both ship with the SDK, not package dependencies. (112-watch-double-tap-complication)
  • N/A — neither item reads or writes any new state. Both complications continue reading HeartbeatStatusStore/PendingApprovalCountStore exactly as today. (112-watch-double-tap-complication)
  • Swift 5.0 (ios/LiveActivityWidget/*.swift, new + existing; ios/Runner/LiveActivityBridge.swift), Dart 3.x / Flutter (lib/ncfed/live_activity.dart, lib/ncfed/conversation_store.dart, lib/ncfed/device_deep_link.dart, lib/screens/chat_screen.dart) — same stack as specs 099/109–112, unchanged. + None new for the app itself. ActivityKit's LiveActivityIntent protocol (iOS 17+, system framework) and Text(timerInterval:) (system SwiftUI API) — both ship with the SDK. Build-time only: the xcodeproj Ruby gem (already available in this environment, already used for the identical class of problem in spec 071) to add the three new Swift files to the correct Xcode target(s) (research.md R5). (113-live-activity-interactive-inflight)
  • N/A — no new persisted state. ConversationStore's two new callbacks (onAdded, onTerminal, research.md R4) are settable function references, exactly like the existing onCompleted, not stored data. (113-live-activity-interactive-inflight)
  • Swift 5.0 (ios/NetClawWidget/*.swift, rewriting Xcode's placeholder template content; ios/Runner/WidgetDataStore.swift, ios/Runner/WidgetBridgePlugin.swift, new), Dart 3.x / Flutter (lib/ncfed/widget_data.dart, new; lib/ncfed/device_deep_link.dart, extended) — same stack as specs 099/109–113, unchanged. + None new. WidgetKit's ControlWidget/AppIntentControlConfiguration (iOS 18+, system framework, already the reason NetClawWidgetExtension's deployment target was bumped in this branch's setup commit) and WidgetCenter (system framework) ship with the SDK. (114-widgets-controlwidget)
  • One new App Group UserDefaults store (group.ca.automateyournetwork.netclaw.mobile.ios, already registered by the operator) — three keys (health summary/pushedAt/isAlarm, pending count, unread count), mirroring three values that already exist elsewhere on the phone (DeviceHeartbeatStore, ApprovalClient.pending, MessageFeedStore.unreadCount); no new source of truth. (114-widgets-controlwidget)
  • Dart 3.x / Flutter (SDK ^3.12.2 per pubspec.yaml); Swift 5.0 (ios/Runner/*.swift) — same stack as specs 066–114, unchanged. + No new dependencies. Reuses AppIntents (iOS 16+ system framework, already in place from spec 111), FlutterEngineGroup (Flutter SDK, already available, previously unused in this codebase), flutter_secure_storage (already a dependency, used for the new theme preference exactly as specs 109/110 already use it for other settings). (115-siri-reliability-fix)
  • flutter_secure_storage gains one new key (theme preference: system | light | dark). No other new persisted state — conversation-turn recording reuses the existing ConversationStore exactly as today. (115-siri-reliability-fix)
  • Python 3.10+ (matches bgp/federation/*, specs 052–115); no new language. + websockets (new — Border-side persistent WS client to the OpenClaw (116-border-turn-latency)
  • N/A (stateless; no new persistent state — this is a runtime dispatch/performance fix) (116-border-turn-latency)
  • Dart 3.x / Flutter (SDK ^3.12.2 per mobile/netclaw-mobile/pubspec.yaml); + None new. Reuses EdgeAskClient/EdgeRpcSource (Dart, edge_ask_client.dart), (117-siri-voice-tuning)
  • N/A — no new persisted state (data-model.md: value-only constant change, request-scoped (117-siri-voice-tuning)
  • Python 3.10+ (zoom-rtms-mcp, bgp/federation/zoom_channel.py — matches every + FastMCP (MCP framework, matching repo convention), Zoom's official RTMS (118-zoom-meeting-intelligence)
  • N/A — MeetingSession/LiveContextBuffer/avatar state are in-memory only inside (118-zoom-meeting-intelligence)
  • Python 3.10+ (skill logic, matching every other NetClaw skill); Node.js 18+ + The community shawnrushefsky/comfyui-mcp server (Node/TypeScript, MIT (120-comfyui-topology-viz)
  • N/A — stateless skill; each completed generation is written as an image file plus a (120-comfyui-topology-viz)
  • Bash (scripts/peering-setup.sh, matching its own existing style), Python + None new. Reuses the mesh daemon's existing enrollment/token-issuance (119-mobile-release-readiness)
  • N/A — no new persisted state. Enrollment continues to live in the existing federation (119-mobile-release-readiness)
  • Python 3.10+ (matches every existing NetClaw MCP server and skill; no new + FastMCP (both new MCP servers, matching repo convention), N2G (new — (121-federated-topology-viz)
  • N/A — no new persistent storage; images pass inline (base64) over the existing (121-federated-topology-viz)
  • Python 3.10+ (matches every existing NetClaw MCP server and skill; no new + FastMCP (worldlabs-marble-mcp, matching repo convention), httpx (122-worldlabs-topology-viz)
  • N/A — no new persistent storage of any kind (spec Clarifications Q1/Q2, FR-013, (122-worldlabs-topology-viz)

Read the full file on GitHub · 245 lines

Changes

What this file has done since we first saw it

Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.

  1. today Changed · -2 lines · -85 tokens per session 148e9956323b
  2. yesterday Changed · +4 lines · +176 tokens per session c9eec33c7529
  3. 2d ago Changed · +1 lines · +5 tokens per session e33d39128230
  4. 6d ago First seen · 242 lines · 10,627 tokens per session scan A f32b7f738f96

Subscribe to this mod's changes

netclaw CLAUDE.md is an instructions file published in the GitHub repository automateyournetwork/netclaw (650 stars, last pushed today), licensed Apache-2.0. It adds 10,723 tokens to every session, about $0.0536 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.

Related

Other instructions, from other repositories

next.js AGENTS.md

AGENTS.md instructions for vercel/next.js, covering next.js development guide, codebase structure, monorepo overview, core package: packages/next and other important packages.

vercel/next.js · 7,296 tokens

codex AGENTS.md

AGENTS.md instructions for openai/codex, covering rust/codex-rs, the codex-core crate, code review rules, crate api surface and model visible context.

openai/codex · 5,182 tokens

vscode buildNext.instructions.md

Working notes and architecture documentation for the new esbuild-based build system in build/next. Use when making changes to the new build pipeline (transpile/bundle commands, NLS plugin, source-map handling, resource copying, or self-hosting watch tasks).

microsoft/vscode · 6,785 tokens

vscode oss-third-party-notices.instructions.md

Instructions for microsoft/vscode, covering vs code oss third-party-notices pipeline, architecture, pipeline flow in ci, applying the notice (cutover) and fallback chain (never fail the build).

microsoft/vscode · 5,001 tokens

langchain AGENTS.md

AGENTS.md instructions for langchain-ai/langchain, covering global development guidelines for the langchain monorepo, corridor security analysis, project architecture and context, monorepo structure and development tools & commands.

langchain-ai/langchain · 4,469 tokens

spec-kit AGENTS.md

AGENTS.md instructions for github/spec-kit, covering agents.md, about spec kit and specify, quickstart — add a new integration in 5 steps, integration architecture and integrationmanifest — file tracking.

github/spec-kit · 7,104 tokens