Dendrai:面向 AI 智能体的审计级治理控制平面
ibrenthutchings-source/dendrai-dashboard
Dendrai 是一个面向 AI 智能体的审计级治理控制平面,拦截每个智能体工具调用并作为受治理事件接入,经 Bronze→Silver→Gold 流水线交由三名独立评估器组成的 Council 加一名 Adjudicator 裁决,输出 CLEAR / MONITOR / ESCALATE 判定与综合风险分。
Dendrai — the audit-grade control plane for AI agents
Your agents are already in production. Dendrai is what lets you defend that decision.
Dendrai sits in front of every action your AI agents take, enforces policy your own people wrote and approved, escalates the risky calls to a named human, and writes the evidence your auditor, board, and regulator will ask for. Agent pilots don't stall on model quality — they stall at the sign-off meeting, when Legal, Audit, or the board asks for a defensible record nobody can produce. Dendrai is the wedge into that meeting.
This repo is the full running system: the React/Vite dashboard, the Python governance backend
(project/agentic-tools/), the UBO Governance Brain adjudication pipeline (UBO/), and the MCP
servers that expose it to Claude Code / Claude Desktop.
The sales narrative (one-pager, 10-slide deck, sample pilot deliverable) lives on the gtm
branch, not yet merged here — ask if you need it linked from this README. For what to trust and
what's still open in the AI/algorithmic components, see
project/MODEL_CARD.md.
What Dendrai does
- Intercepts. Every agent tool call is ingested as a governed event — one endpoint, any framework (MCP, LangChain, OpenAI function calling, or a custom loop).
- Adjudicates. Each event runs Bronze→Silver→Gold into a Council of three independent evaluators (quantitative, narrative, systemic) plus an Adjudicator, producing a verdict — CLEAR / MONITOR / ESCALATE — with a composite risk score and conflict flags.
- Enforces. Policy-as-Code runs on the real Open Policy Agent binary, not a pattern matcher. A fired deny rule vetoes the ensemble outright and forces human review — a control your people wrote and approved outranks anything the scoring says.
- Escalates. Escalated calls land in an approval inbox with preparer/reviewer separation and multi-approver sign-off. A named human decides, and that decision is recorded against the AI's.
- Proves it. Every event, verdict, policy hit, and human decision is written to a tamper-evident, hash-chained evidence record, mapped to SOC 2, NIST SP 800-53, ISO 27001, and COSO — verifiable on demand, not reconstructed after the fact from application logs.
The LLM reviewer in this pipeline can only ever escalate a verdict — never talk one down — and it's only consulted on cases the deterministic ensemble already flagged for a human. That asymmetry is enforced in code, not a prompt instruction.
Framework-agnostic — one endpoint, any agent
The adjudication pipeline (Bronze → Silver → Gold → Council, see project/agentic-tools/mcp_governance.py)
is not MCP-only. MCP tool calls reach it via the telemetry proxy, but any other agent
framework — LangChain, OpenAI function calling, a custom agent loop, or any non-MCP system — can
report tool calls to the same generic ingestion endpoint and get the identical Council review,
risk scoring, and HITL escalation as MCP traffic:
curl -X POST https://<host>/observability/telemetry/ingest \ -H "Authorization: Bearer <ingest_api_key>" \ -H "Content-Type: application/json" \ -d '{ "server_name": "langchain-finance-agent", "event_type": "tool_call", "action": "modify_permissions", "resource": "erp.accounts_payable.vendor_master", "severity": "HIGH", "payload": {"tool": "update_vendor_bank_details", "args": {"vendor_id": "V-4471"}} }'
ingest_api_key is issued per registered system in Dendrai UBO™ Configuration → Monitored
Systems, encrypted at rest, and revocable independently of every other system's key. A LangChain
callback handler or an OpenAI function-calling wrapper needs only to POST its tool-call events
here — no MCP server required. Inbound webhook listeners (GitHub, SARIF/evidence, ITSM) and 16
poll-based connector types (Oracle Fusion, SAP HANA, SailPoint, ...) feed the same pipeline through
the same generic path — see project/agentic-tools/README.md
for the full inventory of what's listening and how often.
Expands from the same engine
The adjudication pipeline isn't agent-only. Point it at the rest of the estate and the evidence chain, control mapping, and approval workflow all carry over — this is the platform the wedge opens the door to, not a separate product:
| ERP | Oracle Fusion RMCS, SAP, NetSuite, Dynamics 365 — SoD violations, control test results, deficiencies |
| Identity | SailPoint — privilege escalation, orphaned accounts, certification failures |
| DevOps | Branch-protection drift, secret scanning, pipeline security, SARIF findings, DORA change metrics |
| Cloud | Postgres CIS hardening, platform drift, connector credential hygiene |
| Third-party / Vendor risk | Continuous SOC 2 coverage tracking, expiry re-escalation |
| AI Governance | Third-party AI tool assessment tracking, human-oversight gap detection |
| Enterprise risk | Continuous risk register → audit scope → management action plans → board report |
The Dendrai Intelligenza dashboard in this repo is that platform's front end: a six-stage
continuous audit loop (signal intake → risk scoring → HITL gate review → scope → management
action plans → closure/calibration) built on live SEC EDGAR/FRED/RSS data, ten deterministic
risk/forecasting models, and the same Claude-powered advisory layer used elsewhere in the
pipeline — see project/README.md for the full feature reference.
Running the app
cd project npm install npm run dev # Vite dev server at http://localhost:5173
cd project/agentic-tools pip install -r requirements.txt cp .env.example .env # fill in API keys — see project/agentic-tools/README.md python api_server.py # → http://localhost:8001/docs
Enable MCP mode in the sidebar to route data through the Python backend instead of the JS
fetch layer. See project/agentic-tools/README.md for the
complete backend reference — environment variables, every tool module, the background loops and
listeners inventory, and the standalone MCP servers for Claude Code / Claude Desktop.
Project structure
project/
src/main.jsx — entry point; imports all component modules
app.jsx — root component; state, pipeline orchestration, routing
pipeline.jsx — six-stage pipeline UI + substep rendering
rail.jsx — Live Register right-hand panel (Risks · Heatmap · Loop)
nav.jsx — left navigation (Configuration · Execution · Governance Intelligence)
report.jsx — Loop Report modal + Override modal
scenarios.jsx — Grey Swan Scenarios panel
ai-chat-panel.jsx — slide-out AI chat panel (Claude / Gemini)
agentic-tools/ — Python governance backend + UBO adjudication pipeline
styles-modules.css — all component CSS
UBO/ — the Governance Brain: Bronze/Silver/Gold/Council pipeline, policy rules
mcp-server/ — standalone Node.js MCP server (EDGAR/FRED tools)
gtm/ — sales narrative, one-pager, pilot deliverable sample
Dashboard screens (left navigation)
| Nav item | Description |
|---|---|
| Setup | Configuration — ticker, industry, audit focus, signal sources, AI chat provider |
| Pipeline | Six-stage loop execution with HITL gates |
| Controls Monitor | KRI / control-effectiveness tracker |
| MAPs | Management Action Plans dashboard |
| Notifications | Live signal notifications |
| Audit Scope | Audit objectives and sprint plan |
| Risk-as-Code | YAML risk register editor with live Generate CaC button |
| Policy-as-Code | Rego policy editor — 7 processes (5 ERP + DevOps Monitoring + Infrastructure Monitoring), version history, multi-approver sign-off, negative-control testing |
| DevOps Monitoring | Branch Integrity Matrix, Pipeline Security, Secret Scanning (real gitleaks), Evidence Inspector (tamper-evidence hash-chain), Drift Timeline, Risk Waivers, Pipeline Attestations, ITSM Tickets & SLA — all riding the same UBO adjudication pipeline as agent governance |
| Grey Swan Scenarios | Bear / Base / Bull scenarios + Grey Swan cascade |
| Governance Intelligence | Board, exec comp, shareholder proposals, peer benchmarking |
The Live Register rail (right panel, Pipeline screen only) has three tabs: Risks · Heatmap · Loop. The Loop Report (header button, enabled after a run completes) is the board-ready output — executive summary, per-stage execution detail, methodology, HITL changes, scenario outlook, and audit trail — with an optional Claude-generated narrative on top of the deterministic numbers.
AI Chat panel
A slide-out conversational interface ("Ask Claude" / "Ask Gemini", top-right header). Claude mode
runs a full agentic tool-use loop (EDGAR, FRED, RSS, quant analytics) and requires
ANTHROPIC_API_KEY + api_server.py running; Gemini mode is conversational streaming with the
current dashboard context injected, using a browser-stored API key from Setup.
Authentication
JWT-based auth integrated into api_server.py. Two local accounts (admin, dendrai) are seeded
on first startup — initial passwords come from AUTH_SEED_ADMIN_PASSWORD /
AUTH_SEED_USER_PASSWORD, or a random one-time password printed to the startup logs; both force a
password change at first login.
- Local login — bcrypt hashing, rate-limited to 5 attempts / IP / 15 minutes
- SSO — Microsoft/Azure AD, Google Workspace, GitHub, Okta (PKCE OAuth 2.0, JIT provisioning) — a provider only appears on the login screen once its env vars are fully set
- JWT sessions — HS256-signed, HTTP-only + Secure + SameSite=Strict cookies, 24-hour TTL
(
AUTH_JWT_SECRETrequired for stable sessions across restarts) - Password policy — 8+ chars, upper/lower/digit/special, last-3 history check
See project/agentic-tools/README.md
for the full environment variable list and auth endpoint reference.
Backend (dendrai-app)
See dendrai-app/README.md for the Express backend, Docker setup, and
production deployment instructions.
来源:GitHub · github.com