SP

Board Design: Flow Engineering

Jira board proposal for CI/CD teams

Owner Kevin Pimentel Date 2025-03-24
Board Design · Flow Engineering for CI/CD Teams

Model how we actually deliver software — not how we used to

This document proposes a new Jira board layout for our engineering pods that reflects how we actually deliver software. Our CI/CD pipeline auto-deploys to staging and production behind feature flags. Our review process happens in preview environments where QA, UAT, and all testing converge. The board should model this reality, not a legacy process with manual deploys and phase-gated handoffs.

This document explains why each column exists, what it replaces, how every type of work flows through, and how each decision is backed by industry research.

Backlog
Queue
WIP: none
In Development
Active
WIP: ceil(E/2)
In Review
Active
WIP: ceil(R/2)
Flagged
Wait / Decision
WIP: none (diagnostic)
Live
Done
7-day rolling

The recommended board — five meaningful states, WIP-limited where humans do the work.

01

Why Change the Board?

Our current columns (Backlog → In Development → Needs Code Review → Staging → Preprod → Deployable) were designed for a process we're leaving behind — one where a developer finishes their part, pushes code through a series of environment-specific gates, and waits for manual promotion at each stage. That process has three problems:

1. Environment columns are not work states.

"Staging", "Preprod", and "Deployable" describe where the code is, not what the team is doing. Moving a card from Staging to Preprod isn't work — it's a deployment artifact. With CI/CD, these promotions are automated. Giving them columns creates busywork (moving cards through stages where no human action happens) and hides the real question: is this feature on for users?

2. Hidden queues.

The board doesn't distinguish between "someone is actively reviewing this" and "this has been sitting in Needs Code Review for 5 days." A ticket in any column could be actively worked on or idle. This makes bottlenecks invisible.

3. No WIP limits.

Six columns with no WIP discipline means tickets spread across every stage. Developers start new work while their previous tickets sit in Needs Code Review. The board looks like progress — tickets in every column! — but throughput is low because nothing is finishing.

02

The Board

Column definitions, entry/exit criteria, and why five is enough.

Column Definitions

ColumnTypeWIP LimitEntry CriteriaExit CriteriaWho Acts
BacklogQueueNoneTicket is refined, sized, and prioritizedTeam member pulls itProduct + Team
In DevelopmentActiveSee Dev WIP formulaTeam has capacity (WIP not exceeded)PR is open, preview environment is live, code compiles, unit tests passDev team (pairing/mobbing)
In ReviewActiveSee Review WIP formulaPR + preview env are readyAll testing passes in preview (QA, UAT, functional, visual). PR is merged. CI/CD auto-deploys behind feature flagSame team reviews
FlaggedWait/DecisionNo limit (diagnostic)Code is in production behind a feature flagTeam/product decides to flip the flagProduct + Team
LiveDoneNone (rolling 7-day filter)Feature flag is ON, users have itTicket ages off board after 7 days or sprint close

Why only 5 columns?

Because there are only 5 meaningful states a ticket can be in:

  1. Waiting to be started (Backlog)
  2. Being built (In Development)
  3. Being validated (In Review — in the preview environment)
  4. Deployed but not yet released (Flagged — behind feature flag in production)
  5. Released to users (Live)

Everything else — CI running, auto-deploy to staging, auto-deploy to prod — is automation. Automation doesn't get a column because no human is doing work during those steps. Giving automation a column creates the illusion of progress while actually just adding card-moving overhead.

03

Column Deep Dive

Backlog

Standard prioritized queue. No WIP limit because this is the intake buffer. The discipline here is refinement — tickets entering the backlog should be ready to pull (clear acceptance criteria, sized, dependencies identified).

Anti-pattern to avoid: A backlog with 200 tickets. If the backlog is larger than ~2 sprints of work, older items should be moved to an icebox or groomed out. A massive backlog is a prioritization problem masquerading as a planning artifact.

In Development

This is where the team builds. The WIP limit is calculated per pod based on composition.

