Start here — install the plugin, then use its setup skill to create or connect an agent through Connect Atbash. You can start without an existing agent or key file.
Atbash Safety checks supported Codex tool calls against your agent's policy before they run. Install it from the Atbash AI Git marketplace, then connect it to the dashboard using the bundled setup skill.
1. Install from the marketplace
Use Node.js 22.13.0 or newer on macOS Apple Silicon, Linux x64/arm64 (glibc), or Windows x64. The Git marketplace includes the built SDK runtime; no SDK install or local build is needed. Terminal path examples below use macOS/Linux shell syntax.
Run in your own terminal with a Codex CLI that supports codex plugin (hook registration below targets Codex 0.154 or newer):
Start here — install the plugin, then use its setup skill to create or connect an agent through Connect Atbash. You can start without an existing agent or key file.
Atbash Safety checks Claude Code tool calls through a bundled PreToolUse hook. The setup skill connects your local plugin to an agent in the dashboard.
Before you begin — this guide assumes you have already onboarded your agent and saved your keys to ~/.config/atbash/guard-client-key. If not, complete the Agent Onboarding guide first.
OpenClaw plugin that gates every tool call against the Atbash policy service. A thin adapter on top of @atbash/sdk — the SDK does the audit pipeline, this package wires it into OpenClaw's before_tool_call hook.
If you're not using OpenClaw and want to use Atbash from your own code, install the SDK directly.
Before you begin — this guide assumes you have already onboarded your agent and saved your keys to ~/.config/atbash/guard-client-key. If not, complete the Agent Onboarding guide first.
Atbash safety judge for AutoGen-style multi-agent orchestration loops.
This package is intentionally small. It gives you one focused helper to ask Atbash for a verdict at the point where your app decides whether to proceed with an action. It does not own your orchestration model.
Before you begin — this guide assumes you have already onboarded your agent and saved your keys to ~/.config/atbash/guard-client-key. If not, complete the Agent Onboarding guide first.
Atbash guardrail plugin for Hermes Agent, built on the official Python SDK (atbash-sdk).
The plugin registers a Hermes hook and asks Atbash for a verdict before a Hermes tool runs. On a blocking decision the tool call is stopped before execution — the same boundary the OpenClaw plugin enforces in its gateway, for the Python runtime.
Before you begin — this guide assumes you have already onboarded your agent and saved your keys to ~/.config/atbash/guard-client-key. If not, complete the Agent Onboarding guide first.
Expose Atbash as a standalone MCP server.
This package starts an MCP server process that loads one Atbash agent identity and exposes safety and query tools over the Model Context Protocol. Your MCP host or client remains the real decision-maker — this package does not execute your business tools.
Before you begin — this guide assumes you have already onboarded your agent and saved your keys to ~/.config/atbash/guard-client-key. If not, complete the Agent Onboarding guide first.
Guard LangChain tools with Atbash.
This is the lightest Atbash integration — a single function that wraps a DynamicStructuredTool and adds a safety check before the tool runs. No graph changes, no framework lifecycle, just a guarded tool boundary.
Before you begin — this guide assumes you have already onboarded your agent and saved your keys to ~/.config/atbash/guard-client-key. If not, complete the Agent Onboarding guide first.
Add Atbash as a safety guard inside a LangGraph workflow.
This package adds a guard node before tool execution and an audit node after, using native LangGraph interrupt semantics for HOLD verdicts.
Before you begin — this guide assumes you have already onboarded your agent and saved your keys to ~/.config/atbash/guard-client-key. If not, complete the Agent Onboarding guide first.
Atbash safety plugin for ElizaOS agents.
Use this when your agent already runs inside ElizaOS and you want Atbash checks around sensitive actions, current policy context in runtime, and best-effort audit logging after action completion.
Start a new Codex session or restart the ChatGPT desktop app. If codex is missing from PATH on macOS, the ChatGPT app bundles it at /Applications/ChatGPT.app/Contents/Resources/codex-cli/bin/codex.
2. Set up through Connect Atbash
Copy this prompt into Codex, rather than your terminal:
text
Use $atbash-setup to set up Atbash for this Codex session. Help me create a new agent or connect an existing one, then continue setup after I finish the browser steps until the local agent status is ready.
Tell the assistant whether to create a new agent or connect an existing agent. For a new agent, provide its name, purpose, risk level, and organization name and description when requested.
Open the Connect Atbash link the setup skill provides. Sign in and verify your wallet in the browser, then return to the assistant so it can prepare the setup proposal.
Review the exact account, organization, plan, and agent changes in Connect Atbash. For a new agent, choose the Developer, DevOps, or Full baseline starting policy; individual rules can also be customized before approval. Complete any plan selection or checkout requested by the dashboard.
Approve and sign the proposal in the browser. Return to the same assistant conversation and ask it to continue. It finishes local activation; setup is complete only when the helper reports DONE and the agent status is ready.
New agent keys are generated in the browser and delivered encrypted to the local setup helper, which saves the profile under ~/.config/atbash/. For an existing agent, the helper opens a local browser form where you enter its key; it checks that the verified wallet owns the matching agent. Never paste a private key into chat or a terminal command.
The starting policy is saved as <agent name> Policy in the organization. You can edit it later under Policies in the dashboard. Setup can run while the hook is active: before an agent is configured, only the plugin's setup steps are allowed. An existing invalid or jailed profile still blocks calls; resolve that state before retrying setup.
3. Register and trust the hook
Installation alone does not register the hook on Codex 0.154+. In Codex, open /hooks. If an Atbash PreToolUse hook is already registered, use that entry. Otherwise, find your installed version in your own terminal:
bash
ls "${CODEX_HOME:-$HOME/.codex}/plugins/cache/atbash-ai/atbash/"
Replace <installed-version> below with the version you installed, then run these commands in your own terminal, outside the agent conversation. Do not use a source-checkout path or register a second copy of an existing hook.
The installer registers the user-level hook and preserves other hooks. Restart Codex, ensure lifecycle hooks are enabled, open /hooks, and trust the Atbash PreToolUse hook. Then check readiness from your own terminal:
bash
node "$ATBASH_CODEX_PLUGIN/runtime/status.cjs"
Use the same terminal as above, or set ATBASH_CODEX_PLUGIN again. Status must report a ready agent and an enforcing hook registration without degraded entries; trusting the hook remains a separate action in Codex. On Windows PowerShell, set $ATBASH_CODEX_PLUGIN to the installed directory under $env:USERPROFILE\.codex\plugins\cache\atbash-ai\atbash\<installed-version>, or your custom Codex home, and use the same node commands.
4. Verify enforcement
Ask the assistant to read a harmless file in the workspace that fits the agent's stated purpose. Check the selected organization and agent in the dashboard's Verdict Feed for the resulting judgment.
An ALLOW decision with allow: true permits the tool call. HOLD, BLOCK, invalid configuration, and service errors deny the pending call. For HOLD, review it in Approvals, then explicitly retry the original request after approval; the plugin does not execute it automatically. Coverage is limited to tools exposed through the host's PreToolUse hook.
Updates and development installs
To refresh the marketplace snapshot and install it again:
Restart Codex after updating. If the installed runtime path changed, update ATBASH_CODEX_PLUGIN and re-run the hook installer from that copy, then check /hooks and status again.
For a fresh development install, use this instead of the production install block:
Use only one ref for the atbash-ai marketplace at a time. main connects to https://atbash.ai; dev connects to https://chromia-verified-ai-dev-two.vercel.app. The Connect Atbash link must match the installed build. Agent registrations belong to their environment; switching builds requires a matching profile. Follow the repository's environment-switching instructions for an existing installation. Do not try to switch environments with runtime endpoint variables.
For later agent changes, copy this prompt into Codex:
text
Use $atbash-manage to help me update my Atbash agent through a new browser-authorized session.
Use Node.js 22.13.0 or newer on macOS Apple Silicon, Linux x64/arm64 (glibc), or Windows x64. The Git marketplace includes the built SDK runtime; no SDK install or local build is needed. Terminal path examples below use macOS/Linux shell syntax.
Run in your own terminal:
bash
claude plugin marketplace add Atbash-Ai/atbash-claude-plugin
claude plugin install atbash@atbash-ai
Or run these slash commands inside Claude Code instead:
Start a new Claude Code session. Confirm Atbash is enabled in /plugin; its hook ships with the plugin, so no separate Codex hook installer is needed.
2. Set up through Connect Atbash
Copy this prompt into Claude Code, rather than your terminal:
text
Use the atbash-setup skill to set up Atbash for this Claude Code session. Help me create a new agent or connect an existing one, then continue setup after I finish the browser steps until the local agent status is ready.
Tell the assistant whether to create a new agent or connect an existing agent. For a new agent, provide its name, purpose, risk level, and organization name and description when requested.
Open the Connect Atbash link the setup skill provides. Sign in and verify your wallet in the browser, then return to the assistant so it can prepare the setup proposal.
Review the exact account, organization, plan, and agent changes in Connect Atbash. For a new agent, choose the Developer, DevOps, or Full baseline starting policy; individual rules can also be customized before approval. Complete any plan selection or checkout requested by the dashboard.
Approve and sign the proposal in the browser. Return to the same assistant conversation and ask it to continue. It finishes local activation; setup is complete only when the helper reports DONE and the agent status is ready.
New agent keys are generated in the browser and delivered encrypted to the local setup helper, which saves the profile under ~/.config/atbash/. For an existing agent, the helper opens a local browser form where you enter its key; it checks that the verified wallet owns the matching agent. Never paste a private key into chat or a terminal command.
The starting policy is saved as <agent name> Policy in the organization. You can edit it later under Policies in the dashboard. Setup can run while the hook is active: before an agent is configured, only the plugin's setup steps are allowed. An existing invalid or jailed profile still blocks calls; resolve that state before retrying setup.
3. Check the hook and agent status
Start a new Claude Code session and review the Atbash PreToolUse hook with /hooks. In your own terminal, find the version installed in the plugin cache:
bash
ls ~/.claude/plugins/cache/atbash-ai/atbash/
Replace <installed-version> with that installed version, then run in your own terminal:
Use your actual Claude configuration directory if you changed it. On Windows PowerShell, set $ATBASH_CLAUDE_PLUGIN to the installed directory under $env:USERPROFILE\.claude\plugins\cache\atbash-ai\atbash\<installed-version> and run the same node command. A ready status confirms the agent configuration; also check that the plugin and its hook are enabled in Claude Code.
4. Verify enforcement
Ask the assistant to read a harmless file in the workspace that fits the agent's stated purpose. Check the selected organization and agent in the dashboard's Verdict Feed for the resulting judgment.
An ALLOW decision with allow: true permits the tool call. HOLD, BLOCK, invalid configuration, and service errors deny the pending call. For HOLD, review it in Approvals, then explicitly retry the original request after approval; the plugin does not execute it automatically. Coverage is limited to tools exposed through the host's PreToolUse hook.
Updates and development installs
Run in your own terminal, then start a new Claude Code session:
bash
claude plugin marketplace update atbash-ai
claude plugin update atbash@atbash-ai
For a fresh development install, use this instead of the production install block:
bash
claude plugin marketplace add Atbash-Ai/atbash-claude-plugin#dev
claude plugin install atbash@atbash-ai
If your Claude Code version does not accept the branch suffix, use a local checkout of that branch:
bash
git clone --branch dev --depth 1 https://github.com/Atbash-Ai/atbash-claude-plugin.git ~/atbash-claude-plugin-dev
claude plugin marketplace add ~/atbash-claude-plugin-dev
claude plugin install atbash@atbash-ai
The default branch main connects to https://atbash.ai; dev connects to https://chromia-verified-ai-dev-two.vercel.app. The Connect Atbash link must match the installed build. An agent created on development is not registered on production. For an existing installation, follow the repository's environment-switching instructions, which cover the shared marketplace cache and local profiles. No endpoint or chain settings are needed for normal setup.
For later agent changes, copy this prompt into Claude Code:
text
Use the atbash-manage skill to help me update my Atbash agent through a new browser-authorized session.
Already ran atbash setup during dashboard onboarding? The plugin is installed, your key is saved at ~/.config/atbash/guard-client-key, and the OpenClaw config is merged. Skip ahead to Configuration to review or adjust settings.
bash
openclaw plugins install @atbash/atbash-openclaw
The judge endpoint and chain ids are compiled into the plugin. No configuration repoints a build afterwards — the wrong build loads cleanly, fires its hook, and then fails every judge call because the agent doesn't exist on the chain that build targets. openclaw plugins list shows which you have (a -dev.N version is the development build). Organization names are not unique across environments, so a resolving org name is not proof the build is right.
The install directory has moved between OpenClaw releases, so don't hardcode it anywhere. Observed on real machines: ~/.openclaw/extensions/<plugin id> on 2026.2.x, and ~/.openclaw/node_modules/<package> on 2026.6.x — where plugins are npm dependencies of ~/.openclaw itself, alongside a generated package.json, and extensions/ is left empty. The install ledger moved with it, from plugins.installs inside openclaw.json to ~/.openclaw/plugins/installs.json (the migration renames the original to installs.json.migrated). OpenClaw records which location it used, and loads from that record:
bash
openclaw plugins list
The record lives in the generated ~/.openclaw/plugins/installs.json on current builds (plugins.installs in openclaw.json on older ones), so read it through the CLI, not a file path.
Re-installing over an existing copy needs openclaw plugins update atbash-openclaw, or --force on the install command.
Migrating from @atbash-plugin/openclaw? That package is retired. Its last release pins an old SDK whose default judge endpoint is a dev deployment, so its audits never reach atbash.ai. Run openclaw plugins uninstall openclaw, then remove any leftover plugins.entries.openclaw block or "openclaw" in plugins.allow — the plugin id here is atbash-openclaw, so a leftover openclaw entry silently configures nothing.
The plugin signs audit transactions locally with your agent's secp256k1 private key. The key never leaves your machine; only signed bytes plus the corresponding public key are transmitted.
Get an agent key
The plugin reads your agent keypair from ~/.config/atbash/guard-client-key — set this up via the Agent Onboarding guide before continuing.
Configure it in OpenClaw
openclaw plugins install records where the plugin lives (that record is what OpenClaw loads from), enables it, and adds atbash-openclaw to plugins.allow if you keep that list. You never hand-write the install directory — it has moved between OpenClaw releases.
All that's left is your configuration. Open ~/.openclaw/openclaw.json and add, keeping the plugins already there:
Fail-closed switch. When true (default), verdicts of BLOCK, HOLD, ERROR, and any unrecognized verdict block the tool call. When false, the plugin runs fail-open: all verdicts allow the tool call through and the outcome is only logged — useful for monitoring without enforcement.
chromiaSecretPath
string
~/.config/atbash/guard-client-key
Path to the agent key file. Supports ~/.
orgName
string
—
Organization the agent was onboarded under, spelled as the dashboard shows it. The plugin resolves which chain to query from this; without it, it uses the SDK's default chain.
Hooks fields
Field
Type
Default
What it does
timeoutMs
integer
OpenClaw default
Maximum milliseconds OpenClaw waits for the plugin's before_tool_call hook to complete before timing it out. Set to e.g. 30000 when your judge calls can be slow and you want a hard ceiling rather than relying on the host's global hook timeout.
allowConversationAccess
bool
false
Grants the plugin access to conversation-lifecycle hook families (before_agent_run, llm_input, llm_output, agent_end). The current version of the plugin does not use these hooks — set true to allow future versions to access them without a config change.
allowPromptInjection
bool
false
Grants access to the before_prompt_build hook family. The current plugin does not use this hook — same forward-compatibility rationale as above.
A note on the entry name
The entry key above is atbash-openclaw — what this package registers as. It is notopenclaw: that id belongs to the retired @atbash-plugin/openclaw, and a leftover openclaw entry silently configures nothing. Installs of the earlier @atbash/atbash-plugin register under atbash-plugin instead, so an existing config may use that key. Atbash still recognizes it, but that package is retired and deprecated on npm. It hardcodes a blockchain RID and node URLs for a chain we no longer run, so its on-chain audit writes cannot land. Move to @atbash/atbash-openclaw.
This matters for the dashboard, not just for style: Atbash detects "is this runtime governed?" by looking for its own plugin in plugins.entries, in every directory OpenClaw has used as a plugin store, and in the install ledger. It matches all of the ids above, so any of them is recognized. If you rename the entry to something else entirely, the agent's capability scan will report it as ungoverned even though the plugin is installed and enforcing.
If your config carries more than one of these entries — which is normal after an upgrade, and is what atbash setup leaves behind when it stands an old entry down — the one that is switched on is the one that governs, and that is the one Atbash reports.
Updating
bash
openclaw plugins update atbash-openclaw
Uninstalling
bash
openclaw plugins uninstall atbash-openclaw
The agent key file at ~/.config/atbash/guard-client-key is not removed — delete it manually if you want to retire the agent identity.
Secret redaction
Before each tool call is sent to the judge, the underlying @atbash/sdk scans the args and context for secret-shaped values and replaces matches with [REDACTED:<kind>]. Redaction is client-side and happens before signing, so secrets never reach the signed bytes, the request body, the on-chain log, or the AI provider.
When the redactor fires, OpenClaw will surface a warning like:
The kinds field shows which patterns matched. anthropic / openai / aws_access_key / jwt / etc. indicate real vendor secrets. generic_token is a catch-all for long random-looking strings — it can also match UUIDs and content hashes; the judge still gets enough context to evaluate the action, but worth knowing if you see it unexpectedly.
The agent's own tool execution is unaffected — only the data sent to the judge is scrubbed.
Troubleshooting
Nothing appears in the dashboard at all.
The plugin hooks before_tool_call only — a chat turn that invokes no tool is never judged, so test with a prompt that actually makes the agent run a tool. If a tool call still logs nothing, the plugin isn't loaded: confirm openclaw plugins list shows atbash-openclaw as enabled, then look for [atbash] plugin loaded in the gateway log on startup. A failed during register … ENOENT line there means the key file at chromiaSecretPath didn't exist when the gateway started.
Tool calls aren't being audited.
Check enabled: true is set both on the entry (plugins.entries.atbash-openclaw.enabled) and inside config (config.enabled).
Plugin loads but doesn't audit calls.
Confirm enforceDecision: true is set and chromiaSecretPath points at a readable file with valid privkey=/pubkey= lines.
Every tool call is blocked, even safe ones.
The plugin is fail-closed: any pipeline error blocks. Look for [atbash] … warnings in the OpenClaw log. Most often: missing key, expired key, or restricted egress.
Invalid config ... plugin not found: atbash-openclaw
A previous partial install can leave a stale entry. Open ~/.openclaw/openclaw.json, delete the entire "atbash-openclaw": { ... } block under plugins.entries, save, and re-run openclaw plugins install @atbash/atbash-openclaw.
boot memory sync failed — check chain endpoint / orgName
The plugin resolved a different chain than the one your agent is registered on. Confirm orgName matches the dashboard exactly. The same message appears when the installed build (prod vs dev) doesn't match where the agent was onboarded — organization names aren't unique across environments.
Plugin missing from openclaw plugins list
The install record is missing or points at a directory that's gone. Re-run openclaw plugins install @atbash/atbash-openclaw, or try openclaw plugins registry --refresh to rebuild the record.
spawn EINVAL on Windows
Known issue with how the OpenClaw CLI spawns npm on Windows. No clean workaround yet — report it in the OpenClaw issue tracker.
License
Proprietary — all rights reserved. Commercial licensing inquiries: contact the Atbash team.
bash
npm install @atbash/atbash-autogen
Environment variables
Variable
Required
Default
Description
ATBASH_AGENT_PRIVKEY
Yes
—
Agent private key (hex). Used to sign every judge request.
ATBASH_ORG_NAME
Conditional
—
Your Atbash org name. Required for orgs on a private Chromia chain; omit for public-chain orgs.
ATBASH_ENDPOINT
No
Atbash production
Judge endpoint URL. Must be https, no URL credentials, and an allowlisted Atbash hostname.
Note: This plugin always fails closed. It does not read or honour an ATBASH_FAIL_CLOSED environment variable — the fail-closed behaviour is unconditional and cannot be disabled via configuration.
When to use it
Use this package when:
you already control your own orchestration steps
you want one explicit Atbash check before a side effect
you do not need a heavier plugin lifecycle
Good fits:
AutoGen-style multi-agent loops
custom planners
supervisor-worker systems
approval chains where your app already owns the review UI
Quick start
ts
import { Atbash } from "@atbash/sdk";
import { judgeForAutoGen } from "@atbash/atbash-autogen";
const client = Atbash.fromConfig({ agentKey: process.env.ATBASH_AGENT_PRIVKEY });
const result = await judgeForAutoGen(
{
action: "Bank transfer $25 to a new external vendor account",
context: "AutoGen agent checking transfer before execution",
toolName: "send_bank_transfer",
toolArgs: { amount: 25, recipient: "new vendor" },
},
client,
);
if (result.allow) {
// proceed
} else {
// stop — surface result.reason to the operator
}
Gate on result.allow === true (or result.verdict === "ALLOW"), never on a list of bad verdicts. if (verdict === "HOLD" || verdict === "BLOCK") stop; runs the action on every other outcome, ERROR included.
API
judgeForAutoGen(input, client, guardManager?)
Parameter
Type
Description
input
AutoGenJudgeInput
The action to evaluate
client
Atbash
SDK client created with Atbash.fromConfig()
guardManager
MemoryGuardManager?
Optional memory guard from createAtbashGuardManager()
Returns Promise<Decision>.
AutoGenJudgeInput
Field
Type
Required
Description
action
string
Yes
Human-readable description of the action
context
string
Yes
Why the agent is taking this action
toolName
string
No
Name of the tool being called (defaults to "autogen_action")
toolArgs
unknown
No
Structured payload the judge evaluates (defaults to { action })
Decision
Field
Type
Description
allow
boolean
Whether to proceed
verdict
`"ALLOW"
"HOLD"
reason
string?
Policy reason (present on HOLD/BLOCK)
toolCallId
string?
ID to pass back on HOLD resolution
Verdict handling
Verdict
Meaning
Action
ALLOW
Safe to proceed
Continue orchestration
HOLD
Needs human review
Stop and hand off; keep toolCallId
BLOCK
Policy violation
Stop and surface reason
ERROR
Judge unreachable, or the judge returned no enforceable verdict
Fail closed, always
An ALLOW is only honoured when the judge actually issued one. If the judge answers with no verdict — an audit-tier org, or a response body that did not parse — the result comes back as ERROR with allow: false. No verdict is not a verdict.
Memory guard
createAtbashGuardManager(client, opts) returns a MemoryGuardManager that screens memory reads and writes for poisoning and rollback before the regular tool-call audit runs. Pass it as the third argument to judgeForAutoGen:
When the call is not memory-related the guard stands aside and the judge decides. When it is, the guard's answer is final and the judge is not consulted — but only a positive allow: true from the guard permits the operation. A MemoryIntegrityError — tampered ciphertext — always blocks.
Option
Type
Default
Description
workspaceDir
string
process.cwd()
Agent workspace directory; ~ is expanded
memoryFilePath
string
workspaceDir/MEMORY.md
Explicit MEMORY.md path; overrides workspaceDir
ttlMs
number
30000
How long (ms) to trust the local memory pointer between chain checks
rollbackMinScore
number
1
Block memory reads when a rolled-back version scores below this (1–10); default 1 = warn only
memoryPathPatterns
Creating the client
Create the client once at startup, then pass it to every judgeForAutoGen call. Both Atbash.fromConfig and new Atbash(...) enforce https-only, reject endpoints with embedded credentials, and check the hostname against a trusted allowlist — a non-allowlisted host throws at construction time. To point at a self-hosted judge, pass judge: { policy: "self-hosted", endpoint, verifyPubKey } to fromConfig.
The plugin installs no signal handlers. Flush telemetry from your own handler:
ts
import { shutdownAtbashAutogen } from "@atbash/atbash-autogen";
process.on("SIGTERM", async () => {
await shutdownAtbashAutogen();
// ... your own shutdown, then exit
});
What this package does not do
It does not wrap your framework for you.
It does not create a review queue.
It does not log or execute the real action automatically.
That is intentional. The host loop stays in control.
Example
A runnable example is in examples/autogen-runtime-agent/ in the package repository.
bash
cd examples/autogen-runtime-agent
ATBASH_AGENT_PRIVKEY=your_key_here node run.mjs
pre_tool_call
This is a Python package. Install it into the Hermes virtual environment using uv.
Install
Already ran atbash setup during dashboard onboarding? The plugin is installed into your Hermes environment, your key is saved at ~/.config/atbash/guard-client-key, and the ~/.hermes/.env config is merged. Skip ahead to Configure to review or adjust settings.
hermes plugins uninstall does not apply here either. Removing the package is one command, but it leaves two things behind that Hermes and Atbash still read:
Hermes loads only what its allow-list names, so take the plugin out of ~/.hermes/config.yaml:
yaml
plugins:
enabled:
- atbash-hermes-plugin
Then drop the Atbash settings from ~/.hermes/.env (ATBASH_KEY_PATH, ATBASH_ORG_NAME, ATBASH_ENFORCE_DECISION and any optional ones you set), and restart Hermes.
Leave ~/.config/atbash/guard-client-key alone unless you are retiring the agent itself. Every other Atbash integration on the machine reads that same file, so deleting it breaks them too. If you do mean to remove it, delete that file by hand.
After the restart Hermes starts without the plugin and tool calls are no longer judged. The agent stays registered on chain and its history is kept: removing the plugin stops new verdicts, it does not deactivate the agent. Do that from the dashboard if you want the plan seat back.
Configure
The plugin needs an Atbash agent key. Hermes loads environment variables from ~/.hermes/.env:
Restart Hermes after changing .env. This is the same key file every other Atbash integration reads, so a machine already running the OpenClaw plugin needs no second key.
Optional settings
Variable
Default
What it does
ATBASH_ENDPOINT
—
Override the Atbash API endpoint
ATBASH_ENFORCE_DECISION
true
Fail closed when Atbash cannot be reached
ATBASH_DEBUG
false
Verbose plugin logs
ATBASH_ORG_NAME
—
Resolves the org subscription, so the SDK picks the public or private chain
ATBASH_TOOL_MAP_PATH
~/.config/atbash/hermes-tool-map.json
Where learned tool classifications are saved
ATBASH_MEMORY_HASH_PATH
~/.config/atbash/hermes-memory-hashes.json
Where the persistent memory-tamper hash store is saved
ATBASH_JUDGE_ENDPOINT_POLICY
Confirm Hermes sees it
Hermes discovers installed packages that expose the hermes_agent.plugins entry point.
bash
hermes plugins list | grep atbash
If needed:
bash
hermes plugins enable atbash-hermes-plugin
With ATBASH_DEBUG=true, ~/.hermes/logs/agent.log shows:
ALLOW with allow: true — the tool proceeds. A missing allow flag is denied.
HOLD — blocked with a review message when ATBASH_ENFORCE_DECISION=true (the default); allowed in fail-open mode. Exception: memory write HOLD always blocks regardless of ATBASH_ENFORCE_DECISION — the Python SDK has no chain-commit path for HOLD writes, so the agent must not proceed. The agent is not jailed; approve or reject from the dashboard, then ask the agent to retry.
BLOCK / DENY / REJECT / DISALLOW — blocked.
Atbash unreachable — fails closed and blocks when ATBASH_ENFORCE_DECISION=true (the default), otherwise allows.
Memory writes (MEMORY.md, CLAUDE.md, memory/ paths) with no verdict — allowed and recorded as the new tamper baseline only when the judge marks the response as audit tier (status: "logged"). Any other missing verdict is blocked under ATBASH_ENFORCE_DECISION=true.
Memory reads — the plugin checks cross-session SHA-256 integrity (from the persistent hash store at ATBASH_MEMORY_HASH_PATH) and within-session snapshot drift before the read proceeds. A hash mismatch signals possible between-session tampering and blocks the read when ATBASH_ENFORCE_DECISION=true.
Setting ATBASH_ENFORCE_DECISION=false makes a judge outage a silent allow — the governance layer stops governing for as long as it lasts. Record a written risk acceptance before turning it off.
For HOLD, the plugin blocks the original call and asks the user to retry after review rather than silently re-running the action.
Docker
Mount your Hermes data directory and keep the key inside the mounted volume:
Hermes tool names vary by version, plugins and enabled skills. The plugin ships defaults for common tools and learns unseen names at runtime, persisting them to ~/.config/atbash/hermes-tool-map.json across sessions.
Telemetry
Initializes the Python SDK's OpenTelemetry metrics with source="plugin:hermes". Best-effort — it never blocks guard registration or tool execution. To opt out:
Plugin not visible to Hermes. Run hermes plugins list | grep atbash and python -m pip show atbash-hermes-plugin. The package must be installed in the same Python environment that runs Hermes.
Verdicts not appearing in logs. Set ATBASH_DEBUG=true, restart Hermes, and watch ~/.hermes/logs/agent.log.
Everything is blocked with an authentication error. Check echo "$ATBASH_KEY_PATH" and test -f "$ATBASH_KEY_PATH" && echo "key file exists". In Docker, paths inside the container differ from host paths — use /opt/data/... paths for mounted Hermes data.
Already ran atbash setup during dashboard onboarding? The MCP server is installed, your key is saved at ~/.config/atbash/guard-client-key, and the client config is merged. Skip ahead to Quick start to review or adjust settings.
bash
npm install @atbash/atbash-mcp
When to use it
Use this package when:
your host already supports MCP
you want one Atbash tool server to serve one or many MCP clients
you want Atbash checks without coupling your app directly to the SDK
Do not use this when you need deep framework lifecycle integration — use a framework-native package like @atbash/atbash-eliza or @atbash/atbash-langgraph instead.
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
const transport = new StdioClientTransport({
command: "npx",
args: ["-y", "@atbash/atbash-mcp"],
env: {
...process.env,
ATBASH_AGENT_PRIVKEY: process.env.ATBASH_AGENT_PRIVKEY,
ATBASH_ORG_NAME: process.env.ATBASH_ORG_NAME,
},
});
Environment variables
Variable
Required
Description
ATBASH_AGENT_PRIVKEY
Yes
Your Atbash agent private key
ATBASH_ORG_NAME
Recommended
Your organization name. The SDK resolves the correct chain from it; without it, calls fall back to the SDK's default chain.
ATBASH_ENDPOINT
No
Override the default Atbash endpoint (https://atbash.ai)
ATBASH_FAIL_CLOSED
—
Has no effect. The MCP server is unconditionally fail-closed — judge errors always block, regardless of this variable.
Tools
Safety tools
atbash_judge
Submit an action for safety judgment before executing it.
Input
Type
Required
Description
action
string
Yes
Plain text description of the action
context
string
Yes
Why this action is being taken
tool_name
string
No
Name of the tool being called
tool_args_json
string
No
JSON string of tool arguments
Returns: { verdict, allow, reason, toolCallId }
atbash_log
Submit a tool call for Atbash safety judgment and logging. Returns the same fail-closed decision contract as atbash_judge: { verdict, allow, reason, toolCallId }.
Despite its legacy name, this is not a distinct non-judging log operation — it runs the same safety-judgment path as atbash_judge.
Input
Type
Required
action
string
Yes
context
string
Yes
tool_name
string
No
tool_args_json
string
No
atbash_check_agent
Check whether an agent is registered on the Atbash platform.
Input
Type
Description
pubkey
string
Agent public key (defaults to server agent)
atbash_judgment_status
Poll the status of a previously submitted judgment.
Input
Type
Description
tool_call_id
string
ID returned from atbash_judge
agent_pubkey
string
Agent public key (defaults to server agent)
Query tools (read-only)
Tool
Description
atbash_get_policy
Get agent policy and blocked status
atbash_get_agent_detail
Get agent metadata
atbash_get_tool_calls
List recent tool calls across all agents
atbash_get_agent_tool_calls
List recent tool calls for one agent
atbash_get_org_tool_calls
List recent tool calls for an organization
atbash_get_tool_call_full
Get full detail for a single tool call
atbash_get_tool_call_count
Get total on-chain tool call count
atbash_get_tier_info
Get organization tier information
atbash_get_held_actions
List actions pending operator review
atbash_get_reviews
Prompt
atbash_safety_check
Prepare a consistent pre-execution Atbash safety review request. Takes action and context and produces a structured prompt that instructs the model to call the Atbash tools before proceeding.
Verdict handling
Verdict
Meaning
What to do
ALLOW
Safe to proceed
Execute the real tool only when allow is also exactly true
HOLD
Pending operator review
Do not proceed; keep tool_call_id to poll status later
BLOCK
Policy violation
Stop; show reason to operator
ERROR
Judge unreachable
Fail closed — do not proceed
Unknown or missing verdicts, and ALLOW responses carrying allow: false, are also returned with allow: false.
Enforcement is advisory in MCP
An MCP server exposes tools; it cannot intercept the other tools your client calls. So this package can tell you an action is unsafe, but it cannot stop the client from running it — the model has to honour the verdict. If a verdict is unreachable, both atbash_judge and atbash_log return {"verdict": "ERROR", "allow": false} with an explicit instruction not to proceed, rather than a bare transport error that is easy to mistake for a broken tool.
For enforcement that a compromised or prompt-injected agent cannot talk its way past, use a plugin that wraps the tool-call boundary itself — for example @atbash/atbash-langchain, @atbash/atbash-langgraph, or the OpenClaw plugin.
Sending better inputs
Better inputs produce better safety decisions.
Weak:
json
{ "action": "do payment", "context": "finance" }
Better:
json
{
"action": "Bank transfer $25 to a new external vendor account",
"context": "Treasury payout review before execution",
"tool_name": "send_bank_transfer",
"tool_args_json": "{\"amount\":25,\"recipient\":\"new vendor\"}"
}
Example
A runnable example is in examples/mcp-runtime-agent/ in the package repository.
bash
npm install && npm run build
ATBASH_AGENT_PRIVKEY=your_key_here ATBASH_ORG_NAME=your_org node examples/mcp-runtime-agent/client.mjs
bash
npm install @atbash/atbash-langchain
Peer dependency:
bash
npm install @langchain/core # >=0.3.0 required
When to use it
Use this package when:
you already use DynamicStructuredTool
you want minimal ceremony
you only need Atbash at the tool execution boundary
Use @atbash/atbash-langgraph instead when you need graph-level pause/resume on HOLD.
Quick start
ts
import { Atbash } from "@atbash/sdk";
import { DynamicStructuredTool } from "@langchain/core/tools";
import { AtbashGuardError, withAtbashGuard } from "@atbash/atbash-langchain";
import { z } from "zod";
const client = new Atbash(process.env.ATBASH_AGENT_PRIVKEY, {
orgName: process.env.ATBASH_ORG_NAME,
});
const tool = new DynamicStructuredTool({
name: "send_bank_transfer",
description: "Send a bank transfer to an external vendor account",
schema: z.object({ request: z.string() }),
func: async (input) => `Executed: ${input.request}`,
});
withAtbashGuard(tool, client);
try {
const result = await tool.invoke({ request: "Transfer $25 to vendor" });
console.log(result);
} catch (error) {
if (error instanceof AtbashGuardError) {
// HOLD, BLOCK or ERROR — the tool did NOT run
console.error(error.atbashVerdict, error.atbashReason);
} else {
throw error;
}
}
API
withAtbashGuard(tool, client, guardManager?)
Mutates tool.func in-place. The original tool instance is returned for chaining. Guarding is idempotent — a tool that already carries a guard is returned unchanged.
Parameter
Type
Description
tool
DynamicStructuredTool
The tool to guard
client
Atbash
SDK client — new Atbash(privkey, opts) or Atbash.fromConfig(opts)
guardManager
MemoryGuardManager
Optional. Screens memory writes for poisoning before the judge call
Returns the same tool instance with its func wrapped.
createAtbashGuardManager(client, opts?)
Convenience wrapper that creates a MemoryGuardManager and runs runBootProbe() automatically in the background.
Option
Type
Default
Description
workspaceDir
string
process.cwd()
Agent workspace directory. ~ is expanded.
memoryFilePath
string
workspaceDir/MEMORY.md
Explicit MEMORY.md path. Overrides workspaceDir.
ttlMs
number
30000
How long (ms) to trust the local pointer between chain checks.
rollbackMinScore
number
1
Block memory reads when a rolled-back version scores below this (1–10). Default 1 = warn only.
memoryPathPatterns
Verdict handling
Verdict
Behavior
ALLOW
Original tool func runs normally
HOLD
Throws AtbashGuardError. Nothing executes. Approve or reject from the Atbash dashboard, then ask the agent to retry
BLOCK
Throws AtbashGuardError with the policy reason
ERROR
Throws AtbashGuardError. Fails closed — the tool does not run when the judge is unreachable
ALLOW is the only verdict that executes the tool. Every non-ALLOW verdict throws — wrap tool invocations in try/catch and handle deliberately.
AtbashGuardError
Field
Type
Description
atbashVerdict
string
"ALLOW", "HOLD", "BLOCK", "ERROR", or an unrecognised verdict passed through verbatim
atbashReason
`string
null`
atbashToolCallId
`string
null`
atbashSource
`"judge"
"memory-guard"`
error.message mirrors atbashReason.
Creating the client
Create the client once at startup and reuse it for every guarded tool:
ts
import { Atbash } from "@atbash/sdk";
const client = new Atbash(process.env.ATBASH_AGENT_PRIVKEY, {
orgName: process.env.ATBASH_ORG_NAME,
endpoint: process.env.ATBASH_ENDPOINT,
});
Atbash.fromConfig() is an alternative that resolves the agent key from ~/.config/atbash/guard-client-key. Both constructors enforce https-only, reject endpoints with embedded credentials, and check the hostname against a trusted allowlist — a non-allowlisted host throws at construction time. To point at a self-hosted judge, pass judge: { policy: "self-hosted", endpoint, verifyPubKey }.
Telemetry flush
Install a shutdown handler to flush in-flight telemetry before exit:
ts
import { shutdownAtbashLangchain } from "@atbash/atbash-langchain";
process.on("SIGTERM", async () => {
await shutdownAtbashLangchain(); // never rejects
process.exit(0);
});
Environment variables
Variable
Required
Description
ATBASH_AGENT_PRIVKEY
Yes
Your Atbash agent private key
ATBASH_ORG_NAME
No
Default org, used to resolve the chain on every judged call
ATBASH_ENDPOINT
No
Override the default Atbash endpoint (https://atbash.ai)
What this package does not do
It does not manage a review queue.
It does not pause and resume execution (use @atbash/atbash-langgraph for that).
It does not guard arbitrary business code — only code behind a wrapped DynamicStructuredTool.
It does not expose a verdict callback. On ALLOW you get the tool's own return value; every other verdict throws.
Example
A runnable example is in examples/langchain-runtime-agent/ in the package repository.
bash
npm install && npm run build
cd examples/langchain-runtime-agent && npm install && cd ../..
ATBASH_AGENT_PRIVKEY=your_key_here node examples/langchain-runtime-agent/run.mjs
bash
npm install @atbash/atbash-langgraph
Peer dependencies (minimum versions):
bash
npm install @langchain/core @langchain/langgraph
Requires @langchain/core >=0.3.0 and @langchain/langgraph >=0.2.0.
When to use it
Use this package when:
your app already uses LangGraph
your graph has a distinct agent phase and tools phase
you want HOLD to pause execution using LangGraph interrupt semantics
Convenience helper that wires atbash_guard and atbash_audit into your graph.
Assumes your graph has nodes named agent and tools. If your layout differs, use createGuardNode() and createAuditNode() directly.
Option
Type
Default
Description
privkey
string
—
Agent private key (falls back to ATBASH_AGENT_PRIVKEY env var)
endpoint
string
https://atbash.ai
Override Atbash endpoint
toolsNode
string
"tools"
Name of the tools node in your graph
agentNode
string
"agent"
Name of the agent node in your graph
workspaceDir
string
process.cwd()
createGuardNode(opts)
Creates the pre-tool safety node. Calls auditToolCall() for every tool call in the last AI message that has no answering ToolMessage — the same calls a prebuilt ToolNode would run, so the guard and the executor cannot disagree about what is about to execute.
Returns a node function that writes atbashVerdict, atbashReason, atbashToolCallId to state.
createAuditNode(opts)
Creates the post-tool audit node. Fire-and-forget call to logToolCall() — errors are suppressed so they never break the graph.
AtbashStateAnnotation
Extends MessagesAnnotation with Atbash fields:
Field
Type
Description
atbashVerdict
`string
null`
atbashReason
`string
null`
atbashToolCallId
`string
null`
atbashConfidence
`number
null`
createJudgeTool(client)
Optional: creates an atbash_safety_check LangChain tool for direct LLM access to the judge.
Parameter
Type
Description
client
Atbash
A constructed Atbash instance (e.g. new Atbash(privkey))
Verdict handling
Verdict
Meaning
Graph behavior
ALLOW
Safe to proceed, and allow is not false
Routes to tools node
SKIP
Nothing pending to judge
Routes to END — never to tools
HOLD
Needs human review
Graph interrupts; resume with Command({ resume: "approve" })
BLOCK
Policy violation
Injects blocked ToolMessage; routes back to agent
ERROR
Judge unreachable
Treated as BLOCK — fail closed
anything else
Unrecognised, malformed, or tampered decision
Treated as — fail closed
HOLD / resume pattern
ts
import { Command, isInterrupted } from "@langchain/langgraph";
const result = await app.invoke(input, config);
if (isInterrupted(result)) {
const payload = result.__interrupt__[0]?.value;
// show payload to operator ...
const approved = await app.invoke(
new Command({ resume: "approve" }),
config,
);
}
Environment variables
Variable
Required
Description
ATBASH_AGENT_PRIVKEY
Yes (if not passing privkey in opts)
Your Atbash agent private key
ATBASH_ENDPOINT
No
Passed via opts.endpoint — the builder does not read this env var automatically
What this package does not do
It does not invent your graph structure.
It does not automatically find your tool node if you use a custom layout.
It does not execute operator review — it only exposes pause/resume mechanics.
Example
A runnable example is in examples/langgraph-runtime-agent/ in the package repository.
bash
npm install && npm run build
ATBASH_AGENT_PRIVKEY=your_key_here node examples/langgraph-runtime-agent/run.mjs
bash
npm install @atbash/atbash-eliza
Requires a published native binding for your platform:
macOS arm64: @atbash/sdk-darwin-arm64
Linux x64: @atbash/sdk-linux-x64-gnu
Linux arm64: @atbash/sdk-linux-arm64-gnu
Windows x64: @atbash/sdk-win32-x64-msvc
Then register atbashPlugin in your ElizaOS character / runtime config alongside your other plugins. The plugin reads its agent identity from the ATBASH_AGENT_PRIVKEY runtime setting at startup.
What it adds
atbashPlugin — registers the Atbash service, policy provider, audit evaluator, and explicit judge action.
AtbashService — loads the Atbash agent identity from Eliza runtime settings.
ATBASH_JUDGE — explicit Eliza action that asks Atbash for a safety verdict.
withAtbashGuard(handler) — wraps sensitive action handlers so Atbash decides before the real handler runs.
policyProvider — exposes current policy and blocked status to the runtime.
auditEvaluator — logs completed action text to Atbash on a best-effort basis.
Runtime inputs
Variable
Required
Description
ATBASH_AGENT_PRIVKEY
Yes
Used to derive the Atbash agent identity and sign requests.
ATBASH_ENDPOINT
No
Overrides the default Atbash API endpoint. Passed as judge: { endpoint } — the SDK's trusted-endpoint policy is applied at startup.
ATBASH_ORG_NAME
No
Resolves which chain the agent lives on. Applied to both the judge client and the memory guard. Without it, the SDK's default chain is used.
ATBASH_AUTO_GUARD_ALL_ACTIONS
No
When true (the default), every action registered in the runtime is wrapped with the Atbash guard at startup. Set to false to disable and guard only actions you wrap manually with withAtbashGuard.
ATBASH_REQUIRE_RECEIPT
No
When true (the default), the guard blocks an action if the judge response does not include a toolCallId receipt. Set to false only for testing.
Runtime model
At startup:
Eliza loads atbashPlugin.
AtbashService reads ATBASH_AGENT_PRIVKEY.
The service derives the public key and creates one reusable Atbash client.
The service checks whether the agent is registered and warns if it is not.
During runtime:
policyProvider can expose current safety status.
ATBASH_JUDGE can request an explicit verdict.
withAtbashGuard() checks Atbash before sensitive action handlers run.
auditEvaluator logs completed activity without crashing the agent if logging fails.
Permission requires an exact, positively matched ALLOW: the decision's verdict must be "ALLOW"and its boolean allow must be true. A missing toolCallId receipt (unless ATBASH_REQUIRE_RECEIPT=false) also denies execution.
Verdict behavior:
ALLOW — Original action handler runs.
HOLD — Original action handler does not run. The action returns a held result with the Atbash toolCallId.
BLOCK — Original action handler does not run. The action returns a blocked result with the policy reason.
ERROR — Original action handler does not run. The action returns an error result.
Automatic guarding
When ATBASH_AUTO_GUARD_ALL_ACTIONS=true (the default), the plugin wraps every action registered in the runtime at startup — so third-party actions are guarded without manual changes. Set to false to guard only actions you wrap with withAtbashGuard yourself.
Explicit judge action
ATBASH_JUDGE asks Atbash for a verdict and returns the decision in data.
Use it when the agent or app needs to inspect safety before choosing a next step. It does not execute your business action.
Example
The runtime example uses a real Eliza AgentRuntime, an in-memory adapter, and a simulated guarded transfer action.
bash
npm run build
ATBASH_AGENT_PRIVKEY=your_key_here npm run example
With optional vars:
bash
ATBASH_AGENT_PRIVKEY=your_key_here ATBASH_ORG_NAME=your_org ATBASH_ENDPOINT=https://atbash.ai npm run example
debug
bool
false
When true, logs a one-line probe for every before_tool_call showing toolName, top-level event/ctx/args keys, and whether the call was classified as a memory write. Useful for verifying memory-write classifier coverage against real traffic. Logs shape only — argument values are never printed.
judgeEndpoint
string
—
Override the judge URL. Leave unset to use the compiled-in default for the installed environment (prod or dev).
judgeEndpointPolicy
"default" | "self-hosted"
"default"
Set to "self-hosted" when pointing at your own judge; requires judgeVerifyPubKey.
judgeVerifyPubKey
string
—
66-char secp256k1 compressed pubkey used to verify the self-hosted judge response signature. Required when judgeEndpointPolicy is "self-hosted".
judgeTimeoutMs
integer
—
Max milliseconds to wait for a judge or memory-guard response before treating it as a timeout. When triggered, the plugin applies the same fail-closed/open logic as any other error (enforceDecision controls the outcome). Unset means the plugin waits as long as the host allows. Set to e.g. 12000 when the host has a hard hook deadline and you want the plugin to fail gracefully instead of being killed mid-await.
memoryPathPatterns
string[]
SDK defaults
Extra path substrings the memory classifier uses to identify memory-shaped files (e.g. "/my-agent/memory/"). Extends, does not replace, the SDK's built-in list.
memoryWorkspaceDir
string
process.cwd()
Workspace root used to locate the memory pointer file and MEMORY.md. Supports ~/.
memoryFilePath
string
<memoryWorkspaceDir>/MEMORY.md
Explicit path to the agent's MEMORY.md. Overrides the memoryWorkspaceDir-relative default. Supports ~/.
memorySyncTTLMs
integer
30000
How long (ms) to trust the locally cached memory chain pointer before re-fetching from the chain. Lower values increase freshness at the cost of more chain queries.
memoryRollbackMinScore
integer (1–10)
1
Block memory reads when a rolled-back version's safety score is below this threshold. Default 1 means warn only, never block. Raise to e.g. 3 to refuse reading poisoned rollbacks.
string[]
SDK built-ins
Custom memory path glob patterns
judgeEndpoint
string
—
Override the judge endpoint separately
judgeVerifyPubKey
string
—
Self-hosted judge response-signing pubkey
orgName
string
—
Organization name for chain resolution
enforce
boolean
true
false = monitor mode: log but never block
debug
boolean
false
Enable verbose debug logging
default
Set to self-hosted when using your own judge endpoint
ATBASH_JUDGE_VERIFY_PUBKEY
—
Required for a self-hosted judge, so signed responses can be verified
ATBASH_JUDGE_TIMEOUT_S
—
Max seconds to wait for a judge response before timing out. Applies the same fail-closed/open logic as any other error (ATBASH_ENFORCE_DECISION controls the outcome). Accepts positive decimal numbers.
HERMES_PROVIDER
—
Informational — Hermes provider, passed through to Atbash context
HERMES_MODEL
—
Informational — Hermes model, passed through to Atbash context
List completed operator reviews
atbash_get_safety_stats
Get chain-wide safety statistics
string[]
SDK built-ins
Custom memory file path patterns.
judgeEndpoint
string
—
Optional judge endpoint override.
judgeVerifyPubKey
string
—
Self-hosted judge response-signing pubkey.
orgName
string
—
Organization name for chain resolution.
enforce
boolean
true
false = monitor mode: log but never block.
debug
boolean
false
Enable debug logging.
Agent workspace directory; ~ is expanded
memoryFilePath
string
<workspaceDir>/MEMORY.md
Explicit MEMORY.md path; overrides workspaceDir
memorySyncTTLMs
number
30000
How long (ms) to trust the local memory pointer between chain checks
memoryRollbackMinScore
number
1
Block memory reads when a rolled-back version scores below this (1–10); default 1 = warn only
memoryPathPatterns
string[]
SDK built-ins
Custom memory path glob patterns
judgeEndpoint
string
—
Override the judge endpoint separately from the main endpoint
judgeVerifyPubKey
string
—
Self-hosted judge response-signing pubkey (required when judgeEndpoint uses a self-hosted policy)
orgName
string
—
Organization name for chain resolution (public vs private chain)
enforce
boolean
true
Set to false for monitor mode: memory guard logs violations but never blocks
debug
boolean
false
Enable verbose debug logging
BLOCK
ATBASH_ENFORCE
No
false puts the memory guard in monitor mode — logs violations but never blocks.
ATBASH_GUARD_DEBUG
No
true enables debug logs for action wrapping at startup and for each guard verdict at runtime.
ATBASH_WORKSPACE_DIR
No
Absolute path to the agent's project root, used to resolve the memory file path. Defaults to process.cwd().
ATBASH_MEMORY_FILE_PATH
No
Absolute or ~-prefixed path to the agent memory file the memory guard monitors. Overrides <ATBASH_WORKSPACE_DIR>/MEMORY.md.
ATBASH_MEMORY_PATH_PATTERNS
No
Comma-separated extra path substrings that count as agent memory. Added to the SDK's defaults, not substituted for them.
ATBASH_MEMORY_TTL_MS
No
How long (ms) to trust the local memory pointer between chain checks.
ATBASH_MEMORY_ROLLBACK_MIN_SCORE
No
Block memory reads when a rolled-back version scores below this (1–10). Default 1 = warn only.
ATBASH_JUDGE_ENDPOINT
No
Overrides the judge endpoint used by the memory guard manager. Distinct from ATBASH_ENDPOINT.
ATBASH_JUDGE_VERIFY_PUBKEY
No
Public key used to verify judge response signatures in the memory guard.
ATBASH_DEBUG
No
true enables verbose debug logging inside the memory guard manager.