A note from the author

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

Orientation · Module 1

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 engineeringEngineering-driven AI
The specWhatever you typed, unchallengedpushback argues with it before anyone builds it
The planAssumed to match the specalignment checks both directions
The codeA green CI runagentic-review assigns six specialist reviewers to the PR
The structureDiscovered later, expensivelyagentic-architecture finds it while it is cheap
The decisionsThe model'sYours, 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.

What the tagline is not promising

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.

What a "skill" is, since the word is used in a specific way here

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.

P
Pushback
Weak specs, hidden assumptions, vague requirements, and risky omissions — caught before implementation begins.
A
Alignment
Gaps between requirements, design, implementation plans, and the work that is actually about to happen.
A
Architecture
Structural issues that make code harder to extend, reason about, and maintain over time.
D
Discipline
Consistently applying review, testing, and quality checks instead of skipping them under time pressure.

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 headline result

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.

A caveat worth stating early

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.

Orientation · Module 2

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.

Your codebase shapes the answers you get

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.

ApproachWhat it looks likeDebt trajectory
Vibe codingDescribe 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 + PAADThe 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"
What "steering" means here

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.

Why "defense in depth"

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:

VerifiedHighMediumLowTotal
Strengths79117
Flaws / risks4171233

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.

How that analysis was run, in one paragraph

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.

Read this critically

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.

Orientation · Module 3

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.

The distinction that matters

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.

LevelWhat it addsIn practice
Spec-firstA 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-anchoredPlus: 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-sourcePlus: 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."

Be honest about how far up you climbed

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:

StageWhat it producesThe question it answers
0 · Steering / constitutionPersistent project context, written once and read every session.What is always true here?
1 · SpecifyRequirements: user journeys, behaviour, what success looks like.What are we building, and why?
2 · PlanA technical design: stack, architecture, constraints.How will we build it?
3 · TasksThe plan decomposed into small, individually reviewable chunks.What is the next concrete piece?
4 · ImplementCode, 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.

Stages 1 and 2 are where they disagree

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.

ToolWhere the project context lives
Cross-tool standardAGENTS.md at the repository root. The nearest thing to a convergent answer.
Claude CodeCLAUDE.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.
PAADNone of its own. PAAD reads whatever your tool already reads and adds no steering format.
Claude Code does not read AGENTS.md

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.

A constitution is not quite a steering file

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.

ToolkitWorkflowWorth knowing
Superpowersbrainstorm → worktree → plan → execute → test → review → finishBy 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 GitHubconstitution → specify → plan → tasks → implement, with optional clarify, analyze and checklist gatesThe 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 AWSrequirements → design → tasksThree 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.
OpenSpecpropose → apply → archiveOrganises 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.
Tesslone spec file per code file, with generated code marked do-not-editThe 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.
This table will go out of date quickly

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.

The influential dissent: HumanLayer

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.

  1. 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.
  2. 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.
  3. 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.
  4. 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.

Vibe coding is not a sin

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.

ObjectionWhat it looks like in practice
Overhead mismatchOne 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 bindingShe 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 diffusionA 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 youNothing checks that…PAAD's answer
A specification…the spec is any goodpushback
Tasks generated from it…the tasks match the spec, in both directionsalignment
An implementation…the code does what was specified, safelyagentic-review
Feature after feature…the structure underneath is still soundagentic-architecture
Superpowers is the honest exception

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.

The one-sentence version

Spec-driven development gets your intent written down. PAAD is what interrogates that intent once it has been written down.

Orientation · Module 4

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 seesThe engineer knows
Every line, in secondsWhich lines everything else depends on, and why
That the retry logic is duplicatedThat the gateway already retries, so this layer is the bug
That a validation check looks redundantThat it was added after the outage nobody documented
That the design is internally consistentThat next quarter's traffic breaks it
That two modules should be mergedThat they belong to two teams and three separate release schedules
That the data handling is convolutedThat 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.

The failure mode is not silence. It is confidence.

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 line worth remembering when the reports look clean

"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.

Where this argument has limits

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.

Orientation · Module 5

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."

Practical test

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 modeWhat it looks like in a session
PoisoningSomething 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.
DistractionSo 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.
ConfusionMaterial 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 clashTwo 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.

Coverage is not the goal

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.

The four letters · Module 6 · P

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.

Why cohesion runs before size

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

