arch-check — Claude Code skill: architecture conformance check
Checks a codebase against the architecture it claims to follow: dependency direction, layer violations, module boundary leaks and cycles. Useful before a release.
npx skills add codewithmukesh/dotnet-claude-kit --skill arch-check -a claude-codeWhat arch-check does
The skill works from the project graph and dependency analysis instead of reading files one by one. It first establishes the declared architecture — from CLAUDE.md, an ADR in docs/decisions/, or by asking you. It will not guess silently, because a wrong baseline produces a wrong report.
Four baselines are supported: Vertical Slice, Clean Architecture, DDD + Clean and Modular Monolith, each with its own rule set. Then come the checks. get_project_graph() maps every project reference against the allowed arrows. detect_circular_dependencies() reports cycles with the full chain. get_dependency_graph() and find_references() probe namespace-level leaks, and get_endpoint_map() shows where endpoints are declared. detect_antipatterns() runs as supporting evidence.
You get a report with severity, file:line evidence and the concrete fix. A single wrong reference such as Domain → Infrastructure counts as CRITICAL, since it makes every downstream violation possible. For critical findings the skill offers to fix them right away. Choosing an architecture is out of scope — that is architecture-advisor.
What it helps with
- catch a Domain → Infrastructure reference before release
- find cycles between projects and print the full chain
- check whether a Domain entity pulls in EF Core types
- confirm endpoints are declared only in the host layer
- spot internal module types leaking outside their module
Example prompts for the agent
- /arch-check
- check the architecture of this solution, baseline is Clean Architecture from CLAUDE.md
- are there dependency direction violations or cycles in the solution?
How to install arch-check
1Skills CLI (Vercel)
npx skills add codewithmukesh/dotnet-claude-kit --skill arch-check -a claude-code2Manually: put the files in place
~/.claude/skills/arch-check/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/arch-check/
1Skills CLI (Vercel)
npx skills add codewithmukesh/dotnet-claude-kit --skill arch-check -a codex2Manually: put the files in place
.agents/skills/arch-check/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add codewithmukesh/dotnet-claude-kit --skill arch-check -a cursor2Manually: put the files in place
.cursor/skills/arch-check/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install codewithmukesh/dotnet-claude-kit arch-check2Manually: put the files in place
.github/skills/arch-check/SKILL.md1Skills CLI (Vercel)
npx skills add codewithmukesh/dotnet-claude-kit --skill arch-check -a gemini-cli2Platform CLI
gemini skills install https://github.com/codewithmukesh/dotnet-claude-kit --path skills/arch-checkManually: put the files in place
.devin/skills/arch-check/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add codewithmukesh/dotnet-claude-kit --skill arch-check -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about arch-check
How do I install arch-check in Claude?
Run npx skills add codewithmukesh/dotnet-claude-kit --skill arch-check -a claude-code. The skill lands in ~/.claude/skills/arch-check/SKILL.md.
What does arch-check do?
It verifies the code against its declared architecture and reports violations: dependency direction, module boundary leaks, cycles, endpoints outside their layer. Every finding comes with file:line evidence and a suggested fix.
How is arch-check different from architecture-advisor?
arch-check audits an existing codebase against the architecture already in place. architecture-advisor comes earlier, when the architecture is still being chosen.
Source text
SKILL.md · MIT
---
name: arch-check
description: >
Architecture conformance check: verifies an existing codebase against its
declared architecture (VSA, Clean Architecture, DDD, Modular Monolith) —
dependency direction, layer violations, module boundary leaks, and cycles —
using token-cheap Roslyn MCP analysis. Invoke when: "check architecture",
"architecture violations", "layer violations", "dependency direction",
"module boundaries", "arch check", "is my architecture clean", "enforce
architecture", "conformance check". For CHOOSING an architecture, use
architecture-advisor instead.
---
# /arch-check
## What
Verifies that the code still matches the architecture it claims to have.
Architectures rot through small, individually-reasonable changes — a Domain
project that gains an EF Core reference, a module that reaches into a sibling's
internals, an endpoint defined outside the host. This workflow catches the rot
using project-graph and dependency analysis, not file-by-file reading.
Output: a violation report with severity, file:line evidence, and the concrete
fix — or a clean conformance pass.
## When
- "check my architecture", "are there layer violations", "dependency direction"
- Before a release or after a large feature lands
- After onboarding to an unfamiliar codebase that claims an architecture
- Recurring on teams where multiple people merge to shared modules
- NOT for choosing an architecture — that is `architecture-advisor`
## How
**Step 1: Establish the declared architecture**
In order of authority: the project's CLAUDE.md, an ADR in `docs/decisions/`,
or ask the user. Never infer silently — a wrong baseline produces a wrong
report. The four supported baselines and their rules:
| Architecture | Rules checked |
|---|---|
| Vertical Slice | Features don't reference sibling features; shared code only via explicitly shared folders/projects |
| Clean Architecture | Domain → nothing; Application → Domain only; Infrastructure → Application; Api → Application (never Api → Infrastructure types, wiring only) |
| DDD + Clean | Clean rules + aggregates referenced only via roots; domain events for cross-aggregate effects |
| Modular Monolith | No project references between modules except `*.Contracts`; cross-module calls via integration events or contracts |
**Step 2: Project-level dependency direction (cheapest, catches most)**
```
get_project_graph()
```
Map every project reference against the baseline's allowed arrows. A single
wrong reference here (Domain → Infrastructure) is a CRITICAL finding — it
makes every downstream violation possible.
**Step 3: Cycles**
```
detect_circular_dependencies()
```
Cycles are violations in every baseline. Report the full chain.
**Step 4: Namespace-level leaks (spot checks)**
Project references can be clean while code still leaks. Probe the risky edges:
```
get_dependency_graph(symbolName: <a Domain entity>, depth: 2)
-- Domain types pulling in EF Core, HttpClient, or Infrastructure namespaces?
find_references(symbolName: <a module-internal type>)
-- referenced from outside its module?
detect_antipatterns()
-- known structural smells as supporting evidence
```
Pick probes by baseline: Clean → sample 3-5 Domain entities and Application
handlers; Modular Monolith → sample each module's internal types; VSA → sample
types inside two or three feature folders.
**Step 5: Presentation boundary**
```
get_endpoint_map()
```
Endpoints must live only in the host/Api layer (Clean) or inside their owning
module (Modular Monolith, VSA feature folders). An endpoint defined in an
Application or shared project is a boundary violation. Unmarked auth on any
endpoint is reported as a side-finding (route to `/security-scan` for depth).
**Step 6: Report**
| Severity | Meaning |
|---|---|
| CRITICAL | Wrong-direction project reference, module-to-module reference, cycle |
| HIGH | Namespace leak (Domain using Infrastructure/EF types), endpoint outside its layer |
| MEDIUM | Shared-kernel logic creep, aggregate bypassed via direct member access |
| INFO | Unmarked endpoint auth, antipattern hits worth a look |
Each finding: evidence (file:line), why it violates the baseline, and the fix
(move the code, invert with an interface, introduce a contracts project, raise
an integration event). Offer to fix CRITICAL items immediately.
### MCP Tools Used
- `get_project_graph` — reference-direction audit (the backbone)
- `detect_circular_dependencies` — cycle detection
- `get_dependency_graph` / `find_references` — namespace-level leak probes
- `get_endpoint_map` — presentation boundary + auth posture
- `detect_antipatterns` — supporting structural evidence
## Example
```
User: /arch-check
Claude: Baseline from CLAUDE.md: Clean Architecture (4 projects).
Project graph (get_project_graph)...
CRITICAL Domain → Infrastructure reference (Domain.csproj:14)
Breaks the dependency rule; makes Domain untestable in isolation.
Fix: invert — define IEmailSender in Application, implement in
Infrastructure.
Cycles (detect_circular_dependencies)... none.
Leak probes on 4 Domain entities...
HIGH Order.cs:8 uses Microsoft.EntityFrameworkCore (Domain must stay
persistence-ignorant). Fix: move the [Index] config to
OrderConfiguration in Infrastructure.
Endpoint map... 23 endpoints, all in Api. 2 unmarked auth (side-finding —
run /security-scan).
Verdict: NOT conformant — 1 critical, 1 high. Fix the reference first;
want me to do it now?
```
## Related
- `architecture-advisor` — choosing a baseline (before this skill is useful)
- `clean-architecture`, `vertical-slice`, `ddd`, `modular-monolith` template — the rules being enforced
- `/security-scan` — depth on the auth side-findings
- `/health-check` — broader report card; arch-check is its architecture dimension in depth
© codewithmukesh · MIT · codewithmukesh/dotnet-claude-kit