Portfolio/Writing/Who should write the Jira ticket a frontend developer builds from?

Who should write the Jira ticket a frontend developer builds from?

A screenshot and a one-line title is not a ticket, it is a bet that nobody will ask about the empty state. Who should actually draft frontend tickets (product, tech lead, or the assignee), how much detail is realistic on a team trying to ship fast, what a good one contains, and how it should get validated before anyone starts building.

A ticket lands in the sprint: one screenshot, a title, and "match the design." The frontend dev who picks it up can see what the happy path looks like at one viewport, in one state, with fake data that never truncates. Everything else, loading, empty, error, what the icon does on hover, what happens at 320px, is a guess made under a deadline. Multiply that by a team shipping fast and "the ticket was unclear" stops being an excuse and starts being the actual root cause on the incident timeline.

A screenshot specifies one pixel-perfect moment. It says nothing about every other moment the screen will ever be in.
Scope
This is the practical, ticket-shaped version of the argument in giving developers Claude Code is not a design handoff: the artifact matters more than the tool reading it. That post is about the handoff in general. This one is about the specific document most teams actually use for it: the Jira ticket, who writes it, how much detail it needs, and how it gets checked before anyone starts building.

Who should actually write it#

The honest answer is that no single role has the whole picture, so no single role should be the sole author. Product knows why the work matters and what outcome counts as done. A tech lead knows what is risky, what already exists to reuse, and what sequencing avoids a rewrite next sprint. The assignee, once they actually sit down with it, is the one who finds the questions the other two did not think to ask: what does this icon do when there is nothing to click, what's the copy when the count is zero.

Who actually writes it
One ticket, three kinds of missing information
๐Ÿ“‹CONTRIBUTES
Product
The why, the priority, what "done" means for the business
๐ŸงญCONTRIBUTES
Tech lead
Technical constraints, sequencing, what is actually risky here
๐Ÿ–ฅ๏ธCONTRIBUTES
Assignee
States, edge cases, feasibility: the questions only building it surfaces
The realistic split
Product drafts intent and acceptance criteria. Tech adds constraints. The assignee flags gaps before starting, not after.
No single author has the whole picture. A ticket drafted by only one of these three is quietly missing the other two.

In practice this rules out two common failure modes. A PO writing tickets alone, with no technical input, produces tickets that are clear about the business goal and silent on every state that goal touches. A frontend dev writing their own ticket from a design file, with no product input, produces tickets that are technically thorough and occasionally solve the wrong problem, because nobody who owns the "why" reviewed it. Neither should happen in isolation. The assignee should always be able to push a ticket back before starting, that right matters more than who held the pen first.

What a screenshot alone leaves out#

This is the concrete version of "unclear," the list of decisions a picture cannot make on its own. None of these are exotic. All of them are the kind of thing that ships wrong, gets caught three sprints later, and gets filed as a new bug instead of traced back to the ticket that never mentioned it.

Screenshot-only tickets
One screenshot. At least eight decisions it does not make.
TICKET-4821
"Match the screenshot"
1 attachment ยท 0 lines of description
NEEDS INFO
Icon statesร— hover, active, disabled?
Loadingร— skeleton, spinner, nothing?
Empty resultร— not drawn
Error messageร— not drawn
Spacingร— no token, no px value
Breakpointsร— one viewport only
Long textร— truncate, wrap, or grow?
Focus orderร— not specified
A picture specifies one pixel-perfect moment. Everything before it and after it is a guess.

Icons are the sneaky one. A screenshot shows an icon at rest. It does not say which icon library it came from, what weight or size, what it looks like disabled, whether it needs a tooltip, or whether it is decorative and should be hidden from a screen reader versus interactive and needs a label. A dev fills that gap with whatever is closest at hand in the codebase, and the fill is invisible in review because the screenshot still matches.

How much detail is realistic when a team is shipping fast#

Full detail on every ticket does not survive contact with a real roadmap, and pretending otherwise is how "process" gets a bad name. The fix is not more documentation everywhere, it is matching the effort to what is actually at risk. A copy tweak and a new money-touching flow do not need the same ticket.

Ticket weightExampleWhat it actually needs
TrivialCopy change, spacing tweakA sentence and a before/after screenshot
SmallNew field on an existing formAcceptance criteria, validation rule, one edge case
StandardA new screen or flowStates, contract link, acceptance criteria, explicit out-of-scope
High-riskPayments, bulk actions, permissionsAll of the above, plus a QA/PO session before dev starts