Dev WIP = ceil( E / 2 )
E = number of engineers who actively write code (devs + SDETs who code). ceil = round up to nearest whole number.

This comes from DeGrandis' baseline of team_size / 2, which encourages pairing and prevents everyone from working on separate things simultaneously. The goal is: at least half the engineering capacity is collaborating on existing work, not starting new work.

How it applies to different pod compositions

Pod makeupE (coders)Dev WIPReasoning
2 devs21Forces pairing. Both work on the same ticket.
3 devs321 pair + 1 solo, or one person available to help review
4 devs422 pairs, or 1 pair + 1 person helping downstream
3 devs + 1 QA32QA is not counted in E — they participate in review, not dev WIP
3 devs + 1 SDET3–42If SDET writes feature code, count them in E. If they write test infra only, don't
5 devs53Never more than E − 1 to guarantee someone is always free to help finish
5 devs + 1 QA + 1 SDET5–63Same formula. QA/SDET capacity goes to review column, not dev WIP
2 devs + 1 SDET2–31–2Small pod — start at 1, increase to 2 only if flow is consistently smooth

Who counts as E?

RoleCounts toward E?Why
Software DeveloperYesWrites production code
SDET (writes feature code too)YesContributes to dev column throughput
SDET (test infra only)NoTheir capacity feeds the review column, not dev
QA EngineerNoTheir capacity feeds the review column
Tech Lead (still codes)YesIf they're writing code in the sprint, count them
Tech Lead (meetings/arch only)NoNot contributing to dev column throughput
Designer (UI/UX)NoTheir capacity feeds the review column (UAT, visual/UI review)
Product ManagerNoNot writing code
Tuning: Start with ceil(E / 2). Run for 2 weeks. If the team consistently finishes tickets faster than review can absorb them, lower the limit by 1. If tickets rarely pile up in review and the team feels idle, raise by 1. The right number is the one where flow is smooth and the team is finishing, not starting.

What "done" means here: A PR exists, the preview environment is live, unit tests pass, the code compiles. The developer isn't "throwing it over the wall" — they're signaling that the ticket is ready for the team to validate together.

In Review

This is the most important column in the new board. It replaces three old stages (QA, UAT, signoff) with one: team validates in the preview environment.

What happens here:

  • QA testing against the preview environment
  • UAT / functional acceptance
  • Visual/UI review
  • Performance spot-checks if relevant
  • Code review on the PR

All of this is done by the same team, not handed off to a separate QA team or UAT team. The person who built it is available to answer questions. The person reviewing has context because they've been involved (pairing, standups, shared ownership).

Review WIP = ceil( R / 2 )
Minimum: 1. R = number of people who can review (devs + QAs + SDETs + designers — everyone who validates).

In practice, R is usually the full pod minus PM (devs + QA + SDET + designer), so Review WIP is roughly ceil(pod_reviewers / 2). But since reviews should be fast (same-day), this limit is mostly a safety valve.

How it applies

Pod makeupR (reviewers)Review WIPReasoning
2 devs + 1 designer32Designer validates UI/UX in preview env alongside dev review
3 devs + 1 designer422 tickets can be reviewed in parallel
3 devs + 1 QA + 1 designer53QA + designer + dev review simultaneously, but cap at 3
4 devs + 1 SDET + 1 designer63Enough capacity for 3 parallel reviews
5 devs + 1 QA + 1 SDET + 1 designer83Cap at 3 even for large pods — more creates context switching for reviewers
Important: For pods with dedicated QA, SDET, or designer, the review column is where their capacity shines. They don't wait for work to be "thrown" to them — they're already involved. But the WIP limit still applies because the goal is fast completion, not parallel review of 5 things.

Cap at 3. Even if the formula gives you 4, cap Review WIP at 3. Beyond that, reviews are competing for attention and taking longer.

What triggers the exit: All checks pass, PR is approved and merged. At this point, CI/CD takes over — automated deploy to staging, preprod, and production behind a feature flag. No human action needed. The card moves to Flagged automatically.

Flagged (No WIP Limit)

