- Python 100%
agentic-dev #
A phased process for building software with coding agents, plus the document templates it runs on.
The idea #
Four files, each with a different job and a different lifetime:
| File | What it is |
|---|---|
DESIGN.md |
What you're building. Starts rough, becomes a rigorous spec. |
DEVELOPMENT.md |
The method. How the build proceeds, phase by phase. |
PLAN.md |
Where the build actually stands right now. |
AGENTS.md |
The rules, always loaded into context. |
There is a fifth, optional, and it does not live in the project:
PREFERENCES.md holds your standing defaults — "I always want Postgres" — and
stays here as a single master copy. Phase 1 looks for agents/PREFERENCES.md
first, then falls back to this one, so a project can override without anyone
maintaining two copies.
It is used to propose answers, never to skip questions. A preference that silently becomes a decision is how a project ends up with an architecture nobody chose — which is exactly what happened to the second project built this way.
The one that surprises people is DESIGN.md, because it has three lives:
- Start — whatever you already know you want. Rough, gaps, contradictions, whole sections empty. This is the normal starting state.
- The gauntlet — the Clarification phase reads it, finds the ambiguities and the decisions nobody has made, and interviews you until they're resolved. The answers get written back in.
- After — the master spec. Every later phase reads it.
PLAN.mdfollows from it.
So you do not need to have it all worked out before you begin. That is what the first phase is for.
Starting a project #
mkdir -p newproject/agents
cp agentic-dev/DEVELOPMENT.md newproject/agents/
cp agentic-dev/templates/DESIGN.md newproject/agents/
cp agentic-dev/templates/PLAN.md newproject/agents/
cp agentic-dev/templates/AGENTS.md newproject/AGENTS.md
AGENTS.md goes at the project root, not in agents/ — that is where
coding agents look for it automatically. If your tool reads CLAUDE.md instead,
leave a one-line CLAUDE.md at the root containing See [AGENTS.md](AGENTS.md).
so both work.
Then:
- Open
agents/DESIGN.mdand write what you know. Leave the rest blank. - Start a session and point it at
agents/DEVELOPMENT.md. - Phase 1 does the rest — it will interview you, and it should ask a lot.
What the process is opinionated about #
Worth knowing before you adopt it, because these are the parts that cost something:
It stops and asks. There are mandatory checkpoints — schema decisions before the database exists, concurrency approach before domain logic — where the process requires polling you rather than deciding. These exist where a wrong choice is cheap now and expensive later.
It has a theory of evidence. Verification must use the project's own documented path, not a harness built for the occasion. Booting infrastructure is verification; validating its config file is not. Green unit tests are evidence about a slice, never about the system. Most of the value in this process is here: the default failure mode of coding agents is confidently reporting success on things that were never run.
It runs agents in parallel, with rules. Concurrent agents get explicitly disjoint file ownership, only the orchestrator touches git, and interface contracts between agents are fixed in writing before either side starts. The rules exist because each one corresponds to something that has actually gone wrong.
It writes down why. PLAN.md keeps a dated log of every decision made with
the owner, including what was rejected. Six months later that is the difference
between a considered design and one nobody can defend.
The Claude Code layer (optional) #
Everything above is plain markdown and works with any coding agent. If you use Claude Code, this directory is also installable as a plugin, which adds enforcement for the two rules that matter most and are most often skipped.
The markdown remains the source of truth. Every rule the machinery enforces is also written down in prose, so another tool loses the enforcement, not the rule.
Hooks #
| Hook | What it does |
|---|---|
Stop |
Runs your test suite when a turn tries to end and refuses to finish while it is red. |
SessionStart |
Puts the current phase status from PLAN.md in front of a session that is starting cold. |
The git hook that isn't here #
"Agents never run git" is the rule this process most wants enforced, and it cannot currently be enforced by a hook. Tested against Claude Code 2.1.220:
PreToolUseinput carries noagent_idand noagent_type.transcript_pathis the main session's path even when a subagent issued the call, so the on-disk<session>/subagents/agent-<id>.jsonllayout cannot be used to identify the caller.session_idlikewise does not vary by subagent.
scripts/deny-git-in-subagent.py is kept, with its tests, because the detection
is a one-line change if a future version exposes the caller. It is deliberately
not wired into hooks.json.
That decision is the point rather than an oversight. A hook you believe is
enforcing a rule, which silently isn't, is worse than no hook at all — you stop
restating the rule in dispatch prompts, and lose the only protection you had. So
the rule stays prose, in DEVELOPMENT.md and AGENTS.md, and keeps appearing in
every dispatch prompt.
Set AGENTIC_DEV_HOOK_LOG=/path/to/log.jsonl to have the hook scripts append
their input and decision. A hook that is not firing looks exactly like a hook
that is firing and deferring; this is how you tell them apart, and it is how the
above was established.
The Stop hook does nothing until you configure it. It reads
.claude/agentic-dev.json from the project root:
{
"testCommand": "docker compose -f compose.dev.yaml exec -T api pytest api/tests",
"testTimeoutSeconds": 600,
"maxConsecutiveBlocks": 2
}
No file means no interference — a hook that guessed how to test your project and blocked your turns would be worse than no hook at all.
Blocking a turn makes the model continue, which produces another turn, which is a
loop if the failure is one it cannot fix. Claude Code documents no built-in guard
for this, so there is a local one: after maxConsecutiveBlocks the hook stands
down and lets the turn end with the failure reported. Trapping you is worse than
letting a red suite through.
The SessionStart hook injects state, not instructions. It reads only the
phase-status table and the checkpoint list from PLAN.md — deliberately not the
decision log, deferred work, or notes for later phases, which are read on demand
when they matter and would otherwise cost context on every session to serve a
minority of them.
It stays silent in a project with no agents/PLAN.md, and silent in one that has
been scaffolded but not started, so a blank phase table is never injected. It
does not fire on compaction — after a compaction the model has just been handed a
summary of the same session — and it does not fire for subagents at all, which
get their context from their dispatch prompt.
Skills and commands #
/kickoff— scaffolds the four documents into a new project, putsAGENTS.mdwhere tools actually look for it, and hands off to Phase 1. If you already have notes on what you want to build, it uses them as-is rather than tidying them — the rough version is the input Phase 1 needs.dispatch-phase-agent— loads when you are about to launch agents. The dispatch-prompt template, wave planning from the dependency graph, and the clauses that each exist because omitting one caused a real failure.
Installing it #
For a single session:
claude --plugin-dir /path/to/agentic-dev
Changes to skills take effect immediately; changes to hooks need
/reload-plugins.
Adapting it #
Not every phase applies to every project. A CLI tool has no UI phase; a library
has no deployment phase; a single-operator tool may need a shared secret rather
than an authentication system. Decide during clarification, record it in
PLAN.md's phase table, and skip phases explicitly rather than silently — a
skipped phase should be visibly skipped, so nobody later has to guess whether it
was decided against or forgotten.
One thing to watch: any technology choice that ends up stated as fact in
DEVELOPMENT.md stops being a question the clarification phase asks, and quietly
becomes the next project's default. Keep the method free of stack decisions; they
belong in DESIGN.md.