# Improve Codebase Architecture

> Scan a codebase for deepening opportunities, present them as a visual HTML report, then grill through whichever one you pick.

- Skill: `amornsit/improve-codebase-architecture` (Agent Skill, multi-file: 3 files)
- Install (CLI): `npx skillmds@latest add amornsit/improve-codebase-architecture`
- Raw SKILL.md: https://api.skillmd.com/api/skills/amornsit/improve-codebase-architecture/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Web & Frontend
- Author: amornsit (https://skillmd.com/u/amornsit)
- Updated: 2026-09-22
- Page: https://skillmd.com/skills/amornsit/improve-codebase-architecture

---


# Improve Codebase Architecture

Surface architectural friction and propose **deepening opportunities** — refactors that turn shallow
modules into deep ones. The aim is testability and AI-navigability.

This command is _informed_ by the project's domain model and built on a shared design vocabulary:

- Read [codebase-design](../codebase-design/SKILL.md) for the architecture vocabulary (**module**,
  **interface**, **depth**, **seam**, **adapter**, **leverage**, **locality**) and its principles
  (the deletion test, "the interface is the test surface", "one adapter = hypothetical seam, two =
  real"). Use these terms exactly in every suggestion — don't drift into "component," "service,"
  "API," or "boundary."
- The domain language in `CONTEXT.md` gives names to good seams; ADRs in `docs/adr/` record
  decisions this command should not re-litigate.

## Process

### 1. Explore

**Scope before you scan — YAGNI.** Deepening a module pays off by making future changes to it
easier, so put extra weight on the parts of the codebase that have recently changed. Decide _where_
to look before you look:

- If the user named a direction — a module, a subsystem, a pain point — take it, and skip the
  inference below.
- Otherwise, walk back a good stretch of the commit history (`git log --oneline`) to find the
  codebase's hot spots — the files and areas that keep coming up — and let those paths pull your
  attention first. If the changes are scattered with no clear hot spot, widen the net.

Read the project's domain glossary (`CONTEXT.md`) and any ADRs in the area you're touching first.

Then use the Agent tool with `subagent_type=Explore` to walk the codebase. Don't follow rigid
heuristics — explore organically and note where you experience friction:

- Where does understanding one concept require bouncing between many small modules?
- Where are modules **shallow** — interface nearly as complex as the implementation?
- Where have pure functions been extracted just for testability, but the real bugs hide in how
  they're called (no **locality**)?
- Where do tightly-coupled modules leak across their seams?
- Which parts of the codebase are untested, or hard to test through their current interface?

Apply the **deletion test** to anything you suspect is shallow: would deleting it concentrate
complexity, or just move it? A "yes, concentrates" is the signal you want.

### 2. Present candidates as an HTML report

Write a self-contained HTML file to the OS temp directory so nothing lands in the repo. Resolve the
temp dir from `$TMPDIR`, falling back to `/tmp` (or `%TEMP%` on Windows), and write to
`<tmpdir>/architecture-review-<timestamp>.html` so each run gets a fresh file. Open it for the user
— `xdg-open <path>` on Linux, `open <path>` on macOS, `start <path>` on Windows — and tell them the
absolute path.

The report uses **Tailwind via CDN** for layout and styling, and **Mermaid via CDN** for diagrams
where a graph/flow/sequence reliably communicates the structure. Mix Mermaid with hand-crafted
CSS/SVG visuals — use Mermaid when relationships are graph-shaped (call graphs, dependencies,
sequences), and hand-built divs/SVG when you want something more editorial (mass diagrams,
cross-sections, collapse animations). Each candidate gets a **before/after visualisation**. Be
visual.

For each candidate, render a card with:

- **Files** — which files/modules are involved
- **Problem** — why the current architecture is causing friction
- **Solution** — plain English description of what would change
- **Benefits** — explained in terms of locality and leverage, and how tests would improve
- **Before / After diagram** — side-by-side, custom-drawn, illustrating the shallowness and the
  deepening
- **Recommendation strength** — one of `Strong`, `Worth exploring`, `Speculative`, rendered as a
  badge

End the report with a **Top recommendation** section: which candidate you'd tackle first and why.

**Use CONTEXT.md vocabulary for the domain, and
`codebase-design`'s vocabulary for the architecture.** If `CONTEXT.md`
defines "Order," talk about "the Order intake module" — not "the FooBarHandler," and not "the Order
service."

**ADR conflicts**: if a candidate contradicts an existing ADR, only surface it when the friction is
real enough to warrant revisiting the ADR. Mark it clearly in the card (e.g. a warning callout:
_"contradicts ADR-0007 — but worth reopening because…"_). Don't list every theoretical refactor an
ADR forbids.

See [references/html-report.md](references/html-report.md) for the full HTML scaffold, diagram
patterns, and styling guidance.

Do NOT propose interfaces yet. After the file is written, ask the user: "Which of these would you
like to explore?"

### 3. Grilling loop

Once the user picks a candidate, run [grilling](../grilling/SKILL.md) to walk the decision tree with
them — constraints, dependencies, the shape of the deepened module, what sits behind the seam, what
tests survive.

Side effects happen inline as decisions crystallize — run
[domain-modeling](../domain-modeling/SKILL.md) to keep the domain model current as you go:

- **Naming a deepened module after a concept not in `CONTEXT.md`?** Add the term to `CONTEXT.md`.
  Create the file lazily if it doesn't exist.
- **Sharpening a fuzzy term during the conversation?** Update `CONTEXT.md` right there.
- **User rejects the candidate with a load-bearing reason?** Offer an ADR, framed as: _"Want me to
  record this as an ADR so future architecture reviews don't re-suggest it?"_ Only offer when the
  reason would actually be needed by a future explorer to avoid re-suggesting the same thing — skip
  ephemeral reasons ("not worth it right now") and self-evident ones.
- **Want to explore alternative interfaces for the deepened module?** Read
  `codebase-design` and use its design-it-twice parallel sub-agent
  pattern.

---

_Adapted from Matt Pocock's "improve-codebase-architecture" skill (github.com/mattpocock/skills) —
MIT © Matt Pocock.
`HTML-REPORT.md` moved to `references/html-report.md` with the context pointer repointed, and the
`/codebase-design`, `/grilling`, and `/domain-modeling` slash commands turned into cross-skill links.
See [NOTICE.md](../../NOTICE.md)._

