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:
- Instrument after the reviewer has seen the evidence, not before. A gap log filled in blind records guesses, not gaps.
- Instrument before the decision is committed. Once "approved" is written, the reviewer's incentive to name what they did not understand collapses.
- 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.



