top of page

Building a Quality Strategy from Scratch

  • Shawn West
  • Feb 26
  • 9 min read

Updated: Aug 10

"Improve quality." It's the mandate every quality leader eventually gets, and it comes with no map. Most teams answer it by adopting a pile of best practices — more tests, more review, a hardening sprint — and change almost nothing. The strategies that actually move the needle start somewhere else: in the team's own defect data, at the stage where its failures are really born. Here's how one team built theirs from scratch, and the audit you can run this week to find your own starting point.

A director pulls you aside after a rough quarter. Two customer-visible outages, a slipped release, a support queue that won't drain. "We need to improve quality," she says. "Put together a strategy." Then she's gone, and you're staring at a blank page with a mandate that could mean anything.

So you do the reasonable thing. You open a doc and start listing what good teams do: code review on every PR, integration tests, monitoring and alerting, a definition of done, maybe a QA hire. It's all defensible. You format it nicely, present it, get nods. Three months later the outages haven't stopped, the doc is in a wiki nobody opens, and the director is asking why the strategy didn't work.

It didn't work because it was never a strategy. It was a list of practices detached from a single fact about your team. And a list of good practices with no priority isn't a plan — it's a guilt generator.

Why "adopt best practices" feels right and lands nowhere

The best-practices list is attractive for an honest reason: every item on it is genuinely good, and each one is someone's real success story. Code review catches bugs. End-to-end tests catch regressions. Monitoring shortens incidents. None of that is wrong.

The problem is that a best-practices list is optimized for the average team's failure distribution, and you are not the average team. When an industry says "you should have more automated tests," it's answering the aggregate — the composite of a thousand teams whose most common expensive failure is a code-stage regression. If your expensive failures are born somewhere else, pouring effort into more tests is like reinforcing the walls of a house whose roof is the thing that leaks. The effort is real. It just doesn't touch your actual failure.

This is the mechanism, and it's worth stating plainly. A quality strategy is a bet about where you'll spend limited effort to prevent the failures that hurt most. A generic strategy places that bet using someone else's data. A strategy grounded in your own failure history places it using yours. The two produce different plans surprisingly often — and the only way to know which practices belong in your strategy is to look at where your defects are actually being introduced before you choose a single one. That is the discovery-first move, applied to quality itself: don't start from the solution catalog, start from where the system is really breaking. (For the frame this sits inside — quality as a managed system, not a checklist — see What Is Quality Management.)

The one audit that turns "improve quality" into a target

Before any practice, run a defect-origin audit. It's cheap, it uses data you already have, and it converts the vague mandate into a specific target.

Pull your last 30 to 50 defects — incidents, escapement bugs, anything that cost real time. For each one, tag the stage where it was introduced, not where it was found. Those are almost never the same, and the gap is the whole point: a bug discovered in production was usually born much earlier, and the birthplace is what your strategy has to reach.

Use a small, fixed set of origin stages so the tags aggregate:

  • Discovery / requirements — the behavior was ambiguous, underspecified, or wrong before a line was written.

  • Design — the requirement was clear but the chosen approach couldn't satisfy it.

  • Code — the design was sound; the implementation had a defect.

  • Integration — each part worked alone; the seam between them didn't.

  • Deploy / config — the code was correct; environment, flags, or config broke it.

  • Data — the logic was correct; the data it assumed wasn't.

Tag each defect with one origin and its rough cost (hours to resolve is fine). Then total by stage. The stage carrying the most cost — not the most tickets, the most cost — is where your first strategic bet belongs. This is the observable diagnostic: it's repeatable, it's grounded in artifacts, and two people tagging the same defect log should land in roughly the same place.

Walking it: one team from mandate to first bet

(Developed example — composite scenario.)

Take a fourteen-person B2B scheduling SaaS — call it Harbor. It sells appointment-booking software to clinics and salons. After a quarter with two outages and a slipped release, the director hands the quality lead, Priya, the familiar mandate: improve quality, write a strategy.

Priya resists the urge to open the best-practices doc. Instead she exports the last six months of defects from the issue tracker — 41 of them that cost more than an hour — and spends an afternoon tagging each by origin with two engineers who remember the context. Here is what the tally looked like:

Origin stage

Defects

Total hours

Share of cost

Discovery / requirements

13

210

47%

Data

7

95

21%

Code

11

70

16%

Integration

6

48

11%

Deploy / config

4

25

6%

The count of code bugs was high — eleven of them — which is exactly why the team's instinct had been "we need more tests." But the cost told a different story. Nearly half the pain came from thirteen defects born in discovery: features built to a requirement that turned out to be ambiguous or wrong, then discovered in production and rebuilt.

One of them was the worst outage of the quarter. A "reschedule" feature had shipped against a one-line ticket: "Let clinics move a booking to a new time." Nobody had asked what happens across a daylight-saving boundary, or when the new slot is already held, or whether a reschedule should notify the customer. Engineering guessed. The guess produced double-booked slots for two days and a frantic rollback. That defect had a code symptom — a timezone off-by-one — but it was born in discovery, in a requirement that never named its own acceptance conditions. More automated tests would have tested the wrong behavior faithfully.

That single afternoon of tagging did what three months of a best-practices doc hadn't: it told Priya where to aim. Not "write more tests." Stop shipping features whose acceptance conditions were never pinned down. The rest of the strategy is built from that finding, step by step.

Step 1 — Define what "good" means, weighted by the audit

Quality is not a universal constant; a payments system and a marketing microsite both want "quality" and mean opposite things by it. So Harbor named its dimensions and, crucially, ranked them using the audit rather than taste.

  • Reliability — bookings never double-count or silently drop.

  • Correctness of behavior — the feature does what the customer was promised, including the edge cases.

  • Performance, maintainability, usability, accessibility — named, but explicitly ranked below the first two for this quarter.

