CAI Get a survey →

The catalog

Every dimension the CAI measures.

The standard is composed of 124 dimensions across 10 lenses. Each is a definition — what it measures and how it's evaluated — pinned to a rubric version. This catalog is the standard's vocabulary; the spec documents how each folds into the score.

4 published versions · this catalog as JSON

Showing only the Architecture lens. Show all 124 dimensions →

124 dimensions

Architecture · 20 dimensions

IDDimensionWhat it measuresWhy it mattersEvaluator
D5 Coupling Whether volatile projects sit underneath others that depend on them (so their churn ripples upward), and whether project dependencies form cycles. A widely-depended-on but stable shared/kernel project is healthy, not penalised. When this is weak, the parts of the system depend tightly on each other and form circular dependencies, so a change in one place forces changes in several others and the structure resists growth. tool
D6 Cohesion (LCOM4) Whether a class's methods are focused on a single responsibility. When this is weak, individual classes mix several unrelated responsibilities, making them harder to understand, test and change in isolation. tool
D7 Architectural Integrity Whether the code respects its intended layering / architecture rules. When this is weak, the code does not respect its own intended layering, so the structure on paper no longer matches reality and the design erodes over time. tool
D22 Internal API Consistency Whether the internal API surface is consistent and coherent. When this is weak, the system's internal interfaces are inconsistent, so developers cannot rely on familiar patterns and each part has to be learned from scratch. LLM · advisory
D23 Boundary Type-Coupling Whether domain types (IDs, enums, value objects) leak across bounded-context boundaries. When this is weak, domain types leak across module boundaries, so the parts of the system that should be independent become entangled and cannot evolve separately. tool
D26 Project Cohesion Whether each project is a focused, coherent unit rather than an oversized grab-bag. When this is weak, individual projects have become oversized grab-bags rather than focused units, blurring responsibilities and making the codebase harder to reason about. tool
D27 Navigability How far you must trace to follow a call — low indirection and co-located slices read easier. When this is weak, following a single call means tracing through many layers of indirection, so understanding even simple behaviour takes a developer much longer. tool
D35 Change Coupling Whether files that change together actually belong together — pairs that repeatedly co-change in git history despite having no explicit code dependency, surfacing the hidden/logical coupling (and boundaries in the wrong place) a static scan can't see. tool
AX1 Captive dependenciesmeta Whether any singleton service captures a scoped/transient dependency — a silent lifetime/threading bug. When this is weak, long-lived services hold on to short-lived dependencies — a silent lifetime bug that can cause subtle, hard-to-reproduce errors under concurrent use. tool
AX2 Stateful singletonsmeta Whether singleton services avoid mutable shared instance state that concurrent callers would race on. When this is weak, shared single-instance services keep mutable state that concurrent users can race on, leading to intermittent corruption that is very hard to track down. tool
AX3 Project dependency cyclesmeta Whether the project-reference graph is acyclic (cycles block independent build/deploy and signal eroding boundaries). When this is weak, the projects depend on each other in cycles, so they cannot be built or deployed independently and the architectural boundaries are eroding. tool
AX4 Dependency directionmeta Whether dependencies point inward (Domain ← Application ← Infrastructure/Web) — the clean-architecture dependency rule, checked across the project graph. When this is weak, dependencies point the wrong way through the layers, so the core business logic is tied to technical details and becomes harder to test and replace. tool
AX5 Architecture & structuremeta Whether the codebase has a recognisable, scale-appropriate structure (a named architectural style, or modular enough for its size) rather than being an ad-hoc ball of mud. When this is weak, the codebase has no recognisable, scale-appropriate structure, so it reads as an ad-hoc tangle that is hard to navigate and grow. tool
AX6 Interface segregationmeta Whether interfaces stay focused rather than fat — the Interface-Segregation principle (SOLID 'I'). When this is weak, interfaces have grown fat with unrelated members, forcing callers to depend on methods they do not use and making the contracts harder to change. tool
AX7 Slice cohesionmeta Whether feature slices stay independent (no direct cross-slice references) — the discipline that makes vertical-slice architecture pay off. When this is weak, feature slices reach directly into each other instead of staying independent, so a change to one feature can unexpectedly break another. tool
AX8 Test isolationmeta Whether production projects stay free of references to test projects — tests may depend on production, never the reverse. tool
AX9 CQS / query puritymeta Whether read (query) handlers stay side-effect-free — a query that writes persistent state or raises events breaks CQS and makes reads unsafe to retry, cache, or route to a read replica. tool
AX10 Code compositionmeta How the codebase splits by code ROLE — domain, application, infrastructure, test, generated. The significance map behind the knowledge/coupling weighting, and a DDD signal in its own right: a thin domain core under fat infrastructure is the anemic-domain smell, quantified. tool
R9 Circular Importsmeta Import cycles in the module graph (D-386) — files that can only be understood and changed together. When this is weak, frontend files import each other in cycles, so they can only be understood and changed together — a tightly knotted area that resists refactoring. tool
R11 Import Boundariesmeta Conformance to the detected frontend architecture layout (feature-sliced / layered src) plus cross-package deep-import rules (D-386). When this is weak, the frontend ignores its own intended layout and reaches across package boundaries with deep imports, so the structure decays and modules become entangled. tool