Skip to content
Guilherme Nogueira
Go back

Good Tickets Are Reliability Work

7 min read

“Fix API. Priority: High.” I have been handed that ticket more times than I can count, and I have written it myself on a bad afternoon. It looks like work. It is actually a promise to have the same conversation again later, under worse conditions.

A ticket is where ambiguity either gets resolved or gets deferred. Defer it and it does not disappear. It moves downstream, to the engineer who guesses, the reviewer who cannot tell what “done” means, and eventually the incident where nobody remembers what this was supposed to do. That is why I treat ticket quality as reliability work, not project-management hygiene.

Years ago I watched an incident that looked, for the first hour, like a bug in a payment flow. It was not. The code did exactly what the ticket asked. The ticket just never said what the business actually needed, and nobody had questioned it weeks earlier, when it was one vague line. We were not debugging code that night. We were debugging a requirement that was never written down.

Ambiguity is technical debt before the first line of code exists.

On the left, a vague ticket labeled only "Fix API", tangled in a loose scribble and surrounded by a few question marks. On the right, a clean, structured ticket with several labeled rows and a checkmark, flowing into a straight arrow toward delivery.

Table of contents

Open Table of contents

The short version

A vague ticket is future rework wearing a nice title

“Fix API” reads like a task. What it actually contains is every question it did not answer: which API, what is wrong, what “fixed” looks like, who is affected, what might break. Those questions do not go away because you left them out. Someone has to answer them, and now they answer them with less context than you had when you wrote it, usually mid-sprint, sometimes mid-incident.

The broad, vague ticket is one line and it feels done. But you did not do the work. You relocated it to a person with worse information and a running clock.

The anatomy of a ticket that prevents an incident

The good version is boring, and boring is the compliment. It answers six questions before anyone writes code.

None of that is bureaucracy. Each line removes a place where an engineer would otherwise guess, and a guess in a ticket is a coin flip you are asking production to call.

Put the two side by side and the difference is not length, it is decisions made versus decisions dodged.

Fix API
Priority: High

Against:

Add idempotency to the payment API

Context:     duplicate requests on network retries are double-charging customers
Impact:      direct financial risk and customer trust, support volume rising
Acceptance:
  - an idempotency key is required and validated
  - a duplicate request returns the original response, never a second charge
  - tests cover retries and the timeout edge cases
Owner:       payments team, on call after ship

The second one is not more bureaucratic. It is the difference between an engineer who starts building and an engineer who starts guessing.

Why a ticket is reliability work

Here is the chain nobody draws, but everybody lives. Ambiguity in the ticket becomes a wrong assumption in the code. The wrong assumption passes review, because the reviewer had nothing to check it against. It ships, because the tests validated the thing that was built, not the thing that was needed. And then it surfaces, weeks later, as the defect that pages someone.

Ambiguous ticket

Wrong assumption

Correct implementation of the wrong thing

Review approves it

Production incident

Every one of those steps was a chance to catch it, and every one of them was blind because the ticket never said what “correct” was. A clear acceptance criterion is a test the reviewer can run in their head. A named risk is an edge case someone remembers to handle. Clarity up front is the cheapest place in the whole pipeline to stop a failure, and the ticket is where that clarity is either written down or quietly lost. Production should validate software, not requirements.

Ambiguity does not get cheaper downstream

The cost of an unclear requirement is smallest in the ticket and largest in production. Every stage it survives multiplies what it costs to fix.

A left-to-right pipeline of four stages, ticket, code, review and production. A small dot of ambiguity enters at the ticket and grows into a larger shape at each stage, largest at production, with a cost curve rising behind it.

The objection: “this is just process overhead”

I have heard the same objection for years. We are engineers, not clerks, and this slows us down. It is a fair worry, and it points at a real failure mode: the team that writes ten fields of ceremony and calls it rigor.

But a good ticket is not more words, it is fewer wrong ones downstream. The vague ticket does not skip the work of specifying. It defers it to the worst possible moment and the least informed person. “Clear” and “long” are not the same thing. The best ticket I ever wrote was four lines. It just happened to be the four lines that mattered.

Vague ticketClear ticket
Where the thinking happensMid-sprint, by whoever picked it upUp front, by whoever has the context
What review can catchWhatever the reviewer imaginesThe stated acceptance criteria
Failure modeShips the wrong thing, correctlyShips the right thing
Incident probabilityHigherLower
Cost of the ambiguityPaid later, with interest, in productionPaid once, cheaply, in writing
Who pays itThe next five peopleYou, now

Who owns the clarity

This is where it stops being a Jira preference and becomes a leadership signal. Writing a clear ticket is choosing to spend your context now, while you still have it, so that five other people do not have to reconstruct it later without it. It is the same move as documenting a system or drawing a team interface: pay a known cost once, up front, to remove an unknown cost that would otherwise land on someone else at a bad time.

The senior move is not to write more tickets. It is to make the clear ones the norm, so the team stops paying the ambiguity tax without ever quite noticing it was there.

Final takeaway

A ticket is not a task label. It is the last cheap place to remove ambiguity before it turns into code, and code is expensive to argue with. Write the context, the impact, the definition of done, the risk and the owner, and you are not doing paperwork. You are shrinking the blast radius of every misunderstanding before it has a chance to reach production.

Good tickets are a force multiplier. The more clarity you put in, the faster and safer the whole team moves, and the fewer late-night surprises trace back to a line that just said “Fix API.”


Share this post:

Previous Post
The First Hire Is the Expensive One
Next Post
Reliability Is a Business Decision, Not an Engineering One