Pennant, and the feature flag that lived in a config file

Eleven flags in a config array, changed by deploying, and two of them dead since 2021.

Feature::define('new-checkout', fn (User $user) => match (true) {
    $user->isInternal()      => true,
    $user->created_at->isAfter(now()->subMonth()) => true,
    default                  => Lottery::odds(1, 100),
});

// resolved once per scope and stored, so the same user gets
// the same answer — which a config array cannot do.

if (Feature::active('new-checkout')) { /* ... */ }

The persistence is what a config flag cannot give you: a percentage rollout that re-rolls on every request is not a rollout, it is a flicker. What the tool does not solve is the dead flag problem — two of ours had been permanently on for two years — so the rule we added was that a flag gets an owner and a removal date in the same commit that creates it, and a monthly report lists the ones past their date.