Novarch SDK
Novarch is the enforcement layer for AI agents in production. It sits in the
path of your agent’s actions, between the agent and its irreversible writes.
Read tools run freely and are buffered as evidence. The moment the agent
attempts a write,
Novarch materializes the buffered reads plus the agent’s stated reasoning into
an Action, the Novarch engine applies your team’s plain-English rules, and the
write either proceeds (pass), pauses for a human operator (hold), or is
stopped cold (kill). The rule and signals are cited in an auditable
Decision record.
novarch (Python) and @novarch/sdk (TypeScript) are the client SDKs: the
read/write tool surface, the wire-contract schema, and framework integrations.
They talk to a Novarch deployment, managed by us or running in your VPC. The
Novarch engine, the rule editor, and the operator triage queue live in that
deployment, not in the SDK.
Novarch governs any consequential write you can write a rule for. Accounts Payable and Customer Support ship as starter packs, but the enforcement layer is not limited to them: you attach your workflow’s own evidence and author rules over it. See How enforcement adapts.
What the Novarch engine decides
Every gated write produces exactly one verdict:
pass: the write executes immediately. Your business is not interrupted.hold(buyer-facing label: PAUSED): the SDK blocks while a human operator approves or denies the action in the triage dashboard. Approval lets the write run; denial or timeout raisesNovarchKillError.kill(buyer-facing label: BLOCKED):NovarchKillErroris raised immediately and the write never runs.
Uncertainty (a judge error, a timeout, or a server restart with a hold in
flight) fails closed by default: it surfaces as a NovarchKillError rather
than silently letting the write through. A deployment can set a
posture that releases the write instead, and every release is
recorded as an action nobody decided.
How the read-buffer → write-gate flow works
@augur.tool(kind="read")runs your tool immediately and buffers a record of the call as evidence for the pending action.augur.set_reasoning(text)attaches the agent’s stated rationale to that pending action. An agent that produces no rationale says so once for the run, and its actions record that. See Declaring that your agent has no reasoning.- The first
@augur.tool(kind="write")drains the buffer and materializes a singleActionfrom the buffered reads, the reasoning, and the write’scontext_builderoutput. - The SDK submits that
Actionto your Novarch deployment, where the Novarch engine applies your team’s plain-English rules and returns aDecision. - The SDK enforces the verdict: it runs the write on
pass, blocks for an operator onhold, and raisesNovarchKillErroronkillor any fail-closed condition.
Names above are the Python spellings. In TypeScript the same three pieces are
session.readTool(...), session.setReasoning(text), and
session.writeTool(...) — see the TypeScript SDK.
This tool surface is one of two ways to attach the gate. If your agent runs on LangChain, LangGraph, or the Claude Agent SDK, you can instead register a single gate at the framework’s tool seam and leave your tool bodies untouched — every tool the agent has is gated, including ones you didn’t write. Same engine, same audit trail. See How you instrument.
Getting access
There are two client SDKs, both open source (Apache-2.0). They implement the same wire contract and the same fail-closed behavior, pinned by a conformance corpus that both test suites run.
pip install novarchnpm install @novarch/sdkInstalling the package alone does not give you a working setup. Either one dead-ends without a deployment to talk to. The Novarch deployment (the engine, the rule editor, and the operator triage queue) is managed by Novarch for pilots and sandboxes, or deployed into your VPC for design partners.