Security

What to Do When the Review Finds a Risk You Cannot Fix

Antonio Evans9 min read

A close-up of a printed decision record on a desk: a short table with columns for risk, compensating control, owner, monitoring signal, sign-off and revisit date, one row filled in by hand.
Key points

Key points

  1. 1When a launch gate fails on a risk you cannot close in time, the correct output is a signed, time-bound risk acceptance record, not a verbal waiver.
  2. 2The record names one accountable signer with authority over the consequence, states the gap and a concrete failure scenario, and lists the compensating controls that run instead.
  3. 3Each compensating control needs an owner, a test date, and the evidence it produces, because an untested control only shows that coverage exists, not that it works.
  4. 4Monitoring with numeric thresholds, a named alarm path, and a revisit date turns the exception into a bounded decision that expires instead of becoming permanent architecture.

Why a failed gate is a decision, not a defect

Most launch checklists are binary: control present, control absent. When the answer comes back absent, teams improvise. Some ship quietly and log the gap as a backlog item. Others block the launch indefinitely. Both are worse than a documented acceptance, because the first leaves nobody accountable and the second treats every gap as fatal.

The security literature is clear that absence of objection is not acceptance. A risk acceptance record is the formal instrument by which an accountable executive takes ownership of a known gap for a defined period, and the authorization decision must be an explicit documented act rather than something inferred from silence as described here. A mature program does not eliminate all risk; it makes risk visible, bounded, and reviewable per this program handbook.

For AI systems the situation is rarely "we have no controls." It is usually "we have one layer and we know it leaks." OWASP's guidance is not to chase a model that cannot be fooled but to build the system around the model so nothing important breaks when it is fooled per the prompt injection entry. That is the intellectual basis for accepting a residual gap: you accept the model-level weakness because system-level controls contain the consequence.

Step 1: write the gap statement so the signer can test it

The most common failure in acceptance records is restating the control requirement instead of describing what the environment cannot do. "Prompt injection filtering is not comprehensive" tells the signer nothing they can verify.

A usable gap statement carries observable consequences and numbers:

The launch configuration has no deterministic check between the agent's tool output and the payment service. In the last 30 days the agent issued a median of 412 tool calls per day, of which 3 to 6 involved a state change. If a manipulated document in the retrieval store causes one state-change call to carry an attacker-chosen recipient, the payment service executes it under the service account and no approval step catches it.

That gives the signer four questions they can ask: how many calls, which tools change state, what account those tools use, and where the missing check would sit. If your gap statement cannot survive those questions, rewrite it.

FieldWhat it must containTest the signer can apply
Scope qualifierThe exact system, environment, and population affectedIs the gap narrower than what I am signing for?
Failure scenarioWho could exploit the gap, by what mechanism, reaching what outcomeIs this plausible in our deployment?
Obligation mappingThe internal standard or external framework the gap touchesIs this only operational risk, or also an audit finding?

Obligation mapping matters more than teams expect because it changes the kind of risk being accepted. A signer who learns at audit that an accepted gap was also a reportable control failure was not given the record they needed per this acceptance guidance. If the gap maps to a named framework entry, say so. The OWASP Top 10 for LLM Applications is common, and both the 2025 and 2026 numberings circulate, so cite the edition you tested against per this summary.

Step 2: choose a signer who can carry the consequence

The rule is simple and often violated: the signer is not the person who built the system. They are the person whose budget, regulatory posture, or business continuity absorbs the failure. For an AI feature touching customer data that is usually the product owner's manager or the business unit lead, with security and privacy as reviewers rather than approvers of the final call.

A multi-party check is worth borrowing from vendor acceptance memos, which route the decision past business, security, privacy and legal, procurement, service owner, risk owner, and the final authority as applicable per this memo template. You do not need seven signatures for an internal launch, but you need the ones that map to real exposure: whoever owns the data, whoever answers the incident, and whoever can stop the launch.

Two governance rules keep this from decaying:

  • Every acceptance has an expiry date, and renewals require fresh evidence that the blocker still exists.
  • Repeated requests from the same service are escalated, and leadership sees exception age and concentration, not just total count per this handbook.

The decay pattern is predictable. The first exception is scrutinized, the second is routine, and the third is a spreadsheet line nobody reads. Age and concentration reporting is what makes the third visible.

Step 3: define compensating controls with owners and evidence

A compensating control is an alternative safeguard that meets the same objective as the primary control when that control cannot be implemented, and it is typically temporary and specific to the deficiency per MetricStream's guide. That definition carries an obligation: the record must say when the control ends and what it covers.

The biggest mistake is listing controls without tested status. "Network access logging is enabled and reviewed" tells the signer coverage exists, not that it works. Each entry needs the control name and owner, the most recent test result and date, the period covered, and a plain statement of what the control actually reduces per this acceptance guidance.

