Architectural governance

Most teams have security, change management, and model risk. What they do not have is a checkable model of the intended system. CALM is the open language for that model. ArchRails is the gate.

CLAUDE.md
prose
platform.md orders.md payments.md schema notes guessed not allowed serviceAPI Gateway serviceOrder servicePayment databaseOrders DB
01 · The trap

Architecture is still living in markdown

The intended system is prose. The running system is git. Nothing connects them.

inferred from the tree
guessed
guessed serviceAPI Gateway serviceOrder servicePayment databaseOrders DB
02 · The agent era

Agents reconstruct intent by guessing

They infer a path from the tree. They do not tell you which parts they invented.

intended system
the model
serviceAPI Gateway serviceOrder servicePayment databaseOrders DB
03 · The category

Architectural governance is the missing layer

The intended system becomes an artifact you can check a change against.

architecture.calm.json
calm v1
serviceAPI Gateway serviceOrder servicePayment databaseOrders DB
04 · The language

CALM is architecture as code

Nodes, allowed paths, and controls in a schema-validated file. Open standard, not our format. calm.finos.org

{ "unique-id": "service-order", "connects": ["service-api-gateway"] }
pull request
refused
serviceAPI Gateway serviceOrder servicePayment databaseOrders DB
Order → Payment refused at merge
05 · Where it runs

The check sits on the change

The pull request is the gate. OrderService is not allowed to call PaymentService.

.md → architecture.calm.json
leave the prompt file
CLAUDE.md orders.md payments.md
serviceAPI Gateway serviceOrder servicePayment databaseOrders DB
06 · Get it out of the .md

The architecture does not belong in a prompt file

Markdown is how to build. The model answers whether a change is allowed.

Get the architecture out of your .md files What was never written down
The product

The pull request is the gate
The session steers. An LLM does not decide.

You declare the model. ArchRails judges the merge against it. The agent session runs the same engine so a forbidden file need not be written.

Built on FINOS CALM v1. Evidence an auditor verifies offline.

Built on FINOS CALM v1 LLM explains. It does not judge.
The proof

OrderService is not allowed to call PaymentService

Architecture Graph · PR #847 — feature/order-refactor
2 violations detected · drag nodes · scroll to zoom
Service
Database
Actor
System
Violation
External
⚡ 2 violations
✓ 1 passed
🏗️ CALM Architecture Review
⚡
Relationship violation
OrderService calls PaymentService directly — must route via service-api-gateway
rel-connects-order-payment
⚡
Interface breach
OrderDatabase accessed via HTTP — node declares JDBC:5432 only
db-orders · iface-orders-sql
✅
Node boundary respected
InventoryService changes scoped to service-inventory — no leakage
CALM sources: calm.json · rel-connects-order-payment calm.json · db-orders
FINOS CALM v1

That rule is a file in the repo

Not a wiki sentence. A schema-validated CALM document: nodes, allowed paths, and the controls on them. Humans review it. The merge gate evaluates it.

Click any node above to inspect it Validate your own architecture

The agent is steered onto the declared path

If that is skipped, the pull request still judges. The product.

Cursor attempts a forbidden DB call during a 3 AM hotfix. ArchRails blocks it in the session; the agent rewrites against the permitted path. Production stays in PCI scope.

The product →

Generic AI review bots
Trained on open-source patterns. Suggests "best practices." Comments are confident but untraceable — no source, no context, no connection to your team's actual decisions.
ArchRails
Enforces your declared CALM architecture from Git. Every comment links back to the exact node, relationship, or interface it was derived from. Violations are provable — not guesses.
Architecture catalogs (Backstage, Cortex, Port, LeanIX, Ardoq)
Catalogs describe what shipped. They surface architecture after the fact and rely on humans to keep them in sync. Useful for inventory, not for stopping a violation from merging.
ArchRails
Catalogs describe what shipped. ArchRails is the gate: the write and the merge are judged against the architecture you declared. Drift cannot accumulate because a forbidden change does not land.
Built on CALM — the open standard

Architecture is declared in FINOS CALM — an open standard from the Fintech Open Source Foundation, not a format we invented. The JSON lives in your repo. Leave, and it still reads in every other CALM tool. New to CALM? FINOS tutorials.

Record

Evidence an auditor checks without us

Every governed merge produces a signed attestation — what the architecture was, that the change was evaluated against it, and who promoted it. You download it and check it yourself. You never have to take our word.

Signed record
Per governed merge
Generated automatically — nobody has to remember to produce it, which is the only kind of evidence that survives an audit. It does not contain your code.
Verify offline
No account, no API call
An auditor who distrusts us entirely can still confirm it. Change one byte and it fails. How the evidence works.
Unbroken history
Chained, gap-refusing
Each record carries the one before it. A version cannot be quietly removed. Retention is measured in years, not dashboards.

