skip to content

Any set of infrastructure guardrails eventually meets a change that legitimately has to break one of the rules. How would you design the exemption path so that exceptions remain possible without the guardrail degrading into a formality?

level: principalimportance: should knowfreq 32%

answer

  1. no path means people route around it
  2. one rule, one resource, never a blanket skip
  3. an expiry forces the decision to recur
  4. approver is not the requester
  5. forty exemptions means the rule is wrong

basics

~20 s

Make exemptions explicit, narrowly scoped to one rule and one resource, time-bounded with an expiry that re-fails, attributed to a named requester and an independent approver, and visible in aggregate. Blanket skips and permanent unowned exceptions are what hollow out a guardrail.

solid answer

~50 s

I design the exemption as a first-class object with five properties. It is **declared**, in version control next to the thing it exempts, so it appears in review rather than in a chat message. It is **narrow** — one rule, one resource — never a switch that disables the whole check for a file or a directory. It is **time-bounded**, with an expiry after which the rule fires again, because a permanent exception is just a rule you did not write. It is **attributed**, with a requester, a reason, and an approver who is not the requester. And it is **visible in aggregate**, because the count and age of open exemptions is the health metric of the whole programme. The second half is that exemptions are feedback: a rule carrying forty exemptions is not evidence of forty sloppy teams, it is evidence of a wrong rule. The real tradeoff is friction versus evasion — make the path too heavy and people stop using the governed route entirely.

go deeper

for a junior

Know that an exception should be written down where the check can see it, with a reason, rather than arranged by turning the check off.

for a middle

Be able to list what a well-formed exemption carries — one rule, one resource, an expiry, a requester and an approver — and say why a blanket skip on a whole file is the dangerous shape.

for a senior

Show that you treat the exemption register as operational data: its size, age distribution and concentration per rule tell you which rules are wrong, and you act on that rather than chasing teams.

for a principal

Own the tradeoff explicitly. Too much friction pushes work off the governed path; too little makes the exemption the default. Be ready to design the fast path for incidents, to keep a small no-exemption core, and to separate an engineering exemption from a business-accepted risk with a named owner.

## Why the exemption path is a design problem, not an afterthought Every guardrail encodes a generalisation, and every generalisation has exceptions it cannot express. The bucket that really is a public website. The legacy database that genuinely cannot be encrypted before next year's migration. The instance size that is over the cap for one afternoon of a data migration. There are only three possible designs, and two of them are bad. If there is **no exemption path**, engineers find one anyway — a change applied outside the pipeline, a rule quietly deleted, a resource moved out of code entirely. If the path is **informal** — a message to the platform team, a temporarily disabled check — you have exceptions with no record, no expiry and no owner, which is the worst of both worlds because you now believe you have a control. The third design is to treat the exemption as a real, structured object. ## The five properties **Declared.** The exemption lives in version control, next to the thing it exempts, and arrives through the same review as any other change. This single choice does most of the work: an exemption in a diff is seen by a reviewer, has an author, and has a history. **Narrowly scoped.** It names one rule and one resource. The antipattern is the blanket skip — a directive that suppresses *all* rules for a file or a directory, usually added to unblock one thing and then inherited by everything added to that file for the next three years. The scope of an exemption should be as close as possible to the scope of the actual exception. **Time-bounded.** Every exemption carries an expiry, after which the rule fires again. This inverts the default: instead of exceptions accumulating silently forever, they come back for a decision. If an exception is genuinely permanent, that is a signal the rule needs a condition it currently lacks — write it into the rule rather than pretending it is temporary. **Attributed and independently approved.** Requester, reason, approver, ticket. The approver must not be the requester; self-approval is the mechanism by which a control becomes decorative. The reason should be readable by someone who was not in the conversation, because in a year that is the only audience. **Visible in aggregate.** A register of open exemptions — how many, on which rules, how old, who owns them — is the actual health metric of the programme. Nobody's dashboard of blocked changes tells you as much as the age distribution of active exceptions. ## Exemptions are feedback about the rules This is the part that distinguishes a lead's answer. If one rule accumulates forty exemptions, the correct interpretation is not that forty teams are careless. It is one of: - **The rule is too broad.** It fails a case it should not; add the missing condition. - **The rule is at the wrong scope.** It should be strict in production and advisory elsewhere. - **The rule encodes a standard the organisation has not actually agreed to.** That is a conversation to have openly, not to lose slowly through exceptions. So the exemption register should be reviewed on a cycle, and rules with high exemption rates should be revised or retired. A guardrail estate that only ever grows is one nobody is maintaining. ## The friction tradeoff The design tension is real and cannot be optimised away. Make exemptions too easy and the exemption becomes the default path — the fastest way past a failing check, taken without thought. Make them too hard, especially in an incident, and people leave the governed path entirely, which costs you the visibility you were trying to buy. Two things resolve it in practice: a **fast path with a strong record** — an urgent exemption can be granted in minutes but is automatically short-lived and reviewed afterwards — and different friction for different rules, so the small hard-mandatory core has no exemption path at all while everything else does. ## Distinguish exemption from accepted risk A useful separation at scale: an *exemption* is an engineering statement that this rule does not apply here. An *accepted risk* is a business statement that a known exposure will be carried, owned by someone with the authority to carry it. Conflating them lets engineering-level approvals silently accept risks nobody senior ever saw. Route the second kind to the risk owner, keep it in the risk register, and let the exemption reference it. ## Signals your exemption design is failing - Blanket skips outnumber targeted ones. - The median age of an open exemption exceeds its original expiry. - Exemptions approved by their own requester. - No one can produce the list on demand. - Rules are being deleted rather than exempted, because deleting is easier.

  • Why is a blanket suppression that disables all rules for a file worse than several targeted exemptions?
    Because its scope silently grows. It was added to unblock one resource, but every resource added to that file afterwards inherits the suppression and is never evaluated again. Nobody reviewing that later change sees anything unusual — the check simply reports green. Targeted exemptions fail loudly when a new resource appears, which is precisely the behaviour you want from a guardrail.
  • Should the small set of hard-mandatory rules have an exemption path at all?
    No, by definition — that is what makes them hard-mandatory, and it is why the set must stay small and unambiguous. The escape valve is a reviewed change to the policy set itself, which is deliberately slower and more visible than an exemption. If you find yourself editing those rules to let individual changes through, they were misclassified and belong at the soft-mandatory level with a recorded override.
  • How would you decide whether a recurring exception should become a permanent exemption or a change to the rule?
    By asking whether the exception is describable. If you can state the condition that makes it legitimate — this account, this resource class, this tag — encode it in the rule, because a rule that expresses the real standard needs no exceptions. Only when legitimacy depends on context the rule cannot see should it stay an exemption, and even then it should be time-bounded and re-argued rather than made permanent.

saying these in an interview costs you the question

  • Having no exemption path and assuming nobody will bypass the check
  • Letting a requester approve their own exemption
  • Adding a blanket skip for a whole file or directory
  • Granting exemptions with no expiry date
  • Reading a high exemption count as team indiscipline rather than a rule defect

context