For AI systems the highest-value compensating controls usually reduce agency rather than add detection. OWASP describes excessive agency as built from excessive functionality, excessive permissions, and excessive autonomy, any of which can be trimmed before launch, and recommends requiring approval for high-impact actions per the LLM06 entry. A tool that can read and delete documents but only needs to read is a one-line change, and it is the cheapest fix you have.

Practical controls for a gap you cannot close:

  • Reduce the tool surface. Remove tools the launch does not need and run remaining tools in the user's context rather than a shared high-privilege identity per the LLM06 entry.
  • Put the check in code, not the prompt. Enforce authorization outside the model, validate responses deterministically, and require human confirmation for irreversible actions per the 2026 risk table.
  • Narrow the deployment scope. Cap blast radius with rate limits and hard spending ceilings, which OWASP lists among the mitigations for unbounded consumption per the LLM10 entry.
  • Partition retrieval. If the gap lives in RAG, enforce permission-aware vector stores and strict logical partitioning so one tenant's query cannot retrieve another's embeddings per the LLM08 entry.

Write the residual limitation next to each control. The record should not claim the controls are equivalent to the missing one; it should say why the residual exposure is temporarily inside the authorized boundary per this template.

Step 4: build monitoring that proves the controls still run

Monitoring answers one question: are the compensating controls still doing what the record claims? That means metrics come from the controls, not from generic system health.

Thresholds belong in the record so the signer knows what pulls them back in.

SignalThresholdAutomatic responseNotify
Blocked tool calls per day3x the 7-day medianPage the on-call owner, freeze state-changing toolsRisk owner, security
Approval rejections on high-impact actionsMore than 5 percent in an hourRate-limit the agent, review the queueProduct owner
Documents failing source validationAnyQuarantine the document, alert the ingest ownerData owner
Model spend per hourConfigured ceilingCircuit breaker trips, agent pausedFinance, engineering

OWASP names rate limiting, input size checks, hard spending caps, and circuit breakers for agents as the mitigations for runaway consumption, and denial of wallet is explicitly about cost-per-use services being drained by volume per the LLM10 entry. If your gap is in cost control, those four are your compensating controls and the spend metric is your proof.

Logging needs the same treatment. Vector and embedding weaknesses are mitigated in part by monitoring ingest and retrieval, because poisoning and unusual retrieval patterns show up in those records before they show in outcomes per this RAG security explainer. Keep the logs queryable for the life of the exception, because they are evidence the signer will be asked to produce. Make the alarm path one person and one action, not a channel. If the record says "the team will investigate," nobody will.

Step 5: set the revisit date and the rollback triggers

The revisit date separates an exception from a waiver. Derive it from the remediation plan, not an arbitrary interval, and state it with a milestone. If the fix needs two weeks of build and one week of test with committed capacity, the revisit is end of week three, not "Q3." When the date arrives, the owner presents evidence of completion or continued blockage, and the signer signs again or the exception closes. The vendor memo pattern does this by making acceptance expire automatically unless a fresh decision is approved per this template.

Write rollback and fix triggers as conditions, not judgments:

  • Rollback trigger: any confirmed incident traceable to the gap, any threshold breach unresolved past its response window, or any change to the data classification in scope.
  • Immediate fix trigger: discovery that a compensating control silently failed, for example logging stopped or a rate limit was raised without approval.
  • Scope reduction trigger: a request to onboard a new tenant or data category, which resets the analysis because the gap statement changes.

The record itself should follow a short pattern: context, decision, alternatives, security trade-offs, expected telemetry, and triggers for re-evaluation per this handbook. That is small enough to fill in during a launch review and complete enough to survive an audit.

GAP: <what the system cannot do, with observed numbers>
SCOPE: <system, environment, data categories, tenant count>
SCENARIO: If <trigger> while <gap>, then <asset> may <impact>.
COMPENSATING CONTROLS:
  - <control> | owner | tested <date> | evidence <where>
MONITORING: <metric> >= <threshold> -> <action> -> <who>
TRIGGERS: rollback if <condition>; fix immediately if <condition>
REMEDIATION: <change> due <date>, owner <name>
REVISIT: <date>, evidence required: <artifact>
SIGNER: <name, role, authority over the consequence>
EXPIRY: <date, automatic unless renewed>

Record two ratings, not one average: inherent exposure before safeguards and residual exposure after verified safeguards, because an average can hide a mandatory failure per this template. A single "medium" line is the record that collapses in an audit eighteen months later.

The options you should compare before accepting

Acceptance is one of five options, and teams default to it too quickly. Compare them in the record so the signer sees the alternatives were priced.

