What this document is — and what it is not
PAAD is a set of skills for AI coding assistants, built on one idea: engineering-driven AI, not AI-driven engineering. The engineer makes the decisions, and sees each one while there is still time to change it. Technical debt is where the difference appears: PAAD's review gates make specification-driven development more rigorous, so debt accumulates more slowly, and agentic-architecture later gives an experienced developer a way to manage the debt that does accumulate — a step AI-led engineering does not include. Everything you need to run PAAD is in this course: what each skill does, why it is designed the way it is, and the evidence behind it. It is also a document, and a document is one particular kind of teaching tool. This first section describes what this document does well, and why it cannot replace training with an instructor.
What a document does well, this one tries to do in full. It is a reference: searchable, quotable, re-readable the night before you introduce the loop to your team. It works at your pace and in your timezone, it costs nothing to distribute, and it is stable — you can link to it in a design discussion or a decision record.
Some things, though, no document can do, however carefully written. They are properties of the medium, not gaps in the material. PAAD is something you practise, not a set of facts to learn. Reading that you should argue with an agent's plan is a different skill from doing it in a live session, with someone there to correct you halfway through. The examples here are necessarily generic or drawn from my own work, while the cases that decide whether any of this is worth adopting live in your codebase, under your constraints. When an agent behaves strangely — and it will — working through the strangeness together in real time is high-value and unrepeatable in prose. And a document cannot answer "but what about our situation," nor check whether it has been understood: "I read it, and I understand it" is invisible from the inside, which is a large part of why instructors exist.
Two further limits are organisational rather than individual. A methodology is a team property — five people reading separately produce five private interpretations, where a team working through the material together produces one agreed norm. And when adoption stalls, it usually stalls for organisational reasons: mismatched expectations, unclear ownership, a senior engineer who is not yet convinced. Those are legitimate obstacles, they are invisible to a document, and they can be addressed in a live discussion. And a document goes out of date: the tools named in these modules change monthly. This page is accurate as of the day it was written; a conversation is accurate today. The optional appendix “Teaching this to your team” covers this in more detail: what a team still has to do once the material is understood, and who has to own each piece of it.
One consequence of all this is worth acting on. A document cannot hear you — so if a module confused you, a skill did not behave as described, or you got stuck somewhere between reading this and running it, telling me is the most useful thing a reader can do, and it is how this course improves. Live training exists for the pieces named above that a document cannot provide — practice on your own code, questions about your situation, one shared norm instead of several private readings — and arranging that, or sending that feedback, both start in the same place: LinkedIn. If you are reading this as an engineer rather than the person who arranges training, none of that is your problem: everything that follows is complete as it stands, and easy to forward to a colleague if it seems useful.
— Curtis "Ovid" Poe
Who is driving?
AI is not magic pixie dust you sprinkle on a problem. It is a tool, and it works best when your engineering judgement drives it rather than the other way around. PAAD is a toolkit for keeping the arrangement pointing in that direction. The section "What PAAD is", two sections below, explains it in full.
Developers who use AI coding tools extensively – but don't carefully review their code – discover something unpleasant. The first day feels like magic. The first month is productive. But over time, they notice that the codebase has become a place they no longer recognise. Three different ways of handling errors, a config value hard-coded in two places, tests that pass without asserting anything, and a feature that technically does what they asked but not what they meant.
Nothing went dramatically wrong. That is the whole problem. Code quality rarely degrades in one dramatic change; it slips through a series of small decisions that each seemed reasonable in isolation. The assistant did what they asked, every time, and the sum of all those reasonable answers is a codebase carrying debt they never chose to accept.
Two arrangements
What went wrong there is not really a code-quality problem. It is a question of who was making the decisions. The developer told the assistant what to do and hoped it would take charge. The assistant did as it was told — it always does — and the developer found out what it had decided only once the code was written.
That is AI-driven engineering: the assistant sets the pace, and the engineers are downstream of decisions they never saw being made. PAAD — an open-source project for AI coding assistants, explained in full in the next section — proposes the inverse, and its README puts it as a tagline:
Engineering-driven AI, not AI-driven engineering.PAAD README
Same speed, opposite direction. You see what the AI is about to do while you can still change it, and you make the decisions. Concretely, that means something different happens at each stage of the work. The names in the right-hand column are PAAD's four core skills — things you invoke by name, each with a module of its own later:
| AI-driven engineering | Engineering-driven AI | |
|---|---|---|
| The spec | Whatever you typed, unchallenged | pushback argues with it before anyone builds it |
| The plan | Assumed to match the spec | alignment checks both directions |
| The code | A green CI run | agentic-review assigns six specialist reviewers to the PR |
| The structure | Discovered later, expensively | agentic-architecture finds it while it is cheap |
| The decisions | The model's | Yours, on the record |
Read the right-hand column downward and you have the shape of the rest of this course. Each module covers one row.
Staying in the driver's seat is the point, and it is also the cost. PAAD gives you visibility and control, not autopilot. If what you want is for the assistant to think for you, this is the wrong toolkit — every skill in it ends with a human decision rather than a merge. The README states the consequence plainly: a report you ignore is worse than no report at all.
AI coding assistants can compress that process dramatically, but they do not reliably challenge weak requirements, detect drift from the plan, or protect long-term code quality on their own.PAAD README
What PAAD is
PAAD (pronounced "pad") is an open-source system of AI agent skills — MIT-licensed, on GitHub, created by Curtis "Ovid" Poe. It does not replace your AI-assisted development tools — it complements them, and its README names Superpowers, a separate open-source workflow toolkit for coding agents, as an example of something you can keep using alongside it. Module 3 introduces Superpowers with the other toolkits. The four letters name four common failure modes, and each failure mode has skills that address it.
A skill is a markdown instruction file — conventionally SKILL.md — that your coding assistant loads on demand and follows. It is not code, and it is not a model. It is a written procedure: when the user asks for this, here is how to do it, here is what to check, here is how to report back. Most modern assistants support some version of the format.
PAAD is roughly a dozen of them. Throughout this course, a skill written in lowercase means the skill itself — pushback, alignment — and the same word with a leading slash, /pushback, means typing it to your assistant. You can also just ask in plain English. Module 11 covers installing them and the three ways to invoke them; until then, treat the names as labels rather than instructions.
The analogy that makes the idea clear
The article introducing the methodology draws a historical parallel worth noting. When Fortran was introduced in the 1950s, IBM knew developers would object, because a compiler could not produce assembler as efficient as hand-written assembler. So the marketing focused on saving developer time, while noting the generated code was almost as fast.
It was decades before compilers routinely wrote assembly that ran faster than human-written assembly. Today, very few humans can write assembly code that outperforms a compiler. This is where we are with AI.Curtis Poe, "Watching Claude Sonnet Outperform Opus"
The claim is not that AI writes better code than you. The claim is that with discipline — the D in PAAD — it produces code that is almost as good as what you would have written, and produces it in a fraction of the time it would have taken you. The analogy is about how quickly the code gets written, not how quickly it runs. And as with compilers, the quality gap is expected to narrow.
It is a good analogy, and like all good analogies it should be checked rather than admired. The appendix “How good is the evidence?” does exactly that.
The founding article is titled "Watching Claude Sonnet Outperform Opus." The finding is exactly that: a smaller, cheaper model (Sonnet) running the PAAD process produced better outcomes than a larger, more capable model (Opus) running without it. Methodology beat model capability.
It is also a single team's field report, relayed second-hand, with no control condition — and the Sonnet/Opus contrast was accidental rather than designed, arising because an IDE bug temporarily locked the team out of Opus. The article's own verdict is the right one: "a 'boots on the ground' report from one team, not a benchmark." Keep that in mind. The appendix “How good is the evidence?” sets it against the independent research.
What this course covers
You will work through the four letters in order, then assemble them into the per-feature loop that ties them together. Two modules do something other than advance that argument. Module 3 is prerequisite rather than PAAD-specific: it explains spec-driven development, the practice PAAD assumes you are already following — skip it if you run spec-kit, Kiro, or OpenSpec today and know why. Module 4 stops to ask what the model cannot see no matter how carefully you review its output. Along the way there are knowledge checks — they are not graded, they exist because reading about a review process and being able to run one are different skills. There is a final assessment at the end.
After the assessment there are optional appendices. One of them, “How good is the evidence?”, tests the whole argument against the independent research literature. Nothing in the course depends on any of them and no assessment question draws on them — take the methodology on trust if you prefer, and go there when you want to know which parts of the case are actually well evidenced. Another, “What the Fable review found”, prints the findings behind the case study in Module 2, so you can judge them yourself instead of taking a count on trust. Another, “Why small specs”, argues that all of these gates work far better on small artefacts than large ones — read it when you are writing your first spec rather than after.
No prior experience with PAAD is assumed. Some familiarity with an AI coding assistant — Claude Code, Cursor, Kiro, Antigravity — will help, but the ideas transfer to any of them.
PAAD uses more tokens than a lightweight "just build it" workflow, and the project is explicit about this: it optimises for better decisions and fewer avoidable mistakes, not for minimum token consumption.
Concretely: a single feature will cost you more tokens because you are paying to review the spec, review the plan, and review the code — on top of writing it. The bet is that this is cheaper than shipping the wrong thing and rebuilding it. That bet is usually right for production software you will maintain for years. It is a bad bet for a prototype you plan to throw away, a spike (a short throwaway experiment that answers one question), or a script nobody but you will ever run. Match the methodology to the stakes — to how much is actually at risk.
Why AI-assisted code rots
Understanding the failure mode is what makes the skills feel necessary rather than bureaucratic. There are three mechanisms, and they compound.
Mechanism one: the assistant is a yes man
AI is a "yes man." It does what you ask it to do, focusing on what you asked it to do. It ignores the big picture unless you explicitly tell it to look at it."Watching Claude Sonnet Outperform Opus"
This is not a bug that will be patched. Instruction-following is what LLMs are designed to do. An assistant that pushed back on every third request would be exhausting and would mostly be wrong. But the consequence is that the quality ceiling of your output is set by the quality of your input — and nothing in the default loop inspects your input.
It is worth being precise about what "your input" means, because most people read it as "your prompt." It is not. Your input is the prompt plus the codebase the assistant is reading to answer it, and the second part usually matters more.
An assistant infers what good looks like from what it finds around it. Ask for a new endpoint in a codebase where the existing three endpoints each validate input differently, and you will get a fourth way. Ask for error handling where half the code swallows exceptions, and it will swallow exceptions — consistently with its neighbours, which is exactly what you would want if the neighbours were right.
This is the compounding mechanism, and it runs in both directions. Debt attracts debt, because every new piece of work is pattern-matched against the debt already there. A clean codebase is not just nicer to work in; it is a better prompt. That is why agentic-architecture exists as a repeated check rather than a single cleanup done once, and it is why "the assistant keeps writing bad code" is often better read as "the assistant is accurately reproducing what my codebase taught it."
A human senior engineer handed a flawed spec says "wait, what happens when two people do this at once?" The assistant handed the same spec writes the code. Both are behaving correctly given their incentives. Only one of them saves you two weeks of work. This is the mechanical reason AI-driven engineering fails: nothing in the default arrangement asks the assistant to question the instruction, so nothing is checking direction. The capacity is there — an assistant will argue with a spec if you tell it to, which is exactly what pushback is — but it is a step you have to add, not one you get for free.
Mechanism two: debt accumulates at the speed of development
The article's formulation is compact: vibe coding rapidly accumulates technical debt while spec-driven development slowly accumulates technical debt. Note that neither number is zero. Spec-driven development is better, not sufficient. The reason is that acceleration and debt are coupled — if you ship five times as much code in a week, you also ship five times as many small structural compromises, and you have one fifth as long to notice each one.
| Approach | What it looks like | Debt trajectory |
|---|---|---|
| Vibe coding | Describe the change in chat, accept the diff, move on. | Rapid accumulation. Fast to start, expensive by month two. |
| Spec-driven development (SDD) | Write a spec, treat it as the source of truth, generate tasks from it. | Slow accumulation. Better, but the spec itself is never reviewed. |
| SDD + PAAD | The same, with review gates at spec, plan, and pre-merge. | Debt is brought into the open and decided on rather than absorbed silently. |
That middle row is the one everything else in this course is built on top of, and it deserves more than a table cell. Module 3 covers what spec-driven development actually is — what a spec is, what the toolkits do, and where the practice has weaknesses. If SDD is already how you work, treat that module as optional.
Mechanism three: errors are cheapest at the earliest layer
This is the oldest idea in software engineering and PAAD's central organising principle, and the article puts the cost gradient in terms of blast radius:
If you have a bad ticket, you write some bad code. If you have a bad spec, you have lots of bad tickets. If you have bad steering, every spec you ever create is impacted."Watching Claude Sonnet Outperform Opus"
A steering file is a document your assistant loads at the start of every session, holding the facts that are true for the whole project rather than for one feature: what it is, what stack it uses, where things live, what conventions to follow. Most projects end up with more than one — a project-wide file, a personal one, and topic files for particular areas — all loaded together. Every tool supports at least one and almost every tool calls it something different — CLAUDE.md in Claude Code, AGENTS.md in the growing set of tools that read the shared open format, .kiro/steering/ in Kiro, .specify/memory/constitution.md in Spec Kit.
Module 3 has the full naming table, and Module 5 covers how to write one that helps rather than hurts. What matters here is only the position: steering sits above specs, so an error in it is inherited by every spec, every plan, and every line of code that follows.
Read that as a hierarchy. Steering files sit above specs; specs sit above plans; plans sit above code. A defect at any level is inherited by everything beneath it. Which tells you immediately where review effort has the most value: as far up that stack as you can get it.
Modern teams already run layered protection: specs, tests, code review, CI, QA, UAT, incident response. Those layers exist because humans are stochastic — they do not behave identically twice — and make different mistakes at different stages. AI is stochastic as well. PAAD's argument is not that AI needs special safeguards — it is that AI needs the same safeguards, applied at machine speed to match machine output.
What the evidence looked like
The article reports an architecture analysis of a codebase of roughly 10,000 lines, built in a few hours by Fable — the most powerful model released at the time of the analysis — working from specifications that were themselves produced with Superpowers, PAAD and Ponytail — but with PAAD deliberately withheld from the implementation, to see what the model builds natively from high-quality input. Five specialist agents produced 79 raw findings, which an adversarial verification pass reduced to 50.
Those 50 verified findings break down like this:
| Verified | High | Medium | Low | Total |
|---|---|---|---|---|
| Strengths | 7 | 9 | 1 | 17 |
| Flaws / risks | 4 | 17 | 12 | 33 |
Thirty-three verified flaws in 10K lines written in an afternoon. The point is not that Fable struggled — it "had no significant problems in creating the software in a few hours." The point is what it produced along the way. The conclusion is blunt: Fable "can brute force past architectural challenges, but without clear and explicit guidance, it creates the same technical debt that less powerful models create." Raw capability did not substitute for guidance.
Two mechanisms in that description — five specialist agents, one verification pass — recur throughout PAAD, so they are worth naming now. A specialist is a sub-agent given one narrow brief — security, or coupling, or error handling — and run in parallel with the others, on the reasoning that a single reviewer looking for everything reliably misses things in its own blind spots. A verification pass is a second, separate stage that takes those raw findings and tries to disprove them: it reads the actual code and the git history and discards anything it cannot substantiate. That is the step that removed 29 of the original 79.
The pattern matters because unverified automated review is mostly false positives — the appendix “How good is the evidence?” has the industrial numbers. Module 8 covers the five architecture specialists in detail, and Module 9 the six review specialists. The appendix “What the Fable review found” opens the report itself: the four High-severity flaws in full, the other twenty-nine listed, and the seventeen strengths alongside them.
Worth noting what this is and is not. It is a single case study, with no control condition and no baseline for what 33 flaws in 10,000 lines would represent for human-written code of comparable age. That does not make it uninformative — the method is described, the findings were verified, and the numbers are specific enough to argue with. It does mean it is one data point rather than a general result. Two appendices let you check it: “What the Fable review found” gives the findings themselves, so you can judge them one at a time, and “How good is the evidence?” sets the case alongside the wider research literature.
Spec-driven development
PAAD is not an alternative to spec-driven development. It is a set of review gates added to whichever version of it you already run — which makes SDD the one prerequisite this course actually has.
The previous module put three approaches in a table and handed one of them an acronym without explaining it. This module explains it. If you already run Superpowers, spec-kit, Kiro, or OpenSpec and know why, you can skip to the last two headings — the criticism, and where PAAD attaches.
The two ways to ask for code
Vibe coding — a phrase Andrej Karpathy coined in early 2025 and which was adopted faster than anyone expected — is describing what you want in chat, accepting the diff, and moving on. You are steering by feel. The code exists, it appears to work, and the reasoning that produced it disappeared with the session.
It has real strengths. It is also, as GitHub's write-up of the problem puts it, the source of a familiar experience: "you describe your goal, get a block of code back, and often… it looks right, but doesn't quite work."
Spec-driven development is the response. Birgitta Böckeler's definition is the most concise one available:
Writing a "spec" before writing code with AI ("documentation first"). The spec becomes the source of truth for the human and the AI.Birgitta Böckeler, "Understanding Spec-Driven-Development"
That is the whole idea. Everything else — the toolkits, the directory layouts, the slash commands — is machinery for making it convenient. GitHub frames the same shift as treating specifications as "living, executable artifacts that evolve with the project," and the underlying justification is a claim about what models are for: they excel at "pattern completion, but not at mind reading." A spec is how you stop asking for mind reading.
SDD separates the stable "what" from the flexible "how." That separation is why a spec is not just a longer prompt. You can throw away an implementation, or generate three of them and compare, without throwing away the thinking that specified it. A prompt cannot be reused that way, because a prompt does not survive the conversation it was typed into.
Three levels of ambition
"We do SDD" turns out to mean at least three different things. Böckeler's taxonomy is worth learning, because the differences matter and almost nobody states which one they mean.
They are not three options you choose between. They are a ladder — Böckeler draws them "with inheritance arrows… because they build up on top of each other." Every SDD approach is spec-first. Spec-anchored is spec-first plus keeping the spec alive. Spec-as-source is spec-anchored plus never hand-editing the code. So the question is never which level you picked, but how far up you climbed.
| Level | What it adds | In practice |
|---|---|---|
| Spec-first | A considered spec is written before the AI writes code, and drives that piece of work. | Nearly universal. Every SDD approach is at least this. |
| Spec-anchored | Plus: the spec is kept and updated after the feature ships, so the next change starts from the spec rather than from the code. | Rarely sustained. Requires someone to update prose that nothing tests. |
| Spec-as-source | Plus: humans edit only the spec and never touch the code, which becomes generated output. | Tessl is exploring it. Closest to classical model-driven development. |
All SDD approaches and definitions I've found are spec-first, but not all strive to be spec-anchored or spec-as-source.Birgitta Böckeler
Two phrases in that table are doing more work than they look. "Kept and updated" means both things at once: the spec lives in the repository beside the code, and somebody edits it when the behaviour changes. A spec committed once and never touched again is not anchored — it is spec-first with a corpse in the tree. "The next change starts from the spec" means that when you return to modify the feature, you open the spec first, revise it, and drive the implementation from the revision. Under spec-first you return to the code instead, because by then the spec is out of date and you know it.
The gap between the top two levels is narrower than it sounds and larger in practice. Spec-anchored keeps a maintained spec beside code that humans still edit. Spec-as-source makes the code an artefact nobody opens, the way nobody opens a compiled binary. That is why Böckeler reaches for the model-driven development comparison: it is the same bet the 2000s made, minus the parseable spec language and the elaborate code generators — and the price for dropping those, in her words, is "LLMs' non-determinism."
PAAD does not pick a level for you. Its gates fire at the spec-first moment — before the code is written — and they work identically whether or not you maintain that spec afterwards. What PAAD does not do is help you stay anchored, and nothing else in this course does either. Spec-first has a built-in expiry date: the moment the code merges, the spec becomes a historical document and drift starts. If you need the spec to stay true, that is a discipline you add on top, and it is the one part of SDD nobody has convincingly solved.
The shape most toolkits share
The tools differ in vocabulary and file layout far more than in structure. Most of them run some version of this basic sequence:
| Stage | What it produces | The question it answers |
|---|---|---|
| 0 · Steering / constitution | Persistent project context, written once and read every session. | What is always true here? |
| 1 · Specify | Requirements: user journeys, behaviour, what success looks like. | What are we building, and why? |
| 2 · Plan | A technical design: stack, architecture, constraints. | How will we build it? |
| 3 · Tasks | The plan decomposed into small, individually reviewable chunks. | What is the next concrete piece? |
| 4 · Implement | Code, usually one task at a time. | Does it do the thing? |
Hold that table next to the per-feature loop in Module 10 and the relationship becomes obvious. PAAD does not replace any of these stages. It inserts a review gate between them.
Treat the middle of that table as a range rather than a fixed sequence, because the toolkits divide it differently. Spec Kit keeps specify, plan and tasks as three separate commands. Kiro uses requirements, design and tasks. Superpowers merges requirements and design into a single document you sign off on, then generates the implementation plan from it — two artefacts where the others have three.
After you've signed off on the design, your agent puts together an implementation plan that's clear enough for an enthusiastic junior engineer with poor taste, no judgement, no project context, and an aversion to testing to follow.Superpowers README
Fewer artefacts does not mean less rigour. It means design decisions live inside the document you already reviewed rather than in one of their own. It does change what alignment has to work with, though: it needs an intent document and an action document, and it only runs its third check, design alignment, where a design document sits between the requirements and the plan rather than serving as the requirements. On a merged workflow you are comparing two documents rather than cross-checking three.
Stage zero: steering files
This is the layer Module 2's blast-radius quote was talking about, and it is worth a section of its own because it is the piece most newcomers never find. A steering file holds what is true for the project regardless of which feature you are building: what the product is, what stack it uses, where code lives, which conventions are non-negotiable, what the assistant should never do. It is loaded at the start of every session, so its cost and its blast radius are both permanent.
The naming has not converged, but it is starting to. AGENTS.md is an open, tool-neutral format now stewarded by the Agentic AI Foundation under the Linux Foundation, used by more than 60,000 open-source projects and read natively by around 25 coding agents — Codex, Cursor, Jules, Copilot and others. It emerged from a collaboration between several of those vendors precisely to stop every tool inventing its own filename.
| Tool | Where the project context lives |
|---|---|
| Cross-tool standard | AGENTS.md at the repository root. The nearest thing to a convergent answer. |
| Claude Code | CLAUDE.md at the root or .claude/CLAUDE.md; ~/.claude/CLAUDE.md for personal preferences; CLAUDE.local.md for gitignored project notes. Topic files go in .claude/rules/. |
| Cursor | .cursor/rules/, with the older .cursorrules still supported. |
| GitHub Copilot | .github/copilot-instructions.md. |
| Kiro | .kiro/steering/ — product.md, tech.md and structure.md are created by default and included in every interaction. ~/.kiro/steering/ applies globally; the workspace version wins if the two conflict. |
| Spec Kit | .specify/memory/constitution.md, generated by /speckit.constitution. |
| PAAD | None of its own. PAAD reads whatever your tool already reads and adds no steering format. |
This causes confusion, so it is worth stating plainly: Claude Code reads CLAUDE.md, not AGENTS.md. If your repository already has an AGENTS.md for other agents, the documented fix is a one-line import, which also leaves room for anything Claude-specific:
# CLAUDE.md
@AGENTS.md
## Claude Code
Use plan mode for changes under `src/billing/`.
A symlink works too, if there is nothing tool-specific to add: ln -s AGENTS.md CLAUDE.md. On Windows that needs Administrator rights or Developer Mode, so prefer the import there. Either way you avoid the real problem, which is two steering files that slowly start contradicting each other.
Spec Kit's constitution is closely related but not the same thing. A steering file mostly records facts — this is the stack, this is the layout. A constitution records principles — what this project will and will not do, which trade-offs are already settled. In practice most teams end up wanting both, and it does not much matter which file they live in as long as they are true. Which is Module 5's subject.
The toolkits
Five are worth knowing. They are more alike than their documentation suggests, with the caveat above about where they diverge.
| Toolkit | Workflow | Worth knowing |
|---|---|---|
| Superpowers | brainstorm → worktree → plan → execute → test → review → finish | By far the most widely adopted — around 265,000 GitHub stars as of August 2026 — and the one PAAD's own README names as an example of a toolkit you can keep using alongside it. It calls itself "a complete software development methodology for your coding agents, built on top of a set of composable skills," and that is the right way to read it: seven phases, not a document format. Note there is no separate design phase — brainstorming is what produces the design document. Isolates work in a git worktree, dispatches a fresh subagent per task, enforces red/green/refactor, and includes its own review skills. See the note below — it overlaps PAAD more than anything else here. |
| Spec Kit GitHub | constitution → specify → plan → tasks → implement, with optional clarify, analyze and checklist gates | The most customisable, and the one that generates the most files: templates, scripts, and a lot of markdown under .specify/. Commands are namespaced — /speckit.specify, not /specify. |
| Kiro AWS | requirements → design → tasks | Three markdown documents per feature plus a steering directory. The easiest of the five to hold in your head, and the one most often accused of being heavy for small problems. |
| OpenSpec | propose → apply → archive | Organises specs by domain (auth/, payments/, ui/) and expresses each change as a spec delta, so a reviewer can read what changed without reading the code. Completed changes are archived rather than left to rot. Explicitly "fluid not rigid" — no phase gates. |
| Tessl | one spec file per code file, with generated code marked do-not-edit | The only one of the three Böckeler reviewed that explicitly aspires to spec-anchored, and the only one exploring spec-as-source. It was in closed beta at the time of Böckeler's review, and Tessl has since repositioned around agent skills: as of August 2026 the spec framework no longer appears in Tessl's documentation at all, which now covers a registry, governance, evals, observability, inventory and an agent. The level of abstraction is low enough that you are arguably still writing code, just in prose. |
These projects move fast and their command names have already changed at least once — Spec Kit's commands acquired the speckit. prefix, and OpenSpec's documentation shows both /openspec:… and the shorter /opsx:… forms depending on where you look. Read the project's own README before typing anything from this page. The same warning applies to this course that applies to a steering file: nothing fails when it goes stale.
HumanLayer is missing from that table on purpose. The company does not use the phrase "spec-driven development" anywhere in its writing — and since co-founder Dex Horthy coined the term context engineering, the omission is a position rather than an oversight. Their workflow, published in 2025 as RPI — research → plan → implement — and since expanded to six phases, questions → research → design → structure → plan → implement, inverts the order every toolkit above shares. Research comes first: the agent establishes facts about the existing codebase before anyone writes down what they want. The argument is that a requirements document is an opinion about a system nobody has read yet, and in a brownfield codebase that is the wrong end to start from. Their artefacts are deliberately disposable, too — "I edit my specs and then the code drifts" — which puts them on the spec-first rung of the ladder above by choice rather than by neglect.
It earns a place in this course for one line on their home page: "Do not outsource the thinking. Every phase is a place to push back." That is this course's argument, arrived at independently by a team that does not call what it does SDD.
Why SDD is generally preferred
Four reasons, in rough order of how much they matter.
- Written intent can be reviewed. This is the big one. A prompt is gone the moment it is answered; a spec sits on disk where a colleague — or
pushback— can argue with it. You cannot put a review gate in front of something that was never written down. - It converts silent assumptions into explicit decisions. Vibe coding does not remove the decisions; it delegates them. Every ambiguity you leave open, the model closes for you, reasonably and invisibly, and you find out which way it went at review time. A spec is where you find out first.
- It outlives the session. Context windows degrade and sessions end — Module 5 covers the evidence. The spec is the only part of your reasoning that survives to the next session, the next developer, or the incident review in eight months.
- It separates what from how. The stable half stops depending on the disposable half, which is what makes it possible to rebuild an implementation without re-arguing the requirements.
And the debt claim from Module 2, restated now that it means something: vibe coding rapidly accumulates technical debt while spec-driven development slowly accumulates technical debt. Slowly, not never. Treat that as an experienced practitioner's observation rather than a measured result — the appendix “How good is the evidence?” is where the measurements are, and they are messier than the slogan.
For a prototype you will delete, a spike run to answer one question, or a script nobody else will ever run, the process overhead costs more than it saves. This is the same "match the methodology to the stakes" point Module 1 made about tokens, and it is why PAAD includes a vibe skill at all: small changes deserve guardrails, not a specification.
Where SDD has weaknesses
The most useful critical read of SDD comes from Böckeler, who worked through three of these toolkits properly — Kiro, Spec Kit and Tessl — and came away unconvinced by all three, for different reasons. Her objections are worth understanding before you adopt anything, because they predict exactly which parts will annoy you. Her verdict on the two workflow toolkits:
Kiro and spec-kit provide one opinionated workflow each, but I'm quite sure that neither of them is suitable for the majority of real life coding problems.Birgitta Böckeler, "Understanding Spec-Driven-Development"
Her reservation about Tessl is a different one, and it comes at the end of this section.
| Objection | What it looks like in practice |
|---|---|
| Overhead mismatch | One opinionated workflow applied to every problem size. A two-line fix does not want a constitution, a requirements document, a design document, and a task list. |
| The review burden moves rather than shrinks | "To be honest, I'd rather review code than all these markdown files," she says of spec-kit's output. You have replaced reviewing something a compiler can check with reviewing prose that nothing checks. |
| The spec is not binding | She documents spec-kit's agent ignoring existing notes and generating them "all over again, creating duplicates." A bigger context window does not make an instruction enforceable. |
| Semantic diffusion | A term losing its meaning as more people use it loosely. "The term 'spec-driven development' isn't very well defined yet" — and it is drifting towards meaning nothing more than "a detailed prompt." |
Her sharpest warning is historical. Model-driven development promised the same thing — write the model, generate the system — and failed because of inflexibility. Attaching an LLM to that idea does not obviously fix it:
We might end up with the downsides of both MDD and LLMs: Inflexibility and non-determinism.Birgitta Böckeler
None of this makes SDD a bad default. It does mean you should expect the markdown files to multiply, expect the agent to ignore parts of it, and be willing to run a lighter process on lighter work.
Where PAAD attaches
Notice what is missing from the document-generation toolkits in the table above. Spec Kit, Kiro and OpenSpec each generate artefacts and hand them to you, and the generation step does not review what it just produced. Nothing argues with your spec, and nothing checks whether the tasks it wrote actually cover the requirements it wrote them from.
That gap is the entire premise of this course.
| SDD gives you | Nothing checks that… | PAAD's answer |
|---|---|---|
| A specification | …the spec is any good | pushback |
| Tasks generated from it | …the tasks match the spec, in both directions | alignment |
| An implementation | …the code does what was specified, safely | agentic-review |
| Feature after feature | …the structure underneath is still sound | agentic-architecture |
Worth stating plainly, because the table above would otherwise oversell PAAD. Superpowers is not a document generator with a hole where the review should be. It includes requesting-code-review and receiving-code-review skills, puts each subagent's work through a two-stage check — spec compliance first, then code quality — enforces red/green/refactor, and ends with a verification-before-completion pass. It already fills several of the gates in that table.
Which is why PAAD's README treats the two as compatible rather than as alternatives — its exact words are "You like Superpowers? Use it with PAAD." What PAAD adds that Superpowers does not is aimed upstream and outward: pushback arguing with the design document before anything is built from it, alignment checking coverage in both directions, and agentic-architecture examining accumulated structure across the whole repository rather than one branch. If Superpowers is already your workflow, pushback is the cheapest place to begin — it needs no branch and no test infrastructure. Treat that as an order of adoption rather than a ranking: the overlap between the two toolkits is smaller in practice than the feature lists suggest, and running both review passes is a deliberate choice rather than a wasted one.
PAAD is deliberately agnostic about which toolkit produced the documents. Its auto-detection scans .kiro/, specs/, docs/plans/ and docs/specs/, and it will also review a plain markdown file — or the conversation you have just had — if that is what you have. Pick whichever SDD tool suits your team. The gates attach either way.
Spec-driven development gets your intent written down. PAAD is what interrogates that intent once it has been written down.
The AI sees all of your code and none of your context
The strongest argument for keeping engineers in charge is not about craft or morale. It is that the model is working from a partial input, and the engineer is holding the rest.
The model reads your repository faster and more patiently than any human will. That part is real, and it is why PAAD works at all. But the expensive decisions in software rarely depend on what is in the repository. They depend on what is not in it.
| The model sees | The engineer knows |
|---|---|
| Every line, in seconds | Which lines everything else depends on, and why |
| That the retry logic is duplicated | That the gateway already retries, so this layer is the bug |
| That a validation check looks redundant | That it was added after the outage nobody documented |
| That the design is internally consistent | That next quarter's traffic breaks it |
| That two modules should be merged | That they belong to two teams and three separate release schedules |
| That the data handling is convoluted | That the partner feed is malformed and the fix is a phone call |
None of the facts in the right-hand column are in the codebase. Most were never written down anywhere. They live in the people who were there — which is what experience actually is, once you stop treating it as a personality trait.
An assistant missing the right-hand column does not stop and say it lacks context. It produces a thorough, well-reasoned, entirely plausible recommendation about the half it can see. It will tidy the retry logic instead of deleting it. It will remove the check that prevented the outage. It will hand you a well-judged list of improvements to an architecture that should be thrown away.
That advice is not obviously wrong. It is the same shape as the good advice, which is exactly why it survives review by anyone who does not already know better.
Why this matters to whoever is paying for it
The argument for keeping engineers in charge is usually made on feelings — trust, craft, morale. Here it is simpler than that, and it is closer to measurable.
Seniority is not nostalgia. It is an input the model does not have. The engineer who remembers the outage is not being sentimental; they are supplying a fact that is absent from every file the AI just read. Remove them from the decision and you have not made the process leaner. You have deleted a critical input and added confident output.
"The AI found no problems" is not the same as "there are no problems." It means the AI found no problems in what it could see. Whether that is reassuring depends entirely on how much of the decision lived outside the repository — and only a person can answer that.
This is why every PAAD skill reports rather than decides, and why each one ends in a human choice rather than a merge. Not because the model is untrustworthy in some abstract way, but because it is working from a partial input while the engineer holds the rest. Engineering-driven AI is the arrangement where those two halves actually meet. AI-driven engineering is the one where the half that happened to be written down wins by default.
Two honest qualifications. First, the right-hand column is a claim about experienced engineers on a codebase they know — it is much weaker for someone onboarding to an unfamiliar repository, where the model may genuinely hold more context than the human does. Second, "the engineer knows" is an argument for keeping people in the decision, not proof that any given person's recollection is correct. Institutional memory is also how a workaround from 2019 survives for a decade. The frame says the human input is missing from the model, not that it is always right.
Groundwork before the skills
Four things that are not PAAD skills but that PAAD assumes. Skip them and the skills work at a fraction of their value.
1. Steering files
Module 3 covered where these live in each tool — CLAUDE.md, AGENTS.md, .kiro/steering/, .specify/memory/constitution.md and the rest. This section is about what to put in one. A steering file typically describes what your project is, what technologies it uses, where to find relevant code, and the practices your codebase follows.
Good steering files more than repay their cost, in two ways. They reduce confidently wrong answers, and they save tokens, because the assistant stops searching the repo to rediscover facts you could have simply told it. Bad steering files are worse than none: a wrong statement in a steering file is inherited by every single piece of work that follows.
They are also loaded into context on every single session, which makes length a real cost rather than a style preference. Claude Code's own documentation suggests keeping each file under 200 lines, on the grounds that longer files consume more context and get followed less reliably — a useful rule of thumb whichever tool you use. Write instructions concrete enough to verify: "run npm test before committing" beats "test your changes."
Open your steering file and ask, line by line: is this still true? Steering files go out of date faster than code, because nothing fails when they do. That silence is exactly what makes them dangerous.
2. Context management
Long contexts degrade. The four failure modes have names, and each is worth recognising when it happens to you:
| Failure mode | What it looks like in a session |
|---|---|
| Poisoning | Something false enters the context — a hallucinated function name, a wrong assumption you did not correct — and gets treated as established fact for the rest of the session. |
| Distraction | So much accumulated history that the model relies on it instead of reasoning about the current problem, repeating earlier approaches rather than choosing the right one. |
| Confusion | Material that is present but irrelevant influences the answer — a file you pasted an hour ago for a different reason shaping the code you get now. |
| Context clash | Two things in the window contradict each other — an old plan and its revision, say — and the model has no reliable way to know which one wins. |
Generation additionally suffers a quadratic slowdown: because each new token is compared against every token already in the window, the cost of producing one grows roughly in proportion to the context length — and the total cost of a long session grows with its square. A full window is slower as well as worse. The practical consequence is that a session which has been running for hours is measurably worse at reasoning than a fresh one, even though nothing visibly broke.
I try to keep my context under 30%. I get much higher quality work out of this."Watching Claude Sonnet Outperform Opus," on a 1M-token context window
The article notes there is no hard-and-fast rule. It reports hearing others put the ceiling at 40–50% on smaller windows, while allowing that on a 200K window you sometimes have no choice but to spend a large share of it just guiding the model's reasoning. The number matters less than the habit: treat a fresh session as a resource you spend deliberately. This is why the per-feature loop tells you to execute tasks in new sessions, and why agentic-review has a pre-flight check that stops and asks you to start a fresh session if your conversation already has substantive history.
3. A test suite that pins current behaviour
If you are bringing PAAD to an existing codebase, tests come first — but not the kind of testing you may be imagining.
Your goal is not to fix bugs. Your goal is simply to lock down current behavior to ensure that you haven't unexpectedly changed things."Watching Claude Sonnet Outperform Opus"
This is the single most counter-intuitive instruction in the whole methodology, and the most important. When you write tests against a legacy codebase you will find bugs. Do not fix them. Write a test that asserts the buggy behaviour, note the bug, and move on. The suite's job right now is to be an alarm that sounds when something changes — not a statement of what ought to be true. With legacy codebases you often encounter so many bugs that trying to fix them all will overwhelm you before the safety net exists.
Three layers are expected: unit tests for isolated components, integration tests validating that components communicate correctly, and end-to-end tests for critical user journeys. The article targets 95%+ coverage when working with AI, against a traditional 80% baseline — the reasoning being that AI makes writing tests cheap enough that the old cost/benefit line moves. Treat that number as a heuristic rather than a target to optimise: as the next paragraph explains, coverage is famously easy to inflate without improving anything.
A line can be "covered" by a test that asserts nothing — green forever, catching nothing. PAAD includes an experimental test-roadmap skill built entirely around this problem: every test phase must name the bug it would catch, and the skill proves each test works by injecting that bug in a throwaway git worktree and confirming the test goes red. A high coverage number with assertion-free tests is worse than a low one, because it buys false confidence.
4. A consistent way to run your checks
Whatever your project uses — a Makefile, npm scripts, a justfile, a shell script — agents work far better when there is one documented command for testing, one for linting, and one for coverage. PAAD includes a makefile skill that will generate these for you, though Makefiles are less popular than they once were and this may not suit your stack.
The value is not the tool. It is that developers and agents run the same quality checks through the same commands. An agent that knows how to run your tests does not have to guess whether this project uses pytest, jest, or cargo — and a steering file naming those commands does most of the same work.
Pushback
If English is the source code, pushback is the code review.
AI assistants rarely tell you your spec has problems. pushback does. It critically reviews specs, PRDs, requirements documents, and design plans before work begins, so you do not build on flawed assumptions.
I'm using it for every non-trivial change, and so far, I think I've argued with 2 of maybe 40 recommendations. It has improved EVERY SINGLE spec I've fed it so far.A PAAD user, quoted in the README
How to run it
/pushback docs/specs/checkout-rework.md # review a specific file
/pushback # auto-detect from the
# conversation or common paths
With no argument it resolves the spec in order: an explicit path, then a spec in the conversation history (it will confirm with you first), then a scan of docs/plans/, docs/specs/, and files named requirements.md, PRD.md, spec.md. If it finds nothing it asks. Notably, pushback does not ask for a fresh session — the conversation you have just had may itself be the spec.
Phase 1 — the reality check
Before it reads a single requirement, pushback looks at your git history: git log --oneline -50 --since="2 weeks ago", reading commit messages and diffing anything relevant. It is asking one question — does this spec assume things about the codebase that are no longer true?
Conflicts are presented upfront, before any other analysis, with what the spec assumes, what actually changed (SHA and date), why it matters, and options. The reasoning is direct: a spec that assumes deleted infrastructure is wrong before the analysis even starts. If your project is not a git repo, this phase is skipped.
Phase 1.5 — scope shape
Two structural checks, in this order:
Feature cohesion. Do the features in this spec serve different user goals? If it bundles things that would naturally be separate PRs, it identifies the groups and asks whether you want to split before continuing.
Spec size. Heuristic signals — multiple unrelated system areas, a very long document, an implementation that would touch many modules. Note what is deliberately not a signal: the skill's own words are "requirement count is not a signal — estimate the diff instead. A spec can list a dozen requirements that are all facets of one small change." But size alone is never the argument. If a meaningful split exists where each piece delivers independent value, it suggests the split. If the features are genuinely interdependent, it flags the size and explains why splitting is not practical, then moves on.
If unrelated features get split out first, the size problem often resolves itself. Order matters in review processes for the same reason it matters in debugging: fix the root cause and the symptoms disappear.
Note what this rule does not say: it does not say size is unimportant. It says size is the alarm rather than the place to cut. The appendix “Why small specs” has the evidence for why the alarm is worth having, and what to do when a long spec turns out to have no seam — no natural place to divide it.
Phase 2 — the six categories
| Category | What it looks for |
|---|---|
| Contradictions | Requirements that conflict with each other, or with the current state of the codebase. |
| Feasibility | Requirements that are difficult or impossible given the codebase as it exists today — missing infrastructure, incompatible architecture, dependencies that cannot support the requirement. |
| Scope imbalance | Requirements wildly disproportionate in effort — one bullet point that is a two-week project sitting next to two-hour tasks. |
| Omissions | Missing requirements that are implied or necessary — error handling, edge cases, migration paths, rollback plans, monitoring, permissions. |
| Ambiguity | Requirements open to multiple interpretations — vague success criteria, undefined terms, unclear scope boundaries. |
| Security concerns | Requirements that introduce or ignore risk — auth gaps, data exposure, injection surfaces, missing rate limits, privilege escalation. |
See it work
Here is a spec that looks entirely reasonable. Read it, decide what you would flag, then reveal the findings.
These are plausible findings, not a transcript. Language models are non-deterministic: run pushback on the same spec twice and you will get overlapping but not identical results — different wording, different ordering, sometimes an issue one run raises and the other misses. That variability is a real limitation, and it is one of the reasons the loop suggests you run these skills more than once for important work.
Notice that none of these are stylistic. Each one would have surfaced in code review, in QA, or in a security incident — just later, and more expensively.
How findings are presented
This detail matters more than it appears to. Findings are ranked by severity — critical, serious, moderate, minor — and presented one at a time. For each: state the problem, give concrete options from best to worst with a recommendation and a short explanation for each, then wait for your response before moving to the next.
You can say "good enough" or "stop" at any point, and the remaining issues are recorded under an Unresolved Issues heading rather than lost. At the end, pushback asks whether to update the spec in place or write a separate report to paad/pushback-reviews/.
Twenty findings presented at once get skimmed and dismissed. One finding with three options and a recommendation gets a decision. The skill's own "common mistakes" table lists "listing every issue at once" as a failure mode — the format is part of the method, not presentation polish.
What good pushback avoids
- Critiquing without reading the codebase. "This contradicts what already shipped" outranks every stylistic concern, which is why the reality check runs first.
- Raising a problem without options. "This is ambiguous" is an observation. "This says 'fast response times' — do you mean under 200ms for 99% of requests? Under a second? That determines whether you need caching" is pushback.
- Manufacturing issues to fill all six categories. Not every spec has security concerns. Saying a category is clean and moving on is the correct behaviour.
- Softening findings to seem agreeable. The entire value is saying what a reviewer would say before the code exists. Criticism that has been softened is worse than no criticism at all.
- Rewriting the spec instead of critiquing it. A silent rewrite replaces your judgement with the model's.
If you want the spec implemented rather than criticised, the skill is instructed to say what it would push back on in a line or two and then continue with the work. A full critique nobody asked for is its own kind of failure.
Alignment
A good spec and a good plan can still be two different products. alignment checks them against each other before code gets written.
Where pushback asks "is this spec any good?", alignment asks "does the planned work actually match it?" It needs two things: an intent document (requirements, spec, PRD) and an action document (plan, tasks, implementation steps). It classifies whichever documents it finds into those two categories and compares them.
/alignment # auto-detect
/alignment requirements.md plan.md # specific files
/alignment docs/specs/ docs/plans/ # directories
Auto-detection scans .kiro/, specs/ (spec-kit), docs/plans/, docs/specs/, and common filenames. Like pushback, it opens with a source-control reality check against recent history.
The three checks
| Check | Direction | What it catches |
|---|---|---|
| Requirements coverage | Intent → action | Requirements with no task at all, and requirements only partially covered — the happy path (the case where nothing goes wrong) has a task but error handling does not. |
| Scope compliance | Action → intent | Tasks that trace back to no stated requirement: scope creep and gold-plating (building more than was asked for). Also tasks addressing implied but unstated requirements, which may be legitimate — it asks. |
| Design alignment | Both, if design docs exist | Design decisions not reflected in tasks, and tasks that contradict or quietly bypass the design. |
The two-directional structure is the point. Coverage alone catches what you forgot. Scope compliance catches what the assistant added on its own initiative — and that second category is where AI-assisted projects drift, because an assistant that adds a caching layer nobody asked for is being helpful in a way that costs you a maintenance burden.
Issues arrive dependency-ordered
Unlike pushback's severity ordering, alignment presents issues in dependency order, root causes before symptoms:
- Missing or unclear requirements first. A missing requirement explains why there is no task for it and no design for it.
- Design gaps second, where design docs exist — a design gap may explain why tasks are missing or wrong.
- Missing, orphaned, or out-of-scope tasks last. These often resolve themselves once the upstream issues are fixed.
Severity is Critical / Important / Minor, and as with pushback you get one issue at a time with options best to worst, and you can stop whenever you like.
The mandatory TDD rewrite
This is the part people are surprised by. Once alignment is confirmed, alignment rewrites your tasks into red/green/refactor format. It skips this only if the tasks are already in that format, or if they do not involve code — infrastructure provisioning, documentation, design work, data migrations, manual processes.
Each rewritten task names the requirement it addresses and then specifies three steps:
| Step | Why it produces better AI output |
|---|---|
| RED — write a failing test | Defines expected behaviour before any code exists. Occasionally the test passes immediately, which tells you the feature already exists or your assumptions are wrong. More often it fails in an unexpected way, surfacing an unknown issue in the codebase. Both outcomes are information you would otherwise never get. |
| GREEN — minimal code to pass | Forces simpler solutions. The assistant addresses the problem directly instead of over-engineering. Less speculative code means less low-quality code to clean up later. |
| REFACTOR — clean up what you just wrote | The step AI almost never does unless explicitly told to. Catches duplicated logic that should be extracted, hard-coded values that belong in config, and inconsistent patterns that should be consolidated — the small things that compound into architectural debt. |
Most descriptions of TDD present the failing test as proof that the test works. In an AI context there is a second benefit: the way it fails is diagnostic. A test that fails with a missing-import error tells you something different from one that fails on an assertion, and different again from one that unexpectedly passes.
Architecture
AI can build quickly on weak foundations. This is the letter that goes looking for the foundations.
Pushback and alignment operate on documents. Architecture operates on the codebase you already have — and unlike the other two, it is a diagnosis you run periodically rather than a gate you pass through per feature.
/agentic-architecture — the diagnosis
/agentic-architecture # whole repo
/agentic-architecture src/ # scoped
/agentic-architecture packages/api/ packages/shared/
Five specialists analyse the codebase in parallel, each from a different angle so that problems cannot hide behind a single reviewer's blind spots. A verification phase then filters false positives by reading actual code and checking git history.
| Specialist | Looks at |
|---|---|
| Structure & Boundaries | Module organisation, responsibility distribution, domain modelling. Finds god objects, shotgun surgery, low cohesion, catch-all utility modules. |
| Coupling & Dependencies | How components connect, abstraction quality, dependency direction. Finds tight coupling, circular dependencies, leaky abstractions, over-abstraction, temporal coupling. |
| Integration & Data | Service communication, data ownership, API contracts, resilience. Finds distributed monoliths, chatty calls, shared databases, missing idempotency. |
| Error Handling & Observability | Error strategies, logging, config, side effects, business-logic placement. Finds hidden side effects, config sprawl, business logic in the UI, magic numbers (unexplained literal values). |
| Security & Code Quality | Auth, secrets, dead code, test coverage. Finds security-as-afterthought, unused dependencies, missing coverage, hard-coded credentials. |
Between them they cover 34 flaw and risk types and 14 strength categories, with a coverage checklist ensuring every category is actually assessed. The report — written to paad/architecture-reviews/ — includes strengths as well as flaws, plus a hotspots list of the files and directories most worth your attention.
A review that only lists problems is easy to dismiss and hard to act on — you cannot tell whether the reviewer understood the codebase or just pattern-matched complaints. Naming what is working is evidence of comprehension, and it stops you from "fixing" the parts that were deliberate.
Diagnosis onlyThis skill does not propose fixes. That is a deliberate separation — mixing "here is what is wrong" with "here is what I changed" makes it impossible to review either one properly.
/fix-architecture — the treatment
Fixing is a separate skill that takes an architecture report as its input and works through findings one at a time, test-first. It requires a feature branch — not main or master — and an existing report.
Before starting it runs pre-flight checks: branch protection, report staleness detection, test infrastructure verification, and a baseline test run. Then it has a conversation with you about how you want to work — solo or team, batch size, auto-commit or manual, how to sort flaws by priority — before confirming a plan.
Each fix validates that the flaw still exists, writes safety-net tests where needed, proposes options with trade-offs, and executes red/green/refactor. Outcomes are recorded in the report itself: Fixed, Won't fix, Partially fixed, Skipped, Fixed (pre-existing), Attempted/reverted. That status tracking is what makes the work resumable across sessions.
This is one of the most instructive design decisions in PAAD. Fixing one structural flaw can resolve others, and that dependency can only be discovered sequentially. Worktree-based parallelism would avoid file collisions — but merging several structural refactors back together is a reliable way to introduce new bugs. Parallelism is not free just because the tooling supports it.
Discipline
Code quality rarely degrades in one dramatic change. It slips through a series of small decisions that each seem reasonable in isolation.
Discipline is the letter that is not a technique. The other three describe things to do; this one describes doing them every time, including the Friday afternoon when the change is small and the deadline is Monday. The skills grouped under it are the ones that make consistency cheap enough to sustain.
/agentic-review — the pre-merge gate
/agentic-review # diff against main
/agentic-review develop # diff against a different base
/agentic-review main src/auth/ # scoped to a directory
Six specialists examine your branch in parallel. Where typical AI review features give shallow, unsystematic feedback, this is designed as a deliberate quality gate: parallel analysis, then a verification pass that reads the actual code to drop false positives, assigns severity, merges duplicates, and classifies what is yours to fix.
| Specialist | Hunting for |
|---|---|
| Logic & Correctness | Wrong conditions, off-by-one errors, null paths, bad state transitions, new code paths that skip validation or cleanup that sibling paths perform. |
| Error Handling & Edge Cases | Missing catches, swallowed exceptions, boundary validation, silent failures. |
| Contract & Integration | Signature versus callers, type mismatches, broken API contracts, data-shape drift, duplicated logic. |
| Concurrency & State | Race conditions, shared mutable state, cache invalidation, ordering assumptions. |
| Security | Injection, auth gaps, data exposure, OWASP Top 10. |
| Spec Compliance | Missing features, deviations from intent, out-of-scope additions — pulling intent from the PR description, plan and design docs, recent commit messages, or the branch name. |
Findings are ranked Critical / Important / Suggestion and the report is written to paad/code-reviews/.
The three categories
What makes this more than a linter is how it decides what is yours to fix:
| Category | Meaning | What happens to it |
|---|---|---|
| In-scope | Your branch caused the bug, or worsened it — made it more likely to be triggered, expanded its blast radius, removed a guard that was masking it, or added a new caller into broken code. | Fix before merge. |
| Out-of-scope (bug) | A bug that already existed, and that your branch does not reach in any new way, even if it lives in a file you touched. | Persisted to paad/code-reviews/backlog.md so it is not lost. |
| Out-of-scope addition | Code your branch added that the spec never promised. | A per-PR decision: keep, split out, or revert. Never goes to the backlog. |
That middle category is the forgiving one. Without it, every review of a legacy file mixes problems you did not cause into the list of things blocking your merge. With it, each one gets a stable ID and a single backlog entry — later reviews re-confirm that entry rather than creating a duplicate, and the finding is set aside in the report's out-of-scope section instead of blocking your PR. The backlog is explicit-removal only: agentic-review never auto-resolves an entry, so you or a later agent deletes it when the work is actually done.
agentic-review refuses to run on main or master, refuses to run against an empty diff, asks what to do about uncommitted changes rather than guessing, and — notably — tells you to start a fresh session if your conversation already has substantive history. That last one is context management enforced by the tool rather than left to your memory.
Run it more than once. The README is explicit that repeated runs are valuable, and equally explicit that this is a stronger automated safety net, not a replacement for human review.
pushback
Notice what is not on that list: how large the diff is. Both the human reviewer and the six specialists get worse as the input grows — but a pre-merge gate is the wrong place to enforce that, because the code already exists by the time it runs. PAAD checks size where acting on it is still cheap: pushback's phase 1.5, on the spec. The appendix “Why small specs” has the evidence and the decomposition procedure.
/agentic-a11y — accessibility as a default
Discipline also means accessibility is not an afterthought. This skill scans for meaningful accessibility barriers and organises them by who they affect, with dedicated specialists for screen reader usage, visual and colour contrast, keyboard and motor interaction, cognitive load, and multimedia.
It supports web, iOS, Android, React Native, Flutter, desktop, CLI, and games, detecting the platform automatically. It evaluates against WCAG 2.2 AA — applied through WCAG2ICT for non-web platforms — with AAA noted as bonus recommendations, and draws on platform guidance such as the Apple HIG, Material Design, and the Xbox Accessibility Guidelines. Output includes an impact summary by user group and the five highest-impact, lowest-effort quick wins.
The skill's own documentation says this plainly: it will help substantially, but human accessibility review of your application is still required. Accessibility is important, and hard. Automated tooling finds missing labels; it does not find an interface that is technically conformant and practically unusable.
/vibe — speed without recklessness
Not every change deserves a spec. vibe exists for the small fix that still benefits from guardrails — roughly one to three files in the same module.
Its pre-flight checks are where the value sits:
- Test infrastructure. If there is no test framework, it says so and asks whether to set one up or proceed without TDD. If you proceed, it still does GREEN and REFACTOR — it just skips RED.
- Scope check. One to three files in the same module is good vibe territory. Four or more files, or crossing module boundaries, and it warns you that this may want a more structured approach.
- Architecture smell. If a conceptually simple task — "only admin users can download finance reports" — turns out to require a great deal of work, it stops and investigates whether deeper structural issues are making it harder than it should be.
- Reusable components. Before building a toast notification (the small message that appears briefly and then disappears), a modal, a validator, or a permission check from scratch, it searches the codebase for existing utilities, half-finished implementations, and established patterns.
Then red/green/refactor is mandatory. If the test passes when it should fail, or fails in an unexpected way, it stops and reassesses rather than continuing. Note what it does not do: vibe writes code, but staging and committing stay with you.
"This simple thing is taking far too long" is a signal every experienced developer recognises and most tools ignore. Encoding it as a stopping condition turns a vague feeling into a decision point — and it is the mechanism by which the Discipline letter feeds back into the Architecture letter.
The per-feature loop
Four letters, one repeatable cycle. Click any stage to see what it does, what it catches, and when to run it twice.
This is the loop the article prescribes for each feature. Several stages are marked may repeat — that is not a sign of doubt; it is the design. Pushback and alignment are often worth running more than once, especially when a spec evolves or a plan changes mid-execution.
Newcomers read the repeat markers as a sign of doubt — as if the skills were unreliable and you run them twice to be safe. They are there for two independent reasons, and both are structural.
The artefact changes underneath you. A review is a critique of a specific document. The moment you accept a finding and edit the spec, the thing that was reviewed no longer exists — you now have a different spec that has never been reviewed. Fixing an ambiguity often exposes an omission that was hidden behind it, and resolving a contradiction can invalidate requirements elsewhere. The second pass is not a retry of the first; it is the first review of a new document.
The reviewer is non-deterministic. Two runs over the identical input will not produce identical findings. This is a genuine weakness, and the honest way to work with it is to treat any single pass as a sample rather than a complete enumeration. Running twice does not guarantee completeness either — it just widens the sample.
Use the size of the finding list as your signal. A pass that returns a long list of issues is telling you two things: this artefact needs work, and you have almost certainly not found all of the problems yet. Reviews reveal what is most visible first, and a document with ten problems tends to have had several of them masking others. Fix that batch and run again — the second pass on a heavily-revised document routinely finds things the first could not have reached.
Conversely, a pass that returns one or two minor points is evidence you are close to done. The practical rule: re-run whenever you have materially changed the artefact, re-run when the last pass found a lot, and stop when a pass returns nothing you did not already know. That stopping condition matters — without it, non-determinism means you can always find one more thing, and the loop never closes.
The README describes a six-step workflow: spec → pushback → plan → alignment → implement → agentic-review. The article describes the seven-step loop above, which adds a second pushback pass on the task list. The article's version is the more thorough one — the task list is a document too, and it can be ambiguous, infeasible, or silently omit things just as a spec can. If you are starting out, run the README version until it becomes a habit, then add the second pushback pass.
Where the other skills fit
| Skill | How often | Trigger |
|---|---|---|
agentic-architecture | Periodic | Before a major refactor, when onboarding to an unfamiliar repo, after rapid growth, or when planning a redesign. |
fix-architecture | Across sessions | After an architecture report exists and you have a feature branch. |
agentic-a11y | Per UI change | Any UI work, or accessibility-sensitive changes. |
vibe | Instead of the loop | Small fixes — 1–3 files, one module — that do not justify a spec. |
The rhythm underneath
Strip away the skill names and the loop has a simple shape: every artefact gets reviewed by something other than the thing that produced it, before anything downstream is built on it. The spec is reviewed before tasks are generated. The tasks are reviewed before code is written. The code is reviewed before it merges.
That is not an AI insight — it is how engineering organisations have worked for decades. What is new is that each of those review passes now costs minutes instead of days, which changes which ones are worth doing. The reason PAAD reviews the spec is not that specs got worse; it is that reviewing them got cheap.
Which is the whole tagline, stated mechanically. Engineering-driven AI is not a new philosophy of software; it is the ordinary review discipline you already believe in, running at a cadence that can keep up with a machine. The loop is what that looks like in day-to-day work.
Getting started
Installation, the order to work in on a codebase you inherited, a first-week plan, and the reference card.
Install — Claude Code
/plugin marketplace add Ovid/paad
/plugin install paad@paad
The install command opens the plugin's details rather than installing immediately — you pick a scope there: install for you (user scope), for all collaborators on the repository (project scope), or for you in this repo only (local scope). Then run /reload-plugins to activate the skills in the session you are already in.
After that, start with /paad:help to see the available skills and when to use each. Every skill announces its own name and version on invocation — Running paad:vibe v1.24.1 — which is how you see what version you are running.
Most skills are shown without the paad: prefix, but you can run them like that if you want: /paad:pushback. However, /help is a common enough command in AI coding tools that we recommend the fully-qualified /paad:help to ensure the agent reads the correct skill.
New skills and fixes do not arrive on their own. Claude Code disables auto-update for third-party marketplaces by default, and PAAD is one, so you install updates yourself: open /plugin, go to the Installed tab, select paad, and choose Update now. Then run /reload-plugins. That single action refreshes the marketplace catalog from GitHub before it looks for a new version, and no session restart is required.
To confirm which version you are on, run any skill and read the banner, then compare it against plugin.json in the repository. If a skill described here is missing entirely, you are on an older release.
A note on how long this course stays accurate. An earlier version of this page flagged a discrepancy between PAAD's README and Claude Code's plugin documentation. The README has since been corrected, and the discrepancy is gone — so the criticism outlived the problem, which is its own small lesson. Treat any version-specific detail here as needing a check against the repository. That applies to this page exactly as it applies to a steering file.
Install — Cursor, Kiro, Antigravity
PAAD skills use the same SKILL.md format Cursor skills expect, so installation is a copy:
# Cursor
cp -r kiro_and_antigravity/skills/.kiro/skills/* .cursor/skills/
# Kiro
cp -r kiro_and_antigravity/skills/.kiro/skills/* .kiro/skills/
# Antigravity — the .agent files are wrappers pointing at the .kiro files,
# so copy both directories
cp -r kiro_and_antigravity/skills/.kiro/skills/* .kiro/skills/
cp -r kiro_and_antigravity/skills/.agent/skills/* .agent/skills/
Invoking skills
You rarely need to type a prefix anywhere. Three routes work:
| Route | Example |
|---|---|
| Natural language | "Run a pushback review on this spec." Works in every supported editor, needs no prefix at all, and is how most people actually invoke these. |
| Bare slash command | /pushback — PAAD's README says you can drop the paad: prefix when no other installed skill shares the name. |
| Fully qualified | /paad:pushback — always works. The namespace exists to disambiguate when two plugins provide a skill with the same name. |
One caveat worth flagging: the Claude Code plugin documentation describes plugin skills as always namespaced, which does not fit well with the README's claim that the prefix can be omitted. If the bare form does not resolve for you, use the qualified one — it works either way.
Starting on an existing codebase
The two-week plan further down was written for a new project, or for one that already has a test suite you trust. Brownfield work is a different problem and wants a different order. The codebase is large, nobody currently on the team wrote all of it, and the safety net you would need before changing anything is the thing you do not have. If that describes your situation, follow the sequence below instead — in order, because each step is what makes the next one safe.
All six steps are available on day one and every one of them is tempting to skip. The sequence is what makes them work: bad steering corrupts everything written afterwards, missing tests make the architecture report unusable, and an unread report is a document rather than a plan. Taken out of order these are six good ideas. Taken in order they are how a legacy codebase gets to the state the rest of this course assumes.
1. Everything the AI produces goes into source control
Specs, plans, architecture reports, test roadmaps, review backlogs. Commit them, on the same branch as the code they describe, by default.
PAAD's own outputs make that a single decision rather than a running one: everything it writes lands under one top-level paad/ directory in your repository — paad/pushback-reviews/, paad/alignment-reviews/, paad/architecture-reviews/, paad/code-reviews/, paad/test-roadmap/, paad/dedup-reviews/, paad/a11y-reviews/. One directory to add, one convention to explain to the team.
The paad/ layout is the Claude Code plugin's. The Kiro and Antigravity packages are a separate port and still write to .reviews/ instead — .reviews/code/, .reviews/architecture/, .reviews/test-roadmap/ and so on. The directory names may also be standardised further in a future release. So confirm where your version actually writes before you commit to a path in a .gitignore rule, a CI job, or a steering file — this is exactly the kind of version-specific detail the note above asks you to check against the repository rather than against this page.
The first reason is mechanical: PAAD's long-running skills keep their memory on disk, so an uncommitted artefact is a skill that has to start over. test-roadmap resumes from paad/test-roadmap/test-roadmap.md — across unrelated commits, squash merges, fresh clones and sessions that remember nothing about the last one. fix-architecture writes its outcomes back into the architecture report and is designed to be picked up again in a later session against that same file. agentic-review gives each out-of-scope finding a stable ID in paad/code-reviews/backlog.md so that later runs re-confirm the entry instead of raising a duplicate. None of that survives a file that only ever existed in one person's working tree.
The second reason matters more on a legacy codebase than anywhere else. Git already tells you what changed. It does not tell you what somebody decided was wrong, what they considered instead, or which of the findings they consciously chose not to act on. On code older than the current team, those documents are frequently the only written account of the reasoning — and they cost nothing to keep.
Two cases are worth knowing before you make this a team rule.
The first is named by PAAD itself. agentic-review commits paad/code-reviews/backlog.md by default, and when a run adds security entries to it the skill stops and tells you so — because a backlog of unfixed security findings in a public repository is a disclosure. Its own warning is worth reading in full: .gitignore after the fact does not remove anything already in history, so that decision is cheapest before the first push.
The second is a position rather than an accident. Module 3 describes HumanLayer treating specs as deliberately disposable — "I edit my specs and then the code drifts" — which is a coherent choice when the artefact's whole job is to get one change written and the codebase is small enough to re-read. Brownfield is the case where it does not apply: re-reading is exactly what you cannot afford, and resumability is the thing you are buying. So keep the default, and put the burden on whoever wants a particular artefact untracked to say why.
2. Validate the steering files before anything else
This is first among the things you actually do, because everything after it inherits whatever it says. Module 5 gives the cost — a wrong statement in a steering file is inherited by every single piece of work that follows — and the practical test: read it line by line and ask whether each line is still true. On a legacy codebase you will usually find one of two situations. There is no steering file, in which case the assistant is inferring your conventions from whatever it happens to read. Or there is one, written during a setup that nobody remembers, describing a project that has since moved.
Do the Module 3 decision at the same time, once, deliberately: pick a canonical document and make the other locations import or symlink it rather than repeat it. Two steering files that disagree is the same cost as one that is wrong, plus the question of which one is wrong — and nothing will tell you. It is also the arrangement PAAD's own skills expect: agentic-review and agentic-architecture scan for CLAUDE.md and AGENTS.md by name before they dispatch anything.
Bad steering does not fail loudly. It produces confident, plausible, wrong work at every layer beneath it, which is the most expensive failure mode in the whole method and the one you can eliminate in an afternoon.
pushback's stated scope names "a spec, PRD, requirements doc, or design plan". In practice it reviews AI-produced artefacts of most kinds effectively — steering files and architecture reports included — and work is under way to refine the skill and its description to match. So point it at your steering file, and at the report in step 4. Two caveats stand while that work lands: the description is the contract the semver promise covers, so behaviour on other inputs can change; and most steering claims are only testable against the code, so a document review complements the check the skills already run rather than replacing it.
3. Build a test suite that pins current behaviour
PAAD's own README puts this bluntly: "PAAD is risky to use with codebases without a strong test suite." Every skill that changes code — fix-architecture, vibe — works test-first, and test-first on untested legacy code means the tests get written under time pressure, one flaw at a time, by whoever happens to be fixing that flaw. Doing it deliberately first is the same work in a better order.
Module 5 gives the rule that makes this survivable, and it is the most counter-intuitive instruction in the methodology: your goal is not to fix bugs. You will find them. Assert the current behaviour, write the bug down, move on. The suite's job right now is to be an alarm that sounds when something changes, not a statement of what ought to be true.
The experimental test-roadmap skill exists for exactly this step, and there is one thing people get wrong about it often enough that the README calls it out. It is not a single command. The first run detects your stack, grades the tests you already have, and writes a phased plan — and writes no tests at all. Every run after that writes one phase, proves each test catches the bug it claims to by injecting that bug in a throwaway git worktree, commits the phase, and tells you where you are. A fourteen-phase roadmap is fifteen invocations. Teams run it once, read the plan, feel informed, and stop with zero tests written.
test-roadmap is one of the experimental skills, so its arguments, output paths and behaviour can change in any release including a patch. That is an argument for pinning your plugin version if you are part-way through a roadmap, not for skipping the step — the step is the safety net, and it is required whether a skill builds it or you do.
4. Take an architecture baseline — then argue with it
agentic-architecture is diagnosis only: five specialists, 34 flaw types, 14 strength categories, a verification phase that filters false positives by reading the code and checking git history, and a report written to paad/architecture-reviews/. On a codebase you inherited, that report is the first honest description of the thing you are responsible for.
It is also a document produced by an AI, which puts it under the same rule as every other document produced by an AI in this course: something other than the thing that made it should review it before anything is built on it. Run pushback on the report.
The larger the codebase, the more that pass earns its place, and the reason is in the skill's own design. Specialists report only findings they hold at 60% confidence or above, and cap a finding at 79 where confirming it would require changing code — so the report is calibrated, not certain. Past roughly 500 source files the skill partitions the files across two instances of each specialist, which means that on a large repository no single reviewer saw the whole thing. That is the right engineering trade-off and it has a predictable consequence: the findings that get missed or mis-weighted are the ones whose evidence is spread across the partition. A cross-cutting flaw looks small from inside either half.
What you are checking is not whether each individual finding is real — the verification phase already did that, against the code. You are checking the list: what is not on it that you know is true, which severities do not match the risk as you understand it, and which findings are technically correct and practically irrelevant to this system.
5. Now the report is a rescue roadmap
A reviewed, prioritised architecture report with a test suite underneath it is the thing this whole sequence was for. fix-architecture works through it one flaw at a time, test-first, on a feature branch, recording an outcome against each finding — Fixed, Won't fix, Partially fixed, Skipped, Fixed (pre-existing), Attempted/reverted — so the work resumes cleanly across sessions. It detects when fixing one flaw resolves others, which is also why it refuses to parallelise: merging several structural refactors back together is a reliable way to introduce new bugs.
It will write safety-net tests where a flaw sits in untested code. You do not want that to be how your test suite gets built. Discovering the absence of tests one flaw at a time, mid-refactor, is the slowest and least deliberate version of step 3 — which is the whole reason step 3 comes first.
Module 8 is careful to say agentic-architecture is a periodic diagnosis rather than a gate, and Module 11's two-week table says to run it once the rest feels routine. Both hold for a codebase you already understand. On an inherited one the first pass is a different thing: it is what tells you whether the codebase can carry the rest of the method, and how much work stands between you and that. Sequence it early, and give the work that follows it a date before you run it — the appendix on teaching this to your team explains why finding that time afterwards is harder than reserving it in advance.
6. None of it replaces human judgment
Module 4 is the reason, and it lands hardest here. The AI sees all of your code and none of your context. A clean architecture report says no problems were found in what the review could see — and what it could see was the repository. The outage that explains the retry loop, the partner whose feed has been malformed since 2019, the compliance rule that made a class ugly on purpose, the volume of traffic arriving next quarter: none of that is on disk, and on a codebase older than the current team, none of it is in anybody's head either.
This is not a caveat attached to the end of the sequence. It is the reason a person runs the sequence rather than an agent. Every step above produces a document that looks finished, and each one is worth precisely what the human reading it brings to the reading. A report you accept without argument has told you nothing you did not already have.
| Step | What it produces | What breaks if you skip it |
|---|---|---|
| 1 · Commit the artefacts | Specs, reports, roadmaps and backlogs versioned beside the code | Resumable skills lose their memory; the reasoning behind the code stays unwritten. |
| 2 · Validate steering | One canonical, current steering document | Everything downstream inherits a wrong statement, silently and permanently. |
3 · Pin behaviour with tests/test-roadmap | A suite that goes red when behaviour changes, bugs included | No safety net, so no structural change is safe to make or to trust. |
4 · Baseline, then challenge/agentic-architecture → /pushback | A reviewed, prioritised description of what is actually wrong | You act on a partitioned, calibrated report as though it were complete. |
5 · Work the roadmap/fix-architecture | Flaws resolved one at a time, test-first, with recorded outcomes | The report becomes a document you have read rather than work you have done. |
| 6 · Supply the judgment | The decisions that were never available to the tooling | Confident, well-formatted output about a system nobody checked against reality. |
A realistic first two weeks — new or well-tested projects
This is the gentler on-ramp, and it assumes something: that the codebase either does not exist yet or already has tests you would trust to catch a regression. If your codebase already exists and that is not true of it, ignore this table and follow the sequence above instead. Adopting the gates one at a time is the right move when the foundation is sound; on an inherited codebase it postpones the only step that makes the rest safe.
| When | Do this | Because |
|---|---|---|
| Day 1 | Install, then run /paad:help to see what is available. | Zero risk. Read what each skill claims to do before you need one. |
| Day 2 | Run /pushback on a spec you have already written and are happy with. | This is the moment that convinces people. Use a spec you believe in — the point is to find out what it misses. |
| Week 1 | Add /agentic-review before every merge. | The highest value for the smallest change to your habits. Fits your existing workflow without changing how you plan. |
| Week 2 | Add /alignment between spec and implementation. | Once pushback is habit, alignment is the natural next gate — and it gives you TDD-formatted tasks. |
| Once it feels routine | Run /agentic-architecture on your main codebase. | Do this when you are ready to act on the results. A report you ignore is worse than no report. |
If you adopt exactly one skill, make it pushback. It is the cheapest to run, needs no branch or test infrastructure, sits highest in the cost hierarchy, and produces the most visible "oh — I hadn't thought of that" moment. Adoption follows from that moment, not from an argument.
Reference card
/paad:help [skill-name]/pushback [spec-file]/alignment [files…]/agentic-architecture [path…]/fix-architecture [report]/agentic-review [base-branch] [path]/agentic-a11y [path]/vibe [task description]/makefileMakefile, so developers and agents run the same checks through the same commands./agentic-dedup [scope] experimental/rethink [topic] experimentalpushback's. Checks whether the assumptions a chosen option rests on are actually true./test-roadmap experimentalPAAD versions itself with semantic versioning — the 1.24.1 scheme, where the first number changes only on a breaking change, the second on a new feature, and the third on a fix. For the stable skills that is a promise: their names, arguments and output locations will not change within a major version. The experimental ones are explicitly exempt. Their arguments, output paths, and behaviour may change — or the skill may be withdrawn — in any release, including a patch release. If you build a workflow on one, pin your plugin version.
Which skills sit in this category also changes between releases: rethink is a recent arrival that did not exist a few versions ago. Check the README's skill table rather than trusting a list you memorised. PAAD also provides a package for Pi — a terminal-based coding agent, separate from everything else named on this page, with its own package manager — installable with pi install git:github.com/Ovid/paad. That package is experimental as a whole, so the caveat above applies to all of it rather than to individual skills within it. If you are not a Pi user, nothing here changes for you.
Sources
Primary
- github.com/ovid/paad — repository, README, and skill definitions (v1.24.1, MIT licensed)
- "Watching Claude Sonnet Outperform Opus" — Curtis Poe's article introducing the methodology
- Claude Code — Discover and install plugins and Create plugins
- Superpowers — a complementary toolkit PAAD's README names as compatible with it, and a spec-driven workflow in its own right (see Module 3)
Spec-driven development (Module 3)
- GitHub, "Spec-driven development with AI: Get started with a new open source toolkit", and the spec-kit repository
- Birgitta Böckeler, "Understanding Spec-Driven-Development", martinfowler.com — the source of the spec-first / spec-anchored / spec-as-source taxonomy and of the critical case
- OpenSpec — specs by domain, change proposals, and spec deltas
- Kiro — steering files
- AGENTS.md — the cross-tool format, stewarded by the Agentic AI Foundation under the Linux Foundation
- Claude Code — How Claude remembers your project, including the documented
@AGENTS.mdimport and symlink patterns
Independent research cited in “How good is the evidence?”
- Liu et al., "Lost in the Middle: How Language Models Use Long Contexts", TACL 2024
- Modarressi et al., "NoLiMa: Long-Context Evaluation Beyond Literal Matching", ICML 2025
- Hong, Troynikov & Huber, "Context Rot", Chroma 2025
- Becker et al., "Measuring the Impact of Early-2025 AI on Experienced Open-Source Developer Productivity", METR 2025 — and METR's 2026 qualification of that result
- Peng et al., "The Impact of AI on Developer Productivity: Evidence from GitHub Copilot", 2023
- Perry et al., "Do Users Write More Insecure Code with AI Assistants?", ACM CCS 2023
- DORA, State of DevOps 2024 and State of AI-Assisted Software Development 2025
- GitClear, AI Copilot Code Quality (2025) and The Maintainability Gap (2026) — vendor-produced; see the caveat in “How good is the evidence?”
- Boehm & Basili, "Software Defect Reduction Top 10 List", IEEE Computer 2001
- Bossavit, The Leprechauns of Software Engineering, and a summary of its cost-of-defect critique
- Bacchelli & Bird, "Expectations, Outcomes, and Challenges of Modern Code Review", ICSE 2013
- Sadowski et al., "Modern Code Review: A Case Study at Google", ICSE-SEIP 2018, and "Lessons from Building Static Analysis Tools at Google", CACM 2018
- Méndez Fernández et al., "Naming the Pain in Requirements Engineering", EMSE 2017
- Eveleens & Verhoef, "The Rise and Fall of the Chaos Report Figures", IEEE Software 2010
- Fucci et al., "A Dissection of the Test-Driven Development Process", IEEE TSE 2017
- Ghafari et al., "Why Research on Test-Driven Development is Inconclusive?", ESEM 2020
- Du et al., "Reducing False Positives in Static Bug Detection with LLMs", ICSE-SEIP 2026
- Stack Overflow, Developer Survey 2025 — AI section
Review size and decomposition (“Why small specs”)
- Karl Wiegers, "Improving Quality Through Software Inspections", Software Development, April 1995 — the source of the 150–200 LOC/hour reading rate, and of the 300–400 lines / 8–12 pages per session limit that follows from it
- SmartBear, "Code Review at Cisco Systems" — 2,500 reviews of 3.2M lines by 50 developers. Vendor-produced and uncontrolled; see the caveat in the appendix
- Rigby & Bird, "Convergent Contemporary Software Peer Review Practices", FSE 2013 — the median-review-size measurements
- Google, Engineering Practices: Small CLs — the 100/1000-line guidance, the files-changed dimension, and the stacked-CL pattern
- Maddila et al., "From Code Review to Code Critique: Intent, Drift, and Spotlight for AI-Generated Diffs at Scale", arXiv 2026 — Meta on agent-generated diffs outgrowing review capacity. A preprint, not peer-reviewed
Final assessment
Fourteen questions across the whole course. Answer them all to see your score.
This is the end of the course itself. Everything after this point is optional reference material, and none of the questions above depend on any of it.
“How good is the evidence?” checks the whole argument against the independent research literature — read it if you would rather not take the methodology on trust, or if you need to make the case to someone who won't. “What the Fable review found” opens up the case study Module 2 summarised in a table: the four High-severity flaws in detail, the other twenty-nine listed, and the seventeen strengths the same report recorded. It is the closest thing here to seeing what one of these reviews actually produces. “Why small specs” is prescriptive rather than descriptive: it argues that every review gate in this course is only as good as the amount of material you point it at, and ends with a procedure for cutting a spec down without cutting it in the wrong place. “Teaching this to your team” is prescriptive too, and is written for whoever has to introduce this to other engineers: it names the four things teams run into once the material is understood — habit, steering spread across more than one editor, steering nobody has reviewed, and an architecture pass with no date on it — and sets out who has to own each one. “Terminology” is a glossary of every term the course uses, with a pointer to the module where each one is introduced; it is meant to be consulted rather than read straight through, and it is a reasonable place to send a colleague who is joining halfway.
How good is the evidence?
The course itself argued from a single primary source. This appendix sets that case against the independent research literature — what is well established, what is still open, and what you should be careful about repeating.
Nothing in the course depends on this page, and no assessment question draws on it. The four letters, the loop, and the final assessment all stand on their own. This is here for readers who would rather not take the argument on faith, and for anyone who needs to defend the methodology to a sceptical colleague, or the person who has to approve the spend.
The short version, if you only want one line: the security and self-assessment findings are solid, the technical-debt numbers everyone quotes are not, and the case for review gates does not rest on the shaky half.
Any methodology is worth checking against evidence gathered by people who were not involved in building it. That is not scepticism about the methodology; it is how you find out which parts of the argument the rest depends on.
The short version: the strongest evidence supports the parts of PAAD concerned with security and correctness review. Some of the more commonly repeated industry claims about AI and technical debt are, on close inspection, less settled than they appear — but the case for review gates does not depend on them.
AI-generated code contains more security defects
This is the best-established claim in the field, and it comes from multiple independent teams using different methods.
| Study | Finding |
|---|---|
| Pearce et al., IEEE S&P 2022 | The foundational study. Across 89 scenarios and 1,689 generated programs, roughly 40% contained a security weakness. |
| Fu et al., ACM TOSEM | Replication on real repositories rather than synthetic scenarios: 27.3% of 733 snippets contained weaknesses, spanning 43 distinct CWE types. |
| Cotroneo et al., ISSRE 2025 | A direct head-to-head across 507,044 samples: vulnerable Java samples ran 3.0% for human code against 6.1–19.6% across the AI models tested, with AI worse on high-risk classes such as command injection and hard-coded secrets. |
| Schreiber & Tippe, Springer 2025 | A moderating result worth knowing: across 7,703 files, 87.9% had no CWE-mapped vulnerability, and rates varied sharply by language (Python 16–18.5%, TypeScript 2.5–7.1%). |
Rates vary widely with methodology, and the moderating study is a genuine caution against quoting the scariest number. But the direction is robust across peer-reviewed venues and independent groups. If you adopt only one thing from PAAD, the security specialist in agentic-review and the security category in pushback are the parts with the firmest evidence behind them.
AI-generated code carries a different defect profile
Here the picture is more interesting than "AI code is worse." The largest study of real production code, Liu et al. (2026), examined 304,362 verified AI-authored commits across 6,275 repositories. Of 484,606 issues found, 89.1% were code smells rather than runtime bugs or security problems. More than 15% of commits from every assistant introduced at least one issue, and 24.2% of those issues survived to the latest revision — which is the accumulation mechanism, documented directly.
That study has no human baseline. It measures how much debt AI-authored commits carry and how long it persists; it cannot tell you whether that is more or less than human commits would have carried. Two other studies with controls point the other way: Cotroneo et al. found human code had the higher concentration of maintainability issues, and Sawada et al. found AI-authored files received fewer bug-fix commits over six months.
The honest synthesis is that AI code has a different failure profile rather than a uniformly worse one: more unused constructs, broader exception handling, more verbosity, more shadowing (inner names hiding outer ones) — and materially more security weaknesses. That is a profile a targeted review pass is well suited to catch, which is more or less what PAAD's specialists are organised around.
The duplication question is still open
You will see it stated frequently that AI-assisted development is driving code duplication up and refactoring down. The source is almost always GitClear's analyses, which report duplication rising to 15.7% of changed lines while refactoring fell to 3.8%. Those are striking numbers and they may well be right.
Two things are worth knowing before you repeat them. First, the analysis has no control group and its central metric is proprietary, so it establishes a correlation over calendar time rather than a cause. Second, the one rigorous within-repository comparison that exists — Mao et al. (2026), matching 19,816 AI-generated files against 36,467 human files from the same repositories — found the opposite direction: duplicated lines at 18.69% for AI code against 25.89% for human code. What it did find is that AI duplication is more fragmented, at 0.679 clone instances per file against 0.534.
A 2026 Drexel University literature review surveyed 104 sources on technical debt in LLM-assisted development and found only 31 were peer-reviewed; 73 were grey literature, 38 of them company blogs. Much of what looks like a body of corroborating research is the same commercial dataset cited onward through blog posts. The review's own conclusion is that for these emerging debt categories "no standardized benchmarks or LLM-specific metrics yet exist, leaving an important gap."
This matters practically: if you make the duplication argument to a sceptical colleague, expect it to be challenged. The security argument will not be.
Does AI adoption accumulate debt over time?
The strongest causal evidence is not GitClear but a Tilburg University difference-in-differences study that exploits a natural experiment: when GitHub Copilot launched in preview it supported some languages and not others, giving genuine treatment and control groups across 2,755 repositories and 1,699 contributors over 24 months.
It found more output — 17.7% more lines, 4.1% more commits — and 2.4% more pull-request revisions controlling for volume. Note that effect size: real, measurable, and modest. The more striking finding was distributional. Peripheral contributors committed 43.5% more, while core contributors committed 19% less and absorbed 6.5% more review burden. More work arrived, and the reviewing of it concentrated on fewer people.
That fits PAAD's actual proposition closely. The problem is less that AI writes bad code and more that it shifts effort from writing to reviewing — and reviewing is the part that does not scale by adding another assistant.
Does AI make developers faster?
This is the most contested question in the field, and the honest answer is that it depends heavily on the task.
| Study | Finding |
|---|---|
| METR RCT (2025) | Experienced maintainers working on their own repositories took 19% longer with AI tools — while both they and expert forecasters predicted a speedup. |
| Peng et al. (2023) | Developers using Copilot completed a task building a new HTTP server from scratch 55.8% faster. The opposite result, on a very different task. |
| DORA 2024 → 2025 | 2024 associated AI adoption with reduced throughput and stability. 2025 reversed the throughput finding to positive, but the negative association with delivery stability persisted. |
METR has since qualified its own result, warning that selection effects likely cause it to understate true speedup, and is redesigning the experiment. So the fair reading is not "AI makes developers slower." It is that task type and codebase familiarity dominate the direction of the effect, and that perceived speedup is an unreliable guide in either direction.
METR found developers believed they were 20% faster while being 19% slower. Independently, Perry et al. (2023) found participants with an AI assistant wrote less secure code while being more confident it was secure. Two teams, two different outcome variables, the same structural result: AI assistance degrades your ability to assess your own output.
This is the strongest single argument for external review gates, and it is stronger than any claim about code-quality metrics. If you cannot trust your own judgement of the work, you need a check that does not depend on it.
Two claims to handle carefully
Defects are cheaper to fix earlier
The direction is well supported. The famous magnitude is not. Boehm and Basili (2001) is the usual source for "100 times more expensive after delivery" — but the same sentence qualifies that the ratio is "more like 5:1" for smaller, non-critical systems. The exponential version has been credibly challenged as resting on evidence that does not support it, and it originates in 1970s projects with expensive release cycles that continuous delivery has largely shortened.
Use the directional claim, which is sound and sufficient for PAAD's argument. Avoid the 100:1 figure.
Code review catches defects
Bacchelli and Bird (ICSE 2013) found that although 44% of programmers ranked defect-finding as their top motivation for review, only 14% of 570 analysed review comments were defect-related. Sadowski et al. (ICSE-SEIP 2018) report that at Google, review expectations centre on readability, maintainability, and education rather than problem-solving.
Human review's dominant value turns out to be knowledge transfer and shared standards — things an AI reviewer cannot supply, and a good reason not to replace human review. But it also means the defect-hunting job is being done less thoroughly than most teams assume. A pass that looks specifically for logic errors, edge cases, and security holes is filling a real gap rather than duplicating work already happening.
Requirements defects are a real failure source
"Naming the Pain in Requirements Engineering" surveyed 228 companies across 10 countries: 48% cited incomplete or hidden requirements as a critical problem, and 39% of those linked it directly to project failure. Boehm and Basili separately estimate projects spend 40–50% of effort on avoidable rework. This is the empirical backing for putting a review gate at the spec, where pushback sits.
Automated review needs a verification pass
An ICSE-SEIP 2026 industrial study at Tencent found that of 433 verified static-analysis alarms, 328 were false positives — a 76% rate, rising above 90% once incomplete-context cases are included. Meanwhile Google requires code-review checks to produce fewer than 10% effective false positives, on the reasoning that developers abandon tools they cannot trust.
Real-world false-positive rates run roughly an order of magnitude above the level at which a tool stays usable. That gap is the whole justification for PAAD's verification phases — agentic-review and agentic-architecture both dispatch specialists and then run a separate pass that reads the actual code to drop false positives. The same Tencent study found LLM-based filtering removed 94–98% of false positives at about 93% accuracy. The verification step is not empty process; it is the difference between a tool people use and one they turn off.
Long contexts degrade model output
This one is well established, and it is the evidence behind the context-management advice in Module 5.
- "Lost in the Middle" (Liu et al., TACL 2024) — performance is highest when relevant information sits at the start or end of the context, and degrades significantly for information in the middle, even in models built for long contexts.
- NoLiMa (Modarressi et al., ICML 2025) — when literal keyword overlap is removed so retrieval requires inference, 11 of 13 models fell below half their short-context baseline at 32K tokens.
- "Context Rot" (Chroma, 2025) — across 18 models, performance degrades non-uniformly as input grows, even on trivially simple tasks.
One qualification: these measure retrieval and question-answering, not coding. Extending them to "long agent coding sessions produce worse code" is a reasonable inference rather than a measured result. Module 5, "Groundwork before the skills," covers what to do about it.
Where this leaves you
| Claim | Evidence |
|---|---|
| AI-generated code has more security defects | Strong. Multiple peer-reviewed studies, independent teams, converging direction. |
| Long contexts degrade output | Strong. Peer-reviewed and replicated, though measured on retrieval rather than code. |
| AI degrades your judgement of your own work | Good. Two independent teams, two outcome variables, same structural finding. |
| Requirements defects drive failure | Reasonable. Large multi-country survey; self-reported. |
| Automated review needs verification | Reasonable. Industrial data on both the problem and the remedy. |
| AI shifts burden from writing to reviewing | Moderate. One well-designed natural experiment; modest effect size. |
| AI code carries more smells overall | Contested. Large studies without baselines; controlled comparisons split. |
| AI raises duplication in real codebases | Open. Widely repeated, but the best controlled measurement points the other way. |
| AI makes developers faster or slower | Contested. Rigorous studies point both directions depending on the task. |
| Defects cost 100× more to fix late | Overstated. The direction holds; the multiplier does not. |
Read down that table and a pattern emerges. The claims that hold up best — more security defects, degraded self-assessment, degraded long-context reasoning, review burden concentrating on fewer people — are all arguments for putting a check between the model's output and your codebase. That is precisely what PAAD is. The claims that are shakier are mostly about the size of the quality problem, not about whether a review gate helps.
Worth noticing which way the good evidence points. The best-supported findings are not about the model's code being bad. They are about the human losing the ability to judge it — believing you were faster while being slower, believing the code was secure while it was less so, absorbing more review burden as more work arrives. Those are findings about the arrangement rather than the tool, which makes them the empirical case for engineering-driven AI specifically, not a general case for being careful.
Which points at the right way to decide: run pushback on a spec you already believe in and see what comes back. One such result on your own work will tell you more than this entire page.
What the Fable review found
Module 2 compressed fifty findings into a table with two rows. This appendix opens that table: what was reviewed, the four High-severity flaws in full, a reference list of the other twenty-nine, and the seventeen strengths the same report recorded.
Nothing in the course depends on this page and no assessment question draws on it. It exists because a two-row table is easy to quote and hard to check, and because the findings themselves teach more than the count does. The full report is public: Architecture Report, 18 July 2026 — the project name is redacted in the report itself. Throughout this appendix, Fable is the AI system that built the code, not the codebase under review.
Everything below is drawn from that report. Where a finding is summarised rather than quoted, the summary is ours; the finding titles are the report's own.
What was reviewed
The subject is a browser application built around a deterministic simulation, with a React and three.js interface. Its central design idea is that the save file is the history: the simulation records every action taken, and rebuilds the current state by replaying that list from the beginning. The report calls one replay a rewalk, and the promise the whole design rests on is that a rewalk produces exactly the state that live play produced.
| Property | Value |
|---|---|
| Size | About 10,500 lines across roughly 65 source files. |
| History | 31 commits. Reviewed at commit 06a5cf9. |
| Written documentation | CLAUDE.md, a design document, and 16 architecture decision records. |
| Structure | Three layers with a stated dependency direction: simulation → state → interface. |
| Tests | 154, all of them in the simulation layer. |
This is the detail that changes how you should read the numbers. The specification was written using Superpowers and PAAD, deliberately, to make sure the model was working from a good brief. PAAD was then left out of the implementation on purpose, to find out what the model produces natively when nothing checks the work between the brief and the merge.
So this is not a picture of AI-assisted development with no process at all. It is a picture of what one model produced from a specification that had already been through a review gate — which makes 33 verified flaws a more interesting number than it would otherwise be, not a less interesting one.
How the review was run
The report is the output of /agentic-architecture: five specialists working in parallel, each with one narrow brief, then a separate verification pass that reads the actual code and the git history and discards what it cannot substantiate. Module 8 names the five specialists and what each one looks for.
The specialists produced 79 raw findings between them. Verification brought that to 50: 33 flaws and 17 strengths. Most of the 29 that went were the same problem found by more than one specialist and merged into a single entry; a smaller number were false positives dropped after the verifier read the code.
The four High-severity flaws
Read the four together before reading them separately, because the shape of the group is the most useful thing in the report. Three of the four are about the save file. The fourth is that the layer holding the save file has no tests. These are not four unrelated defects; they are one untested area and the three problems that grew in it.
F1 — Replay can produce a different result from live play
When two events can legally resolve at the same moment, the code resolves them in the order the two blocks happen to be written in, rather than in the order the events occurred. Playing forward in small time steps reaches one of them first. Loading a save, or using a "skip" control, jumps the clock in a single step and reaches the other first. The two paths then produce different outcomes — a different result, recorded at a different time, with different consequences downstream.
The report locates this in the settle() function, where one block runs ahead of the other, and in the load path, which sets the clock forward and then advances by zero — which is what routes a load through the same branch a skip uses. The verifier confirmed it by replaying the scenario from beginning to end rather than by reading alone.
Why it is High: it contradicts the invariant the architecture is built on. It also contradicts the project's own architecture decision record, which specifies resolution in time order. One of the two is wrong, and nothing in the codebase notices the disagreement.
F2 — The version number covers the envelope, not the contents
The save file carries a version number, which has never been incremented, while the set of recorded action types grew from eight to sixteen. The deeper problem is that the real format is larger than the file. Because loading means replaying, every recorded action is re-checked against today's tuning constants and content rules. Adjust a balance value — which the project's own steering file describes as "a data change" rather than a code change — and actions that were legal when they were recorded are no longer legal, so the replay fails.
Why it is High: a routine content change invalidates existing saves, and the version number, which is the one mechanism that exists to detect exactly this, does not move.
F3 — A save that fails to load is discarded, then overwritten
The load path wraps everything in a single catch that returns nothing. The code underneath it produces genuinely useful diagnostics — unknown save version, delta log epochs must be non-decreasing — and every one of them is thrown away at that boundary. Nothing is logged, copied aside, or quarantined. A fresh session is created instead, and the automatic save, which runs every 30 seconds, writes over the unreadable file under the same key.
Why it is High: put F2 and F3 together and the mechanism is complete. A balance change makes the save unreplayable, the error explaining why is swallowed, and the file is overwritten within half a minute. The user's data is gone, and no signal was produced at any point in that sequence.
F4 — The layer where the first three live has no tests
All 154 tests are in the simulation layer, where they reach roughly 92% of statements. The state layer — save, load, skip, automatic save, and the code that runs when the module is first imported — has none. F1's trigger and F3's swallowed error both live there.
Why it is High: on its own this is not a defect at all; it is the reason the other three could exist without anyone noticing. The suite is thorough about the layer that is pleasant to test, which is the layer that was already deterministic and already correct.
The other twenty-nine
Listed by the report's own titles, grouped by severity. They are worth skimming rather than studying: the point is the texture of what accumulates, not any individual entry.
Seventeen Medium
scenario.ts is the unstable hub and an emerging god object — 1,225 lines, 21 imports, changed by every feature.Twelve Low
Read down the list and the same few kinds keep appearing. Simulation rules copied into the interface, where they can drift apart silently: F11, F12, F22, F24, F32. Missing coverage: F21, F29, and F4 above. Unexplained literal values: F23, F31. Structural growth pressure on one or two files: F7, F8, F18. None of these names is invented for the occasion — they are categories from the 34 flaw types the architecture specialists work through, which is why the report can be compared against the next one rather than read as an essay.
What the same review found working
The report records strengths as well, and deliberately so — Module 8 explains why. Omitting them here would misrepresent a report whose verdict was mixed rather than damning.
| Strength | Impact |
|---|---|
| S1 | Event-sourced domain model with the action log as a single seam. High. |
| S2 | The three-layer dependency direction holds in production code. High. |
| S3 | Single-writer discipline on the write path, enforced end to end. High. |
| S4 | The simulation core is a textbook acyclic graph with pure leaf modules. High. |
| S5 | Half-written saves are structurally impossible. High. |
| S6 | A deterministic headless test seam, with replay-hash assertions. High. |
| S7 | Subsystem cohesion: one mechanic, one file, one test. High. |
| S8 | Randomness discipline: no wall-clock time and no unseeded randomness. Medium-high. |
| S9 | Data-pipeline provenance, with reference-vector testing. Medium. |
| S10 | Errors are surfaced consistently, in the language of the product. Medium. |
| S11 | Fail-fast guards and corruption detection at the simulation's edges. Medium. |
| S12 | No injection or network attack surface. Medium. |
| S13 | Pragmatic abstractions, with their limits written down. Medium. |
| S14 | A lean dependency footprint. Medium. |
| S15 | A single constants file as the source of truth; the interface imports rather than copies. Medium. |
| S16 | A versioned save with a migration switch, present since the first milestone. Medium. |
| S17 | Coverage tooling wired up and correctly gitignored. Low. |
Two of those are worth holding next to the flaw list. S11 says the simulation fails fast and detects corruption at its edges — and F3 is the load boundary throwing those detections away. S16 credits the versioned save with its migration switch — and F2 is that version number not covering what actually varies. In both cases the mechanism was built. What was missing was the check that it still did the job.
Where the risk concentrated
Every architecture report ends with a hotspots list, which is the part to read first if you only read one. This one names three.
| Area | Why |
|---|---|
| The state layer | The least tested and highest risk code in the repository. The save and load paths where data is lost, the import-time boot side effect, and the skip logic that triggers F1. |
scenario.ts | The hub everything routes through. Holds F1's ordering, the incomplete state hash of F13, and the per-feature growth that drives F7. |
| The main interface component | Where copied simulation rules collect (F11, F12, F22, F32), along with the mirror-bypass reads of F6 and the per-feature growth of F18. |
What to take from this
None of the 33 is "the program does not work." The article is explicit that the model "had no significant problems in creating the software in a few hours." What the review found is inherited risk: things that are fine today and expensive at the point where somebody changes a balance value, or adds the seventeenth mechanic, or resumes a save on a second device.
The flaws cluster where the tests are not. That is the single most reusable observation in the report, and you can check it against your own codebase this afternoon without running anything: find the layer with no tests, and it will be the layer where the model was least constrained and least often corrected.
The report ends in questions, not patches. Its last section is five questions for the author — is the F1 scenario reachable in normal play; should a rebalance break old saves or not; is direct access to the live simulation sanctioned or not. That is agentic-architecture being diagnosis only, which Module 8 covers: several of these are decisions somebody has to make, and a tool that quietly picked one would be removing the choice rather than surfacing it.
Two of the four High flaws are contract questions. What does a version number promise? What does a save guarantee about a future release? Those are answerable in a paragraph before any code exists, and they are exactly the kind of question pushback asks of a specification. By the time they appear as F2 and F3 they are a load path, an automatic save timer, and a data-loss sequence — which is Module 2's cost gradient, visible in one codebase.
One report, one codebase, produced by the author of the methodology this course teaches. There is no control condition, and no comparable review of a human-written codebase of the same age and size to set beside it — so nothing here establishes that 33 flaws in 10,500 lines is a high number. It might be an ordinary one.
What the report does have is a stated method, a verification pass, and findings specific enough to disagree with individually — which is more than most of what gets quoted in this area. Treat it as a worked example of what the review produces, not as a measurement of what AI-assisted code is like. The appendix “How good is the evidence?” is where the wider literature sits.
Why small specs
A 50-line diff is not just easier to review than a 5,000-line diff. It is easier to review reliably — and that is a different claim, with different evidence behind it. This appendix makes the case for keeping specs small, and then argues about where you are allowed to cut.
Nothing in the course depends on this page and no assessment question draws on it. Unlike the evidence appendix, though, this one is prescriptive: it ends with a decomposition procedure you can apply to the next spec you write.
The short version, if you only want one line: review quality falls off with size for humans and for models, for unrelated reasons that compound — but size is the alarm, not the place to cut. You slice a spec on independent value, never on length.
Everything else in this course is about putting a review gate somewhere. This page is about the one variable that decides whether the gate works at all: how much you ask it to look at.
The number you half-remember is real
Most engineers have absorbed a rule of thumb along the lines of "review quality collapses somewhere past a few hundred lines." Almost nobody can cite it. It comes from two places, and they agree with each other more closely than you would expect.
The first is Karl Wiegers' 1995 write-up of inspection practice, which converts a reading-rate finding into a size limit:
Data in the software literature indicates that slowing the preparation and inspection rates increases the number of bugs found, with the optimum balance around 150–200 lines of code per hour. […] This rule limits the quantity of material that can be covered in a single inspection to about 8–12 pages of design or text documents, or 300–400 lines of source code.Karl Wiegers, "Improving Quality Through Software Inspections", Software Development, April 1995
Note the second half of that sentence, because it is the part this appendix is actually about: the same constraint that caps a code review at 300–400 lines caps a document review at 8–12 pages. The limit was never specific to code. It is a limit on how much material a reviewer can hold in mind at one time, and a specification is material.
The second source is the largest study of lightweight code review ever run: SmartBear's case study at Cisco Systems, covering 2,500 reviews of 3.2 million lines of code by 50 developers over ten months ending in May 2006. Its findings on size:
| Finding | What the study says |
|---|---|
| Defect density by size | "Reviewers are most effective at reviewing small amounts of code. Anything below 200 lines produces a relatively high rate of defects." Above that it falls away: "no review larger than 250 lines produced more than 37 defects per 1000 lines." |
| Recommended batch | "Review between 100 and 300 lines of code at a time and spend 30–60 minutes to review it." |
| Reading speed | "Inspection rates less than 300 LOC/hour result in best defect detection. Rates under 500 are still good" — and detection degrades sharply above that. |
| Session length | "Total review time should be less than 60 minutes, not to exceed 90. Defect detection rates plummet after that time." |
Neither source is a randomised trial. Wiegers is a practitioner paper summarising the inspection literature of its day; the Cisco study is a vendor case study published by the company selling the review tool, with no control condition. Both are credible and widely used, and neither would survive being described as "the research shows."
There is also an arithmetic trap in the headline finding. Defects per thousand lines falls as the review grows partly because the denominator is growing. Part of that curve is caused by the arithmetic, not by reviewers paying less attention. What the arithmetic does not explain away is the reading-rate result — reviewers who go faster find fewer defects in absolute terms — and that is the finding the size limit actually rests on.
What contemporary practice converged on
The stronger evidence is not a threshold study at all. It is the observation that when many independent organisations moved from formal inspection to lightweight review, they all converged on roughly the same size — without coordinating, and without citing Wiegers.
Rigby and Bird measured this across open-source projects and industrial ones, and the medians are startling if your mental model of a code review is a big pull request:
| Project | Median lines changed per review |
|---|---|
| Apache | 25 |
| Linux | 32 |
| Android | 44 |
| AMD | 44 |
| Chrome | 78 (median 5 files) |
| Lucent — traditional formal inspection, for contrast | 263 |
Their reading of it is the useful part: "By creating smaller changes, developers can work in shorter intervals," and the distributions are left-skewed, meaning "the majority of changes are small" was the norm rather than the exception. Only 23% of Chrome changes were as large as a median Lucent inspection.
A CL, or "changelist", is Google's term for one reviewable change — their equivalent of a pull request. Google's published guidance says the same thing prescriptively, and adds the dimension that a line count misses:
Small, simple CLs are: Reviewed more quickly. […] Reviewed more thoroughly. […] Less likely to introduce bugs.Google Engineering Practices — Small CLs
There are no hard and fast rules about how large is "too large." 100 lines is usually a reasonable size for a CL, and 1000 lines is usually too large, but it's up to the judgment of your reviewer. […] A 200-line change in one file might be okay, but spread across 50 files it would usually be too large.Google Engineering Practices
Note that Google refuses the thing this appendix is doing — it will not treat a line count as a threshold, only as a prompt for a reviewer's judgement. That is the honest reading, and it is compatible with the argument here: what follows is a ceiling past which the evidence says review degrades, not a number to enforce.
It is a ceiling, not a target — the point past which the practitioner literature says review stops working, not the size you should be aiming for. The working medians of teams that review well are an order of magnitude below it: 25 to 80 lines. If your specs routinely produce 400-line branches you are at the edge of what a careful human reviewer can do, not comfortably inside it.
And spread matters as much as volume. PAAD's vibe skill already encodes this: it warns at four or more files, or crossing module boundaries, regardless of how few lines are involved. Same instinct, different unit.
The automated reviewer has the same problem, for different reasons
The obvious hope is that agentic-review escapes all of this. It does not get tired, it does not skim, and it will read the ten-thousandth line as carefully as the first. Two of those three are true, and the third is the one that matters.
Model review degrades with size too, through three mechanisms that compound:
| Mechanism | What it does to a large diff |
|---|---|
| Context degradation | Retrieval and reasoning quality fall as the input grows, non-uniformly and well before the window is full. The appendix “How good is the evidence?” has the studies — Lost in the Middle, NoLiMa, and Chroma's Context Rot — and Module 5 has what to do about it. |
| Non-determinism | Any single review pass is a sample of the findings, not an enumeration of them. Module 10 makes this point about re-running reviews; it applies with more force the more there is to find. |
| Attention dilution across specialists | Six specialists each holding a whole large branch is six diluted reviews, not one thorough one. Scoping agentic-review to a directory is the same intervention as splitting the spec, applied too late. |
The first two combine in a particularly damaging way. Suppose a review pass catches any given defect with probability p, and your branch contains n of them. You expect to miss (1 − p) × n. Doubling the size of the change roughly doubles n — and, because the input got longer, lowers p at the same time. A big diff fails twice over: more to find, and a worse chance of finding each one. That is the whole argument in one line, and it applies to the human reviewer and the model reviewer alike.
A July 2026 preprint from Meta describing their internal AI review system puts the trend plainly: "Diffs are growing larger as agents produce multi-file changes in a single session, and external data shows that the vast majority of large code changes now ship without any formal review." Their framing is that "AI coding agents are generating code at volumes that exceed the capacity of traditional peer review."
The same paper is a caution against treating the AI reviewer as the answer: in their comparison, security concerns appeared in 2.0% of AI review comments against 19.1% of human ones, and AI reviewers "over-index on low-signal suggestions." Read that alongside the finding in “How good is the evidence?” that AI assistance degrades your judgement of your own work, and the conclusion is uncomfortable but clear: the thing generating the large diffs is not the thing that can be trusted to review them. The size discipline has to come from you. (Maddila et al., arXiv:2607.29516, 2026 — a preprint, not peer-reviewed.)
agentic-review's pre-flight checks look at your session context, your branch, and your uncommitted changes. They do not look at how large the diff is — and that is the right place for them not to look. By the time a pre-merge gate runs, the code exists and the size is already settled. A gate cannot shrink what it has been handed.
So PAAD puts the size control where it can still change the outcome: phase 1.5 of pushback, which checks cohesion and then size on the spec, before a line is written. vibe carries the same instinct for work too small to spec, warning at four files or a module boundary. The lever exists — it sits at the top of the stack rather than the bottom, which is exactly where the rest of this course keeps pointing.
Which is why this is a spec problem
Diff size is not something you decide at review time. By the time you are running agentic-review you cannot shrink the thing you are reviewing; you can only scope the review and compensate. Diff size is decided much earlier, and mostly by one document.
Module 2's blast-radius hierarchy, restated in units of review load:
| Layer | What its size determines |
|---|---|
| Steering | How much boilerplate every spec inherits. |
| Spec | How many tasks get generated, and therefore how large the branch gets. |
| Task list | How much work arrives in a single session — and how much one alignment pass has to hold. |
| Branch | What the human and the six specialists actually have to review. |
An oversized spec is not a documentation problem. It is a commitment, made before any code exists, to a review you will not be able to perform properly. That is the cheapest possible moment to fix it and the last moment at which fixing it is free.
But size is the alarm, not the place to cut
Here is where this appendix has to argue with itself, because PAAD's own pushback skill contains a rule that looks like a direct contradiction of everything above. From Module 6:
Size alone is never the argument. If a meaningful split exists where each piece delivers independent value, it suggests the split. If the features are genuinely interdependent, it flags the size and explains why splitting is not practical, then moves on.Module 6, on pushback's phase 1.5
That rule is correct and this appendix does not overturn it. The two fit together once you separate detection from decomposition:
| Length | Independent value | |
|---|---|---|
| What it is good for | Noticing that something needs looking at. | Deciding where the boundary goes. |
| What it is useless for | Telling you where to cut. | Telling you to look in the first place. |
| In the skill | Phase 1.5's size heuristics — multiple unrelated areas, a very long document, an implementation touching many modules. Requirement count is explicitly not one of them. | Phase 1.5's cohesion check, which runs first for exactly this reason. |
Cut a long spec at an arbitrary point and you do not get two reviewable specs. You get two specs that cannot be understood or shipped without each other, which is worse than one long one: you have hidden the coupling instead of removing it, and now two review passes each see half a picture. Length tells you to go looking for a seam. It never tells you where the seam is.
A spec that is too long and has no seam is a legitimate outcome. Some features are genuinely indivisible — a protocol change, a data migration that must be transactional, a security fix that is incoherent in pieces. pushback's designed behaviour there is to flag the size, explain why splitting is not practical, and move on. That is the right answer, not a failure.
What it should not be is silent. If you write down why it cannot be split, you have converted an invisible risk into a stated one — and you know to compensate downstream, which is the last section of this page.
Where the seams actually are
Four decomposition strategies, in rough order of how often they work.
| Seam | How to find it | Test that you found it |
|---|---|---|
| Independent value (vertical slice) | Ask what the smallest thing is that a user could actually use. Then what the next one is. | Each spec could ship on its own and someone would be better off. If piece two is worthless without piece three, they are one piece. |
| Capability | Group by the capability being changed rather than the feature being requested — OpenSpec organises specs this way natively. | Each spec names one thing the system can now do that it could not before. |
| Risk isolation | Pull the one genuinely dangerous part — the auth change, the migration, the concurrency — into its own spec. | The risky spec is small enough to review at 150 lines/hour, and small enough that a second person can review it too. The rest stops being blocked behind it. |
| Layer, with stubs | Google's "horizontal split": introduce shared code or placeholder implementations (stubs) so a lower layer can be merged and reviewed before the layer above exists. | Use this one last. It frequently produces pieces with no independent value — which is exactly the failure mode above under a more respectable label. |
Order the pieces, do not just pile them up
A split spec is a chain, not a heap. Each piece should name the piece it depends on, and they should be built in that order — the same principle alignment applies when it presents issues root-cause first, and the same reason fix-architecture refuses to parallelise structural fixes. Dependencies you do not write down get discovered during integration, which is the expensive place to discover them.
Google's stacked CLs pattern is the mechanical version: write one small change, send it for review, and immediately start the next one based on it. Specs stack the same way.
A worked example
Take the data-export feature from Module 7 — the one with the Redis cache nobody asked for. As a single spec it is three requirements, a background worker, an email path, and a rate limiter: comfortably past the point where one review pass will see all of it.
Every cut is on independent value, not on length — and the smaller line count was a result of that, not the reason for it. Notice also what the exercise produced: an explicit row cap that nobody had thought to specify. Decomposition is itself a review technique.
Three splits that look right and are not
- Splitting by line count. "This is 900 lines, so it becomes two 450-line specs." You have not reduced anything; you have made one artefact into two halves that only make sense together.
- Splitting by file or layer with no shippable middle. "Spec 1: the migration. Spec 2: the endpoint." Neither delivers value alone, so neither can really be reviewed alone — the reviewer of Spec 1 has to imagine Spec 2 to judge it.
- Splitting phases of one coherent feature into separate specs.
pushback's own documentation warns against mistaking sequenced phases of a single feature for bundled unrelated features. Phases are a task-list structure. They are not independent value.
When it genuinely cannot be split
Then compensate downstream, deliberately and in writing:
- Say so in the spec. One paragraph naming why the pieces are inseparable. This is the thing a reviewer most needs and least often gets.
- Scope the reviews.
agentic-reviewtakes a path:/agentic-review main src/auth/. Several scoped passes over a large branch beat one pass over all of it, for exactly the context reasons above. - Run more passes. Module 10's rule applies with more force here: a pass returning many findings means more remain hidden behind them. On a large branch, expect to need three passes where you would normally run one.
- Stage the branch even though the spec is whole. An unsplittable spec does not always imply an unsplittable branch. Stacked commits, reviewed in order, recover most of the benefit.
- Insist on the human pass. This is precisely the case where the automated safety net is weakest and where "the AI found no problems" carries the least information.
When a spec implies a branch of more than a few hundred lines, or work spread across more than a couple of modules, go looking for a seam. If you find one that gives each piece independent value, take it. If you do not, write down why in the spec itself and pick up the compensations above. What you should not do is notice the size and then do nothing about it, which is the outcome this page exists to prevent.
The counter-argument, which is real
Splitting is not free, and a page that only argued one side would be the kind of unchallenged input this whole course is against.
| Cost of splitting | What it looks like |
|---|---|
| Fixed overhead multiplies | Every spec carries fixed overhead — context, review passes, a plan, a branch. Five specs pay it five times. Böckeler's "I'd rather review code than all these markdown files" applies more strongly to five documents than to one. |
| The chain can drift | Specs written up front and implemented over weeks go stale against each other. Spec-first SDD has no mechanism to keep them consistent — that is the spec-anchored problem from Module 3, now multiplied. |
| Integration risk moves rather than disappears | Three separately reviewed pieces can each be correct and still not work together. Nothing in this page's argument catches that; only the human holding the whole picture does. |
| Half-features can ship | Independent value is a design constraint, and sometimes it forces a product decision — the row cap in the worked example — that nobody wanted to make yet. |
Which is why the rule is a search for a seam rather than an instruction to split. The claim is not "smaller is always better." It is that past a certain size your review stops being reliable, and you should know that you have crossed the line rather than find out afterwards.
How good is this evidence?
| Claim | Evidence |
|---|---|
| Contemporary teams converged independently on small changes | Good. Rigby & Bird measured it across unrelated open-source and industrial projects; Google's published guidance agrees prescriptively. Convergence across independent organisations is decent evidence even without a trial. |
| Reviewers who read faster find fewer defects | Reasonable. Consistent across the inspection literature and the Cisco data — but that literature is practitioner-generated rather than experimental. |
| Human review degrades past roughly 300–400 lines | Moderate. Two independent sources land on the same range. Neither is peer-reviewed, and part of the defect-density curve is an effect of the growing denominator. |
| Long inputs degrade model output | Strong, but measured on retrieval and question-answering rather than code review. See “How good is the evidence?”. |
| Therefore AI review recall falls as diffs grow | Inference, not measurement. No study directly measures agentic review recall as a function of diff size. It follows from two measured things; treat it as a well-motivated expectation, and notice that Meta's engineers are designing around the same expectation. |
The practical conclusion survives all of those caveats intact, because it does not depend on the threshold being exactly 400. It depends only on the direction — reliability falls as size rises, for both reviewers you have — and on the observation that the cheapest place to act on that is the document you write before any code exists.
Teaching this to your team
The preamble explains why a document cannot do everything a live session can. This appendix is about the step after that one, which is the step people underestimate: the work between a team understanding PAAD and a team actually running it under a deadline. That work is ordinary and it is not large. It also does not happen on its own. If you are the person who will introduce this to other engineers, this is the part to plan for.
Nothing in the course depends on this page and no assessment question draws on it. Like “Why small specs”, it is prescriptive rather than descriptive: it names five things teams run into after the material is understood, and says what to do about each.
The short version, in one line: the explanation is rarely what is missing. What is missing is repetition on real work, one agreed steering file, and dates in a calendar.
The teams I have run this material with rate the sessions highly. That is worth saying plainly, because it makes the first explanation anyone offers — that the material was unclear — an unlikely one. It also cannot settle the question. A rating collected at the end of a session measures how the session felt, not what anyone can still do a month later, and the evidence appendix is sceptical of self-reports for exactly that reason. What I see when I go back is not confusion about the method. It is that people returned to the deadlines they already had, and a method you understand is not yet a method you can perform.
The preamble names the organisational reasons adoption stalls: mismatched expectations, unclear ownership, a senior engineer who is not yet convinced. Those are real. This appendix is about a cause that sits underneath them and is easier to fix — the practice has simply not been performed enough times to be available under pressure. Engineers know this about every other skill they have. Nobody expects to read a debugger's manual and then use it well. It is easy to forget here, because the material is easy to read, and material that is easy to read feels finished.
1. Understanding it and being able to do it are different things
This is what stops teams most often, and it is the hardest thing to see from the inside. A new practice competes with an old habit at the worst possible moment: the point where the work is late and there is the least room to stop and think. At that moment people do what they can already do without having to decide. Reading that you should argue with an agent's plan is one skill. Doing it on a feature that is already late is a different skill, and it is built the way skills are always built — by repetition, on real work, with someone watching the first few attempts.
So do not try to strengthen anyone's intention. Remove the decision instead. Module 5 asks for one documented command for testing, one for linting and one for coverage, and it is explicit that the value is not the tool: it is that developers and agents run the same quality checks through the same commands. The same reasoning applies one level up. Put agentic-review into whatever your team already treats as the list of things that must happen before a merge — the pull request template, the review checklist, the list that a team agrees describes finished work. The aim is not to make skipping the review impossible. The aim is to make skipping it a visible act rather than a silent one.
Then practise once, before it matters. Module 11 sets out a first two weeks for one person. The team version of day 2 is worth doing together: take a spec somebody on the team wrote and is happy with, run pushback on it in a shared session, and read the findings aloud. The findings are not the point. The point is that everyone has watched a colleague disagree with an agent, once, with other people in the room, before they have to do it alone under time pressure.
Most teams contain both. It is tempting to read that difference as one of ability. More often it is a difference in existing habit: the engineers who adopt PAAD quickly are usually the ones who already argued with plans before an agent was involved.
Treat those engineers as pair-programming partners, not as evidence that everyone else is not trying. Somebody who has done this once alongside a colleague is in a very different position from somebody who has only read about it, and an hour of pairing is the cheapest item on this page.
2. One project truth, more than one place to keep it
Module 3 sets out where each tool keeps its project context — CLAUDE.md, .cursor/rules/, .kiro/steering/, .github/copilot-instructions.md, a Spec Kit constitution — and gives the documented fix for the commonest collision: Claude Code does not read AGENTS.md, so CLAUDE.md imports it with a single @AGENTS.md line, or is a symlink to it. PAAD adds no steering format of its own; it reads whatever your tool already reads.
That fix is a paragraph in Module 3 and a decision nobody makes. It is worth making deliberately, because the number of places project context can live grows quietly: a second editor, a colleague who prefers Cursor, a Copilot user, a bot in CI. Each arrival is reasonable on its own, and each one can bring a second document describing what the project is. Module 3 names the real problem exactly — two steering files that slowly start contradicting each other — and Module 5 gives the cost: a wrong statement in a steering file is inherited by every single piece of work that follows. Two files that disagree is that cost, plus the question of which one is wrong. Nothing will tell you. The divergence makes no noise, which is the same reason Module 5 asks you to read each line and check whether it is still true.
So choose one canonical document and make every other location point at it rather than repeat it. AGENTS.md is the reasonable default: it is tool-neutral, read natively by around 25 coding agents, and Module 3 gives both patterns for connecting Claude Code to it. Then check occasionally that the pointers are still pointers. A copy made once, just for now, becomes invisible the moment it is committed.
None of this is a PAAD decision. It is a decision about your repository, and it needs somebody to make it rather than being settled by whoever configured their editor first. It is also the arrangement PAAD's own skills look for: agentic-review and agentic-architecture both scan for CLAUDE.md and AGENTS.md by name before they dispatch anything.
3. Nobody has reviewed your steering file
Steering sits above specs in the cost hierarchy, so getting it right pays off across everything written afterwards. In most teams I have worked with it is also the document nobody has reviewed: written once during setup, by one person, and relied on by everybody since.
It is worth knowing where PAAD does check it, because it does. agentic-review, agentic-architecture and agentic-a11y all read the steering files before dispatching their specialists, and every specialist prompt carries the same instruction:
Steering files (CLAUDE.md, etc.) describe conventions but may be stale. If you find a contradiction between steering files and actual code, flag it as a finding.agentic-review, v1.24.1 — the same caveat appears word for word inagentic-architectureandagentic-a11y, and in paraphrase inagentic-dedup
That is a check against the codebase, which is the only place most steering claims can be tested at all: “we use dependency injection here” is true or false relative to the code, and reviewing the document with nothing to compare it against would be guessing. So the placement is sensible. What no skill's stated scope covers is a review of a steering file as a document, before anyone relies on it — pushback's description names “a spec, PRD, requirements doc, or design plan”, and steering is not in that list. Nothing stops you from pointing pushback at one; that is your judgement rather than the skill's stated scope.
Two things follow, and both need an owner:
- Read the steering files yourself, on a fixed date. Module 5 gives the test: line by line, is this still true. Do it before the first spec, then put the next pass in the calendar, because nothing else will remind you. A steering file that has gone out of date still loads without complaint.
- Treat a steering contradiction reported by
agentic-reviewas a finding about the steering file. It arrives inside a report about a branch, which makes it easy to read as noise attached to somebody's diff. It is the cheapest correction PAAD will hand you: one edit, and everything written afterwards starts from the corrected version.
4. The architecture pass that is scheduled for “later”
Module 8 is careful to say that agentic-architecture is not a gate: it is a diagnosis you run periodically, rather than something every feature passes through. Module 11 adds when to start — once the rest feels routine, and only when you are ready to act on the results, because a report you ignore is worse than no report. Both statements are right, and together they are the sentence teams use to postpone the pass indefinitely. “Later” is a plan only once it has a date.
Postponing it is different in kind from skipping a gate, and the difference is worth stating. pushback, alignment and agentic-review all act at or before the moment code arrives, so they slow down how quickly new debt accumulates. agentic-architecture is the step that gives an experienced developer a way to manage the debt that is already in the codebase. Leave it out indefinitely and you keep the part of PAAD that slows new debt while losing the part that addresses what is already there — which is usually the part that made an established team interested in the first place.
Attach the pass to something that already recurs — a release, a quarter, whatever planning cycle you have — so that running it does not depend on one person arguing for it each time. Decide before you run it who owns the report and how much time is set aside to act on it, and reserve that time in the same conversation. fix-architecture works one flaw at a time, test-first, on a feature branch, and is resumable across sessions (Module 8). That is a body of work rather than an afternoon, and the time for it is much harder to find once the report already exists than before.
Module 11's brownfield sequence puts the architecture pass early rather than late, because on an inherited codebase the first report is not a periodic health check — it is what tells you whether the codebase can carry the rest of the method. That changes when you run it. It does not change the sentence above: what needs a date is the work after the report, and that is just as easy to postpone when the report arrived in week three as when it arrived in month six.
5. On an inherited codebase, the order is what slips
Module 11 gives a six-step sequence for bringing PAAD to a codebase that already exists: commit the artefacts, validate the steering, build a suite that pins current behaviour, take an architecture baseline and argue with it, work the resulting roadmap, and supply the judgment none of it can. Most teams that adopt PAAD are adopting it into a codebase like this. The sequence is not difficult and it is not controversial. What happens to it is that the order changes.
It changes in a predictable direction. agentic-architecture is the interesting step — it produces a document, it produces it quickly, and it makes visible something everybody already suspected about the codebase. Step 3 is the opposite of interesting: it is weeks of writing tests that assert behaviour you know to be wrong, producing nothing anyone can demo. So the baseline gets run first, the report exists, the report is right, and now there is a prioritised list of structural fixes and no safety net to make any of them on. At that point the team either stops, or starts refactoring without tests — which is the failure this whole method was assembled to prevent.
So make the safety net the visible thing. test-roadmap is unusually well suited to being tracked in public, because it reports where it is at the end of every run — Phase 8 of 14 — 7 done, 6 to go — and each phase lands as its own commit. Put that fraction wherever your team already looks at progress. A number that moves every few days survives a planning conversation; "we are writing tests" does not.
Two smaller items in that sequence also need somebody to decide them once, for everyone:
- Whether AI artefacts are committed. Module 11 makes this a strong default rather than an absolute, which means it is a decision, which means it needs to be made deliberately rather than by whoever creates the first report. Agree it once, write it in the steering file, and settle the one exception PAAD names for itself — security entries in a review backlog on a repository that is public or shared outside the team — before the first push rather than after.
- Who reads the architecture report. Step 4 asks you to run
pushbackon it and then bring what the tooling could not see: the outage behind the retry loop, the constraint that made a class ugly on purpose. That is not a review anybody can do from the report alone. It wants the person with the longest memory of the system, and an hour of their time booked in advance.
What the extra work actually is
Written out, the whole of it is smaller than most teams expect. That is an argument for planning it rather than for skipping it: work this small is exactly the kind that never acquires an owner. The times below are my own rough estimates from doing this with teams, not measurements.
| Work | Who | When | What it costs, and why it is worth it |
|---|---|---|---|
| Choose the canonical steering document; point the other locations at it | One person, once | Before the team starts, not after | About half a day. Prevents two documents that quietly disagree, which is expensive to correct later because nothing fails when it happens. |
| Read the steering files line by line and edit them | Whoever knows the project best | Before the first spec, then on a repeating date | An hour or two per pass. Everything written afterwards starts from this document. |
One shared pushback session on a real spec | The whole team | Week 1 | About an hour. This is the session people remember. |
| Put one review into the merge checklist | Whoever owns the pull request template | Week 1 | Minutes of work, and it is what makes the review survive a deadline. |
| Pair on the first live runs | The engineers who picked it up quickly, with everyone else | Weeks 1–3 | About an hour each. This and the shared session are what build the habit; the other rows only protect it. |
Book agentic-architecture and the work that follows it | Whoever owns the roadmap | A named date, attached to a cycle you already have | The pass itself is cheap. Acting on it is not, which is why the time has to be reserved in advance rather than found afterwards. |
| Agree whether AI artefacts are committed, and write it in the steering file | One person, once | Before the first report exists | Minutes. Left undecided it is settled by whoever generates the first report, and a security backlog in a public repo is expensive to un-commit. |
Work the test-roadmap to the end, with the phase count visible brownfield | A named owner, not the whole team | Before any structural fix | Weeks, on a real codebase. It is the least demonstrable work in the sequence and the only thing that makes the rest of it safe. |
| Read the architecture report against what is not in the repository brownfield | Whoever has the longest memory of the system | The week the report lands | An hour or two. It is the only step that can supply the reasons the code is the way it is, and it cannot be done later by someone else. |
None of that is difficult and none of it is surprising once it is written down. The reason to write it down is that every line of it is work with no default owner, and a method with no owner stays in the training material. If you would rather not do it alone, the preamble says where to find me. If you would rather do it yourself, everything on this page is something you can run without me — the only real failure is assuming it will happen without anybody doing it.
Terminology
Every term the course relies on, in one place, with the module that introduces it. Not meant to be read straight through — meant to be the page you turn to when a word arrives before its explanation does.
Nothing here is new material; it is the course's vocabulary pulled out of its narrative order. Each entry names the module where the idea is actually developed, so if a one-line definition is not enough you know where to go. Terms are grouped by kind and alphabetical within each group.
If you are joining a team that already uses PAAD and want the shortest possible orientation, read the first two tables and skip the rest.
PAAD itself
| Term | What it means |
|---|---|
agentic-a11y | Accessibility review skill. Scans a UI for barriers, organised by who they affect, against WCAG 2.2 AA. "a11y" is the standard abbreviation for "accessibility" — eleven letters between the a and the y. Module 9. |
agentic-architecture | Structural diagnosis of a whole codebase. Five specialists, 34 flaw types, then a verification pass. Reports; proposes no fixes. Run periodically, not per feature. Module 8. |
agentic-dedup | Experimental. Hunts semantic duplication — code that means the same thing behind different names. Reports only. Module 11. |
agentic-review | Pre-merge gate. Six specialists on your branch diff, then verification, then findings sorted into three categories. Module 9. |
alignment | Checks an intent document against an action document in both directions, then rewrites the tasks into red/green/refactor form. The second A. Module 7. |
| Defense in depth | Layered protection, so that no single check has to catch everything. The organising metaphor of the whole toolkit — and the reason PAAD is a set of gates rather than one clever pass. Module 2. |
| Discipline | The D. Not a technique but the habit of applying the other three every time, including when the change is small and the deadline is close. Module 9. |
| Engineering-driven AI | PAAD's tagline and its whole proposition: you see what the AI is about to do while you can still change it. The inverse of AI-driven engineering, where the assistant sets the pace and you find out what it decided when the code lands. Module 1. |
| Experimental skill | A skill exempt from PAAD's versioning promise. Arguments, output paths and behaviour can change in any release, including a patch. Currently agentic-dedup, rethink and test-roadmap — but which skills sit here changes too. Module 11. |
fix-architecture | The treatment to agentic-architecture's diagnosis. Consumes a report and works through findings one at a time, test-first, on a feature branch. Module 8. |
| In-scope / out-of-scope | How agentic-review decides what is yours to fix. In-scope: your branch caused or worsened it. Out-of-scope bug: pre-existing, goes to a backlog rather than blocking your merge. Out-of-scope addition: something your branch added that no spec promised. Module 9. |
makefile | Generates a project Makefile so developers and agents run the same checks through the same commands. Module 5. |
| PAAD | Pushback, Alignment, Architecture, Discipline — four common failure modes in AI-assisted development, and the skills that address each. Pronounced "pad". Open source, MIT-licensed, by Curtis "Ovid" Poe. Module 1. |
paad/ | The directory the Claude Code plugin writes its reports into, inside your repository — paad/pushback-reviews/, paad/architecture-reviews/, paad/code-reviews/, paad/test-roadmap/. Reports are files you keep, not chat output you lose. The Kiro and Antigravity port writes to .reviews/ instead, and the names may be standardised further in a later release. Modules 6–9, 11. |
| Per-feature loop | The seven-step cycle that assembles the four letters into a repeatable rhythm: spec → pushback → tasks → pushback → alignment → implement → agentic-review. Module 10. |
pushback | Critically reviews a spec before anything is built from it. Six categories, one issue at a time, worst first, each with options. The P, and the recommended first skill to adopt. Module 6. |
rethink | Experimental. Argues with an answer rather than a spec — including one of pushback's — by testing whether the assumptions a chosen option rests on are actually true. Module 11. |
| Skill | A markdown instruction file, conventionally SKILL.md, that a coding assistant loads on demand and follows. Not code and not a model — a written procedure. PAAD is about a dozen of them. Module 1; installing and invoking, Module 11. |
| Specialist | A sub-agent given one narrow brief — security, coupling, error handling — and run in parallel with others, so that problems cannot hide in a single reviewer's blind spot. Module 2; in detail, Modules 8 and 9. |
test-roadmap | Experimental. Builds a suite that pins current behaviour, proving each test works by injecting the bug it claims to catch. The only PAAD skill that writes and commits code. Module 5. |
| Verification pass | A second, separate stage that takes raw findings and tries to disprove them, reading the actual code and git history to discard what it cannot substantiate. The thing that makes automated review usable rather than noise. Module 2; the evidence for it, "How good is the evidence?" |
vibe | Guardrails without heavy process, for small changes — roughly one to three files in one module. Pre-flight checks, then mandatory red/green/refactor. Not to be confused with vibe coding, which is what it exists to make safer. Module 9. |
Working with coding agents
| Term | What it means |
|---|---|
AGENTS.md | An open, tool-neutral steering file format read natively by many coding agents. Stewarded by the Agentic AI Foundation under the Linux Foundation. Claude Code does not read it directly — import or symlink it from CLAUDE.md. Module 3. |
| Antigravity | Google's agentic development platform, and one of the environments PAAD provides skills for alongside Claude Code, Cursor and Kiro. Installing for it copies two directories into your project: .agent/skills/, which Antigravity discovers, and .kiro/skills/, which holds the content those files point at. Module 11. |
CLAUDE.md | Claude Code's steering file, at the repository root or in .claude/. Personal preferences go in ~/.claude/CLAUDE.md; gitignored notes in CLAUDE.local.md. Module 3. |
| Constitution | Spec Kit's near-relative of a steering file. A steering file mostly records facts (this is the stack); a constitution records principles (this is a trade-off we have already settled). Module 3. |
| Context clash | Two things in the context window contradict each other and the model has no reliable way to know which wins. One of four long-context failure modes. Module 5. |
| Context window | Everything the model can see at once — your prompt, the conversation so far, and whatever files have been read into it. Measured in tokens; 200K and 1M are common sizes. Quality degrades well before it is full. Module 5. |
| Distraction | So much accumulated history that the model relies on it instead of reasoning about the current problem. A long-context failure mode. Module 5. |
| Non-determinism | Run the same skill on the same document twice and you get overlapping but not identical findings. A real limitation, and the reason the loop tells you to run reviews more than once on work that matters. Modules 6 and 10. |
| Pi | A terminal-based coding agent with its own package manager, unrelated to the other tools named in the course. PAAD provides an experimental package for it. Module 11. |
| Plugin / marketplace | How Claude Code distributes and installs bundles of skills. PAAD is a third-party marketplace, which means auto-update is off by default and you install updates yourself. Module 11. |
| Poisoning | Something false enters the context — a hallucinated function name, an uncorrected assumption — and is treated as fact for the rest of the session. A long-context failure mode. Module 5. |
| Quadratic slowdown | Each new token is compared against every token already in the window, so the cost of generating one grows roughly in proportion to the context length — and the total for a long session with its square. A full window is slower as well as worse. Module 5. |
| Semantic versioning | The 1.24.1 scheme: first number for a breaking change, second for a feature, third for a fix. PAAD's stable skills honour it; the experimental ones are exempt. Module 11. |
| Slash command | Typing a skill's name with a leading slash — /pushback. The fully-qualified form /paad:pushback always works; the bare form works when no other installed skill shares the name. Plain English works too. Module 11. |
| Steering file | A document your assistant loads at the start of every session, holding what is true for the project rather than for one feature. Projects usually have more than one. Sits above specs in the cost hierarchy, so an error in it is inherited by everything. Named in Module 2; what to put in one, Module 5. |
| Sub-agent | A separate agent instance dispatched to do one scoped piece of work with its own fresh context, reporting back. How PAAD runs specialists in parallel. Module 2. |
| Token | The unit models read and write in — roughly three-quarters of a word. Both the billing unit and the unit context windows are measured in, which is why the course treats context as a budget. Module 1. |
| Yes man | The course's shorthand for the default behaviour of an assistant: it does what you ask, focused on what you asked, and does not challenge the request. Not a bug — instruction-following is the design. Module 2. |
Spec-driven development
| Term | What it means |
|---|---|
| Kiro | AWS's SDD toolkit. Three markdown documents per feature — requirements, design, tasks — plus a steering directory. The easiest of the five to hold in your head. Module 3. |
| MDD | Model-driven development. The 2000s-era idea that you write a model and generate the system from it. Failed because of inflexibility, and it is the historical warning Böckeler aims at SDD. Module 3. |
| OpenSpec | An SDD toolkit organising specs by domain and expressing each change as a spec delta, so a reviewer can read what changed without reading the code. Module 3. |
| PRD | Product requirements document. One of the artefact names pushback recognises, alongside spec, requirements and design plan. Module 6. |
| SDD | Spec-driven development. Writing a spec before writing code with AI, and treating that spec as the source of truth for both human and model. The practice PAAD assumes you are already following. Module 3. |
| Spec-anchored | The middle rung: spec-first plus keeping the spec updated after the feature ships, so the next change starts from the spec rather than from the code. Rarely sustained. Module 3. |
| Spec-as-source | The top rung: spec-anchored plus humans editing only the spec and never the code, which becomes generated output. Tessl is exploring it. Module 3. |
| Spec delta | OpenSpec's unit of change — a description of what this change does to the spec, rather than a rewritten spec. Module 3. |
| Spec-first | The bottom rung, and the one every SDD approach reaches: a considered spec is written before the code and drives that piece of work. Stopping here — as most teams do, and as PAAD's gates assume — means drift starts the moment you merge. Module 3. |
| Spec Kit | GitHub's SDD toolkit. Constitution, specify, plan, tasks, implement, with optional gates. The most customisable of the five. Commands are namespaced: /speckit.specify. Module 3. |
| Superpowers | A separate open-source methodology for coding agents — brainstorm, design, plan, execute — and the one PAAD's README names as compatible with it. It includes its own review, TDD and verification skills, and the two are designed to be used together rather than chosen between. Module 3. |
| Tessl | The only toolkit Böckeler found explicitly aspiring to spec-anchored, and the only one exploring spec-as-source: one spec file per code file, generated code marked do-not-edit. Module 3. |
| Vibe coding | Describing what you want in chat, accepting the diff, and moving on — a term Andrej Karpathy coined in early 2025. Fine for a prototype you will delete; expensive by month two on anything you keep. Modules 2 and 3. |
Software-engineering terms the course assumes
| Term | What it means |
|---|---|
| ADR | Architecture decision record. A short document recording one decision, the alternatives considered, and why this one was chosen — kept in the repository so the reasoning outlives the people who were in the room. Appendix “What the Fable review found”. |
| Blast radius | How far the consequences of one defect spread. A bad ticket costs you some bad code; bad steering costs you every spec you ever write. The reason review effort is worth most at the top of the stack. Module 2. |
| Boilerplate | Standard wording or code repeated in many places because the format requires it, not because it says anything new. In a steering file it is the background every spec inherits whether it needs it or not. Appendix “Why small specs”. |
| Chatty calls | A design that makes many small network round-trips where one larger call would do. Cheap in a diagram, expensive in production. Module 8. |
| CL (changelist) | Google's term for one self-contained change submitted for review — their equivalent of a pull request. The "small CLs" guidance quoted in the appendix is about the size of a single one. Appendix “Why small specs”. |
| Code smell | Something that is not a bug but suggests a deeper design problem — an over-long function, a class doing three jobs. The dominant category of issue in AI-authored code, according to the largest study of real production code. Module 8; the evidence, "How good is the evidence?" |
| CVE / CWE | A CVE is one specific publicly catalogued vulnerability in one product. A CWE is the class it belongs to — SQL injection, hard-coded credentials. Security research counts CWEs; incident reports cite CVEs. Modules 6 and the evidence appendix. |
| Distributed monolith | Services split apart on paper but so tightly coupled that they must be deployed together. The cost of microservices without the benefit. Module 8. |
| Event sourcing | Storing a system's history as the list of actions taken, and rebuilding the current state by replaying that list, rather than storing the state itself. Powerful, and it makes replay-produces-the-same-answer an invariant the whole design then depends on. Appendix “What the Fable review found”. |
| Fable | The AI coding system whose unassisted output the course's case study examines — not the name of the codebase reviewed, which the published report redacts. It built roughly 10,000 lines in a few hours from specifications that were themselves prepared with PAAD; PAAD was deliberately withheld from the implementation. Module 2; appendix “What the Fable review found”. |
| God object | A class or module that has accumulated responsibility for everything, so every change touches it and nothing can be tested in isolation. Module 8. |
| Gold-plating | Building more than was asked for — an extra option, a cache, a more general design — because it seemed like an improvement. alignment's scope-compliance check exists to find it. Module 7. |
| Happy path | The route through a feature where nothing goes wrong: valid input, no errors, no unusual timing. Specs describe it and forget the rest, which is why partial coverage is a category of its own. Module 7. |
| Idempotency | The property that doing something twice has the same effect as doing it once. Its absence is why a retried payment can charge twice. Module 8. |
| Inspection rate | How fast a reviewer reads the material under review. The inspection literature puts the optimum around 150–200 lines per hour, which is where the 300–400 lines (or 8–12 pages) per session limit comes from. Appendix “Why small specs”. |
| Leaky abstraction | An interface that forces callers to know how it works internally, so it never actually provides the isolation it promised. Module 8. |
| Magic number | A bare literal value in the code with no name or explanation — if (retries > 3) — so nobody later knows whether 3 was measured, guessed, or copied from somewhere else. Module 8. |
| OWASP Top 10 | The Open Worldwide Application Security Project's periodically updated list of the most critical web application security risks. The checklist agentic-review's security specialist works from. Module 9. |
| Red/green/refactor | The TDD cycle. RED: write a failing test. GREEN: the minimal code to pass it. REFACTOR: clean up what you just wrote. The third step is the one AI almost never does unless told. Named in Module 3; explained in Module 7. |
| Ship | To release something to real users. "It ships on its own" means a piece of work is useful as soon as it is released, without waiting for the rest. Throughout; the appendix “Why small specs” relies on it most. |
| Shotgun surgery | When one conceptual change requires edits scattered across many files. A symptom of responsibility being in the wrong place. Module 8. |
| Spec chain / stacked specs | What a split spec should become: an ordered sequence where each piece names the piece it depends on, rather than an unordered pile. The document-level equivalent of Google's stacked CLs. Appendix “Why small specs”. |
| Spike | A short, throwaway piece of work run to answer one question — can this library do X, how slow is this approach — rather than to produce code you keep. One of the cases where the full loop costs more than it saves. Modules 1 and 3. |
| TDD | Test-driven development. Writing the test before the code. alignment rewrites your tasks into this form, and vibe enforces it. Module 7. |
| Technical debt | Structural compromises that make future work slower. The course's core claim is not that AI creates it but that it creates it at the speed of development, which is faster than anyone reviews. Module 2. |
| Temporal coupling | When two operations must happen in a particular order but nothing in the code says so, and nothing stops you getting it wrong. Module 8. |
| UAT | User acceptance testing. The layer where real users confirm the thing does what they needed — one of the human review layers the defense-in-depth argument draws its analogy from. Module 2. |
| Vertical slice | A cut through every layer of the system thin enough to ship on its own — the seam that makes a split spec reviewable, as opposed to a horizontal cut by layer, which usually leaves pieces with no independent value. Appendix “Why small specs”. |
| WCAG 2.2 AA | The Web Content Accessibility Guidelines, at the middle of three conformance levels. The standard agentic-a11y evaluates against; WCAG2ICT is the adaptation that applies the same criteria to non-web software. Module 9. |
| Worktree | A git feature giving you a second working directory on the same repository, checked out to a different branch. It lets an agent work in isolation, or a test be proved by breaking the code somewhere disposable. Modules 3 and 5. |
Research terms, used only in the evidence appendix
| Term | What it means |
|---|---|
| Control group / baseline | The comparison a study needs before "AI code has N problems" means anything. Its absence is the single most common weakness in the AI-and-quality literature, including in PAAD's own founding case study. |
| Difference-in-differences | A method for extracting causation from natural experiments: compare how a treated group changed against how an untreated group changed over the same period. What makes the Tilburg Copilot study the strongest causal evidence available. |
| DORA | The long-running State of DevOps research programme. Its 2024 and 2025 reports disagree with each other on whether AI adoption helps throughput, which is itself informative. |
| False positive | A finding that is not real. One industrial study at Tencent put static analysis at 76%, rising above 90% once incomplete-context cases are counted; Google's threshold for a tool developers will keep using is under 10%. That gap is the entire justification for PAAD's verification passes. Appendix “How good is the evidence?”. |
| GitClear | A commercial code-analytics vendor whose duplication figures are the most widely repeated claim in this space — and the one with the weakest independent support. |
| Grey literature | Material published outside peer review: company blogs, vendor reports, conference talks. Not worthless, but a 2026 review found 73 of 104 sources on AI technical debt fell into this category, much of it recycling one dataset. |
| METR | The research organisation behind the 2025 randomised controlled trial in which experienced maintainers took 19% longer with AI tools while believing they were 20% faster. METR has since qualified the result itself. |
| RCT | Randomised controlled trial. Participants are assigned to conditions at random, which is what allows a causal claim rather than a correlation. |
If you hit a word in this course that is not on this page and not explained where it appears, that is a defect in the course rather than a gap in your knowledge. The same standard the methodology applies to a spec — ambiguity is the author's problem, not the reader's — applies to the training.