A flag decouples deploying from releasing, which is genuinely valuable, and it doubles the number of code paths — permanently, unless somebody deletes it.
if (Feature::enabled('new_checkout', $user)) {
return $this->newCheckout($request);
}
return $this->legacyCheckout($request);
// the part that is not code: a ticket, created WITH the flag,
// with a date, to delete the flag and the losing branch.
Two flags interacting is four paths and nobody has tested all four, which is why a codebase with forty long-lived flags has a combinatorial space no suite covers. Creating the removal ticket at the same time as the flag is the only mechanism I have seen work; a monthly review of flag age is the backstop. A flag at a hundred percent for three months is dead code with a configuration entry.