Business

Logging the Absence of Clarification Before an Approval

Antonio Evans9 min read

A split scene: left side shows a typical approval dialog with a green 'Approve' button and a greyed-out 'Ask a question' link; right side shows a log table with columns for request ID, time-to-approval.
Key points

Key points

  1. 1Most approval systems log the decision but discard the reasoning gap that preceded it, which is where drift starts.
  2. 2You can capture missing clarifications, unstated assumptions, and ignored risks as structured events at the moment of approval.
  3. 3The count and age of these clarification gaps are a leading indicator of teams approving without understanding.
  4. 4Rolling gaps into a per-approver and per-request-type drift signal turns a design flaw into a measurable, fixable number.

Where to instrument the pause

Every approval flow has a pause: the request goes out, a human looks at it, and then something happens. Most systems instrument the two ends (the request and the decision) and leave the middle empty. The clarification gap log lives in that middle. You do not need a new system of record. You need one extra write on the path that already exists.

The mechanics differ by stack, but the shape is the same everywhere. In an async approval pattern, a workflow blocks until a signal or timeout arrives, and the approval payload captures approver identity, a decision, comments, and a timestamp. The Temporal approval pattern documentation makes the point that capturing approval decisions "along with metadata such as the approver's identity, a reason, and a timestamp" is the structured alternative to a plain boolean. Your gap log attaches to the same signal handler, so it rides along with the decision rather than requiring a second round trip.

The same hook exists in agent frameworks. Tool-level checkpoints let you pause execution right before a specific function runs and surface a structured request for human input; the Agno human-in-the-loop guide describes requires_confirmation=True producing a RunRequirement object that describes the pending action. That object is your insertion point: before the human resolves it, you ask them what is unclear, and you persist the answer next to the resolution.

For flows built on a formal authorization protocol, the pause is even cleaner to instrument. Client Initiated Backchannel Authentication decouples the authorization request from the action so the requester waits on a backchannel while a human gets notified and decides, as described in Auth0's writeup on secure human-in-the-loop interactions. Because the decision is already a discrete, timestamped message, you can attach gap metadata to it without touching the agent.

Three practical placement rules:

  1. Instrument after the reviewer has seen the evidence, not before. A gap log filled in blind records guesses, not gaps.
  2. Instrument before the decision is committed. Once "approved" is written, the reviewer's incentive to name what they did not understand collapses.
  3. Instrument on both approve and reject paths. Rejections carry gaps too, and a rejection with no stated missing information is often just avoidance.

If your flow routes through Slack or email via a library like HumanLayer, the Permit.io comparison of HITL frameworks is a useful map of which libraries give you a post-decision hook and which only give you a blocker. The deciding factor for gap logging is not whether the framework can pause, it is whether it emits a durable object after the pause resolves.

What to record in a clarification gap event

A gap event is not a comment field. Comments are unstructured, they get skipped, and they are impossible to aggregate. A gap event is a small, fixed-schema record with a short list of what was left unclear. Keep it to under a minute of reviewer effort or it will not happen.

FieldTypeWhy it matters
gap_idUUIDJoin key across decision log, audit trail, and dashboards
request_idstringLinks the gap to the request it shadows
request_typeenumEnables drift comparison across approval classes
approver_idstringSupports per-approver analysis and coaching
decided_attimestampAge calculations and time-of-day patterns
decisionenum (approve, reject, escalate, modify)Separates gaps that preceded action from gaps that preceded refusal
missing_questionslist of short stringsThe questions that should have been asked
assumptionslist of short stringsWhat the approver assumed to proceed
unanswered_riskslist of short stringsKnown risks nobody resolved
confidenceinteger 1 to 5Self-reported understanding
evidence_seenbooleanWhether the reviewer opened the attached evidence
time_to_decide_secondsintegerDerived from the pause, useful as a proxy for engagement

Two design choices matter more than the rest. First, missing_questions must be a list, not free text, so you can cluster and count them later; a one-line comment about "unclear scope" is worth nothing at scale. Second, confidence should be captured on every decision, including clean ones, so you have a baseline. Without a baseline, a rising gap count is ambiguous: it could mean more confusion or better reporting.

The sanity of the record depends on the input state being pinned. A decision audit trail is only replayable if it stores "the exact text or JSON the model read, pinned to a specific content revision rather than a pointer to the current version," along with the policy version, the threshold in force, and any human override, per Sanity's glossary entry on decision audit trails. Your gap event inherits the same discipline: it must reference the exact artifact version the approver saw, not the request as it looks a week later.

