{"slug": "show-hn-get-your-agents-into-regulated-industries", "title": "Show HN: Get your agents into regulated industries", "summary": "MakerChecker, a self-hosted governance software for AI agents, launched to enforce structural controls and human approvals in regulated industries. The tool blocks agents from exceeding grants or approving their own work, logs all actions in a verifiable audit chain, and is available as open-source on GitHub.", "body_md": "**Website: makerchecker.ai**\n\n**Your AI agent moved the money. No one approved it.**\n\nMakerChecker is self-hosted software that governs AI agents through **structural enforcement** and **human approvals**. Structural enforcement runs at machine speed with no human in the path: an agent acts only through a **role**, runs only the skills its role was **granted** (deny by default, pinned to an exact version), cannot exceed its limits, and provably cannot approve its own work. Human approval is reserved for the few high-risk actions where a rule requires a named person to sign. Every action commits to a hash-chained, Ed25519-signed **audit log** that anyone verifies offline. Change one row and verification breaks at it.\n\nYour agents keep running in their existing framework. MakerChecker is the checkpoint in front of them and the record behind them: a Fastify server on Postgres. Agents connect as a **flow** (MakerChecker runs the steps and gates) or a **proxy session** (MakerChecker authorizes and records tool calls your framework executes). Both write the same audit chain.\n\n**New here?** Operator → [Quickstart](#quickstart). Integrator → [Integration](#integration). Security reviewer → [docs/security-model.md](/sammysltd/MakerChecker/blob/main/docs/security-model.md). Examiner → [docs/audit-spec.md](/sammysltd/MakerChecker/blob/main/docs/audit-spec.md). GRC analyst → [docs/compliance/control-mapping.md](/sammysltd/MakerChecker/blob/main/docs/compliance/control-mapping.md).\n\n[Live demo](https://makerchecker.ai/demo/): an agent is blocked from exceeding its grant and from approving its own work, the run's audit chain verifies offline, and a named human signs off only where a rule requires it. No signup.\n\n**Grant.** Bind a role to exact skill versions. Nothing else runs.**Check.** Every tool call hits the gate first. No grant, over a limit, or against an SoD constraint, and it is denied before the tool body runs.**Gate.** High-risk steps wait for named human approval. The requester cannot approve their own.**Record.** State changes and tool calls commit to the audit chain in the same transaction, each event chained to the last by hash.\n\nEvery refusal is named and audited:\n\n| Control | Refusal |\n|---|---|\n| Skill not granted to the role | `skill_not_granted` |\n| Over a per-invocation amount or count limit (fails closed) | `limit_amount` , `limit_invocations` |\n| A conflicting role already acted in the run (segregation of duties) | `enforcement.sod_violation` |\n| High-risk skill with no preceding gate | `high_risk_requires_gate` |\n| Any altered audit row | `audit verify` → `{ ok: false, failedSeq }` |\n\n```\ndocker compose up\n```\n\nPostgres and the server come up on port 3000. First boot seeds the demo and prints an admin key and an officer key — copy them from the logs.\n\nOn a production (non-demo) deployment nothing is seeded; mint the first admin and its API key explicitly with `node dist/cli.js bootstrap-admin --email <e> --name <n>`\n\n(printed once). See [First admin on a fresh deployment](/sammysltd/MakerChecker/blob/main/docs/quickstart.md#first-admin-on-a-fresh-deployment).\n\nA cash-reconciliation flow with a maker-checker constraint is seeded and ready:\n\n```\nexport H='authorization: Bearer mk_...'   # admin key from the logs\n\n# Trigger the flow\ncurl -X POST localhost:3000/api/flows/daily-cash-reconciliation/runs -H \"$H\" -H 'content-type: application/json' -d '{}'\n\n# Inspect the pending approval gate\ncurl localhost:3000/api/approvals -H \"$H\"\n\n# Approve the gate\ncurl -X POST localhost:3000/api/approvals/<id>/decision -H \"$H\" -H 'content-type: application/json' \\\n  -d '{\"decision\":\"approved\",\"reason\":\"Exceptions resolved\"}'\n\n# Verify the audit chain\ncurl localhost:3000/api/audit/verify -H \"$H\"\n```\n\nFull local setup, and running with real models, is in [docs/quickstart.md](/sammysltd/MakerChecker/blob/main/docs/quickstart.md).\n\nFor Kubernetes, a Helm chart — non-root pod, the signing key on a persistent volume, and the two-role hardening applied as a pre-install hook — is in [deploy/helm](/sammysltd/MakerChecker/blob/main/deploy/helm/README.md).\n\nThe quickstart connects as the Postgres owner, which disables the append-only audit triggers. For tamper-resistance against a compromised app credential, run the server as a non-owner role with [ docker-compose.hardened.yml](/sammysltd/MakerChecker/blob/main/docker-compose.hardened.yml) (\n\n[walkthrough](/sammysltd/MakerChecker/blob/main/docs/security-model.md#database-hardening-walkthrough)).\n\npnpm workspaces with Turborepo. The server is AGPL-3.0; the SDKs and connectors are Apache-2.0, so you can embed them in closed-source code.\n\n| Package | License | What it is |\n|---|---|---|\n`packages/server` |\n\n`cli.js`\n\nadmin tool.`packages/web`\n\n`packages/shared`\n\n`packages/sdk`\n\n`governedTool`\n\nwrapper.`packages/sdk-python`\n\n`governed_tool`\n\n.`packages/connector-langchain`\n\n`governLangChainTool`\n\n/ `governToolkit`\n\nfor LangChain `StructuredTool`\n\ns.`packages/connector-claude-agent`\n\n`governClaudeTool`\n\nfor Claude Agent SDK custom tools.The governed primitives — Agent, Role, Skill, Trigger, Flow, Run/Audit — are Postgres-backed and versioned. See [docs/concepts.md](/sammysltd/MakerChecker/blob/main/docs/concepts.md).\n\nOpen a proxy session, then wrap each tool. Every call runs `proxy.check`\n\n(a deny throws `GovernanceDeniedError`\n\nbefore the tool runs), executes the tool, then records the output. High-risk skills are refused on the proxy path; they need a flow gate.\n\n``` js\nimport { createClient, governedTool, GovernanceDeniedError } from \"@makerchecker/sdk\";\n\nconst client = createClient({ baseUrl: \"http://localhost:3000\", apiKey: \"mk_...\" });\nconst { session } = await client.proxy.openSession({ label: \"recon-run\" });\n\nconst match = governedTool(\n  client,\n  session.id,\n  \"recon-preparer\",   // registered agent whose role grants are evaluated\n  \"txn-match@1\",       // skillRef: name@version\n  (input: { statement: unknown[]; ledger: unknown[] }) => matchTxns(input),\n);\n\nawait match({ statement, ledger }); // throws GovernanceDeniedError if denied\nawait client.proxy.closeSession(session.id);\n```\n\nConnectors keep your tool's name, description, and schema:\n\n**LangChain**—`governLangChainTool`\n\nreturns a`DynamicStructuredTool`\n\n. See[examples/connectors/langchain](/sammysltd/MakerChecker/blob/main/examples/connectors/langchain/README.md).**Claude Agent SDK**—`governClaudeTool`\n\nreturns an`SdkMcpToolDefinition`\n\nfor`createSdkMcpServer`\n\n. See[packages/connector-claude-agent](/sammysltd/MakerChecker/blob/main/packages/connector-claude-agent/README.md).**Python**(CrewAI, LangChain, LlamaIndex, AutoGen) —`create_client`\n\nthen`governed_tool`\n\n;`pip install makerchecker`\n\n. See[packages/sdk-python](/sammysltd/MakerChecker/blob/main/packages/sdk-python/README.md).\n\nEvery state transition emits an audit event in the same transaction as the state write. Each event's hash is SHA-256 over the RFC 8785 canonical JSON of the event (excluding `seq`\n\n), chained through `prev_hash`\n\nfrom a genesis event tied to the instance. Change any row and recomputation breaks at it.\n\n`GET /api/audit/verify`\n\nwalks the chain and returns `{ ok, count, headHash }`\n\n, or `{ ok: false, failedSeq, reason }`\n\non a break. The CLI verifies the live chain and signed bundles offline:\n\n```\n# verify against the running database\ndocker compose exec server node dist/cli.js audit verify\n\n# export a signed bundle, then verify it with no database\ndocker compose exec server node dist/cli.js audit export --out bundle.json\nnode dist/cli.js audit verify-bundle --in bundle.json\nnode dist/cli.js audit verify-bundle --in bundle.json --key instance.pub  # pin the key\n```\n\nBundles are Ed25519-signed and carry the manifest needed to recompute the chain. The format is specified in [docs/audit-spec.md](/sammysltd/MakerChecker/blob/main/docs/audit-spec.md) for reimplementation in any language. `audit report --run <id>`\n\nbuilds a self-contained HTML run report; `audit access-review`\n\nrenders the role/grant/SoD review (also at `/api/reports/access-review`\n\n).\n\nThe chain is the system of record, so back it up like one: [docs/backup-restore.md](/sammysltd/MakerChecker/blob/main/docs/backup-restore.md) covers database backup, PITR, escrowing the write-once signing key separately, and a restore drill that ends in `audit verify`\n\n.\n\nMakerChecker 1.0. The server, web, shared, integration, and verification paths are covered by unit and integration tests against Postgres in CI.\n\n1.0 has no drag-and-drop flow builder, SSO/SAML, or multi-tenancy. Flow definitions are typed JSON/YAML.\n\nServer, web, and shared are AGPL-3.0 ([LICENSE](/sammysltd/MakerChecker/blob/main/LICENSE)). The SDKs, connectors, and examples are Apache-2.0 — import and ship them in closed-source products without copyleft. A commercial license is available for organizations that cannot use AGPL-3.0: [hello@makerchecker.ai](mailto:hello@makerchecker.ai). Details: [LICENSING.md](/sammysltd/MakerChecker/blob/main/LICENSING.md).\n\nContributing: [CONTRIBUTING.md](/sammysltd/MakerChecker/blob/main/CONTRIBUTING.md) · Security: [SECURITY.md](/sammysltd/MakerChecker/blob/main/SECURITY.md) · Code of Conduct: [CODE_OF_CONDUCT.md](/sammysltd/MakerChecker/blob/main/CODE_OF_CONDUCT.md) · Changelog: [CHANGELOG.md](/sammysltd/MakerChecker/blob/main/CHANGELOG.md)", "url": "https://wpnews.pro/news/show-hn-get-your-agents-into-regulated-industries", "canonical_source": "https://github.com/sammysltd/makerchecker", "published_at": "2026-06-24 09:33:17+00:00", "updated_at": "2026-06-24 09:44:25.576175+00:00", "lang": "en", "topics": ["ai-safety", "ai-agents", "ai-policy", "ai-tools", "ai-infrastructure"], "entities": ["MakerChecker", "Fastify", "Postgres", "GitHub", "Kubernetes"], "alternates": {"html": "https://wpnews.pro/news/show-hn-get-your-agents-into-regulated-industries", "markdown": "https://wpnews.pro/news/show-hn-get-your-agents-into-regulated-industries.md", "text": "https://wpnews.pro/news/show-hn-get-your-agents-into-regulated-industries.txt", "jsonld": "https://wpnews.pro/news/show-hn-get-your-agents-into-regulated-industries.jsonld"}}