

Also from Kynth Studios


Also from Kynth Studios


Also from Kynth Studios
1# Agent Guide (container stack + external agents)23Open-FDD ships as a **container stack**: `openfdd-central`, `openfdd-web` (React),4`openfdd-fieldbus`, `openfdd-mqtt`, plus optional `openfdd-mcp`. It does **not**5ship an embedded AI chatbot. External orchestrators — Codex CLI, Cursor,6OpenClaw, Claude Desktop, or any MCP host — connect via **JWT REST** and optional7**`openfdd-mcp` stdio**.89| Layer | Responsibility |10| --- | --- |11| **central** | MQTTS ingest, Feather/Parquet historian, DataFusion SQL FDD + `/api/analytics/*`, REST + JWT (Rust image — no Python) |12| **web** | React product UI (`frontend/web`) — sole product UI ([ADR-001](docs/architecture/adr-001-react-rust-modernization.md)) |13| **fieldbus** | BACnet / Modbus / Haystack OT drivers |14| **mqtt** | Mosquitto MQTTS broker |15| **mcp** | Optional read-first stdio tools → central (`OPENFDD_API_BASE`) |1617**Docs:** [Build recipes](docs/operations/build-recipes.md) · [External agents](docs/examples/external-agents.md) · [MCP README](mcp/README.md) · [ECM engineering (PyPI)](docs/ecm/README.md)1819**Software-engineering agent OS:** [`openfdd_agent_spec/`](openfdd_agent_spec/) — architecture locks, skills, Milestone A.2021**Active recovery / Vibe 21 twin program:** [`tools/open-fdd-vibe21-production/`](tools/open-fdd-vibe21-production/README.md) · capability ledger [`docs/migration/react-rust/capabilities.yaml`](docs/migration/react-rust/capabilities.yaml).2223**PyPI (`open-fdd`):** ECM engineering + pandas oracle (`open_fdd.rules` / `analytics` / `reporting`) for **third-party tooling** outside the product app. Product FDD is DataFusion on GHCR.2425Dual expression cookbooks (permanent): `docs/rules/cookbook/` (SQL + pandas).2627## Start session2829Unmerged UI is **not** on GHCR. Resolve newest published images by OCI30`created` (`./scripts/ghcr_newest_by_created.py`), and never paste a Caddy31URL until `./scripts/openfdd_demo_gate.sh` exits 0. See32[`CONTAINER_AGENT.md`](openfdd_agent_spec/CONTAINER_AGENT.md).3334```bash35./scripts/openfdd_stack_up.sh react-ot # React SPA + mqtt + central + fieldbus36# or: react (no fieldbus) / csv37TOKEN="$(curl -s -X POST http://127.0.0.1:8080/api/auth/login \38 -H 'Content-Type: application/json' \39 -d '{"username":"admin","password":"'"$OPENFDD_ADMIN_PASSWORD"'"}' \40 | jq -r '.token // .access_token')"41```4243Discover routes: `curl -s -H "Authorization: Bearer $TOKEN" http://127.0.0.1:8080/api/agent/tools | jq '.tools | length'`4445## Safe scripts4647```bash48./scripts/openfdd_stack_pull.sh react-ot49./scripts/openfdd_stack_up.sh react-ot50./scripts/nightly-ot-bench/run_all.sh # pull sha-* + OT/API gates51./scripts/openfdd_stack_up.sh csv52```5354## External agent workflow55561. Stack healthy on LAN/VPN only — never expose on public internet.572. JWT for admin/operator/viewer (see central auth env).583. `openfdd-mcp` stdio outside the web UI, or REST `/api/agent/tools`.594. Read-first; writes need `OPENFDD_MCP_ALLOW_WRITES=1` and `confirm:true`.605. Never print secrets. BACnet writes need explicit human approval.6162## Product UI / FDD agent notes6364- **Overview plots:** plot Expanders default **open** so charts are not hidden behind carets (`OverviewPopulated`).65- **Lab → FDD Plots:** `session_config` `confirm_min` (and rule params) apply to the series overlay (`sql_detail_session`). After **Update this rule**, Reports/FDD Plots must refetch on `RULES_UPDATED`.66- **SCHED-1 occupancy:** treat numeric `0` / `0.0` / `false` **and** string `unoccupied` (and related tokens) as unoccupied — SQL + pandas cookbook stay aligned.67- **Synthetic-59:** soak via `scripts/synthetic_59_*.py` under `reports/wattlab-parity/fixtures/synthetic_59/`. Do not greenwash `expected_faults.csv`. B100 dump-parity remains **paused**.68- **Units:** FDD SQL is °F canonical. Metric CSVs convert at query (`unit_system=metric|si`). Lab sliders show °C when metric is selected; Run all rules after switching.69- **Hourly append:** seed with `POST /api/csv/import/package`, then `POST /api/csv/import/package/append` (JWT, `confirm:true`). Custom appenders stay outside the repo.70- **Overview layout:** full width beside sidebar (Streamlit-like); named Plotly PNG stems via `downloadFilename`; Lab rule menu A–Z; FDD series = required∪optional roles.71- **Mech OAT bins:** status/cmd before amps; prefer web/weather OAT. Analytics envelopes: `scripts/synthetic_59_overview_analytics_soak.py`.7273## Low-RAM hosts (bensbench)7475- **Never** local `docker build` / heavy Rust compile for stack images. Ship via PR → GH Actions → GHCR `nightly` / `sha-*`.76- Before pulling new images: prune unused/old digests first, then `./scripts/openfdd_stack_pull.sh …` and `./scripts/openfdd_stack_up.sh … --no-pull`.77- Details: [`openfdd_agent_spec/CONTAINER_AGENT.md`](openfdd_agent_spec/CONTAINER_AGENT.md).7879## Never8081- delete `workspace/`82- run `docker compose down -v`83- run `docker volume prune`84- print secrets or tokens85- expose API on public internet86- write BACnet without explicit human approval87- embed vendor chat relays or model API keys in the stack88- add Python to the product central/web request path89- local stack image builds on low-RAM hosts (use GHCR)9091See [docs/agent/index.md](docs/agent/index.md) for external-agent architecture.9293For library/migration/PR missions (Milestone A), start at [openfdd_agent_spec/AGENTS.md](openfdd_agent_spec/AGENTS.md).94
One repository carrying more than one format is the comparison this product exists for: does anyone actually write different content in each file, or is one a copy of the other?
| Repository | Format | Stack | Covers | Score | Changed |
|---|---|---|---|---|---|
| bbartling/open-fdd.cursor/rules/openfdd-demo-ghcr.mdc · 157 | Cursor rules | testdo-not | 69/100 | today | |
| bbartling/open-fdd.cursor/rules/openfdd-phase1-react-parity.mdc · 157 | Cursor rules | no sections | 47/100 | today | |
| bbartling/open-fddopenfdd_agent_spec/AGENTS.md · 157 | AGENTS.md | stylesecuritydependenciesmonorepo+2 | 67/100 | today | |
| bbartling/open-fddservices/fieldbus/AGENTS.md · 157 | AGENTS.md | testapiagent-behaviour | 62/100 | today | |
| bbartling/open-fddtools/open-fdd-modernization/AGENTS.md · 157 | AGENTS.md | teststyletesting-strategygit+5 | 69/100 | today |
Same format, overlapping stack, ranked by quality.
| Repository | Format | Stack | Covers | Score | Changed |
|---|---|---|---|---|---|
| vllm-project/vllmAGENTS.md · 89k | AGENTS.md | setuptestlint-formatstyle+5 | 100/100 | 14 days ago | |
| duckduckgo/content-scope-scriptsspecial-pages/AGENTS.md · 70 | AGENTS.md | buildteststylearch+3 | 100/100 | 14 days ago | |
| code-yeongyu/oh-my-openagentpackages/web/AGENTS.md · 68k | AGENTS.md | setupbuildtestlint-format+6 | 100/100 | 13 days ago | |
| TryGhost/Ghoste2e/AGENTS.md · 55k | AGENTS.md | setupteststylearch+2 | 100/100 | today | |
| aaif-goose/gooseAGENTS.md · 53k | AGENTS.md | setupbuildtestlint-format+7 | 100/100 | 8 days ago | |
| n8n-io/n8npackages/@n8n/agents/AGENTS.md · 201k | AGENTS.md | buildteststylearch+3 | 100/100 | 14 days ago | |
| deepseek-ai/deepseek-harnessnative/landlock-run/AGENTS.md · 104k | AGENTS.md | setupteststylearch+3 | 100/100 | today | |
| mui/material-uiAGENTS.md · 99k | AGENTS.md | setupbuildtestlint-format+9 | 100/100 | 14 days ago |
A badge carrying the measured quality of the strongest agent config file in this repository, out of 100. It reads from this index every time somebody loads your page, so it changes when the measurement changes and there is nothing to keep up to date. Free, no account, and the value is not something you or we can set by hand.
[](https://rulestack.kynth.studio/configs/bbartling-open-fdd-agents)Would rather not hotlink us? Every badge is also served in shields.io’s endpoint schema, so shields renders the image and your readers never talk to our domain:
Published by Toolproof, the masthead over this index and eight others. The method behind the number is at toolproof.kynth.studio/methodology, and the whole thing is readable as JSON with no key at /api.