September 2026
Confetti Fires Before the Save Button, and 22% Deploy Twice
Why 22% of teams deploy twice in minutes, and how instant feedback loops quietly reshape engineering judgment before anyone hits save
A Croatian development team ships a checkout redesign on a Thursday afternoon. The CI pipeline goes green, Slack erupts with emoji, and someone triggers the deploy. Twelve minutes later, a second deploy fires from the same branch — nobody is quite sure who pressed it, or why. The code is identical. The only thing that changed between the two deploys is how the first one felt. That gap between the emotional reward of a green build and the sober judgment of a rollback decision is where this article lives. Specifically: what happens to engineering decisions when the feedback loop is engineered to feel good before the outcome is known?
The Anatomy of a Pre-Commit Celebration
There is a particular species of interface feedback that arrives before the action it celebrates is complete. The confetti animation that plays the instant you click a button, not when the operation succeeds. The chime that sounds on form submission, not on server confirmation. The progress bar that fills to 100% and then sits there, pulsing, while the actual work happens invisibly behind it.
In web development, this pattern is everywhere, and it is usually defended on UX grounds: perceived performance, user reassurance, reduced abandonment. All legitimate. But the same pattern, applied to developer tooling rather than end-user interfaces, produces a stranger effect. The person receiving the reward and the person bearing the consequence are the same person, and the reward is calibrated to the moment of intent rather than the moment of outcome.
Consider the humble deploy button. In many internal tools, it is wired to fire a success toast the moment the API call is dispatched. The toast says "Deployed." The deployment may still fail. The toast does not know this. It is, in the literal sense, a lie told in the imperative mood.
This is not a bug in the toast. It is a design decision, and it is a decision that shapes behavior over time. B.F. Skinner's work on operant conditioning gave us the vocabulary for this: reinforcement delivered immediately after a response strengthens that response far more effectively than reinforcement delivered after a delay. A reward that arrives 400 milliseconds after a click binds tightly to the click. A reward that arrives after a 90-second deploy pipeline, complete with a loading spinner and a context switch to another tab, binds loosely to anything at all.
The 22% figure in the title is not from a formal study — it comes from internal telemetry shared by a Zagreb-based SaaS team during a 2024 engineering retrospective, where they discovered that roughly one in five production deploys in their system was a duplicate triggered within ten minutes of a prior deploy from the same commit. The team's own hypothesis: the deploy button's instant success animation had become a small, reliable hit of accomplishment, and pressing it again was cheap.
Why the Timing of Feedback Matters More Than Its Content
A green checkmark and a confetti burst carry roughly the same information. What differs is when they arrive and what they attach to. If the reward precedes the outcome, it attaches to the intention to act. If it follows the outcome, it attaches to the act itself. Over hundreds of repetitions, this difference compounds into two entirely different engineers: one who has learned that pressing the button feels good, and one who has learned that a successful deploy feels good.
The first engineer presses more buttons. The second engineer deploys more carefully.
Loss Aversion in the Deploy Button
Kahneman and Tversky's prospect theory established that losses loom larger than equivalent gains — roughly twice as large, in their original 1979 framing. Losing 100 kuna hurts about as much as gaining 200 kuna pleases. This asymmetry shapes decision-making under uncertainty in ways that are mostly invisible to the person doing the deciding.
Now apply it to a rollback.
A rollback is a loss. It is an explicit admission that the previous action was wrong. It costs time, it costs face, and in many team cultures it costs a small amount of social capital. A forward deploy, by contrast, is framed as a gain: progress, velocity, shipping. The asymmetry is baked into the language before anyone makes a decision.
This is where the pre-commit celebration becomes genuinely dangerous. If the deploy button delivers its reward before the outcome is known, then the emotional accounting of a deploy is settled the moment you press it. The rollback, arriving later, is a pure loss with no offsetting gain. The engineer's nervous system has already banked the win.
The rational response would be to roll back more often and more quickly. The behavioral response is to roll back rarely and reluctantly, and to reach for a forward fix instead — another deploy, another press, another small reward. This is not a character flaw. It is what happens when you put a reward on the wrong side of an uncertain outcome.
The Forward-Fix Trap
Forward-fixing — shipping a new commit to correct a problem introduced by the previous commit — is sometimes the right call. It is faster than a rollback when the fix is trivial and the rollback is complex. But it is also rewarding in a way that rollback is not, and that asymmetry quietly biases the choice.
A team that tracks its deploy frequency but not its rollback frequency will, over time, drift toward forward-fixing as a default. The metric rewards the behavior. The interface rewards the behavior. The culture, if it celebrates shipping and tolerates breakage, rewards the behavior. Three separate reinforcement loops pointing the same direction.
The countermeasure is not to make rollback punishing or deploy joyful. It is to make both neutral — and to make the reward arrive after the outcome, not before.
Variable-Ratio Reinforcement and the Refresh Reflex
Skinner's most cited finding, and the one most often misapplied, concerns variable-ratio schedules: reinforcement delivered after an unpredictable number of responses produces the highest and most persistent response rates. Slot machines are the canonical example, but the pattern appears anywhere an action produces an uncertain reward.
Developer tooling is full of these.
The CI pipeline that usually passes but occasionally fails on a flaky test. The package registry that usually responds in 200ms but occasionally hangs. The analytics dashboard that sometimes shows a spike worth investigating and sometimes shows nothing. The pull request that sometimes gets an enthusiastic review and sometimes gets ignored for two days.
Each of these is a variable-ratio schedule, and each one produces a small, persistent pull toward checking. Refresh the pipeline. Refresh the dashboard. Refresh the PR. The behavior is not irrational — sometimes the refresh reveals something important — but the rate of refreshing is governed by the schedule, not by the information value of the check.
In Croatian dev teams, where many engineers work across multiple projects and time zones, this reflex is often compounded by a genuine need to stay current. The line between "checking because it's useful" and "checking because the schedule made me" is thin, and it is almost never visible from inside the behavior.
Designing Against the Reflex
The fix is not to remove uncertainty. Uncertainty is the job. The fix is to remove the reward from the check itself and attach it to the outcome the check is meant to inform.
Concretely: a CI system that notifies you only when the pipeline changes state — pass to fail, fail to pass — removes the reward from the refresh and attaches it to the transition. A dashboard that pushes a summary once a day removes the reward from the glance and attaches it to the digest. A PR system that batches notifications removes the reward from the individual check and attaches it to the review cycle.
None of these are novel ideas. They are standard practice in mature engineering organizations. What is less often articulated is why they work: they are not primarily about reducing noise. They are about relocating reinforcement from the moment of checking to the moment of knowing.
Competitive Play and the Shape of Risk
There is a reason competitive games are studied by behavioral economists. They compress decision-making under uncertainty into tight, observable loops, and they make the reward structure explicit. A well-designed game tells you exactly what you are being rewarded for, and then it lets you choose whether to pursue it.
Most engineering environments do neither.
The overlap between game design and developer tooling is not superficial. Both are concerned with the same problem: how do you shape behavior over time using feedback, when the outcome you care about is distant and uncertain? Both have to contend with the fact that immediate, certain rewards beat delayed, uncertain ones — every time, in every nervous system.
The interesting question is what competitive play gets right that most engineering tooling gets wrong.
Three things stand out.
First, competitive games make the reward legible. You know what you did to earn the points. In most engineering systems, the connection between an action and its consequence is diffuse — a deploy that succeeds might be good code, good luck, a quiet day for traffic, or a dependency that happened to behave.
Second, competitive games make the cost of failure legible. Losing a round costs you something specific and immediate. Rolling back a deploy costs you something vague and delayed, which is precisely why it feels worse than it is.
Third, competitive games separate the reward from the action. You do not get points for pressing the button. You get points for the outcome the button was meant to produce. This separation is the entire point, and it is almost entirely absent from the tooling most teams use.
What a Legible System Looks Like
A legible deploy system would tell you, at the moment of decision, what you are about to risk. Not in a modal dialog with a checkbox — those are ignored within a week — but in the ambient information available at the moment of action. What is the current error rate? What is the traffic volume? What is the blast radius of this service? What did the last deploy from this branch do?
None of this is technically difficult. Most of it is already instrumented. The challenge is that presenting it at the moment of action interferes with the reward, and the reward is what makes the button feel good to press.
There is a real tension here, and it is worth naming. A deploy button that feels slightly bad to press will be pressed less often, and pressing it less often is not always the goal. Teams that ship continuously need a deploy button that feels routine — neither rewarding nor punishing, just a step in a process. Routine is the target. Celebration and dread are both failures of design.
The Save Button Problem
The title of this piece is deliberately absurd. Confetti does not typically fire before a save button. But the pattern it describes is real, and it shows up in every interface where the feedback is calibrated to the gesture rather than the result.
The save button that plays a satisfying click and then silently fails to persist. The form that shows a success state before the server has confirmed. The deploy that toasts "Deployed" before the health check has run. The PR that shows a green checkmark before the review has actually happened.
Each of these is a small lie, and each one teaches the user something true about the system: that the reward is attached to the gesture, not the outcome. Users learn fast. They learn to trust the gesture and distrust the outcome. They learn to press again.
The 22% duplicate deploy figure is one symptom. There are others. The engineer who submits a form twice because the first submission's confirmation felt ambiguous. The user who refreshes a page mid-transaction because the loading state was indistinguishable from a stall. The team that ships a feature twice because the first deploy's telemetry was never checked.
A Practical Direction
The forward-looking move is not to remove feedback. It is to move it — from the moment of intent to the moment of outcome, and from the individual action to the aggregate result.
Three concrete shifts, each small, each testable:
Delay the success signal until the outcome is known. A deploy toast that fires on health-check pass rather than on API dispatch. A save confirmation that fires on persistence rather than on click. The delay is usually under two seconds. The behavioral effect is not small.
Batch the variable-ratio rewards. Replace the always-available dashboard with a daily digest. Replace per-event notifications with state-change notifications. Replace the refresh reflex with a scheduled check. The information is the same. The schedule is different.
Make rollback cheap and legible. If rollback is framed as a loss, it will be avoided. Reframe it as a routine operation with a known cost and a known benefit. Track rollback frequency alongside deploy frequency, and treat a high rollback rate as a sign of a healthy, fast-moving team rather than a broken one.
None of these are dramatic. None of them require new tooling. They require noticing where the reward currently sits, and moving it.
The confetti will still fire. It will just fire after the save button has actually saved something — which, it turns out, is the only moment when the celebration is true.