CategoryWhat it looks for
ContradictionsRequirements that conflict with each other, or with the current state of the codebase.
FeasibilityRequirements that are difficult or impossible given the codebase as it exists today — missing infrastructure, incompatible architecture, dependencies that cannot support the requirement.
Scope imbalanceRequirements wildly disproportionate in effort — one bullet point that is a two-week project sitting next to two-hour tasks.
OmissionsMissing requirements that are implied or necessary — error handling, edge cases, migration paths, rollback plans, monitoring, permissions.
AmbiguityRequirements open to multiple interpretations — vague success criteria, undefined terms, unclear scope boundaries.
Security concernsRequirements 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.

Why "might," not "would"

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.

docs/specs/password-reset.md
# Password Reset Users who forget their password should be able to reset it. - Add a "Forgot password?" link on the login page. - User enters their email address and receives a reset link. - Clicking the link takes them to a page where they set a new password. - The new password must be secure. - Show a confirmation message when the reset succeeds. - Reset links should expire after a reasonable time.
Security
No rate limiting. Nothing stops an attacker submitting thousands of reset requests, which makes your mail provider send a flood of unwanted mail to an address of the attacker's choosing and may get your sending domain blocked.
Security
Account enumeration. "User enters their email and receives a reset link" implies a different response for known and unknown addresses. That difference is a free list of who has an account. The response must be identical either way.
Security
Token properties are unspecified. Single-use or reusable? Invalidated when a new one is issued? Invalidated after a successful reset? Cryptographically random, or derived from something guessable? Every one of these has been a real CVE in somebody's product.
Ambiguity
"Must be secure" is not a requirement. Minimum length? Character classes? Checked against a breached-password list? Can it match the previous password? Without a number, three developers will implement three different rules.
Ambiguity
"A reasonable time" is not a duration. Fifteen minutes and twenty-four hours are both defensible; they are not the same product. Pick one and write it down.
Omission
No session handling. Should resetting a password log out the user's other active sessions? If the reason for the reset is that the account was compromised, the answer has to be yes — and that is a requirement nobody wrote down.
Omission
No failure paths. What does the user see when the token is expired, already used, or malformed? What happens if the email fails to send? Every one of these is a screen somebody has to build, and if the spec is silent the developer will invent something.

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/.

Why one at a time

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.
When not to use it

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.

The four letters · Module 7 · A

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

CheckDirectionWhat it catches
Requirements coverageIntent → actionRequirements 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 complianceAction → intentTasks 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 alignmentBoth, if design docs existDesign 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:

  1. Missing or unclear requirements first. A missing requirement explains why there is no task for it and no design for it.
  2. Design gaps second, where design docs exist — a design gap may explain why tasks are missing or wrong.
  3. 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.

Intent: requirements.md  ·  Action: tasks.md
REQUIREMENTS R1. Users can export their data as CSV. R2. Exports must be rate-limited to 3 per hour per user. R3. Large exports (>50k rows) run in the background and email a download link. TASKS T1. Add /export endpoint returning CSV. T2. Add a background job for exports over 50k rows. T3. Send email with signed download link. T4. Add a Redis cache layer for export queries. T5. Build an admin dashboard showing export history.
Coverage
R2 has no task at all. Rate limiting is a stated requirement with zero corresponding action item. This is the classic silent gap — it ships, nobody notices until someone writes a script that calls the endpoint repeatedly. Presented first: it is a root cause.
Coverage
R1 is only partially covered. T1 handles the happy path. Nothing addresses what happens when a user with no data exports, when the CSV generation fails midway, or when a user requests an export while one is already running.
Scope
T4 traces to no requirement. A Redis cache layer is a real engineering decision with real operational cost. It may be justified — but it was not asked for, and it needs to be either promoted to a requirement or dropped. This is exactly the drift the check exists to catch.
Scope
T5 is a separate feature. An admin dashboard is not part of "users can export their data." It has its own UI, its own permissions model, and its own testing burden. It belongs in its own spec.

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:

StepWhy it produces better AI output
RED — write a failing testDefines 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 passForces 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 wroteThe 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.
The insight hiding in RED

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.

The four letters · Module 8 · A

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.