For each top dimension they wrote one observable standard: "A booking action either fully succeeds or fully fails — never a partial state," measured by a count of partial-state records, which should be zero. "We care about reliability" is a feeling; a number you can query is a standard. (Choosing measures that resist gaming is its own discipline — Quality Metrics That Actually Matter is the companion for that step.) The audit did the ranking work here: correctness-of-behavior rose to the top precisely because that's where the costly defects were born.

Step 2 — Pick a few bets that hit the origin, and write them down

The discipline most teams skip is choosing few. Harbor picked three, and each one pointed directly at a bar in the audit:

  1. Kill discovery-born defects at the source. No feature ticket enters the sprint without a filled acceptance block: the observable success signal, the named edge cases, and the data that proves it. This is a discovery gate, not a testing one — it acts before code exists.

  2. Contain the data-origin cluster. Add a validation check on booking writes that rejects partial states, so the second-largest cost bar can't reach production silently.

  3. Regression-lock the one flow that already burned them. Put the reschedule flow under an end-to-end test that runs on every deploy — targeted at the specific behavior two incidents came from, not coverage for its own sake.

A good bet names the problem, the intervention, and the outcome you expect, and connects back to a dimension you said you cared about and an exposure you actually have. Notice what's not on the list: no blanket "increase test coverage," because the audit said code was the cheapest bar, not the most expensive one.

Alongside the bets, Harbor wrote its non-negotiables — the standards it won't ship without regardless of deadline: no release with an open Sev-1; no booking-write path without the partial-state check; no feature into a sprint without its acceptance block. Non-negotiables are the part of the strategy that holds when pressure arrives, and pressure always arrives. You write them down before the crunch precisely because you can't be trusted to decide them during it. The line between a soft aspiration and a real non-negotiable is enforcement, which is the subject of Quality Gates That Actually Gate — a gate that can be waved through under deadline was never a gate.

Step 3 — Make the strategy cheap to follow

A strategy that depends on everyone remembering it decays in a month. The job is to push each decision into the place where it happens by default:

  • The acceptance block became a required field in the ticket template — a ticket without it can't move to "ready." The discovery gate is now structural, not a habit.

  • The partial-state check lives in the write path and in CI, not in a reviewer's memory.

  • The reschedule end-to-end test runs on every deploy through branch protection; nobody has to remember to run it.

Every standard you can bake into a default is a standard you no longer have to police. The goal is that following the strategy is the path of least resistance and ignoring it takes effort.

What changed

A quarter later, Priya re-ran the same audit on the new defect log. The discovery-origin bar had dropped from thirteen defects to four, and the two that reached production were caught by the acceptance-block review before release rather than by a customer. Total defect hours were down by roughly a third — almost entirely from the discovery column the strategy had aimed at. The code bar barely moved, which is exactly right: it was never the expensive one. The point isn't the specific numbers of a composite team; it's the shape. Because the strategy was built from where the defects were born, its effort landed on the failure the team actually had — and the same audit that found the target measured the result.

The mechanism, stated once

A generic best-practices strategy and a data-grounded one differ in one variable: whose failure distribution the bet is placed on. Adopt the industry list and you optimize for the composite team's most common failure — usually a code-stage bug — which may be your cheapest problem, not your worst. Run the origin audit first and every bet lands on a stage you've observed carrying cost. That's why the boring, specific strategy beats the polished, universal one: not because best practices are wrong, but because a practice only pays off when it's aimed at a failure you actually have.

Where the audit-first approach bends

The origin audit assumes you have a defect history to read. A brand-new product with three weeks of life doesn't — there, you're forced to reason forward from risk (what would hurt most if it broke?) rather than backward from data, and you should re-run the audit the moment you have twenty real defects to learn from. A second exception: a genuine, external non-negotiable — a compliance requirement, a contractual SLA — earns a bet regardless of what the audit says, because the cost of violating it isn't in your defect log yet and you don't want it to arrive there. And if your audit comes back genuinely flat, with cost spread evenly across every stage, that's a finding too: it usually means defects aren't being logged with enough fidelity to learn from, and your first bet is to fix the logging before you fix the code.

Revisit it on a schedule

A quality strategy is a living set of priorities, not a monument. Put a recurring 30-minute slot on the calendar — quarterly is plenty — and re-run three checks: did we land the bets we made, and if not, was it the wrong bet or no time? Did our exposure change, since new features create new critical paths? And most concretely, re-run the origin audit — the distribution shifts as you fix things, and last quarter's tallest bar is often this quarter's shortest. Update the page, pick the next few bets. The strategy stays useful precisely because it's small enough to revisit without dread.

Your first move this week

Don't write a strategy doc yet. Export your last 30 to 50 defects and tag each one by the stage where it was introduced — discovery, design, code, integration, deploy, or data — with its rough cost in hours. Total by cost, not by count. In an afternoon you'll have something the mandate never gave you: a single stage, named and quantified, where your quality actually breaks. That stage is your first bet. Everything else — the dimensions, the non-negotiables, the defaults — hangs off that one observed fact.

When you're ready to turn the finding into the one-page artifact your team acts from, work straight from the annotated model in A One-Page Quality Strategy: A Real Example You Can Copy — it's the companion to this piece, and it shows the finished page this audit is meant to fill in.

Related on ShiftQuality: the copyable one-pager this audit feeds (A One-Page Quality Strategy); quality as a managed system rather than a checklist (What Is Quality Management); measures that resist gaming (Quality Metrics That Actually Matter); and making a non-negotiable actually hold (Quality Gates That Actually Gate).

bottom of page