This is the same principle behind a well-built decision log. A decision log is "a structured record of your decisions: what you chose, why you chose it, who was involved, what alternatives were considered, and what outcomes were expected," and it exists because the reasoning behind a choice fades unless it is written down, per monday.com's decision log guide. The clarification gap log is the decision log's missing half: it records the reasoning that did not happen.

The decision rule: when a gap becomes a stop

Not every missing clarification should block an approval. If it did, nothing would ship. You need a rule that decides, at the moment of approval, whether the gap is tolerable, must be logged and proceed, or must halt the request.

The rule I recommend is a two-axis classification: reversibility and blast radius. The StackAI approval workflow design guide states the risk-based rule of thumb plainly: require approval when the agent's next action is "irreversible, costly, regulated, or high blast radius." Extend that to gaps: a gap that sits on an irreversible action is a stop, a gap on a cheap corrective action is a log-and-go.

Gap typeReversible actionIrreversible action
Missing business contextLog and proceed with confidence ratingStop, request clarification
Unstated assumption about dataLog, flag for post-reviewStop, request clarification
Unanswered compliance riskStop, escalate to ownerStop, escalate and block
Missing technical detailLog and proceedLog and proceed if rollback exists

A worked example makes the arithmetic concrete. Suppose your approval queue sees 400 requests a week. Historically, 12% arrive with a missing field that the approver has to chase, so 48 requests a week. Each chase costs an average of 18 minutes across reviewer and requester, which is about 14.4 hours a week. If your gap log shows that 70% of those chases are the same three fields, you have a data-capture problem upstream, and fixing the request form removes roughly 10 hours a week of rework while making the gap count fall on its own. The log pays for itself the first time you can say "these three fields cause most of our clarification debt" with numbers.

The complementary rule covers the opposite failure. Reviewers who never record a gap are not necessarily seeing clear requests; they may be rubber-stamping. The Promptessor guide to HITL approval workflows flags the risk directly: "Approval fatigue can make human oversight meaningless," and it recommends recording what the reviewer saw alongside the decision. A reviewer with a zero gap rate and a median decision time of four seconds is a finding, not a role model.

From events to a drift signal

One gap event is an anecdote. A thousand gap events with timestamps become a control chart. The insight most teams miss is that you should track two distinct numbers, and they move in opposite directions.

Gap count (gaps per 100 approvals) measures how often people approve without understanding. Gap age (median time from a gap being recorded to its resolution) measures whether anyone ever goes back. A team with a falling gap count and a rising gap age is not improving; it has stopped reporting. A team with a rising gap count and a falling gap age is getting more honest and more responsive at the same time, which is the healthy trajectory.

Compute the signal on three slices: by request type, by approver, and by week. The per-request-type slice tells you where to fix the form. The per-approver slice tells you who needs context or training. The weekly slice tells you whether a process change helped or a new bottleneck appeared.

-- Weekly clarification gap rate and age, per request type
SELECT
  request_type,
  date_trunc('week', decided_at)              AS week,
  COUNT(*)                                    AS approvals,
  COUNT(gap_id) FILTER (WHERE gap_id IS NOT NULL) AS approvals_with_gap,
  ROUND(100.0 * COUNT(gap_id) FILTER (WHERE gap_id IS NOT NULL)
        / COUNT(*), 2)                        AS gap_rate_pct,
  ROUND(percentile_cont(0.5) WITHIN GROUP (
        ORDER BY resolved_at - decided_at) / 3600.0, 1) AS median_gap_age_hours,
  ROUND(AVG(confidence), 2)                   AS avg_confidence
FROM approval_events
WHERE decided_at > now() - interval '12 weeks'
GROUP BY 1, 2
ORDER BY 1, 2;

Set alert thresholds empirically, not from a benchmark you read somewhere. Run the query for four weeks with no thresholds at all, then set the alert at roughly 20 to 30% above your own median gap rate. The Galileo guide to production HITL oversight makes the same argument for escalation: "derive escalation rate targets from your own task distributions, not generic industry figures." Your gap rate is a property of your request intake, your evidence packs, and your reviewer training, so it deserves your own baseline.

For agents specifically, the gap signal doubles as an autonomy gate. The Elementum writeup on HITL agentic AI lays out a three-tier model (human-in-the-loop, human-on-the-loop, human-out-of-the-loop) and argues that how much oversight a workflow needs depends on its risk profile. Gap rate is an empirical proxy for that risk. A request type that consistently shows low gap rate and high confidence over several weeks is a candidate for exception-only review; one that shows a widening gap spread stays under full review.