SpecialistLooks at
Structure & BoundariesModule organisation, responsibility distribution, domain modelling. Finds god objects, shotgun surgery, low cohesion, catch-all utility modules.
Coupling & DependenciesHow components connect, abstraction quality, dependency direction. Finds tight coupling, circular dependencies, leaky abstractions, over-abstraction, temporal coupling.
Integration & DataService communication, data ownership, API contracts, resilience. Finds distributed monoliths, chatty calls, shared databases, missing idempotency.
Error Handling & ObservabilityError 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 QualityAuth, 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.

It reports strengths on purpose

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.

Why fixes are sequential, not parallel

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.

The four letters · Module 9 · D

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.

SpecialistHunting for
Logic & CorrectnessWrong 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 CasesMissing catches, swallowed exceptions, boundary validation, silent failures.
Contract & IntegrationSignature versus callers, type mismatches, broken API contracts, data-shape drift, duplicated logic.
Concurrency & StateRace conditions, shared mutable state, cache invalidation, ordering assumptions.
SecurityInjection, auth gaps, data exposure, OWASP Top 10.
Spec ComplianceMissing 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:

CategoryMeaningWhat happens to it
In-scopeYour 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 additionCode 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.

Pre-flight checks that will stop you

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.

What the pre-flight checks leave to 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.

Stated limitation

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.

The architecture-smell check is the clever one

"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.

Putting it together · Module 10

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.

Why "may repeat" is the important part

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.

Two versions, and the difference matters

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

SkillHow oftenTrigger
agentic-architecturePeriodicBefore a major refactor, when onboarding to an unfamiliar repo, after rapid growth, or when planning a redesign.
fix-architectureAcross sessionsAfter an architecture report exists and you have a feature branch.
agentic-a11yPer UI changeAny UI work, or accessibility-sensitive changes.
vibeInstead of the loopSmall 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.

Putting it together · Module 11

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.

Why does this skill look different?

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.

Keeping it up to date

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:

RouteExample
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.

The order is the content

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.

Check where your install writes

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.

A strong default, not an absolute

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 is a more general critic than its description says

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.

Experimental, and load-bearing

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.

StepWhat it producesWhat breaks if you skip it
1 · Commit the artefactsSpecs, reports, roadmaps and backlogs versioned beside the codeResumable skills lose their memory; the reasoning behind the code stays unwritten.
2 · Validate steeringOne canonical, current steering documentEverything downstream inherits a wrong statement, silently and permanently.
3 · Pin behaviour with tests
/test-roadmap
A suite that goes red when behaviour changes, bugs includedNo 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 wrongYou 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 outcomesThe report becomes a document you have read rather than work you have done.
6 · Supply the judgmentThe decisions that were never available to the toolingConfident, 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.

WhenDo thisBecause
Day 1Install, then run /paad:help to see what is available.Zero risk. Read what each skill claims to do before you need one.
Day 2Run /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 1Add /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 2Add /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 routineRun /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.
Start with pushback

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]
Overview of all skills, or detailed help for one.
/pushback [spec-file]
Critically review a spec, PRD, or design plan before implementation. Six categories, severity-ordered, one issue at a time.
/alignment [files…]
Check requirements against plans in both directions, then rewrite tasks as red/green/refactor.
/agentic-architecture [path…]
Five specialists, 34 flaw types, 14 strength categories. Diagnosis only — proposes no fixes.
/fix-architecture [report]
Work through an architecture report one flaw at a time, test-first. Needs a feature branch.
/agentic-review [base-branch] [path]
Six specialists on your branch before merge. Critical / Important / Suggestion. Run it more than once.
/agentic-a11y [path]
WCAG 2.2 AA review by disability category, across web, mobile, desktop, CLI, and games.
/vibe [task description]
Small changes with guardrails: pre-flight checks plus mandatory red/green/refactor.
/makefile
Creates or updates a project Makefile, so developers and agents run the same checks through the same commands.
/agentic-dedup [scope] experimental
Hunts semantic duplication — code that means the same thing behind different names and control flow. Reports only; never refactors.
/rethink [topic] experimental
Argues with an answer rather than a spec — including one of pushback's. Checks whether the assumptions a chosen option rests on are actually true.
/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.
On the experimental skills

PAAD 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

Spec-driven development (Module 3)

Independent research cited in “How good is the evidence?”

Review size and decomposition (“Why small specs”)

Putting it together · Module 12

Final assessment

Fourteen questions across the whole course. Answer them all to see your score.

Optional appendices follow

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.

Optional appendix

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.

