Safeguard
Developer Tools•

How should you handle scan exceptions and waivers as a team grows?

Every blocking scan needs a way out. Record who approved, why, and when it expires. Here is how the process changes between 5, 50, and 500 engineers.

Safeguard Security Team
3 min read

Every blocking scan needs a documented way out: a waiver with a reason, a named approver, and an expiry date. The process should be lighter for a team of five and more formal at larger sizes, but the three fields stay the same.

Why you need a waiver process

Scanners are wrong sometimes, and sometimes a fix cannot ship today. Without a sanctioned exception path, developers choose their own: they disable the check, suppress findings in code, or merge with an administrator override. All three leave no record.

A waiver turns a quiet bypass into a visible decision.

The three required fields

  1. Reason. Why the finding does not apply or cannot be fixed now. "Not exploitable because the vulnerable function is never called" is a reason. "Deadline" is a weaker one but can be valid with a plan.
  2. Approver. A named person, not a team alias.
  3. Expiry. A date when the waiver lapses and the check applies again.

Leave out any of these and waivers become permanent, anonymous, and unexplained.

How it scales

Team sizeWho approvesWhere recordedReview
1 to 10Tech lead or founderA file in the repositoryAt each release
10 to 100Service owner, with a security contact for high severityA tracked list tied to the findingMonthly
100 and upTiered: owner for medium, security for criticalCentral register with reportingMonthly, plus aggregate trend review

Keep waivers where reviewers can see them

A waiver stored in a developer's editor settings or a chat message is invisible. Put it in version control next to the code, or in the system that holds findings, so a reviewer can see it during the pull request.

Watch for patterns

Count waivers by rule. If one rule produces most of them, the rule is probably too noisy or too strict. Change the rule instead of approving the same waiver forty times. Also watch for repeated renewals of the same waiver, which usually mean a fix is stuck and needs an owner.

Do not forget the admin bypass

Branch protection can let administrators bypass required checks. GitHub's documentation lists a setting that prevents bypassing the protection settings. Decide whether administrators are bound. If they are not, make sure bypass use is logged and reviewed, since it is an exception too.

Steps

  1. Define the three required fields.
  2. Choose where waivers live.
  3. Name approvers by severity.
  4. Set a default expiry, such as 30 or 90 days, appropriate to your risk.
  5. Send reminders before expiry.
  6. Review waiver counts monthly.

Where Safeguard fits

Safeguard supports policies, gates, and compliance evidence automation, so approved exceptions and the checks they relate to can be kept as evidence. Try a scan first at https://gold.safeguard.sh/scan.

Quick check

Should waivers ever be permanent?

Rarely. An expiry forces a fresh decision. If a risk is truly accepted long term, record it as an accepted risk with periodic review.

Can developers suppress findings in code comments?

Only if the suppression is visible in review and tied to a reason. Silent inline suppressions are an invisible exception path.

Sources

Last reviewed: 19 October 2026.

Never miss an update

Weekly insights on software supply chain security, delivered to your inbox.

Self-healing security runs on Safeguard.

Your first fix PR is minutes away.

No sales call required, even your agent can complete the purchase over MCP.