Creating a flag is a deliberate act and removing one is not, so without a mechanism the count only goes up.
Feature::define('new-checkout', expires: '2022-09-01');
// and the test that makes it real
public function testNoFlagIsPastItsExpiry(): void
{
$expired = Feature::all()->filter(
fn ($f) => $f->expires->isPast()
);
$this->assertEmpty($expired, 'Expired flags: ' . $expired->keys()->join(', '));
}
A failing test is the only mechanism that reliably produces the removal, because a report or a dashboard is something to ignore. The date will be wrong and extending it should require editing the definition, which is a thirty-second conversation with yourself and is exactly the friction that is wanted.