Two failure modes and how to avoid them

The compliance theater trap. When gap logging becomes mandatory, reviewers will enter the minimum that clears the form. You get a wall of "assumption: standard" entries and a dashboard that says everything is fine. The counter is structural, not motivational: make the gap list a set of choices pulled from the request's own missing fields, and require evidence_seen to be true before the decision commits. If the reviewer did not open the evidence, the gap is real whether or not they wrote it down.

The slowdown objection. Someone will argue that gap capture adds friction to a flow you built to be fast. The StackAI guide names this misconception explicitly and points at the real cause of slow approvals: "The delay usually comes from poor routing and incomplete context, not from the mere existence of a human step." Note the word incomplete context. A gap log is a measurement of how often context is incomplete. The fix is better request intake, and the log tells you which intake fields to fix first.

There is a third, subtler failure: instrumenting only the approve path. If gaps are only recorded on approvals, your data conflates "we proceeded without understanding" with "we refused to proceed." The Permit.io guide stresses that every action should have a reviewer or approver so the audit trail answers who authorized what and why. Your gap event should answer the same for refusals: what was missing that made you say no?

A worked rollout

Start narrow. Pick two request types, one high-risk and one routine, and run the gap log for two weeks.

Week 1: instrument only. Add the gap fields to the approval pause, capture confidence and evidence_seen, and do not act on the data. Tell reviewers the data is for calibration, not performance review. The second part is not optional; if reviewers believe gaps are being scored against them, you get the compliance theater trap.

Week 2: review together. Pull the per-request-type query and read every gap where confidence was 1 or 2. You will usually find two kinds of finding: a missing field on the request form (fix the form) and a policy that nobody actually understands (fix the policy).

Week 3 onward: set the signal. Publish a weekly gap rate and median gap age per request type and per approver. Do not rank approvers by gap count; publish the distribution and discuss outliers in one-on-ones. Ranking punishes honesty, and honesty is the entire raw material of this system.

If you want help designing the instrumentation or reading the first month of signals, a free consulting call is a reasonable place to map your existing approval flow onto these fields. And if the approval flow itself is agent-driven, running every model behind a single endpoint makes plumbing the pause and the gap event far simpler: Quanta Inference exposes text, image, video, audio and embedding models through one OpenAI-compatible API, so the approval hook lives in one place rather than one per provider.

FAQ

FAQ

What exactly is a clarification gap?

It is a recorded event describing the questions that were never asked before an approval was finalized: missing clarifications, unstated assumptions, and risks nobody resolved. It is stored as a structured record with a timestamp, the approver, the request, and a short list of what was left unclear. It lives alongside the decision, not instead of it.

Do I need a new tool to capture this?

Usually not. Any approval mechanism that pauses and resumes already has a point where the decision is written, and the gap record attaches there. The Temporal approval pattern, tool-level confirmation objects in agent frameworks, and CIBA-style backchannel authorization all expose a durable decision message you can extend with gap fields.

How is this different from a decision log?

A decision log records what was decided, why, who was involved, and what alternatives were considered. A clarification gap log records what was not understood or asked. The two are complements: the decision log explains the choice, and the gap log explains the uncertainty the choice carried.

What is a healthy gap rate?

There is no universal number, and you should be suspicious of anyone who gives you one. Baseline your own process for four weeks, then treat a sustained rise of 20 to 30% above your own median as the signal worth investigating. A gap rate of zero across all approvers is itself a warning sign, because it usually means nobody is recording.

Won't recording gaps slow approvals down?

The measurement adds seconds; the friction people feel usually comes from incomplete context upstream. A gap log is how you find out which request fields are missing, so intake gets better and the chases stop. Track median gap age as the counter-metric: if it falls while the gap rate stabilizes, the loop is working.

Sources

Sources

  1. Approval Pattern | Temporal Documentation
  2. How to add human-in-the-loop controls to AI agents that ...
  3. Secure “Human in the Loop” Interactions for AI Agents
  4. Human in the Loop AI Agents: Approval Workflows That Work
  5. Decision audit trail: definition, contents, and why it matters
  6. Decision log: template, examples, and best practices 2026
  7. Human-in-the-Loop AI Agents: How to Design Approval Workflows for Safe ...
  8. Human-in-the-Loop AI Agents: Approval Workflows & Best Practices
  9. How to Build Human-in-the-Loop Oversight for AI Agents
  10. Human-in-the-Loop AI Agents: Deploying Agentic AI With Control
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