The phases open and close the engagement. The middle — usually two to four months, the bulk of the work — isn't a phase at all.
It's one short cycle, repeated for every change: decide what you want, hand it to an agent, prove it before anyone trusts it.
Every idea below is paired with the real thing — one ordinary week of Harbor Mutual, a fictional but fully worked engagement: two features built end to end, a bug caught, a story bounced.
Why the middle isn't a phase
If checking waits, it piles up — and a pile never gets checked
A traditional project saves up testing and review for the end. When an AI writes the code, that's fatal: it can produce more in a week than a saved-up review queue will ever clear. So the middle isn't phased. It's a loop, and the checking happens per change.
The loop is three beats — Intent, Delegate, Discern — run for every piece of work, large or small. Nothing waits. A change is checked before the next one starts, not weeks later in a batch nobody has time for.
There's no gate at the end of a loop pass, because a pass isn't a phase. There's a merge bar every change clears: checks pass, a fresh agent has graded it, and a human who didn't write it has approved it.
By week four, ten changes had already shipped this way — each one proven before the next began. The week we're watching is deliberately ordinary: nothing on the board is special.
"The implementation, testing, and review phases of a traditional SDLC — collapsed into one cycle, run per change."
Phases 0–3 fixed the problem and built the factory. The loop now grows it into the product, spec by spec.
You get a review queue an AI can outrun by Tuesday. The whole point of the loop is that checking never gets to pile up — it happens on each change, while it's still one change.
Go deeper — the full method
The gated phases open the engagement (0–3) and close it (7–9, C); everything in between — typically 8 to 16 weeks, the bulk of the engagement — runs as this loop. There is no exit gate at the end of a loop pass, because the loop is not a phase. It is how every single change gets built, from the day the Foundation gate closes to the day the backlog is done. It has no batch artifact gate — it has a merge bar that every change clears, and it is left when a human declares the backlog feature-complete.
The loop replaces the implementation, testing, and review phases of a traditional SDLC, collapsed into one cycle and run per change. The moment the pod starts skipping the loop for "small" changes is the moment unchecked work creeps back in. Small and risky is exactly the cheap-to-type, expensive-to-get-wrong case: the worst bugs in agent-built code ship inside changes someone decided were too small to bother checking.
Phase 0 fixed the problem. Phase 1 signed the requirements. Phase 2 chose the architecture. Phase 3 built the factory — the harness, the pipeline, the rails — and proved it on the walking skeleton. The loop now runs everything else.
The whole loop in one picture
Three beats, every time: Intent → Delegate → Discern
Everything in the middle of the engagement is this one cycle. Each beat answers a different question, and skipping any of them is exactly where agent-built work goes wrong.
Decide what you want — clearly enough to check — and write it down as a spec. When the agent can build in minutes, how clearly you said it is what decides whether you got what you wanted.
An agent builds it, inside bounds a human set, from a plan a human approved. Not "go build it" — it's drawing the box the agent works in, then approving its plan before a line is written.
Prove it before anyone trusts it. Checks and a non-author confirm it against the spec. Merge deploys it. Written is cheap now; checked is the bar.
The moment the loop gets skipped for "small" changes is the moment unchecked work creeps back in. Small-and-risky is the cheap-to-type, expensive-to-get-wrong case — the worst bugs in agent-built code ship inside changes someone decided were too small to check.
Go deeper — the full method
The loop is three beats, run for every change, large or small:
- Intent — decide what you want, clearly enough to check, and write it down as a spec.
- Delegate — an agent builds it, inside bounds a human set, from a plan a human approved.
- Discern — checks and a non-author prove it before anyone trusts it; merge deploys it.
The vocabulary the rest of the page leans on: a spec is one feature in one
file in the repo (specs/NNNN-name.md) — the goal, scope in/out, testable
acceptance checks, a risk tier; the agent builds from it, no spec, no build. A
story is that work before it has been made ready. A PR is the
proposed change under review: one spec = one branch = one PR. CI is the
automated checks (build, tests, lint, coverage) on every PR. The grader is a
fresh AI agent that did not write the code and grades it check-by-check against the spec. The
Checker is the pod member who approves a change — never its author. The
Stop hook refuses to let an agent finish with red tests or a broken build. The
rails are the Phase 3 enforcement taken together: CI gates, the grader, branch
protection, and the deploy pipeline.
Beat one — Intent
Nothing enters the loop as a conversation
A story becomes buildable only by clearing one bar first: the Definition of Ready. The test that does the most work is dead simple — could two people build different things from this line? If yes, the line is a wish, not a check.
"Handle errors gracefully" is a wish. "A duplicate submission returns an error with a specific message" is a check. The difference is whether anyone can tell, mechanically, if it's done.
A ready story also states what the change must not touch, answers the silent product decisions (fail open or fail closed? what does a blocked user see?), and names which existing pattern to reuse. A silent decision left unwritten doesn't disappear — the agent makes it for you, fast, unsupervised, and you find out what it chose when something breaks.
At Monday's triage, three stories were on the table. One failed the vague-line test on the spot:
"Show adjusters similar past claims."
"Nobody can write an acceptance check for 'similar' — so nobody can build it. Back to sharpening with Luis. A bounce here costs a conversation; the same vagueness found mid-build costs a redo."
The other two sharpened cleanly into spec 0015 (the fast-path queue) and spec 0016 (duplicate-claim merge).
Vague intent doesn't get fixed downstream. It gets built — fast, and wrong. The hour spent making a spec checkable is the hour that decides everything after it.
Go deeper — the full method
Nothing enters the loop as a conversation. A story becomes buildable only by clearing the Definition of Ready at weekly intent triage:
- Every acceptance criterion passes the vague-line test. "Handle errors gracefully" is a
wish; "a duplicate submission returns 409 with
{ "error": "duplicate claim" }" is a check. - Scope in and scope out are both stated. What the change must not touch is as load-bearing as what it must do.
- The silent decisions are answered. A real product choice left unwritten (fail open or fail closed? what does a blocked user see?) does not disappear — the agent makes it for you, fast, under no supervision, and you find out what it chose when something breaks.
- A risk tier is assigned by the Pod Lead and recorded in the spec.
- The harness context the agent will rely on is named — which existing pattern this change reuses, so the agent extends the codebase instead of inventing a second way to do something it already does.
The Orchestrator then writes the spec — one file, in the repo, durable across sessions: Goal, Why, Scope in/out, Acceptance checks, Risk tier, Delegation plan, Checking plan. The spec outlives the chat that produced it; the agent reads it every session, the grader grades against it, and when behavior changes later, the spec changes in the same PR — a stale spec is a lie that misleads the next reader and the next agent.
Intent is the highest-leverage hour anyone spends in the loop. When the agent can produce the code in minutes, what decides whether you get what you wanted is how clearly you said it — vague intent doesn't get fixed downstream, it gets built, fast, wrong.
Still in Intent — how much rigor
Not every change deserves the same scrutiny
One review depth for everything fails in both directions: reading a typo fix as hard as an auth change burns the pod's scarce attention, and waving an auth change through on a glance ships an incident. So every spec gets a risk tier — and the tier decides the rigor.
- HIGH — auth, payments, personal data, schema changes, anything hard to undo. Tight leash on the agent, the full checking ladder, a security pass, a named human signature.
- MEDIUM — new business logic, integrations, shared services. Standard leash; the grader plus one human checker.
- LOW — UI inside existing patterns, copy, internal tooling. Lighter look — but the grader and the mechanical checks still run.
The Pod Lead assigns the tier and owns it. Anyone can raise a tier on the spot; lowering one always takes a conversation. Risk escalates up, never quietly down.
The two ready stories landed on different tiers, and that decided everything that followed:
New business logic, nothing hard to undo.
Merging claim records is hard to undo, and a wrong merge mangles two policyholders' data.
Neither was over- or under-checked. The tier decided the rigor, not the mood.
Go deeper — the full method
The risk taxonomy lives in the harness so agents see it too.
| Tier | What lands here | What it triggers |
|---|---|---|
| HIGH | Auth/identity, payments, personal or client data handling, schema migrations, public API contract changes, infrastructure and pipeline changes, AI-behavior changes (prompts, models, tool definitions), anything hard to undo | Tight agent permissions, the full checking ladder, a security review pass, a named human sign-off in the PR |
| MEDIUM | New business logic, external integrations, changes to shared internal services | Standard permissions, grader plus a human Checker |
| LOW | UI within existing patterns, copy, internal tooling, additive CRUD on established rails | Lighter review; the grader and the mechanical gates still run |
The tier is assigned per spec at triage and recorded in the spec. Anyone — human or agent — can raise a tier on the spot; lowering one always takes a discussion with the Pod Lead, who owns the tier. Risk challenges escalate up, never down, without discussion.
Beat two — Delegate
Draw the box, approve the plan — then let it build
Delegating is not "go build it." The agent starts in plan mode: it reads the repo and proposes an approach — which files, how it satisfies each check — before it may change anything. A human corrects or approves the plan first.
- Scope — the files it may touch. Everything else is out: "if something outside this needs to change, stop and ask."
- Context — the one pattern to reuse, named. An agent not pointed at the existing pattern will cheerfully invent a second one.
- Permissions — what it may do without asking. Safe commands auto-run; installs, network calls, and gated paths force a human confirm.
Freedom by risk, within one change: loose leash on the parts cheap to undo ("format the log however reads cleanest"), tight leash on the parts expensive to get wrong ("for the keying and the auth check, follow the plan exactly").
On spec 0016 (HIGH), Sara delegated with two leashes — tight on the matching keys and merge write path, loose on the audit-log formatting. In plan mode she pushed on the one thing the plan glossed:
"What exactly is the match key when the policy number is absent?"
"The agent's answer was vague — which is a tell. The plan got an explicit route-to-manual-review path before she approved it. Correcting a plan costs a sentence; correcting a finished build costs a redo."
A script — the Stop hook — fires when the agent tries to finish. With a red test or a broken build, it refuses. "Done" stops being the agent's opinion and becomes a fact about the world.
Go deeper — the full method
Delegating is drawing the box the agent works inside, and approving its plan before it starts. Plan first, always. The agent starts in plan mode: it reads the repo and the spec and proposes an approach — which files it will touch, how it will satisfy each acceptance check — before it may write anything. The Orchestrator corrects or approves the plan, and looks for the one decision the plan glosses over ("what is the counter key when the request has no key?"). Correcting a plan costs a sentence; correcting a finished build costs a redo. The most dangerous decisions in agent-built code are the ones nobody noticed being made — plan approval is where they get noticed.
Three bounds, set per spec:
- Scope — the file patterns the change may touch. Everything else is out, and "if you think something outside this needs to change, stop and ask" is part of the handoff.
- Context — the one canonical pattern to reuse, named explicitly. An agent not pointed at the existing pattern will happily invent a second one, and now the codebase has two.
- Permissions — what the agent may do without asking. The harness auto-allows the safe commands (build, test, lint, reads) and forces a human confirm on the rest: package installs, network calls, anything under a gated path like migrations or auth.
Freedom by risk, within one change. The parts cheap to undo get a loose leash ("implement the log throttling however reads cleanest"); the parts expensive to get wrong get a tight one ("for the keying and the auth check, follow the plan exactly — deviate only by asking"). The box is enforced, not requested: the permission rules hold whether or not anyone is watching, and the Stop hook refuses to let the agent finish with failing tests or a broken build. This hook is the single highest-value automation in the standard — it turns "the tests must pass" from a request the agent might rationalize past into a fact about the world.
Still in Delegate — one agent or many
Spread out to explore; line up to commit
It's tempting to throw a swarm of agents at a feature to go faster. That's how you get agents clobbering each other's edits. The honest rule is a single question.
Are the pieces independent, or tangled?
- Fan out to explore. Three candidate approaches, each written up by its own agent, run in parallel — they touch nothing shared.
- Single-thread to build. One feature writing into shared code gets exactly one agent, start to finish — parallel agents in the same files overwrite each other.
Spread out to explore, line up to commit. The test is independence, not impatience.
Both of the week's specs were features writing into shared code paths — the work-queue service, the intake matching service. So each got exactly one agent, start to finish.
Fanning out would have been faster to start and slower to finish, once the conflicts surfaced.
Go deeper — the full method
One agent or many. Fan out to explore: independent investigations (three candidate approaches, each written up by its own agent) run in parallel because they touch nothing shared. Single-thread to build: one feature writing into shared code paths gets exactly one agent, start to finish, because parallel agents in the same files clobber each other. The test: are the pieces independent (fan out) or tangled (single-thread)? Spread out to explore, line up to commit.
Fanning out a build is one of the named loop failure modes — parallel agents writing the same files clobber each other. Fan out only to explore; one agent writes shared code.
Before Intent — when the answer isn't known
You can't write a checkable line about something nobody has checked
Every beat so far assumed a spec exists. Sometimes it can't yet — and writing one anyway is the most expensive mistake in the loop, because it looks like progress.
When the honest answer is "nobody knows," run a spike.
- Boxed. A time box or a token box, agreed at triage and written down. A spike that runs until it feels finished is just unsupervised building.
- Throwaway, and enforced. Spike work lives on a
spike/branch, and a required check refuses any PR opened from one. The code is read, learned from, and deleted. - The finding is the deliverable. What was assumed, what was tested against which system, what was found, whether the assumption survived. The write-up is committed; the code is not.
The code is the experiment. The write-up is the result — and it's the only thing that outlives the branch.
A story kept bouncing at triage: nobody could say whether the carrier's API deduplicated on the idempotency key, or whether a retry quietly created a second claim. Two people wrote two different acceptance lines for it, which is the vague-line test failing out loud.
Guessing that line would have shipped a claim-duplication bug behind a full set of green tests.
Go deeper — the full method
Why a spec can't cover it. Acceptance criteria that pass the vague-line test cannot be written about behavior nobody has verified. There are only two honest responses, and one of them is a lie: write a precise spec about an unknown — which the grader then dutifully grades against fiction — or find out first.
Why the throwaway rule is mechanical. "It started as a spike" is the most
natural route by which unchecked code reaches production. Spike code has, by design, climbed
none of the checking ladder: no spec to grade against, no coverage bar, no Checker. The
enforcement is a required status check (spike-guard) rather than a branch-protection
rule, because protection rules govern the branch being merged into and cannot express
"refuse this source branch." Unlike the spec gate, it carries no label escape — the route
for spike work worth shipping is to write the spec and rebuild it.
Where they come from, where they go. The Pod Lead opens a spike at triage when a story cannot be made ready; the Architect opens one when a design decision has no evidence behind it. The finding closes the decision-list item, unblocks the stuck spec, and — when it invalidates a Phase 2 decision — feeds the ADR revision that follows, as a HIGH-risk spec like any other. Design gets decided at the design gate and stays revisable afterward; the spike is what earns the revision.
Two failure modes worth naming: the spike that ships (throwaway code talked onto main because it "already works"), and the spike with no finding (the code gets deleted, nothing gets written down, and the pod pays twice — once to run it, again the next time somebody wonders the same thing).
Beat three — Discern
The author never checks their own work
A change is done when it has been proven against its spec by something other than its author — not when the code exists. That's the whole beat. Three layers stand on every change, and the author is in none of them.
- Mechanical gates — build, tests, lint, coverage. Hard blocks; a red one stops the merge, no judgment involved.
- An independent grader — a fresh agent that did not write the code, told so plainly, grading check-by-check against the spec. It's required to run; its verdict advises.
- A non-author human — someone who didn't write it approves the merge. On HIGH risk, also a security pass and a named signature.
Why no author? Their tests prove only what they thought to test. The grader catches the hole the author was blind to — the case they never imagined, so never tested.
On spec 0016, the agent finished with eleven green tests and a clean build. On an unchecked team, that ships. The grader — a fresh agent — failed it:
"NOT MET. A missing policy number is normalized to "" before keying. Every no-policy claim shares one match bucket — two unrelated phone reporters in the same week WILL be merged into one claim. All 11 tests pass with this bug live."
"Fix re-graded clean · security agent passed the data path · Wes signed off by name · checked and merged by Jonah, not the author. The bug existed four hours, all of them on a branch."
The deadliest failure mode is the author grading itself — the agent that wrote the code confirming it works, or the Orchestrator who drove it approving it. It catches nothing the author didn't already think of. Author never approves, no exceptions.
Go deeper — the full method
Written is cheap now; checked is the bar. A change is done when it has been proven against its spec by something other than its author, not when the code exists. The proving climbs a checking ladder — five rungs, each catching what the one below cannot:
| Rung | The check | What it catches that the rung below can't |
|---|---|---|
| 1 | The done-rule in the harness | Sets the bar ("done means checked, not typed"); persuasion only — it enforces nothing by itself |
| 2 | The agent re-checks each turn | The agent's own mechanical slips: the broken import, the test it broke two steps back |
| 3 | The blocking Stop hook | The agent declaring itself done anyway — it cannot finish with red tests or a broken build. But a hook enforces the tests that exist; it cannot enforce a test nobody wrote |
| 4 | The separate grader | The hole the author was blind to: it grades check-by-check against the spec, not against the tests, so it catches the case the author never thought to test |
| 5 | The human / security gate | The judgment calls no machine should own: the risk acceptance, the product call, the security sign-off on a HIGH change |
Rung 4 is where the bug the author's green test suite hid goes to die — and it only works because Intent wrote checkable acceptance criteria for it to grade against. In the rails, the ladder lands as three layers on every PR: mechanical gates in CI (hard blocks: build, tests, lint, 80% coverage on new code); the grader in CI (required to run, advisory verdict — a fresh agent reads the spec in the diff and posts a check-by-check verdict as a PR comment, and it cannot be skipped but its verdict does not block); and the human Checker (hard block: non-author approval on every PR, plus on HIGH risk a security review pass and a named human sign-off recorded in the PR).
You do not run every change up all five rungs — that recreates the review bottleneck the loop exists to remove. The risk tier sets the climb: LOW stops after the grader's advisory pass and a light human look, MEDIUM gets grader-plus-Checker, HIGH goes all the way up. Merge deploys to the client's dev environment automatically. A true emergency merge past a gate requires the Pod Lead plus one other human, an exception label, and a retro agenda item. Two exceptions in a month means the gate or the specs are wrong.
Now watch one change go through
Spec 0016, beat by beat
You've got the three beats; here's a single HIGH-risk change walking through all of them, the way it actually ran at Harbor — from a story on the triage table to deployed in dev, with the grader's catch in the middle. Step through it.
A story clears the Definition of Ready
The duplicate-merge story passes the vague-line test, scope-in and scope-out get stated, and a silent decision surfaces — what does the second reporter see? — onto the decision list with the client's two-day clock. The Pod Lead tiers it HIGH.
One file, five testable checks
Once the client answers the silent decision, the Orchestrator writes spec 0016: goal, scope, five acceptance checks each one testable, the risk tier, the delegation plan, the checking plan. The spec lives in the repo — the agent reads it, the grader grades against it.
Three bounds and two leashes
Scope: the matching service and merge path, nothing else. Context: reuse the existing event-log writer. Permissions: standard, with the schema gated. Tight leash on the keys and write path; loose on the audit-log format.
The plan gets corrected before a line is written
In plan mode the agent proposes its approach. The Orchestrator pushes on the one thing it glosses — the match key when the policy number is absent. The vague answer is a tell; the explicit route-to-manual-review path goes in before approval.
Eleven green tests — and a live bug
The agent builds inside the box. Its own tests pass, the Stop hook lets it stop, CI goes green. But the suite only covers claims that have a policy number. The bug is live and invisible. On an unchecked team, this is where it ships.
A fresh agent catches what green tests hid
The grader — told plainly it did not write this code — walks the checks against the spec, not the tests. It fails check 3: empty-string match bucket would merge two unrelated phone reporters. The verdict posts as a PR comment for the human Checker to read.
Fix, security pass, a named signature
The fix routes no-policy claims to manual review and adds the missing test. Re-graded clean. The security agent passes the data path. Wes signs off by name — the named sign-off HIGH risk requires — and a non-author checks and merges.
Merge ships it to dev, automatically
Merge fires the deploy pipeline; the change lands in Harbor's dev environment with no manual step. The bug lived roughly four hours — all of them on a branch, none of them in dev. The loop is ready for the next change.
Go deeper — the full method
The sequence above is the three beats run end to end on one HIGH-risk change. Intent makes the story ready (vague-line test, scope in/out, the silent decision routed to the decision list on the client clock) and writes the spec — one file, five testable acceptance checks, the risk tier, the delegation and checking plans. Delegate sets the three bounds and the two leashes, then corrects the plan in plan mode before a line is written — the no-policy match key is the decision the plan glossed, and the route-to-manual-review path goes in before approval.
The agent then builds inside the box; the Stop hook holds it to a green suite and CI goes green — but eleven passing tests only cover claims that have a policy number, so the data-mangling bug is live and invisible. Discern is where it dies: the grader, told plainly it did not write the code, grades check-by-check against the spec rather than the tests and fails check 3; the fix re-grades clean; the security-reviewer agent passes the data path; Wes signs off by name (the named HIGH-risk sign-off); and a non-author checks and merges. Merge deploys to dev automatically. The bug lived roughly four hours, all of them on a branch.
What keeps the loop honest
Four short meetings — and two numbers that run the week
None of the meetings asks "what did you do yesterday." When agents do the building, that answer is "the agents wrote a lot," and it means nothing. The meetings point at the two things that actually constrain the loop: the clarity going in, and the review queue coming out.
The daily flow check opens with the queue number — how many changes wait for checking, how long the oldest has waited — not a status round-robin. Weekly intent triage turns stories into ready specs. Retro+ asks of every escaped bug: "which check should have caught it?" and the answer becomes a harness change, not a resolution to try harder.
Two numbers run it. The WIP cap stops the pod opening more changes than it can check. The review-wait tripwire: when the median wait crosses the line, the pod stops starting new work and clears the queue. Review is the loop's real bottleneck — more building can't fix a checking constraint.
The week's numbers, read at Friday's retro:
One trend flagged: the security queue's wait was drifting up to 2.1 days — read on its own line, because averaged in with the rest it would hide until something HIGH had quietly waited a week. Maya took it to Dan outside the room.
Review wait creeps up, everyone keeps starting work, and the loop silts up invisibly until nothing merges. The tripwire exists to make stopping automatic, not heroic.
Go deeper — the full method
Four short meetings replace the ceremony calendar. None of them asks "what did you do yesterday" — when agents do the building, that answer is "the agents wrote a lot," and the number means nothing.
| Meeting | Length | Replaces | What it does |
|---|---|---|---|
| Flow check (daily) | 10–15 min | standup | The queue number first: how many changes wait for checking, how long the oldest has waited. Walk the in-flight changes nearest-done first; every waiting change gets a Checker; vague specs get flagged back to triage; the WIP cap gets enforced; one commitment each. |
| Intent triage | 60 min | refinement | Stories become ready specs: vague lines sharpened, silent decisions surfaced onto the decision list, risk tiers assigned, the backlog ordered. |
| Retro+ | 60 min | retro | Every escaped bug gets the same question — "which check should have caught it?" — and the answer becomes a harness improvement, not a resolution to try harder. |
| Setup review | 30–60 min | (new) | The week's harness changes merge: CLAUDE.md updates, skill and hook improvements, permission tuning — versioned, PR'd, reviewed by the Setup Owner's deputy. |
Two numbers run the week. The WIP cap keeps the pod from opening more changes than its checking capacity can clear — agents can always write more code; the constraint is proving it. The review-wait tripwire is the alarm on the same constraint: when the median wait crosses the agreed threshold, the pod stops starting new work and clears the queue. The security queue is read separately at every flow check — it clears slower, and averaged in with the rest it hides until something HIGH has quietly waited a week.
Two disciplines that make it work
One spec, one change — and the client sees outcomes, never activity
Two habits keep the loop sustainable: changes stay small (one spec, one branch, one pull request), and the client is shown working software, not numbers an agent can inflate.
Small changes. One spec is one branch is one pull request. A small change is cheap to read, cheap to grade, and cheap to revert if it's wrong. The discipline is the same at forty lines as at four hundred — "too small to bother" is how unchecked work sneaks in.
Outcomes, not activity. No PR counts, no "AI productivity" claims in anything the client sees — ever. Agents inflate every activity number; demos and outcomes don't lie. Published research backs the caution: measured teams doubled PR volume while actual delivery stayed flat.
At Friday's 45-minute steering, the adjuster — Gail — drove the demo herself: the fast-path queue and the duplicate-merge flow, live in dev.
Karen, the sponsor, was told plainly: the production needle moves at rollout, not before. Honest beats impressive.
Go deeper — the full method
The client never sees the loop's internals — they see working software on a steady rhythm:
- Biweekly steering, 45 minutes: a live demo in the dev environment, the outcome scorecard (their success metric, the delivery-stability trend, the accepted-as-is trend), the decision list needing their answers, and gate status when a phase boundary is near.
- A weekly five-bullet async summary in between. Written for a busy reader: what shipped, what's next, what we need from you. Claude drafts it from the week's merged work; the Pod Lead corrects and sends it.
- No activity metrics in client materials, ever. No PR counts, no "AI productivity" claims. Agents inflate every activity number; demos and outcomes don't lie.
The internal dashboard is baseline-and-trend with no vanity targets: accepted-as-is rate (the trust signal), review wait median (the real bottleneck indicator), rework/revert and bounce-back-for-unclear rates (intent quality), escaped bugs (each answered at Retro+), the DORA four as trends, and security-review wait on its own line. Never tracked, never reported: velocity, story points, PR count, lines of code. The decision list is the client-facing edge of Intent: every silent decision surfaced at triage that belongs to the product lands there, with the agreed answer clock; a stalled decision list goes to steering as a delivery risk, not absorbed as quiet guessing.
Quality in the loop is per-change; some concerns only exist at the integration level — performance under load, end-to-end journeys across many features, penetration testing. The Quality Engineer plans and runs them as scheduled hardening passes (typically one mid-Build and one before deployment prep); the first pass is also where the test environment gets added alongside dev. Hardening is scheduled work inside the flow, not a phase that gates everything else.
The loop, in one breath
Say it clearly, bound it tight, let no one check their own work
That's the whole middle of the engagement — Intent, Delegate, Discern, run for every change, with the checking happening per change so it never piles up. The beats are one system: sharp intent is what makes checking possible, and independent checking is what makes speed safe. Where to go next: