Applying WIP constraints: cap the queue, cap the delay
Same demand, two boards
day 0WIP in the system (items)
Cycle time, 30-day rolling (days)
Build is the bottleneck: 3 workers × 1/3.0 d = 1.0 item/day, so λ is also its utilization. Try: run 300+ days at λ = 0.92, then slide λ past 1.0 — the push board's Build queue grows without bound while the pull board holds its WIP and simply admits less. Then tighten the limit to 10 and watch cycle time fall faster than throughput.
What a WIP limit buys and costs (M/M/1/K)
Single server, random arrivals and service times; an arrival that finds K jobs in the system is held back (blocked). Try: at 90% utilization, a limit at 2× the average queue (K = 18) cuts mean cycle time about a third and the 95th percentile by more, for under 2% of demand. Then click Ratchet a few times and watch each small cut compound.
Demand 0.85/day into Spec → Design → Build → Verify (Build is the designed bottleneck at 1.0/day). The broken stage runs at 10% capacity during the outage. Global rope: release new work only while Spec+Design+Build hold < 13. Local kanban: each stage holds at most workers + 2 (4, 4, 5, 4). Same items, same random draws for every policy.
Total WIP in the line
Queue at Verify (items in that stage)
Where the WIP sits when the outage ends
Try: break Build — the global rope works fine, because it was tied to exactly that stage. Now break Verify: the rope keeps releasing work at Build's pace and the pile in front of Verify grows for the whole outage, while local kanban limits push back stage by stage within days.
Queue waiting for test (items)
Committed WIP vs. held-back demand (items)
Price paid: 13.3 borrowed person-days. Dev (5 people) feeds Test (2 testers, the bottleneck at ~1.4 items/day); demand jumps from 1.0 to 2.1/day for 30 days. Cost of delay averages $2k per item per day, counted from the request; killed items are excluded (their value is gone instead). Try: Pull a tester with lag 1, then 12 — the same resource is worth far less late (W9). Then try Block alone: the committed queue shrinks but time-from-request barely moves — blocking only relocates the queue to where it is cheaper (W21).
Board with escalation — red = older than 15 days
day 0Cycle-time scatter: every finished item
Task effort is heavy-tailed (lognormal, and 6% of tasks expand to 5× their size). Escalation: the 2 oldest items past the limit jump their queue and get an expert working 3× faster. Timebox: no task may consume more than the box in any stage — the rest is cut or deferred to a follow-up. Try: just watch for 200 days and note how a handful of expanders hold kanban slots hostage and block everyone behind them; then switch to escalation or a 2× timebox and compare the tail.
Differential service: give urgent work its own lane
W18Expedite cycle time (mean / 95th pct, days)
Normal cycle time once admitted (mean / 95th pct, days)
4 people, each job takes 1 day on average (exponential); expedites carry 10× the cost of delay of normal work. The expedite lane lets an expedite interrupt normal work when everyone is busy (escalate the expedite) and caps normal work in process; normal work beyond the cap waits in the backlog, uncommitted. Interruption costs (context switching) are not modeled. Try: push utilization to 92% — the FIFO expedite waits as long as everything else, while the lane keeps it near its 1-day service time. Raise the expedite share to 40% and watch normal work pay for it: differential service only works while the fast lane is a small fraction of the flow. Lower the WIP cap to bound normal cycle time and see the backlog grow instead.
Goodput: useful messages delivered, % of capacity
Delay per delivered message (ticks, incl. retransmissions)
A router serves 10 messages per tick. A sender that hears nothing within 20 ticks sends the message again; duplicates still sitting in the queue use capacity when served. With no limit, once the queue's wait exceeds the timeout, a growing share of the router's work is duplicates — goodput collapses just past 100% load, the Internet's 1986 congestion collapse. The hard limit drops arrivals at a full buffer; progressive throttling turns away a growing share of new demand as the queue rises, so the queue stays short. Try: slide the load from 95% to 105% and watch the red curve fall off a cliff.
Adaptive WIP: TCP's window tracks a changing capacity
TCP's window is a WIP limit on unacknowledged packets; by Little's Law throughput = window ÷ round-trip time. Capacity is 40, drops to 12, then rises to 80 packets per round trip. A fixed limit that was right before the change is too high during the dip (a standing queue and steady losses) and too low after the upgrade (idle capacity). AIMD probes upward slowly and halves at the first loss, so it keeps re-finding the right WIP. Try: deepen the dip to 5 and compare the delay of the two policies.
- takeawayCap WIP and you cap cycle time (Little's Law). A limit near twice the average queue removes the worst delays for a percent or two of throughput — then ratchet it down.
- takeawayPrefer local limits at each hand-off: they push back within days wherever the jam appears, without knowing where the bottleneck is. Hold excess demand where waiting is cheapest.
- takeawayPlan the response before the queue arrives: who gets pulled in, which scope is expendable, what gets purged, how aged items escalate — and throttle progressively rather than slamming the door.
All 23 principles of applying wip constraints
book chapter 6- W1The Principle of WIP Constraints
Limit the amount of work-in-process to control cycle time and flow.
By Little's Law, cycle time is WIP divided by throughput, so capping WIP caps the average cycle time. Queueing math shows the price is small: a limit at about twice the average unconstrained queue cuts the worst queues and the long cycle times while rejecting only a percent or two of demand.
↑ see it in the visualization - W2The Principle of Rate-Matching
WIP constraints force the rate of starting work to match the rate of finishing it.
When a downstream stage is full, upstream cannot push more into it, so the system admits work only as fast as it completes work. Without the constraint, a fast upstream stage keeps feeding a slower one and the difference silently becomes a queue.
↑ see it in the visualization - W3The Principle of Global Constraints
Use a global constraint on total WIP when the bottleneck is predictable and permanent.
Theory of Constraints' drum-buffer-rope releases new work only as the bottleneck finishes it, capping the whole line's WIP with one simple rule. It works well in a factory with a stable bottleneck; in product development the bottleneck moves with the work mix, so a single global cap reacts slowly.
↑ see it in the visualization - W4The Principle of Local Constraints
Where you can, constrain the WIP of each local pool instead of only the total.
A kanban limit at every hand-off (like TCP's window at every connection) stops the stage just upstream of a jam within one item, and the back-pressure propagates step by step. Local limits react faster and need no knowledge of where the bottleneck currently is.
↑ see it in the visualization - W5The Batch Size Decoupling Principle
Use a WIP range, not a single number, to decouple the batch sizes of adjacent processes.
If design hands work over in batches of five and test consumes them in batches of three, a fixed WIP target can never be met exactly. Let WIP float between an upper and lower bound so each process can use its own economic batch size while the total stays controlled.
↑ see it in the visualization - W6The Principle of Demand Blocking
When WIP reaches its upper limit, block all new demand until it falls.
The blocked work does not vanish; it waits outside the system in a cheap, uncommitted state (a backlog nobody has started, a request not yet accepted). This is the simplest response and the one a kanban card or a full TCP window applies automatically.
↑ see it in the visualization - W7The Principle of WIP Purging
When WIP is too high, kill the lowest-value work in process.
Money already spent is a sunk cost; the question is whether the remaining work is worth its remaining cost plus the delay it imposes on everything behind it. A queue crisis is the moment to cancel the marginal projects that should have been cancelled anyway.
↑ see it in the visualization - W8The Principle of Flexible Requirements
Reduce WIP by shedding non-essential requirements when the queue is high.
Cutting a feature from every item in the queue reduces the work content of the whole queue at once. Decide in advance which requirements are expendable so you can drop them quickly, the way a release train drops the stories that don't make the cut.
↑ see it in the visualization - W9The Principle of Resource Pulling
Apply extra resources to an emerging queue quickly, while it is still small.
Queues grow and drain asymmetrically: a little extra capacity early prevents a big queue, while the same capacity added late needs a long time to drain it. Speed of response matters more than the size of the response.
↑ see it in the visualization - W10The Principle of Part-Time Resources
Use part-time resources on high-variability work so they can surge when a queue forms.
Someone loaded at 50% on a project can jump to 100% the day a queue appears, with no ramp-up because they already know the work. A full-time person already at 100% has no surge capacity at all.
↑ see it in the visualization - W11The Big Gun Principle
Pull high-powered experts onto emerging bottlenecks.
A senior expert can clear in days a problem that would take a team weeks, so keep your best people lightly loaded and on call for queue emergencies rather than buried in routine work they would be fully utilized by.
↑ see it in the visualization - W12The Principle of T-Shaped Resources
Develop people who are deep in one specialty and broad across many.
A T-shaped engineer adds value on their own specialty and can still help usefully wherever a queue appears. Pure specialists are efficient but cannot move; pure generalists move but lack depth.
↑ see it in the visualization - W13The Principle of Skill Overlap
Cross-train people at adjacent processes so they can absorb each other's queues.
The most useful overlap is with the stage next door: a developer who can write and run tests can help when the test queue grows, and the hand-off between them gets better too.
↑ see it in the visualization - W14The Mix Change Principle
Change the mix of work released upstream to regulate the queue at a bottleneck.
When the test queue is high, start the jobs that need little testing and hold the test-heavy ones; when it is low, do the reverse. The total work is unchanged, but the bottleneck's load is smoothed by sequencing upstream work.
↑ see it in the visualization - W15The Aging Principle
Watch the age of items in WIP; the outliers carry the problem.
An average cycle time hides the few jobs that are stuck. Tracking the age of every item in process exposes them early, because an item that has been in a stage far longer than usual is almost always blocked, not just slow.
↑ see it in the visualization - W16The Escalation Principle
Have a pre-planned escalation process for items that exceed an age limit.
Decide in advance who gets told and what happens (more people, an expert, a decision from management) when a job crosses the aging threshold, so the response is automatic instead of negotiated each time.
↑ see it in the visualization - W17The Principle of Progressive Throttling
Throttle demand gradually as the queue approaches its limit instead of slamming it shut at the limit.
Internet routers using random early detection drop a growing fraction of packets as the queue rises, so senders slow down before the buffer fills. Gradual throttling avoids the oscillation of on/off blocking and keeps the queue short.
↑ see it in the visualization - W18The Principle of Differential Service
Give different classes of work different WIP limits and priorities according to their cost of delay.
A single queue treats a high-cost-of-delay expedite like routine work. Separate workstreams with their own WIP constraints and priority give fast service to the urgent class, as Internet DiffServ does for voice versus email traffic.
↑ see it in the visualization - W19The Principle of Adaptive WIP Constraints
Adjust WIP constraints as the capacity of the system changes.
TCP grows its window slowly while things flow and cuts it sharply at the first sign of congestion, constantly tracking the capacity it can actually get. A fixed WIP limit set for last quarter's team is too high when people leave and too low when they join.
↑ see it in the visualization - W20The Expansion Control Principle
Prevent individual work items from expanding without limit.
Some tasks grow the longer you work on them: research that never converges, a refactor that keeps finding more. Under a WIP limit an expanding task also holds a slot hostage, so set a time or effort box and force a decision when it is reached.
↑ see it in the visualization - W21The Principle of the Critical Queue
Constrain WIP in the part of the system where queueing is most expensive.
Not all queues cost the same: a queue of committed, half-built work ties up money and decays, while a queue of unstarted ideas costs little. Hold excess demand where it is cheapest and keep the expensive queue short.
↑ see it in the visualization - W22The Cumulative Reduction Principle
Small, repeated reductions in WIP add up to large reductions in cycle time.
Ratchet the WIP limit down a little at a time, fix whatever problem the tighter limit exposes, then ratchet again. Each step is cheap and the effects on cycle time compound, much like reducing inventory to expose the rocks in lean manufacturing.
↑ see it in the visualization - W23The Principle of Visual WIP
Make WIP continuously visible to everyone.
Product development inventory is invisible information, so represent each item as a physical or digital card on a board. Once people can see the pile in front of a stage, they self-organize to clear it.
↑ see it in the visualization