Skip to content

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 raises NovarchKillError.
  • kill (buyer-facing label: BLOCKED): NovarchKillError is 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 single Action from the buffered reads, the reasoning, and the write’s context_builder output.
  • The SDK submits that Action to your Novarch deployment, where the Novarch engine applies your team’s plain-English rules and returns a Decision.
  • The SDK enforces the verdict: it runs the write on pass, blocks for an operator on hold, and raises NovarchKillError on kill or 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.

Terminal window
pip install novarch

Installing 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.

Next steps