Optional — read it or take the course on trust

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.

StudyFinding
Pearce et al., IEEE S&P 2022The foundational study. Across 89 scenarios and 1,689 generated programs, roughly 40% contained a security weakness.
Fu et al., ACM TOSEMReplication on real repositories rather than synthetic scenarios: 27.3% of 733 snippets contained weaknesses, spanning 43 distinct CWE types.
Cotroneo et al., ISSRE 2025A 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 2025A 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.

The limitation the authors state themselves

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.

Why it feels better evidenced than it is

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.

StudyFinding
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 202420252024 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.

The finding that matters most for PAAD

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.

This strengthens the case for automated review rather than weakening it

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

ClaimEvidence
AI-generated code has more security defectsStrong. Multiple peer-reviewed studies, independent teams, converging direction.
Long contexts degrade outputStrong. Peer-reviewed and replicated, though measured on retrieval rather than code.
AI degrades your judgement of your own workGood. Two independent teams, two outcome variables, same structural finding.
Requirements defects drive failureReasonable. Large multi-country survey; self-reported.
Automated review needs verificationReasonable. Industrial data on both the problem and the remedy.
AI shifts burden from writing to reviewingModerate. One well-designed natural experiment; modest effect size.
AI code carries more smells overallContested. Large studies without baselines; controlled comparisons split.
AI raises duplication in real codebasesOpen. Widely repeated, but the best controlled measurement points the other way.
AI makes developers faster or slowerContested. Rigorous studies point both directions depending on the task.
Defects cost 100× more to fix lateOverstated. 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.

Optional appendix

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.

Optional — and it is one report about one codebase

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.

PropertyValue
SizeAbout 10,500 lines across roughly 65 source files.
History31 commits. Reviewed at commit 06a5cf9.
Written documentationCLAUDE.md, a design document, and 16 architecture decision records.
StructureThree layers with a stated dependency direction: simulation → state → interface.
Tests154, all of them in the simulation layer.
The specification was reviewed. The implementation was not.

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

F5
No error boundary or global error handler; a render exception leaves a blank page.
F6
Six interface components bypass the state mirror and read the live simulation during render.
F7
Shotgun surgery: every new mechanic touches six to ten files across three separate dispatch sites.
F8
scenario.ts is the unstable hub and an emerging god object — 1,225 lines, 21 imports, changed by every feature.
F9
The whole mirror is rebuilt every animation frame, including while paused, with no memoisation.
F10
Inconsistent catch discipline: most store actions wrap the simulation call, three do not.
F11
A cost formula is re-derived in the interface instead of imported from the simulation.
F12
A readiness rule is re-implemented in the interface, including its comparison tolerance.
F13
The state hash omits the very field F1's divergence appears in, so equal hashes do not certify equal state.
F14
The state hash is documented as save verification but is never used on the save or load path.
F15
The save is parsed with a blind type cast; only the version field is inspected, nothing else is validated.
F16
An exception inside the animation frame stops the loop permanently and silently.
F17
The apply-then-save-then-mirror sequence is hand-copied about fifteen times; two skips leave a step out.
F18
Low cohesion in the main interface component: 708 lines mixing simulation data, layout and seven error slots.
F19
The scenario is constructed and storage is read as a side effect of importing the module.
F20
Save failures are entirely silent, while the event log grows without limit toward the storage quota that causes them.
F21
A documented ephemeris test claim is not met: the barycenter branch is never exercised.

Twelve Low

F22
Placement availability diverges between interface and simulation, so a button can enable and then throw on click.
F23
Two bare string literals gate two findings, with no named constants and no test on the copy.
F24
A lag formula is reimplemented at least four times, once in the interface.
F25
The save module reaches into simulation internals directly on load; no restore API exists.
F26
An unused runtime dependency.
F27
An unused development dependency that downloads browser binaries.
F28
A simulation-layer test imports the state layer, contradicting the documented dependency direction.
F29
Zero tests for the interface directory, including two pure modules that would be easy wins.
F30
No automated check that the generated data file still matches the raw data it is baked from.
F31
The same undocumented tolerance value is duplicated about ten times across simulation and interface.
F32
Two limits are enforced only as slider attributes in the interface, making them unnamed business rules.
F33
An untracked directory containing one empty stale lock file.

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.