This column is diagnostic, not active. No one is doing work here — the code is already in production behind a feature flag. This column exists to make a specific question visible:

"How much unreleased code do we have sitting in production?"

If this column grows, it surfaces a problem:

  • Product hasn't decided to release — prioritization issue
  • Waiting for a coordinated launch — dependency issue
  • Fear of turning it on — confidence issue (testing was insufficient)
  • Forgot about it — process issue

Each of those is a different conversation, but they're all invisible if you don't have this column. The code is deployed, the developer moved on, and nobody notices that value is sitting behind a flag for 3 weeks.

No WIP limit on purpose. This is an alarm column. When it grows, the team should ask "why aren't we releasing?" in standup. The discomfort of seeing 8 flagged items is the point.

Key metric: Flag-to-Live time. Track how long tickets sit in Flagged. If the average exceeds 3 days, investigate why.

Live

The ticket is done. Feature flag is ON. Users have it. Celebrate and move on.

When do tickets leave the board? Configure a rolling board filter to only show tickets that moved to Live in the last 7 days. Older tickets disappear from the board view automatically but remain in "Done" status in Jira — they're still queryable, they just don't clutter the board. If you use sprints as a planning cadence, sprint close also archives completed tickets naturally. The Live column should feel like a "recently shipped" feed, not an ever-growing list.

Jira setup: In board settings → filter, add a condition: status = Live AND status changed to Live AFTER -7d. Alternatively, use a Jira automation rule to auto-transition tickets from "Live" to "Closed" after 5 days.
04

Validation in Flow

Quality is built in during the work, not inspected at the end.

Validation is collaborative, not a handoff

The In Review column intentionally merges functional testing, acceptance, visual review, and code review into a single collaborative step performed by the whole team in the preview environment. Validation happens alongside the person who built the work — not after they've declared it done and moved on. Keeping all validation in one column is what prevents hidden queues and back-and-forth handoffs.

Quality is built in, not bolted on. Inspection after the fact is the slowest and most expensive place to find problems.

Research bears this out: testing treated as a separate, downstream phase catches defects at a 25–40% rate. Teams that build quality in — through pairing, shared test scenarios, and continuous validation in a preview environment — remove 85%+ of defects before a formal "testing phase" would even begin (Capers Jones, across 13,000+ projects).

Signals that validation has drifted into inspection

When issues consistently pile up at the end of the flow, it's usually a signal that quality is being inspected rather than built in. Watch for these patterns:

  • Issues are discovered at the end rather than during the build — surfacing as rework, not progress.
  • Acceptance criteria get interpreted instead of verified — a sign the AC wasn't binary and testable to begin with.
  • Work moves backward on the board (Review → Development) more than occasionally.
  • Reviewers only see the work at the end, having had no involvement during refinement or the build.
  • Validation waits on a single role, creating a queue where finished work sits idle.
Each of these has an upstream or in-flow fix. Adding another stage after the work is "done" relabels the queue without removing the cause — and reintroduces the handoff the board was designed to eliminate.

Practices that keep validation in flow

1. Write binary, testable acceptance criteria

"Match the mocks" or "works well" can't be verified — only interpreted. Each AC item should be something anyone can confirm with a yes/no answer without guessing intent. Testable AC written upstream prevents most end-of-line surprises.

2. Verify your own work before In Review

The Definition of Done for entering In Review includes the owner checking the work against its acceptance criteria — with evidence: a ticked AC checklist, a short recording, or a walkthrough of the preview environment. Entering Review means "ready to validate together," not "ready for someone else to test first."

3. Involve reviewers early, not just at the end

Bring validation forward. Reviewing acceptance criteria during refinement, and writing test scenarios together at the start of development, means the same issues get caught earlier, cheaper, and without a bottleneck.

4. Validate together in the preview environment

Don't just read the diff. Pull the branch or open the preview environment and click through it with the author. This catches what diff-reading misses and turns a multi-day review round-trip into a 30-minute session.

Fewer stages, faster flow

