- tools/physics-sanity/ — JS library of cross-node balance helpers
(mass / hydraulic / hydraulic-power / oxygen-transfer / energy) with
7 unit tests + a CLI demo. Designed for `require()` from per-node
integration tests where shape-based unit tests miss physically-
impossible plant states.
- tools/docker-compose.yml + tools/mcp/{node-red-admin,influxdb,browser}
scaffolding — placeholder Dockerfiles + a ROADMAP.md for the Node-RED
admin MCP. Compose file is the target shape for the Q3-2026 migration
to the central MCP server; the per-service Dockerfile stays in this
repo as the canonical definition either way. Implementations are TODO.
- tools/README.md — top-level tooling index; documents the CI order for
running every tool on a PR.
- .gitignore: ignore tools/.env (developer-specific MCP endpoints).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- tools/output-manifest-verify/ — enforces .claude/rules/output-coverage.md
§3: every node ships test/_output-manifest.md and every declared key
is referenced by at least one test file. First run shows only
machineGroupControl has the manifest (16 keys covered); all other nodes
warn. --strict escalates "missing manifest" to an error for CI gating.
- flow-lint gains two rules from the same output-coverage rule:
* FN_OUTPUT_WIRES_MISMATCH — function declares outputs=N but wires has
M arrays (causes silent dropped or duplicate emissions).
* FN_PAYLOAD_NULL_LITERAL — function source contains `payload: null`
literal (the η-null ui-chart crash pattern from 2026-05-14).
First run found 1 instance in mgc/02-Dashboard.json.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Generates the markdown table inside <!-- BEGIN AUTOGEN: topic-contract -->
blocks in nodes/<n>/wiki/Reference-Contracts.md from the canonical registry
at src/commands/index.js. Replaces the agent-written placeholders the wiki
uplift left behind.
- Accepts both labelled and unlabelled END markers; rewrites to canonical
'<!-- END AUTOGEN: topic-contract -->' on regeneration so future runs are
consistent.
- --check mode for CI (exit 1 if any block is out of date).
- Out of scope for now: data-model AUTOGEN block (requires instantiating
the domain; the 9 agent-written placeholders for that block stay until
a follow-up tool lands).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- tools/contract-verify/ — diffs CONTRACT.md ## Inputs table vs
src/commands/index.js registry. First run found 3 real drifts:
MGC has `set.scaling` in CONTRACT (not in registry); monster + settler
registry has `child.register` (not in CONTRACT); pumpingStation registry
has `set.outflow` (not in CONTRACT).
- tools/flow-lint/ — lints examples/*.flow.json against the rules in
.claude/rules/node-red-flow-layout.md. First run flagged the
monster/basic flow (4 ui-* at 0,0 + ui-chart missing interpolation
property) and rotatingMachine/edge.flow.json (6 ui-* at 0,0).
- Both tools are read-only, single-binary npm packages with a `--json`
output mode for CI, exit code 1 on drift. Encode the rules so we
don't have to re-discover the bugs that motivated them.
Per CLAUDE.md tooling doctrine: prefer these over ad-hoc grep/jq.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>