StrengthImpact
S1Event-sourced domain model with the action log as a single seam. High.
S2The three-layer dependency direction holds in production code. High.
S3Single-writer discipline on the write path, enforced end to end. High.
S4The simulation core is a textbook acyclic graph with pure leaf modules. High.
S5Half-written saves are structurally impossible. High.
S6A deterministic headless test seam, with replay-hash assertions. High.
S7Subsystem cohesion: one mechanic, one file, one test. High.
S8Randomness discipline: no wall-clock time and no unseeded randomness. Medium-high.
S9Data-pipeline provenance, with reference-vector testing. Medium.
S10Errors are surfaced consistently, in the language of the product. Medium.
S11Fail-fast guards and corruption detection at the simulation's edges. Medium.
S12No injection or network attack surface. Medium.
S13Pragmatic abstractions, with their limits written down. Medium.
S14A lean dependency footprint. Medium.
S15A single constants file as the source of truth; the interface imports rather than copies. Medium.
S16A versioned save with a migration switch, present since the first milestone. Medium.
S17Coverage 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.

AreaWhy
The state layerThe 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.tsThe 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 componentWhere 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.

Read this critically

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.

Optional appendix

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.

Optional — but this one changes how you write specs

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:

FindingWhat 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."
Two caveats before you quote these to a colleague

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:

ProjectMedian lines changed per review
Apache25
Linux32
Android44
AMD44
Chrome78 (median 5 files)
Lucent — traditional formal inspection, for contrast263

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.

So where does 400 actually sit?

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:

MechanismWhat it does to a large diff
Context degradationRetrieval 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-determinismAny 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 specialistsSix 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.

This is now an industry-scale problem, not a personal-habit problem

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.)

Where PAAD puts the size control, and why it is there

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:

LayerWhat its size determines
SteeringHow much boilerplate every spec inherits.
SpecHow many tasks get generated, and therefore how large the branch gets.
Task listHow much work arrives in a single session — and how much one alignment pass has to hold.
BranchWhat 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:

LengthIndependent value
What it is good forNoticing that something needs looking at.Deciding where the boundary goes.
What it is useless forTelling you where to cut.Telling you to look in the first place.
In the skillPhase 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.

The honest version of the rule

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.

SeamHow to find itTest 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.
CapabilityGroup 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 isolationPull 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 stubsGoogle'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.

One spec → a dependency-ordered chain of three
ORIGINAL — one spec R1. Users can export their data as CSV. R2. Exports must be rate-limited to 3 per hour per user. R3. Large exports (>50k rows) run in the background and email a download link.
Spec 1
Synchronous CSV export, with an explicit row cap. Depends on nothing. Ships on its own: users who want their data can get it today. The cap is a stated product decision rather than an accident — which is a requirement the original spec never had, surfaced by the act of splitting.
Spec 2
Rate limiting on the export endpoint. Depends on Spec 1 existing. Ships on its own: it makes a live endpoint safe. Note that it is also the security-relevant piece — isolating it means it gets its own review rather than being finding number nine in a long list.
Spec 3
Background worker and emailed download link, lifting the cap. Depends on Specs 1 and 2. Ships on its own: it raises a limit users are already hitting. This is the piece with the queue, the worker, the email template and the signed URL — by far the largest, and now reviewed alone rather than buried behind the easy two-thirds.

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-review takes 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.
A working rule of thumb, offered as a starting point rather than a law

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 splittingWhat it looks like
Fixed overhead multipliesEvery 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 driftSpecs 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 disappearsThree 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 shipIndependent 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?

ClaimEvidence
Contemporary teams converged independently on small changesGood. 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 defectsReasonable. 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 linesModerate. 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 outputStrong, but measured on retrieval and question-answering rather than code review. See “How good is the evidence?”.
Therefore AI review recall falls as diffs growInference, 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.

Optional appendix

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.

Optional — written for whoever introduces this

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.

This is obvious to some people within an hour, and not to others

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 in agentic-architecture and agentic-a11y, and in paraphrase in agentic-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-review as 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.

On a codebase you inherited, this one moves

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 pushback on 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.

