Skip to main content

Boundary enforcement for AI coding agents: plain-YAML module contracts compiled into CLAUDE.md, hooks, and CI checks that keep agents inside your architecture.

Project description

ANMA

Boundary enforcement for AI coding agents. ANMA turns plain-YAML module contracts into the CLAUDE.md, hooks, and checks that keep Claude Code inside your architecture — and it measurably works where it matters most.

In a controlled benchmark, a cheaper/faster model (Claude Haiku 4.5) violated a declared module boundary in 13 of 19 runs of a plain repo. With ANMA, across 20 runs of the same task it violated it 0 times (Fisher's exact p < 0.0001). See docs/BENCHMARKS.md for the full study, including the honest part: a frontier model (Opus 4.8) respected the boundary on its own, so ANMA's value is insurance for running cheaper agents plus a CI/governance guarantee — not making a frontier model smarter.

What it does

You declare each module's public interface and what it may depend on. anma sync compiles that into everything else, so the architecture the agent reads can never drift from the rules CI enforces:

anma.yaml                       project config (schema_version, source_roots)
src/domains/billing/
  anma.yaml                     the module contract — see docs/CONCEPTS.md for all fields
  CLAUDE.md          (generated) loads when Claude opens billing/
CLAUDE.md            (generated) architecture map, between markers
.claude/rules/boundaries.md (generated) always-loaded imperative
.claude/hooks/anma_pretooluse.py (generated) blocks a boundary-breaking edit (exit 2)
tach.toml            (generated) engine config
.github/workflows/anma.yml (generated) CI: drift check + boundary check
DECISIONS.md         append-only: why each boundary exists

Quickstart (60 seconds)

pip install anma[tach]      # tach backend recommended; works without it too
anma init                   # scaffolds contracts + a worked accounts/billing example
anma sync                   # generates CLAUDE.md, nested docs, hooks, tach.toml, CI
anma check                  # ✓ boundaries respected

Full walkthrough: docs/QUICKSTART.md.

Commands

anma init             # scaffold contracts + a worked example
anma sync             # regenerate all artifacts from contracts
anma sync --check     # CI guard: fail if generated artifacts drifted from contracts
anma check            # enforce boundaries (hook / pre-commit / CI)
anma check --warn     # report violations but exit 0 (incremental adoption)
anma check --json     # machine-readable output for pipelines

Exit codes: 0 ok · 1 violations, contract errors, or drift.

Two layers: guidance and enforcement

ANMA works at two levels, and the benchmark shows they play different roles:

  • Guidance — the generated root and per-module CLAUDE.md and .claude/rules put your architecture in the agent's context. This is what drove the 68% → 0 result: the model was steered to the correct design and didn't attempt a bad edit.
  • Enforcement — the PreToolUse hook judges the proposed edit and returns exit 2 to block any new disallowed import before it lands; the same check runs at pre-commit and in CI. This is the guarantee that holds for the edits guidance doesn't catch, and regardless of which model or human wrote the diff.

The enforcement hook is verified to fire (feed it a forbidden edit → exit 2); in the benchmark it never needed to, because guidance pre-empted every bad edit. Both matter; see the benchmarks for exactly what each one is shown to do.

Who it's for

  • Teams running cheaper or faster agents (cost-sensitive pipelines, bulk tasks, non-frontier or non-Claude models) that don't reliably respect an architecture on their own — this is where ANMA's steering is decisive.
  • Anyone who wants an enforced architecture: a guarantee in CI/pre-commit that module boundaries hold no matter who or what wrote the change.
  • Teams that want architecture as governance: declared interfaces, ownership → CODEOWNERS, and docs that can't silently drift from the rules.

If you only ever drive a frontier model on small, well-described tasks, ANMA may add turns without changing outcomes — and the benchmarks say so plainly.

Lightweight by design

~800 lines, no runtime, no DSL, zero required dependencies (the builtin engine needs nothing; tach is an optional, faster, interface-aware backend). A security team can read the whole tool in an afternoon.

Enterprise

  • Drift detectionanma sync --check fails CI if generated docs/config fall out of sync with the contracts.
  • Incremental adoptionanma check --warn and per-module deprecated_deps let a large codebase adopt without a red build on day one.
  • Governanceowners: per module generates CODEOWNERS; source_roots: supports monorepos.
  • Supply chain — signed releases (PyPI Trusted Publishing + provenance + SBOM), pip-audit in CI, Apache-2.0. See SECURITY.md.

Documentation

Apache-2.0 · ANMA Labs LLC

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

anma-0.5.6.tar.gz (47.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

anma-0.5.6-py3-none-any.whl (21.7 kB view details)

Uploaded Python 3

File details

Details for the file anma-0.5.6.tar.gz.

File metadata

  • Download URL: anma-0.5.6.tar.gz
  • Upload date:
  • Size: 47.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for anma-0.5.6.tar.gz
Algorithm Hash digest
SHA256 fef1450cdaf9f5894ddc94d904fa35f687afc0aff455c1b2c94e0484f03d00ea
MD5 8f76d70da69b8287c3eb2fc465a24a7d
BLAKE2b-256 69864eeafe830adda94a074b6756441a218070d096189a5a261b34076cc88c55

See more details on using hashes here.

Provenance

The following attestation bundles were made for anma-0.5.6.tar.gz:

Publisher: release.yml on anma-labs/anma

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file anma-0.5.6-py3-none-any.whl.

File metadata

  • Download URL: anma-0.5.6-py3-none-any.whl
  • Upload date:
  • Size: 21.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for anma-0.5.6-py3-none-any.whl
Algorithm Hash digest
SHA256 e9b8ec3bfde196ea7d49637291d8c33e5a48fb9ff0889d8358d20625092835c8
MD5 f2ca7b14b94be12d281b885153806950
BLAKE2b-256 6507b4c6107f339dea5220a2d0b73c0fbcdd0c0351a209243a836bb7878c7ff4

See more details on using hashes here.

Provenance

The following attestation bundles were made for anma-0.5.6-py3-none-any.whl:

Publisher: release.yml on anma-labs/anma

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page