Most teams fail this not by skipping detail everywhere, but by using one shallow template for everything, so the payments ticket gets the same three lines as the copy tweak. Weighting tickets is itself a five-minute decision at grooming, not a new process to adopt.

What a well-specified ticket actually contains#

  • Acceptance criteria in behavior terms. Not "matches the design" but "shows a spinner while loading, an empty-state message with zero results, and a retry action on error."
  • Every state, not just the happy one. Loading, empty, error, partial, permission-denied, each named, not implied by omission.
  • The real contract, linked. The actual API response shape or a curl that proves it, not a paraphrase of what someone thinks the backend returns. See what the backend owns, what the front end owns.
  • What is explicitly out of scope. The fastest way to stop scope creep mid-sprint is writing down what this ticket is not trying to solve.
  • Who to ask. One name for a product question, one for a technical one. Silence is what makes a dev guess instead of asking.

How tickets get validated before anyone starts building#

Detail on paper is not the same as detail that survives contact with the person building it. A regular, short session, refinement, grooming, three-amigos, the name matters less than the habit, where product, a technical voice and ideally QA or UX look at the next batch of tickets together, catches more than any template. The question worth asking out loud every time is simple: could someone build this without pinging anyone? If the answer is no, that gap gets filled before the ticket enters a sprint, not during it.

This does not need to be heavyweight. Fifteen minutes twice a week covering the next five tickets beats a two-hour meeting nobody prepares for. The point is a fixed cadence that exists whether or not anyone remembers to ask for it, because the tickets that most need a second pair of eyes are exactly the ones nobody thinks to flag.

How tickets get tested once the work is under way#

Validation does not stop at grooming. A mid-build check-in, even an informal one, where the dev shows the actual states they built against the ones that were specified, catches drift while it is still cheap to fix. Waiting for a final QA pass to be the first time anyone compares the build against the ticket means every gap surfaces at the most expensive possible moment, right before ship.

  • QA tests against the acceptance criteria, not the screenshot. If the criteria did not mention a state, that is a ticket bug, not a build bug, and it gets logged as one.
  • UX reviews the states that were not in the original file. Loading and error states are usually designed after the fact, if at all. Someone should look at them before ship, not discover them in production.
  • The assignee demos before calling it done. A five-minute walkthrough surfaces "wait, what about..." questions faster than any written checklist.
text
# definition of ready, before a ticket enters a sprint
โœ“ acceptance criteria are written as behavior, not "matches design"
โœ“ every state is named: loading, empty, error, partial, permission-denied
โœ“ the real API contract is linked, not paraphrased
โœ“ out-of-scope is written down, not assumed
โœ“ one name is attached for a product question, one for a technical one
โœ“ the assignee has read it and had a chance to push back

The honest bill#

  • Writing states and acceptance criteria into every ticket is real time that does not show up as shipped work, and it competes with velocity metrics that only count the shipping part.
  • A grooming cadence only works if it is actually protected on the calendar. The first sprint under deadline pressure is exactly when it gets skipped, which is exactly when it is needed most.
  • Weighting ticket detail requires someone to make a judgment call about risk, and that call is sometimes wrong. A "trivial" ticket occasionally turns out not to be.
  • None of this replaces trust. A team that argues about ticket quality every sprint has a process problem. A team that never argues about it has probably stopped noticing the gaps.
Summary
There is no single correct author for a frontend ticket, product, tech lead and assignee each hold a piece the others do not. A screenshot alone is not a spec, it is a bet that nobody will ask about the states it does not show. Match the level of detail to what is actually at risk, put a short recurring check on the calendar so gaps get caught before a sprint starts rather than after it ships, and let the person building it push back before they start. None of that is exotic. It is just the part that gets skipped first when a team is in a hurry, which is exactly when it is most expensive to skip.

Next up
Giving developers Claude Code is not a design handoff

Handoff was never "here is a tool that can read Figma and write code." It was a transfer of intent, constraints and edge cases from one head to another, and most of that transfer still happens nowhere. Seating an agent between design and engineering does not close the gap, it moves where the gap gets discovered, usually into production. What handoff was actually for, where it breaks now, and what a contract that a human and an agent can both build from looks like.

Read next โ†’