Filtering exceptions: every one needs an expiry date

An exception is a hole with a reason attached. While the reason is attached it is a decision; once the reason is lost it is just a hole, and the loss happens by default rather than by neglect. Everything below is about keeping the two together for as long as the exception exists.

Section Operations Updated Record five fields

What to record when you add one

Five things, and the fifth is the one nobody writes down.

What is exempted. The narrowest accurate description: this URL path, this form field, this client. A scope recorded loosely will be read loosely a year later by somebody deciding whether it still applies.

Why. The specific case, not the category. «Support form rejects error messages containing HTML» survives; «false positives» does not, because it describes every exception ever made and therefore distinguishes none of them.

Who owns it. A person or a team who would notice if it were removed. Exceptions without an owner are the ones that survive reorganisations untouched, because removing them is nobody's risk to take.

When it ends. A date. Either the exception expires then, or somebody looks at it then, and record which of the two it is.

What would make it unnecessary. The condition under which the hole can close: a form that stops accepting raw HTML, an integration that starts signing its HTTP requests, a rule adjusted upstream. This field is what turns a list of exceptions into a list of work, and without it the review below has nothing to decide with.

THE RECORD WHAT IS EXEMPTED THE NARROWEST ACCURATE SCOPE WHY THE SPECIFIC CASE, NOT THE CATEGORY WHO OWNS IT SOMEBODY WHO WOULD NOTICE WHEN IT ENDS A DATE — EXPIRY OR REVIEW WHAT WOULD MAKE IT UNNECESSARY THE ONE NOBODY WRITES WITHOUT THE FIFTH FIELD A LIST OF HOLES WITH IT A LIST OF WORK
// the review has nothing to decide with until the fifth field exists

Four kinds, by how long they live

Lifetime is the useful way to sort them, because it determines what you do next rather than how the exception looks.

Incident exceptions, added while something is on fire. These have the shortest legitimate life and the highest survival rate, which is the whole problem. Anything added during an incident should carry an end date measured in days and be revisited when the incident review happens rather than whenever somebody remembers.

Launch and migration exceptions, added to get something out of the door. These live for weeks and end when the thing they unblocked is stable. Their characteristic failure is that the launch succeeds, everybody moves on, and the exception is the only trace of a temporary state that no longer exists.

Integration exceptions, describing a partner, a provider callback, or an internal system. These have no natural end, and pretending otherwise produces an expiry date that gets extended without thought every time it arrives. Give them a review date instead, and treat the review as a check that the integration still exists and still behaves the way the exception assumes.

Content collisions, where your own legitimate content trips a rule. These should be the shortest-lived of all, because an exception here is a workaround for a mismatch that can usually be corrected at the rule or in the form. Left permanently, they are the class most likely to widen, since the next similar collision is easiest to solve by extending the exception that already exists. Finding these in the first place is the subject of false positives.

The ones that cannot expire

Some exceptions are permanent, and the honest thing is to say so rather than to set a date nobody intends to honour.

A permanent exception is not dangerous because it is old. It is dangerous because its scope drifts: the integration it describes gains new endpoints, the client identifier it names is reused by something else, the route it covers is reorganised so that the exception now applies to more than it did. Age is a proxy for that drift, which is why review dates work even for things that will never be removed.

Two habits keep them honest. Recording the scope in terms that fail loudly when the world changes, rather than terms that quietly widen. And reviewing them against the thing they describe rather than against the exception itself: the question is whether that integration still works this way, not whether the exception still looks reasonable.

Removing one safely

Deleting an exception is a change to filtering behaviour, and it deserves the same care as adding one.

The safe sequence is to stop enforcing the removal before making it: put the affected traffic back under observation, watch what would now be refused, and confirm it is what you expect before the exception actually goes. That is the same discipline as monitor mode, applied in the opposite direction, and it turns a removal from a guess into a measurement.

Two things not to do. Do not remove several exceptions at once: if something breaks, you will have no way to attribute it, and attribution is the entire value of doing this deliberately. And do not remove them during a period when traffic matters most, such as a sale or a launch, because the failure mode of a wrong removal is refusing customers at exactly the moment there are most of them.

Where a removal does cause refusals, reinstate the exception first and investigate afterwards. The information is still there an hour later; the customers are not.

THE SAFE SEQUENCE BACK TO OBSERVATION READ WHAT WOULD BE REFUSED CONFIRM, THEN THE EXCEPTION GOES // monitor mode, applied in the opposite direction NOT LIKE THIS SEVERAL AT ONCE — NOTHING TO ATTRIBUTE TO DURING A SALE — MOST CUSTOMERS PRESENT // if a removal refuses people, reinstate first and investigate after // the information is still there an hour later; the customers are not
// deleting an exception is a change to filtering behaviour

The review that makes this work

A standing review, on whatever cadence you already use for other configuration.

Go through the list, and for each entry ask the three questions the record already contains: does the reason still hold, does the owner still exist, and has the condition that would make it unnecessary been met. Entries that fail the first two are candidates for removal today. Entries where the third is now satisfied are the work the review exists to find.

The list itself is the deliverable. An exception that is not on it is not managed, whatever its expiry date says, and the most common reason a review finds nothing is that the exceptions being added are not reaching the list at all.

Questions

Why does every exception need a date?

Because the circumstance that justified it ends before the exception does, and nothing else notices. A date is the only mechanism that forces a second look; without one, the safe-feeling choice is always to leave it alone, and that choice is made silently by everybody who inherits it.

What about exceptions that are genuinely permanent?

Give them a review date rather than an expiry. The risk with a permanent exception is not its age but its scope drifting as the thing it describes changes, so the review checks the integration or route it covers rather than the wording of the exception.

Is it safer to keep an exception than to remove one?

Only in the moment. Keeping is safe today and accumulates; removing carries a small, immediate, observable risk you can manage by watching first. The practice that fails is the one where nothing is ever removed because each individual removal looked riskier than doing nothing.

How narrow should an exception be?

As narrow as the case that prompted it: one route, one field, or one client rather than one rule switched off. A broad exception is indistinguishable in effect from not having the rule, and it will be described in the record as though it were something smaller.

Where the platform sits

Removing an exception is a change to filtering behaviour, and the same three positions apply to it as to adding one.

off

Nothing is inspected, so no exception is doing anything.

monitor

Where a removal is measured before it happens: read what would now be refused.

block

The removal takes effect. From here a mistake is refusals rather than a record.