Every column transition is overhead — card moving, status syncing, notifications, standup discussion — and every additional stage adds queue time without adding throughput (Little's Law). The board keeps only the columns where a human is actively doing something. Adding stages to inspect finished work creates exactly the hidden queues and wait states the board is designed to expose and remove.

Track rework rate, not "bugs found in review." Counting how often tickets move backward on the board (Review → Development) makes the real signal visible and points to where quality needs to be built in earlier.
05

FAQ: "But What About…?"

What if the work doesn't need a feature flag?

Not all work requires a feature flag. Bug fixes, infrastructure changes, refactors, dependency updates — these often ship directly without a flag. The board handles this cleanly:

Work typeFeature flag?Board flow
New featureYesBacklog → Dev → Review → Flagged → Live
Feature enhancementUsually yesBacklog → Dev → Review → Flagged → Live
Bug fixNoBacklog → Dev → Review → skip Flagged → Live
Tech debt / refactorNoBacklog → Dev → Review → skip Flagged → Live
InfrastructureNoBacklog → Dev → Review → skip Flagged → Live
HotfixNoBacklog → Dev → Review → skip Flagged → Live
Config changeNoBacklog → Dev → Review → skip Flagged → Live

When a ticket doesn't need a flag, it moves from In Review directly to Live on merge. CI/CD deploys it, it's immediately active, done.

In Jira, this can be handled with:

  • A ticket field (Feature Flag: Yes/No) that determines the workflow transition
  • Or a Jira automation rule: on transition to "Flagged", if Feature Flag = No, auto-transition to "Live"
  • Or simply: the developer moves it to Live manually after merge (takes 2 seconds)

The board still works. Flagged is optional per ticket — it's there for tickets that need it.

What about work that needs coordinated release across multiple tickets?

Group the tickets under an Epic or use Jira's release/fix version. The individual tickets flow normally through the board. The Epic stays in "Flagged" until all child tickets are merged and the coordinated release is ready. Then the flag flip happens for the whole feature.

This is actually an argument for the Flagged column — it makes coordinated releases visible. You can see "3 of 5 tickets are flagged, 2 still in dev" at a glance.

What about PRs that get reverted in production?

If a feature flag is flipped on and something breaks:

  1. Flip the flag OFF (instant mitigation, no deploy needed)
  2. Create a new bug ticket that enters the Backlog
  3. That bug flows through the board normally: Dev → Review → (fix ships behind existing flag) → Flagged → Live

The flag is the safety net. This is why feature flags exist — they decouple deploy from release.

What about work that sits in Flagged for a planned launch date?

This is fine and expected. A marketing launch on a specific date means tickets will sit in Flagged until that date. The column makes this visible and intentional. What you want to avoid is tickets sitting in Flagged with no planned release date — that's the anti-pattern.

Tag these tickets with the planned release date so the team knows they're intentionally staged, not forgotten.

Won't this slow us down? We're removing columns — less granularity.

Fewer columns = faster flow. Each column transition is overhead (card moving, status syncing, notifications, standup discussion). Research supports this:

  • Lean manufacturing: every handoff is a potential defect injection point and adds queue time
  • DORA research: elite teams have fewer process gates, not more
  • Theory of Constraints: optimizing non-bottlenecks creates the illusion of progress while adding WIP

The columns we're removing ("Deployed", the old "Released") represented human actions that no longer exist. Removing them removes fake work.

What about QA / SDET? Where do they fit? Not all pods have them.

QA and SDET aren't a phase — they're skills the pod has (or doesn't). The board works regardless of pod composition:

Pods with a dedicated QA:

  • In Development: QA writes test plans, reviews acceptance criteria, sets up test data while devs build
  • In Review: QA is the primary tester in the preview environment. They're not waiting for a handoff — they've been involved since the ticket entered Dev
  • QA capacity feeds the Review WIP. They don't count toward Dev WIP (see formula above)

Pods with an SDET:

  • If the SDET writes feature code: count them in E, they contribute to Dev WIP
  • If the SDET focuses on test automation/infra: they're like QA — their capacity feeds Review, not Dev
  • SDETs add unique value in Review by building automated regression suites against the preview environment

Pods with neither QA nor SDET:

  • Developers own quality entirely. This is fine — it's how many high-performing teams work
  • Review WIP R = number of devs (everyone reviews)
  • The tradeoff: devs need to be disciplined about testing. The preview environment is the safety net — everything is validated there before merge
  • Consider: devs on these pods should pair-review (not just code review — actually test together in the preview env)
The principle is the same regardless: quality is built in, not bolted on after. Capers Jones' research across 13,000+ projects: testing as a separate phase catches defects at a 25–40% rate. Teams with embedded quality practices (pairing, TDD, continuous testing) achieve 85%+ defect removal before the "testing phase" even starts.
What if someone is blocked? Is there a Blocked column?

No. A "Blocked" column hides where something is blocked. If a ticket in Development is blocked on an API dependency, it should stay in Development with a blocked flag (Jira's native flagging) and a comment explaining why.

This keeps the bottleneck visible in context:

  • "We have 2 of 3 WIP slots in Dev occupied by blocked tickets" is a very different signal than "there are 2 things in the Blocked column"
  • The first tells you Dev is constrained. The second doesn't tell you anything about which stage is impacted.
How do we handle urgent/expedite work?

Add a swimlane for expedite items. The expedite lane has its own WIP limit of 1. If something is truly urgent, it bumps everything else. But only 1 thing can be expedited at a time — because if everything is urgent, nothing is.

How do I know a ticket is ready to move to In Review?

The entry bar for In Review is: the PR is open, the preview environment is live, unit tests pass, and the owner has verified the work against its acceptance criteria — with evidence, such as a ticked AC checklist, a short recording, or a walkthrough of the preview environment.

Moving a ticket to In Review means "ready to validate together," not "ready for someone else to test first." If tickets arrive without their AC verified, tighten this entry bar rather than adding a step after it.

Our acceptance criteria keep getting interpreted differently. How do we fix that?

Make the acceptance criteria binary and testable before the ticket enters the sprint. "Match the mocks" or "works well" can't be verified — only interpreted. Each AC item should be something anyone can confirm with a yes/no answer without guessing intent.

Most disagreements about whether a ticket is "done" trace back to AC that was never testable to begin with. Fixing the AC upstream prevents the debate downstream.

We keep finding issues at the very end of the flow. What does that signal?

It usually signals that quality is being inspected at the end rather than built in during the work. Inspection after the fact is the slowest and most expensive place to catch problems.

The fix is to move validation earlier: sharper acceptance criteria upstream, the owner self-verifying before In Review, and reviewers involved during the build rather than only at the end. See Validation in Flow for the full set of practices.

Why don't we add a separate column for final validation or sign-off?

Because a separate stage after the work is "done" reintroduces a handoff and creates a hidden queue — the exact patterns the board is designed to remove. Every additional column adds queue time without adding throughput (Little's Law).

Validation already has a home: the In Review column, where the whole team validates collaboratively in the preview environment. If issues are reaching the end of the flow, the answer is to build quality in earlier, not to add a stage that houses the symptom. Track rework rate (tickets moving Review → Development) to see where quality needs to be built in sooner.

How can reviewers get involved earlier instead of only at the end?

Bring validation forward. Review acceptance criteria together during refinement, and write test scenarios together at the start of development — so the edge cases that would normally be found after the fact are designed in from the beginning.

When everyone who validates has been involved since the ticket entered Development, review in the preview environment becomes a fast confirmation rather than a first discovery.

Who is responsible for making sure the acceptance criteria are met?

The whole team owns quality — but the ticket owner verifies their own work against the AC before it enters In Review. Validation in Review is then a shared confirmation, not a first pass. Quality is built in, not bolted on: the goal is that the team catches issues together as the work is validated, not that any one role becomes the safety net at the end.

06

WIP Limits: The Non-Negotiable

Everything else is column naming. WIP limits change behavior.

WIP limits are the single most important element of this board. Everything else is column naming. WIP limits change behavior.

Why They Work (The Math)

Little's Law (proven, not theoretical):

Cycle Time = WIP / Throughput

If your team has a throughput of 2 tickets/week:

WIPCycle Time
21 week
42 weeks
84 weeks
126 weeks
Doubling WIP doubles cycle time with zero change in throughput. This is math, not opinion.

Context Switching Cost (Weinberg)

Gerald Weinberg's research on cognitive overhead:

Simultaneous projects% of time on each% lost to switching
1100%0%
240%20%
320%40%
410%60%
55%75%

At 5 concurrent tickets, a developer spends 75% of their time switching between them and 5% on each. WIP limits prevent this.

What Happens When WIP Is Full

When a column hits its WIP limit and a developer finishes their current work, they should not pull a new ticket from the backlog. Instead:

  1. Help finish something downstream — review a PR, help with testing, pair on a stuck ticket
  2. Unblock something — investigate a blocked item, resolve a dependency
  3. Improve the system — write tests, refactor, update documentation
This is the core behavior change. "I'm done with my ticket, I'll start a new one" becomes "I'm done with my ticket, who needs help finishing theirs?"
07

Metrics That Matter

With this board, track four metrics (aligned with Mik Kersten's Flow Framework):

MetricWhat it measuresHealthy rangeWarning sign
WIPTickets in Dev + ReviewDev WIP + Review WIP per podConsistently exceeding limits
Cycle TimeDays from Dev start to Live3–7 days> 10 days
ThroughputTickets reaching Live per weekStable or growingDeclining while WIP grows
Flag-to-Live TimeDays a ticket sits in Flagged0–3 days> 5 days (value sitting unreleased)

The first three are standard flow metrics. The fourth — Flag-to-Live time — is unique to teams with feature flags and is the new "hidden queue" to watch.

08

Implementation Plan

PHASE 1 · WEEK 1
Update Jira Board
  1. Rename columns: Backlog | In Development | In Review | Flagged | Live
  2. Configure WIP limits per pod: Dev = ceil(E/2), Review = ceil(R/2) (cap at 3)
  3. Add Feature Flag field to ticket template (Yes/No)
  4. Add Jira automation: if Feature Flag = No and ticket moves to Flagged, auto-transition to Live
  5. Remove old "Deployed" and "Released" columns
PHASE 2 · WEEK 1–2
Team Adoption
  1. Walk through this document in a team meeting
  2. Run the flow engineering simulation prototype (handoff-vs-flow-kanban) to illustrate the principles visually
  3. Each pod calculates their WIP limits (start with ceil(E/2) / ceil(R/2), tune after 2 weeks)
  4. Establish the standup prompt: "What's closest to Live?" (work right-to-left, not left-to-right)
PHASE 3 · WEEK 3–4
Tune
  1. Review Flag-to-Live times — are tickets sitting behind flags too long?
  2. Review WIP limit compliance — are limits being respected or routinely overridden?
  3. Adjust limits based on observed flow (up or down by 1)
  4. Identify recurring blockers and address root causes
09

References

#SourceKey Contribution
1Gerald Weinberg, Quality Software Management (1992)Context-switching cost model: each parallel task adds ~20% overhead
2Capers Jones, Applied Software Measurement (2008)Defect rates by testing phase: 25–40% in gated QA vs 85%+ with embedded quality
3Forsgren, Humble, Kim, Accelerate (2018)DORA metrics: elite teams deploy on demand, <1 day lead time, 0–15% change failure rate
4John Little, Little's Law (1961)Cycle Time = WIP / Throughput — proven mathematical relationship
5Dominica DeGrandis, Making Work Visible (2017)Five time thieves, WIP as primary constraint, board design principles
6Mik Kersten, Project to Product (2018)Flow Framework: Velocity, Time, Efficiency, Load as four key metrics
7Eliyahu Goldratt, The Goal (1984)Theory of Constraints: system throughput is limited by its bottleneck
8Gene Kim et al., The Phoenix Project (2013)The Three Ways: flow, feedback, continuous learning