OptionSecurity effectBusiness effectWhen to choose it
Do not proceedRisk stays out of productionLaunch slips, commitment delayedGap crosses a legal or contractual prohibition
Reduce scopeSmaller population exposedLimited launch, internal users onlyGap is severe but narrow
Add a control you can build fastPartial coverage, measurableDays of engineeringA deterministic check or approval step exists
Accept with conditionsBounded, monitored, expiringLaunch on schedule with obligationsGap is real, remediation underway, signer has authority
Replace the componentRemoves the gap classProcurement or rebuild costThe failing part is third-party and unresponsive

"Do not proceed" is correct when the gap crosses a legal prohibition or a control the organization has declared non-negotiable, and those cases escalate rather than enter the exception queue per this memo guidance. "Add a control you can build fast" applies more often than teams assume, because the cheapest fixes reduce access rather than add detection: fewer tools, narrower permissions, manual approval on the one state-changing call per the LLM06 entry. The OWASP cybersecurity and governance checklist is a reasonable input here, since it is written for the cross-functional group that has to make this call, including executive, security, privacy, compliance, and engineering leaders per the checklist.

A worked example. A support agent launches next week; the gate flags that indirect prompt injection can reach a state-changing refund tool; the proper fix, a code-level approval gate, needs three weeks. You accept the risk with conditions for 21 days: the refund tool is removed from the agent and refunds route to a human queue (no build cost), the agent is limited to internal users for 14 days (scope reduction), spend is capped at a hard hourly ceiling with a circuit breaker, and the on-call owner watches refund-queue volume and tool-call rejections daily against a named threshold. The signer is the support operations lead, who owns refund errors. The revisit is day 21, with the approval gate as the required artifact. Engineering cost to the launch: the config change plus two dashboards. That is what a documented acceptance buys: the launch moves, exposure is smaller, someone owns the consequence, and the gap has an end date.

If the gap is in model access or cost control, the fix is sometimes architectural. Routing every model call through a single API with prepaid credits and a hard ceiling gives you the circuit breaker and spend metric the record needs, across text, image, video, audio, and embedding models, which also simplifies the supply chain question OWASP lists as a top-ten risk per Quanta Inference and the 2026 risk table. If the review is stalling because nobody on the team has done this before, a free 30-minute discovery call is cheaper than another week of circular review.

FAQ

FAQ

Who should sign a risk acceptance record?

Someone with the authority to absorb the consequence: the business owner of the affected process or data, not the engineer who built the system. Security and privacy review and can veto on policy grounds, but the acceptance sits with the person whose budget or regulatory posture takes the hit. For AI features touching customer records, that is typically the operations or product lead above the team.

How long should an exception last?

Long enough to complete the fix, short enough that silence becomes a decision. Derive the date from the remediation plan (build plus test plus committed capacity) and state the milestone due by then. Make the exception expire automatically unless a fresh decision is signed, so a missed date forces action instead of letting the gap roll forward per this memo pattern.

What if the compensating controls are untested?

Then the record must say so, and the signer must know coverage is unverified. Each entry should carry a test date and the evidence artifact it produces, and an untested control should carry a commitment to test within a stated window per this acceptance guidance. An untested control is not a reason to refuse the exception; a misrepresented one is.

How is this different from a normal security exception?

It is the same instrument applied to a launch gate rather than standing policy. Both are explicit, time-bound, owned, linked to compensating controls, and reviewable by a defined authority per this handbook. The difference is timing and detail: a launch acceptance carries a named failure scenario, monitoring thresholds, and rollback triggers, because it ships something real users exercise within days.

Can we accept a gap that maps to a legal requirement?

No. Acceptance records bound operational risk; they do not convert a legal prohibition or mandatory contractual commitment into an acceptable one. Escalate those to legal, privacy, or the appropriate executive authority instead of routing them through the exception queue per this memo guidance. The same applies to controls the organization has already declared non-negotiable.

Sources

Sources

  1. Writing a risk acceptance record the accepting executive ...
  2. Risk Acceptance, Exceptions, and Decision Records
  3. LLM01:2025 Prompt Injection - OWASP Gen AI Security Project
  4. OWASP Top 10 for LLM Applications: 2026 and 2025 - Superwise.ai
  5. Vendor Security Risk Acceptance Memo Template
  6. The Ultimate Guide to Compensating Controls
  7. LLM06:2025 Excessive Agency - OWASP Gen AI Security Project
  8. OWASP LLM10: 2025 Unbounded Consumption
  9. LLM08:2025 Vector and Embedding Weaknesses
  10. RAG Security: Vector & Embedding Weaknesses | OWASP LLM08
  11. LLM Applications Cybersecurity and Governance Checklist v1.1
About the author

About the author

Antonio Evans
Antonio Evans

Antonio Evans is the founder of Quanta Intelligence and a fractional CTO who builds HIPAA-ready AI systems for health and life-science companies. Before that he was technical co-founder of FriendsEAT for twenty years, CEO of Socialdraft, and a data engineer at IBM. Antonio lives with his dog Santino in Lisbon, Portugal.

All articles