WorkWhoWhenWhat it costs, and why it is worth it
Choose the canonical steering document; point the other locations at itOne person, onceBefore the team starts, not afterAbout 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 themWhoever knows the project bestBefore the first spec, then on a repeating dateAn hour or two per pass. Everything written afterwards starts from this document.
One shared pushback session on a real specThe whole teamWeek 1About an hour. This is the session people remember.
Put one review into the merge checklistWhoever owns the pull request templateWeek 1Minutes of work, and it is what makes the review survive a deadline.
Pair on the first live runsThe engineers who picked it up quickly, with everyone elseWeeks 1–3About 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 itWhoever owns the roadmapA named date, attached to a cycle you already haveThe 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 fileOne person, onceBefore the first report existsMinutes. 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 brownfieldA named owner, not the whole teamBefore any structural fixWeeks, 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 brownfieldWhoever has the longest memory of the systemThe week the report landsAn 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.

Optional appendix

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.

How to use this page

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

TermWhat it means
agentic-a11yAccessibility 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-architectureStructural 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-dedupExperimental. Hunts semantic duplication — code that means the same thing behind different names. Reports only. Module 11.
agentic-reviewPre-merge gate. Six specialists on your branch diff, then verification, then findings sorted into three categories. Module 9.
alignmentChecks 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 depthLayered 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.
DisciplineThe 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 AIPAAD'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 skillA 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-architectureThe 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-scopeHow 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.
makefileGenerates a project Makefile so developers and agents run the same checks through the same commands. Module 5.
PAADPushback, 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 loopThe seven-step cycle that assembles the four letters into a repeatable rhythm: spec → pushback → tasks → pushback → alignment → implement → agentic-review. Module 10.
pushbackCritically 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.
rethinkExperimental. 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.
SkillA 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.
SpecialistA 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-roadmapExperimental. 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 passA 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?"
vibeGuardrails 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

TermWhat it means
AGENTS.mdAn 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.
AntigravityGoogle'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.mdClaude 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.
ConstitutionSpec 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 clashTwo 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 windowEverything 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.
DistractionSo much accumulated history that the model relies on it instead of reasoning about the current problem. A long-context failure mode. Module 5.
Non-determinismRun 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.
PiA 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 / marketplaceHow 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.
PoisoningSomething 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 slowdownEach 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 versioningThe 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 commandTyping 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 fileA 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-agentA 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.
TokenThe 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 manThe 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

TermWhat it means
KiroAWS'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.
MDDModel-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.
OpenSpecAn 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.
PRDProduct requirements document. One of the artefact names pushback recognises, alongside spec, requirements and design plan. Module 6.
SDDSpec-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-anchoredThe 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-sourceThe 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 deltaOpenSpec's unit of change — a description of what this change does to the spec, rather than a rewritten spec. Module 3.
Spec-firstThe 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 KitGitHub's SDD toolkit. Constitution, specify, plan, tasks, implement, with optional gates. The most customisable of the five. Commands are namespaced: /speckit.specify. Module 3.
SuperpowersA 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.
TesslThe 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 codingDescribing 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

TermWhat it means
ADRArchitecture 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 radiusHow 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.
BoilerplateStandard 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 callsA 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 smellSomething 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 / CWEA 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 monolithServices split apart on paper but so tightly coupled that they must be deployed together. The cost of microservices without the benefit. Module 8.
Event sourcingStoring 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”.
FableThe 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 objectA class or module that has accumulated responsibility for everything, so every change touches it and nothing can be tested in isolation. Module 8.
Gold-platingBuilding 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 pathThe 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.
IdempotencyThe 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 rateHow 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 abstractionAn interface that forces callers to know how it works internally, so it never actually provides the isolation it promised. Module 8.
Magic numberA 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 10The 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/refactorThe 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.
ShipTo 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 surgeryWhen one conceptual change requires edits scattered across many files. A symptom of responsibility being in the wrong place. Module 8.
Spec chain / stacked specsWhat 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”.
SpikeA 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.
TDDTest-driven development. Writing the test before the code. alignment rewrites your tasks into this form, and vibe enforces it. Module 7.
Technical debtStructural 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 couplingWhen two operations must happen in a particular order but nothing in the code says so, and nothing stops you getting it wrong. Module 8.
UATUser 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 sliceA 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 AAThe 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.
WorktreeA 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

TermWhat it means
Control group / baselineThe 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-differencesA 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.
DORAThe 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 positiveA 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?”.
GitClearA 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 literatureMaterial 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.
METRThe 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.
RCTRandomised controlled trial. Participants are assigned to conditions at random, which is what allows a causal claim rather than a correlation.
A term that is missing from here

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.