Skip to content

Architecture your coding agent follows.

Pick a plan once. al dente checks every edit Claude Code makes, live, and hands back what breaks the plan.

Layers, not spaghetti

A real shop app: 17 files, 33 imports. With a plan, every file gets a layer, and the one import that breaks it stands out.

As spaghetti, every import looks the same. Which one is wrong?

receipts.ts imports users.ts, but Shop may not use Auth.

WebAPIAuthShopDataShared
routesserverpasswordssessionsusersseedstoretypescartcatalogcheckoutreceiptscartclientloginmainproducts

As spaghetti, every import looks the same. Which one is wrong?

receipts.ts imports users.ts, but Shop may not use Auth.

From a plan to every pull request

Start from an idea or from code you already have. Planning takes a minute; after that it runs on every edit without you asking.

Claude Code asks what matters most for the app: lightweight, looks and feel, ship fast, or grows big.The answers: lightweight; C#, Java, TypeScript and JavaScript; Windows, macOS and Linux.Three architectures to pick from, the recommended one with a preview of its parts.

Measured on real Claude Code sessions

We gave Claude Code the same feature requests on the same app, with and without al dente, on Claude Haiku 4.5, Claude Sonnet 5.5, Claude Opus 5.5. None of the prompts mentions architecture.

Sessions that ended with code breaking the plan

One square per session, on the two tasks with a tempting shortcut.

  • Ended breaking the plan
  • Wrote the shortcut, fixed it in the same session
  • Kept to the plan
Without al dente
57%
13 of 23 sessions
With al dente
0%
0 of 23 sessions
Haiku 4.5
Sonnet 5.5
Opus 5.5

Working alone, Claude never noticed its own shortcut: all 13 stayed in the final code. With al dente, 4 sessions wrote one, were stopped at that edit, and fixed it.

12 of 12

sessions that the guard blocked ended clean. Claude fixed the import itself, a median 7 s after the block. This is what it was told:

al-dente: src/shop/checkout.ts breaks the architecture agreed in al-dente.json.
  line 6: imports "../auth/users.ts" from Auth, but Shop may only use: Data, Shared.
80 ms

to check an edit against the plan (median over 288 edits). Without al dente, a break waits for code review.

Catch it now, or pay for a second session

We sent every broken session back to Claude with the check's findings, as a code review would. All 13 of 13 came back clean, at 80,904 tokens and $0.063 each: almost as much as the feature itself.

Without al dente, per feature
141,442
tokens, $0.104, counting the follow-up
With al dente, per feature
103,878
tokens, $0.067: 27% fewer tokens, 35% lower cost

Where the tokens go

A normal Claude Code session next to one with al dente.

Knowing the plan

Claude Code alone: There's no plan: it works from the files it happens to read

With al dente: ~214 tokensonce, at session start

An edit that keeps to the plan

Claude Code alone: Nothing is checked

With al dente: 0 tokensthe check runs outside the model and says nothing

An edit that crosses the plan

Claude Code alone: 80,904 tokensfor the follow-up session that fixes it later, on average; until then it stays in the code

With al dente: ~101 tokensClaude is stopped at that edit and told the allowed way around it

Mapping code you already have (Apache Kafka, 3,819 source files)

Claude Code alone: ~468,000 tokensjust to read its import lines

With al dente: ~900 tokensone survey: its folders and the imports between them

83 valid runs of Claude Code (4 feature requests on a 16-file TypeScript app, 2 to 6 runs per model and setting; every feature checked in a real server and browser, 35 of 35 worked with al dente on). Small samples: read the rates as indicative. Per-feature totals are on the tasks with a tempting shortcut and assume each break is found and fixed in one follow-up session; tokens include cached input, as Claude Code reports them. The plan costs about 214 tokens at session start. Token sizes outside the sessions are characters divided by 4: the real hook on the demo app, and al-dente survey on Apache Kafka, whose source al dente checks (tests left out) is about 7,600,000 tokens. Method, raw results and the harness are on GitHub.

Why not a diagram or a linter

Diagram tools show a snapshot. Import linters check rules you wrote by hand, later. al dente sits in the loop with the agent.

CapabilityDiagram generatorsImport lintersal dente
Rules come from a plan you pick in conversation
Checks each edit as the agent makes it, and tells the agent
Live map of the whole appSnapshotStatic graph
Pull request check

Works with

It reads the code itself, with no compiler or language runtime to install.

Today

  • TypeScript
  • JavaScript
  • Python
  • Java
  • Claude Code
  • GitHub Actions

Coming next

  • Kotlin
  • C# and .NET
  • Go
  • Cursor
  • Codex CLI
  • Gemini CLI

Install

Two commands in Claude Code, then ask Claude for a plan.

Claude Code plugin

/plugin marketplace add Orest-Z/al-dente
/plugin install al-dente@al-dente

Then, for a new app, ask Claude:

“Design the architecture for this app with al dente.”

Or, for code you already have:

“Map this project with al dente.”

For a new app it proposes two or three plans to pick from. For existing code it proposes parts from the imports already there, and older breaks never block. Either way, the guard starts on the next edit.

Pull request check

name: Architecture
on: pull_request
permissions:
  contents: read
  pull-requests: write
jobs:
  al-dente:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - uses: Orest-Z/al-dente@v1