As-Is
What the code actually contains.
ARCHITECTURE CONTRACT · EXPLORER · DETERMINISTIC CHECKS
Define components, responsibilities and allowed dependencies. Review the implementation, the declared Target and their differences in the ArchQ Explorer. Your coding agent queries the same contract and findings.
Architecture checks for coding agents
Local · No LLM in the checker · MIT · Python, Dart, TypeScript with different analysis scope
What the code actually contains.
What the contract declares.
Where implementation and Target differ.
Open a component to explore its responsibilities, interfaces and dependencies. As-Is, Target and Diff show our own code and the contract declared for it.
Recorded snapshot · aa159e5 · retrieved 2026-10-12. Analysis limits and UNKNOWN are recorded in the report.
Open the full report ↗Latest published report ↗GREEN TESTS ARE NOT ENOUGH
A coding agent can cross a boundary without failing a behavior test. This rule declares the boundary. The finding identifies the source location.
{
"id": "DEP-RENDER-NO-STORE",
"kind": "forbidden_dependency",
"source": "shop.render",
"target": "shop.store",
"include_type_checking": true,
"rationale": "Text projection consumes typed values without touching persistence.",
"provenance": ["docs/architecture/shop.md"],
"decided_by": "architect"
}10 lines from the Shop rule. The full contract also contains components and other rules.
Presentation reaches into persistence. This dependency is forbidden by the contract.
from shop.store import OrderRepositorySource: Shop fixture in the README.
EVIDENCE / PYTHON REPLAY
A switch to dictionary dispatch keeps eight behavior tests green. Static analysis can no longer resolve the new call. The candidate is rejected for that regression.
# before · sample/work.py
from sample.helpers import credit, debit
def run(key: str, amount: int) -> int:
if key == 'credit':
return credit(amount)
if key == 'debit':
return debit(amount)
raise KeyError(key)
# candidate · sample/work.py
from sample.helpers import credit, debit
def run(key: str, amount: int) -> int:
handlers = {'credit': credit, 'debit': debit}
return handlers[key](amount)This replay measures static visibility. It does not establish a runtime defect. The source record contains the full conditions and call counts.
Conditions & source ↗Result JSON ↗Reproduce ↗WHY ARCHKEEL?
Import Linter and Tach check Python boundaries; ArchUnit tests JVM architecture, including calls and accesses. dependency-cruiser and Nx check dependencies in JavaScript/TypeScript projects.
ArchKeel combines declared-change checks, regression checks on comparable analysis evidence, and focused snapshot queries that retain UNKNOWN. ANMA and code-governance also support agents. Choose ArchKeel when you need this review loop.
Compare the candidate with an expectation published before submission.
Fewer findings are insufficient when analysis can see less.
Query the contract and findings by scope. Keep global results and UNKNOWN.
Compare the tools against the review loop you need.
Compare tools and limitsYOUR FIRST CHECK
Python 3.11+ and a Git repository with at least one commit. Use a Python version compatible with your project.
Ask your agent to read the architecture docs, propose boundaries, and let you decide which dependencies are allowed.
Read the setup guide ↗uv tool install archkeel
archkeel skill install codex
# or: archkeel skill install claudearchkeel validateFor the declared-change gate: archkeel check with the protocol configured. report produces evidence and can exit 0 despite FAIL or UNKNOWN.
ArchKeel 2.0.0 is released. Historical examples use their documented versions. Release notes ↗
ARCHKEEL CHECKS ARCHKEEL
We check our own code with the same tool. The snapshot in the Explorer contains these rule assessments:
Completed rules without violations.
Rules with recorded violations.
Rules whose required evidence is incomplete.
Overall result: UNKNOWN. Passing rules leave the remaining analysis gaps open.
Inspect findings and evidence ↗FAQ
Architecture checks for coding agents. ArchKeel checks declared architecture boundaries and changes in AI-assisted code. The CLI runs locally and deterministically, without an LLM in the checker.
If you only need import or module constraints in your existing stack, your current checker may be sufficient. ArchUnit also offers JVM structural tests.
Complete runtime correctness or good architecture. Analysis is static and depends on the language profile.
The collaborative Studio interface is planned. The CLI and its reports are available. See the Studio concept on Vision & Roadmap.