What an attestation is, and is not. It proves what your architecture was at a merge, that the change was evaluated against it, and by which build. It does not contain your code. Your SCM already holds the pull request. The attestation binds to that record rather than duplicating it.

CALM Visualizer — Free

Validate and visualize your CALM architecture before it ships

Paste your calm.json to instantly check for interface violations, missing controls, and structural issues — then render your architecture graph interactively. No account required.

  • Validates against FINOS CALM v1 schema
  • Interactive architecture graph with node detail panel
  • Flags relationship and interface violations inline
  • Free to use — no login, no limits
Open CALM Visualizer
Architecture Graph
● 6 nodes · 9 relationships
👤 Customer
⚡ API Gateway
📦 Order Service
⚠ Inv. Service
💳 Payment
🗄 Order DB
🗄 Inventory DB
■ Service ■ Database ■ Actor ■ Violation

Common questions

CALM (Common Architecture Language Model) is a FINOS open standard for describing architecture as machine-readable JSON. We use it because it solves a problem that has quietly worsened for 15 years: ask five engineers to draw your system's architecture and you get five different pictures — a point Google's Adam Bender called out at SE@TP 2026. CALM ends the divergence: one declared graph that every human, every coding agent, and every CI step reads off, with deterministic verification on top.
No. Run archrails arch generate in your repo and it reads your code and writes a first-draft architecture document, plus the configuration ArchRails needs to enforce it. It uses a coding agent you already have installed — Claude Code, Codex, Gemini CLI or Cursor Agent — so ArchRails calls no model service of its own and no AI API key is involved. Budget 20–40 minutes on a large repo; it is a one-time cost. You review the draft like any other PR, merge it, and enforcement starts on the next one. If you'd rather author by hand, the free CALM Visualizer is available with no account required. Declaring the architecture once is the fundamental that lets AI amplification go in a useful direction; without it, more agents just means more entropy.
No — there is no copy of your repository anywhere in ArchRails, and nothing is indexed, mirrored or retained after the fact. Review runs against the pull request's diff, which is held only for the life of that PR and deleted when it closes or merges. Nothing outside the diff is ever read. The workflow uses your repo's existing CI token, so ArchRails never holds repo-wide credentials of its own.
No. The pull request is the gate. The session runs the same engine so a forbidden write need not start. If the session is skipped — a manual edit, a different agent, a raw push — merge still judges. An LLM can explain a verdict. It does not issue one.
Copilot and generic AI review bots score code against general best practices learned from open-source training data. They have no idea what your system is or isn't supposed to do. ArchRails enforces your declared architecture — the specific nodes, allowed connections, controls, and interface contracts in your calm.json. Every comment is traceable to a node ID you authored. It's deterministic, not probabilistic, and the same gate runs at PR time and inside the coding agent — so the agent can't reach an API your architecture forbids. As Adam Bender put it at SE@TP 2026: “all of your APIs just became public” the moment you let agents loose. ArchRails is the contract that says which ones they're allowed to call.
Agents write whatever you let them write. The default behaviour is to find any API they can call and call it. ArchRails sits in front of the agent. Before a code change lands, the session is judged against your architecture and gets a deterministic verdict. Violations come back with the rule that was broken and the path that already exists — the agent doesn't get to negotiate, and it doesn't generate a path that would never have merged.
No. You author the control on the architecture. Anyone changing Terraform in that repo is judged against it. Application source is not proof that a store is encrypted. A control you apply to the whole architecture applies to every node in it. Live cloud-account state is out of scope — the gate is this pull request. PCI and GDPR template IDs are optional paste-ins, not a requirement. Signed-in users: Academy → Infrastructure controls.
Yes. A single calm.json at the repo root describes your full system graph, and ArchRails only evaluates the slice of the graph a given PR actually touches — a payment-service change won't trigger inventory-service checks. This is deliberate: dependency graphs scale quadratically with codebase size, so at the 10× AI-driven velocity everyone is preparing for, evaluating everything on every PR is how you burn your test budget into the ground.
Because adding probabilistic review on top of a system you can't reason about doesn't get you intellectual control — it gets you a louder bottleneck. As Bender put it at SE@TP 2026, AI is an amplifier: magnitude, not direction. The deterministic CALM check is the fundamental layer: same engine, same verdict, every PR and every agent call. The LLM sits on top — translating the verdict into a readable PR comment, suggesting which sanctioned node to use instead. We use AI to explain a verdict; we never use it to be the verdict.
Read the product for Author, Seed, Gate, Record. Request a scoping call to walk through it with the founding team against your repo footprint. Or start a 14-day eval — corporate email required, full access to shipped features.

Make architecture review automatic — and provable

Start with one repo and one CALM document. ArchRails will enforce it on every pull request.

Request a demo See the product