Quality goals — what this system is allowed to be good at
Three to five attributes, ranked with no ties, each written as a scenario you could lose. This is the concern every other one is measured against — a decision without a goal cannot be reviewed, and a guardrail without a goal is a rule someone will delete.
Spine concern · arc42 §1.2, 10 · spine.yaml: quality_goals
A quality goal is one attribute this system must be good at, written as a scenario with a stimulus, an environment and a measurable response — not as an adjective. Keep three to five, ranked with no ties, because the ranking is what resolves the trade-offs that come up later. Every goal names the guardrail that makes it fail loudly; a goal with no guardrail is a wish, and the spec should show it as one.
The Basics
Durable. What this concern is responsible for, regardless of decade or stack.
Functionality tells you what the system does. Quality goals tell you what it must do well, and — far more usefully — what it is permitted to be mediocre at. A system with nine quality goals has none, because nothing in it can lose an argument.
An adjective is not a goal
"The system must be scalable, secure and highly available" is three adjectives. Nobody can build against it, nobody can test it, and nobody can ever be told they have failed to meet it. It survives review precisely because it cannot be contradicted.
The fix is the scenario, and it has three parts. A stimulus: what happens. An environment: the conditions it happens under, including the bad ones. A response with a number and a unit: what the system must do about it. "During a single-AZ failure, checkout completes for 99.9% of requests within 2 seconds at p99, without operator intervention." That sentence can be met, missed, measured and argued with, which is the whole point.
The environment clause is the part most often dropped and the part that carries the cost. A latency target at average load is nearly free; the same target at three times peak, during a partial dependency outage, may be the single most expensive commitment in the document. Write which one you mean.
Three to five, and the ranking is the artefact
The limit is not tidiness. Quality attributes trade against each other — consistency against availability, latency against cost, changeability against raw performance, security against convenience — and every real design decision is a choice about which side of one of those pairs to stand on. If everything is a priority, the person making the decision at 4pm on a Thursday has no basis for it, so they will pick by taste and you will find out during an incident.
Rank them, and forbid ties. A tie is not a diplomatic compromise; it is an unmade decision that has been written down as though it were made. The uncomfortable half-hour spent deciding whether availability outranks consistency for this system is the highest-value half-hour in the whole exercise, and it is the half-hour that gets skipped when the goals are gathered by survey.
The test that the ranking is real: name a decision you would make differently if the order were reversed. If no such decision exists, the ranking is decorative and the goals are probably too vague to constrain anything.
Write the non-goals down
For every goal that made the list, something was left off it. Say so explicitly: this system does not optimise for multi-region write availability; this service tolerates minutes of staleness in reporting; this admin tool is allowed to be slow.
Non-goals do more work than goals in practice. They are what stop a well-meaning engineer from spending a quarter hardening something nobody needed hardened, and they are the fastest way to answer the recurring question of whether some new capability is in scope. A spec that only lists ambitions reads as though every property matters, which is indistinguishable from having no goals at all.
The goal belongs to the system, not the sprint
Quality goals change on the timescale of the business, not the backlog. They come from what the system is for and what it would cost to be bad at it — revenue lost per minute of downtime, contractual response times, the regulatory floor, the cost of an engineer waiting on a build.
That is also the honest source of the numbers. A latency target derived from a competitor's marketing page is a guess; one derived from the measured drop-off in conversions past 2 seconds is a goal. When you cannot get the real figure, write the assumption next to the number rather than laundering it into a target that looks authoritative.
Every goal points at its enforcement
A quality goal with no guardrail is a preference with good posture. It will be met by accident for a while, then quietly stop being met, and nobody will find out until a customer does.
So the goal carries the ids of the checks that protect it, and the spec makes an unenforced goal visible as unenforced. That visibility is the useful part: a table where two of the five goals have empty guardrail lists is telling you exactly where the system's real risk sits, and it takes ten seconds to read.
A quality goal is complete when
- It names one attribute
- Availability, latency, changeability, operability, cost, answer quality. A goal covering three attributes is three goals wearing one id.
- It has a stimulus and an environment
- What happens, and under what conditions — including degraded ones. A number without conditions is unpriced.
- It has a measurable response
- A figure and a unit, at a stated percentile. 'Fast' and 'reliable' are not responses.
- It has a rank
- An integer, unique across the set. No ties, because the ranking is what resolves trade-offs later.
- It names its guardrails
- The checks that fail when it is violated — or an explicit empty list, so the gap is visible instead of implied.
- Someone would notice it being missed
- If the goal could be violated for a quarter without anybody caring, it is not a goal for this system.
In the spec
What the concern looks like once it is written down — the machine layer entries a build check or a coding agent resolves by id, and the prose beside them.
quality_goals:
- id: QG-1
attribute: availability
scenario: >-
During a single-AZ failure, checkout completes for 99.9% of
requests within 2s p99, without operator intervention.
priority: 1
guardrails: [G-1]
- id: QG-2
attribute: changeability
scenario: >-
A new payment provider can be added by one engineer in under
five days without changing the order domain.
priority: 2
guardrails: [G-2, G-4]
- id: QG-3
attribute: cost
scenario: >-
Infrastructure cost stays under $0.40 per 1,000 checkout
requests at 3x current peak.
priority: 3
guardrails: [G-6]
- id: QG-4
attribute: answer quality
scenario: >-
On the versioned support-reply eval set, helpfulness scores
>= 0.85 mean and no safety case fails.
priority: 4
guardrails: [G-7]# Quality goals
Ranked. No ties. Reviewed quarterly; next review 2026-12-01.
## QG-1 availability (rank 1)
During a single-AZ failure, checkout completes for 99.9% of
requests within 2s p99, without operator intervention.
Why this number: checkout carries ~£38k/hour at peak. 99.9%
over 30d is ~43 minutes of budget, which finance accepted.
99.95% was priced at a second region and rejected — see
ADR-0016.
Enforced by: G-1 (burn-rate alert, pages).
## Non-goals
- Multi-region write availability. Single-region with a tested
restore is accepted; revisit if we sell into the EU.
- Reporting freshness. Minutes of staleness are fine.
- Admin console latency. It is allowed to be slow.The Current
Reviewed 2026-09-09How it actually plays out in production now. Dated, because this is the part that decays.
The measurement side of this concern is solved and commoditised: SLOs, error budgets and burn-rate alerts are standard practice, and the tooling to compute them ships in every observability platform. What has not caught up is the front half — most teams still write the goals as adjectives in a requirements document, then measure whatever the platform makes easy.
SLOs are widespread; quality goals are not
It is now normal for a serious service to have SLIs, an SLO, an error budget and a multi-window burn-rate alert. It is still unusual for those numbers to be traceable back to a stated goal that names why 99.9 rather than 99.95 — which means the number is defensible operationally and indefensible commercially.
The gap shows up in the same conversation every time. Someone proposes tightening availability; nobody can price it, because the goal was never written with the cost of the alternative attached; the tightest suggestion in the room wins by sounding responsible. An extra nine bought that way is paid for out of the changeability budget, silently.
Where the vocabulary comes from
ISO 25010 remains the most useful checklist for making sure a category has not been forgotten — its 2023 revision added safety as a top-level characteristic, which matters more now than it read at the time. Use it as a prompt, not as a template: the failure mode of a standard taxonomy is a spec with one goal per characteristic, which is nine goals, which is none.
For changeability, the DORA measures are the closest thing to an industry-standard scenario: lead time, deployment frequency, change failure rate, time to restore. They are convenient because they are already instrumented in most delivery pipelines, so a changeability goal expressed in those terms comes with a guardrail almost for free.
Cost has become a first-class quality attribute
Ten years ago cost efficiency sat in a finance conversation. Now it belongs in the goal set, with a unit — cost per thousand requests, per tenant, per completed job — because the architectural choices that move it are the same ones that move latency and availability, and if it is not ranked it loses every argument until the invoice arrives.
The specific trap of this period: an architecture whose cost scales with traffic, adopted while traffic was small, with no goal stating the ceiling. It is not discovered by monitoring. It is discovered by a finance review, at which point the fix is a redesign rather than a tuning exercise.
Operability is the goal that platform teams inherit
In an organisation with a platform team, several quality goals are not the product team's to meet — availability of the deployment path, the observability floor, patch cadence. Say which goals are inherited and from where. Both failure modes are common: a team re-solving a problem the platform already guarantees, and a team assuming a guarantee that was never made.
The clean way to write it is a goal that names its provider and its own residual obligation. The platform guarantees the tier; the service still owns the parts only it can see, which is usually its own request budget and its own degradation behaviour.
Percentiles, and the honesty of the tail
Averages are still the default in requirement documents and still nearly meaningless for user-facing paths. Write p99 or p99.9 for anything a person waits on, and state the measurement window along with it — a p99 over a month hides an outage that a p99 over five minutes catches.
Where a fan-out is involved, the arithmetic is worth doing once in front of the team: a page that makes twenty parallel calls each at a p99 of 100ms does not have a p99 of 100ms. Teams that have done that calculation write different goals, and usually fewer of them.
Future-ready
What changes when agents write and operate the code. Opinionated on purpose.
Two shifts, and they push in opposite directions. Non-deterministic features need a kind of quality goal the discipline has no established form for — answer quality, expressed as an eval threshold. And code arriving faster than humans can review it moves changeability and verifiability up the ranking, because the bottleneck is no longer writing the change.
Answer quality is a quality attribute
An LLM feature has a quality that is neither functional nor operational: how good the output is. It is not covered by availability or latency, it cannot be asserted by a unit test, and leaving it out of the goal set does not make it stop being the thing users judge the product on.
Write it as a scenario like any other, with the measurement named: on a versioned dataset of representative cases, the feature scores at or above a stated threshold on a stated grader. That makes the eval suite the guardrail, the dataset a versioned artefact, and the threshold a number someone had to choose — which is exactly the treatment every other quality goal gets.
The part that is genuinely new is that the goal must be statistical. Deterministic goals are per-request: this request completed in under 2 seconds. An answer-quality goal is per-distribution: this feature scores 0.85 across the suite. A single bad output is not a breach, and the spec has to say what a breach is instead — a drop in aggregate score, a regression on a named subset, a failure on a safety-critical slice where one is too many.
Verifiability rises in the ranking
When a change takes an hour to produce and a day to verify, the property that constrains delivery is verifiability, not development speed. That is now the common case on teams generating a large share of their code, and it changes what the goals should say.
Concretely: goals that used to read as developer-experience nice-to-haves become load-bearing. Build and test-suite duration, because it gates the review loop. Blast radius of a single change, because review attention is the scarce resource. Reversibility — how fast a bad change can be taken out — because the cheapest response to unreviewable volume is to make being wrong survivable.
Cost per task, not cost per request
Once agents are doing work in the system, the unit of cost changes. A request-based ceiling says nothing about a feature where a single user action triggers a chain of model calls with a variable tail, and the tail is where the money goes.
Write the goal in the unit the money is actually spent in — cost per completed task, at a stated percentile, including retries and the failures that produced no result. The percentile matters more here than anywhere else, because the distribution has a long right tail and the mean will tell you everything is fine.
The goals are the brief an agent works to
An agent asked to make something faster will make it faster, at some cost you did not ask about — cache the wrong thing, denormalise a table, drop a validation, add a dependency. It has no ranking to consult, so it optimises the attribute in the prompt.
Ranked goals in the machine layer are what turn that into a bounded instruction: improve latency without regressing the higher-ranked goal, and if the two conflict, propose a decision instead of choosing. Combined with guardrails, this is the closest thing to architectural intent an agent can actually act on — an ordered list of what matters, and the checks that prove it still does.
Goals still cannot be generated
Most of the spine benefits from drafting help. This concern resists it, because a quality goal encodes what the organisation is willing to trade away, and nothing in the codebase contains that. An agent asked to write quality goals will produce a plausible, well-formatted, comprehensively ranked set of five that nobody in the business has agreed to — and it will look better than the real one.
Use the help where it is real: turning an agreed goal into a well-formed scenario, spotting that two goals conflict, pointing out that a goal has no guardrail, checking the percentile arithmetic on a fan-out. The ranking stays with the people who own the consequences.
How this concern fails
Named, because a failure mode you can name is one you can spot in your own repository before it costs you a quarter.
The nine-goal table
One row per ISO characteristic, every one important. Nothing can lose an argument, so decisions get made on taste and the table is never opened again. Cut to five by asking which one you would sacrifice first, then writing that answer down as the ranking.
The tie
Two goals at priority 1, usually availability and consistency, or speed and quality. It reads as balance and it is an unmade decision. The cost lands on whoever is on call when the two actually conflict.
The adjective with a number bolted on
'Highly available — 99.99%' with no environment, no window and no percentile. Unmeasurable in practice, and the first incident review turns into an argument about what it meant rather than about what broke.
The goal nobody costed
An availability target chosen because it sounded professional. It buys an extra region, a second on-call rota and a slower release process, all paid for out of goals that were never told they were funding it.
The unenforced goal that looks enforced
It sits in the table alongside four goals that have guardrails, and it has none. Formatting implies parity; reality is that this one is unmonitored. Leave the empty list visible rather than tidying it away.
The goals inherited without being claimed
The product team assumes the platform guarantees a tier the platform never promised, or re-implements one it already provides. Both come from a goal that does not say who owns it.
Go deeper
Frequently asked
What is the difference between a quality goal and an SLO?
The quality goal is the commitment and its reason; the SLO is one way of measuring it. A goal says checkout stays available during a single-AZ failure and records that 99.9% was what the business agreed to fund; the SLO is the indicator, target and error budget that make it observable. In The Spine the goal lives in quality_goals with a rank, and the SLO is the guardrail it points at — so a target can never exist without a stated reason, and a reason can never exist without a check.
How many quality goals should a system have?
Three to five, ranked with no ties. The limit exists because quality attributes trade against each other, and the ranking is the only thing that resolves those trades when a decision has to be made without you in the room. If your list has nine entries, none of them constrains anything — the test is whether you can name a decision you would make differently if two of them swapped places.
How do you write a quality attribute scenario?
Three parts: a stimulus, an environment and a measurable response. What happens, under what conditions — including degraded ones — and what the system must do about it, with a figure, a unit and a percentile. 'The system must be fast' has none of them. 'At 3x current peak, a product page returns in under 300ms at p99' has all three, and can therefore be met, missed and priced.
Where do non-functional requirements fit in?
Quality goals are the useful subset of what a requirements document calls non-functional requirements: the three to five you have ranked, made measurable and bound to checks. The rest of that document is usually a mix of constraints, which belong in the constraints section with their reasons and expiry dates, and preferences, which belong nowhere. The renaming is not cosmetic — 'non-functional' invites a list, and a list is what stops the trade-offs from being made.
What is the quality goal for an AI feature?
Answer quality, written as an eval threshold on a versioned dataset — plus the ordinary goals of latency and cost per task, which behave differently once a single user action can fan out into a variable chain of model calls. The important difference is that the goal is statistical rather than per-request: one bad output is not a breach, so the spec has to define one, usually as a drop in aggregate score or any failure on a safety-critical slice where one is too many.
How often should quality goals be reviewed?
Quarterly for the ranking, and immediately whenever the business changes what the system is for — a new customer tier, a new market, a regulatory floor, a pricing change. The goals themselves are stable; the order is what moves, and a reordering is the signal to re-read the decisions taken in the name of the goal that dropped. That is why decisions carry the goal id: a rank change tells you precisely which choices are now suspect.
How does this map to arc42 sections 1.2 and 10?
arc42 splits the same material in two: section 1.2 holds the top three to five quality goals and section 10 holds the fuller quality tree with scenarios. The Spine keeps one concern with one id space, ranked, and adds the binding arc42 leaves out — each goal names the guardrails that enforce it. If you are already running arc42, the crosswalk is direct: 1.2 becomes the ranked head of quality_goals and section 10's scenarios become the scenario field.
The other eleven concerns
Pages are being written one at a time. The ones without a page yet are still in the template, with prompts instead of prose.
- Decisions
- Guardrails
- Constraints
- Context & scope
- Solution strategy
- Structure
- Behaviour
- Deployment & operations
- Cross-cutting concepts
- Risks & debt
- Vocabulary
Quality goals
Take the template, not the idea
The zip, the single-file variant, the schema and the agent bundle. Nothing behind an email address.
Free to fork, modify and use commercially. No attribution required.