Cursor's "Sand" project targets non-developers. Anthropic's Claude Cowork runs cross-device. OpenAI's ChatGPT Work delivers documents, spreadsheets, and presentations. When an agent produces a deliverable for someone who cannot read the code, the verification interface matters more than the output format. A download button is not verification.
The problem
When a developer reviews agent output, they can read the diff, run the tests, and check the types. When a non-developer receives an agent-produced spreadsheet or document, they have no equivalent verification path. They either trust it completely or reject it completely. Neither is useful.
What a verification UI needs
| Element | Purpose | Implementation |
|---|---|---|
| Source list | Show what inputs the agent used | Links to source documents with timestamps |
| Confidence indicator | Flag low-confidence outputs | Per-section confidence derived from source coverage |
| Change highlights | Show what the agent generated vs. copied | Diff view between source and output |
| Audit trail | Record who requested what and when | Append-only log with request ID, timestamp, and result hash |
| Rejection path | Let the user say "this is wrong" without starting over | Feedback record linked to specific output section |
A minimal verification component
<!-- agent-output-verification.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Agent Output Verification</title>
<style>
.verification-card {
border: 1px solid #ddd;
border-radius: 8px;
padding: 16px;
margin: 8px 0;
font-family: system-ui, sans-serif;
}
.source-list { list-style: none; padding: 0; }
.source-list li {
padding: 4px 0;
border-bottom: 1px solid #eee;
}
.confidence-low { color: #c0392b; font-weight: bold; }
.confidence-medium { color: #e67e22; }
.confidence-high { color: #27ae60; }
.reject-btn {
background: #fff;
border: 1px solid #c0392b;
color: #c0392b;
padding: 4px 12px;
border-radius: 4px;
cursor: pointer;
}
.reject-btn:hover { background: #c0392b; color: #fff; }
.audit-entry {
font-size: 12px;
color: #666;
margin-top: 8px;
}
[role="alert"] {
padding: 8px;
border-radius: 4px;
margin: 4px 0;
}
.alert-warning {
background: #fff3cd;
border: 1px solid #ffc107;
}
</style>
</head>
<body>
<div class="verification-card" role="article" aria-labelledby="output-title">
<h2 id="output-title">Q3 Revenue Summary</h2>
<p>
Generated by: agent-task-7841<br>
Requested: 2026-07-20 14:32 UTC<br>
Confidence: <span class="confidence-medium" id="confidence" role="status">Medium</span>
</p>
<div role="alert" class="alert-warning" id="confidence-warning" hidden>
This output has medium confidence. Two of five sections have no direct source.
</div>
<h3>Sources used</h3>
<ul class="source-list" aria-label="Sources used by the agent">
<li>Q3-sales-report.csv (uploaded 2026-07-20)</li>
<li>Pricing-changes-2026.xlsx (uploaded 2026-07-20)</li>
<li>Q2-summary.docx (uploaded 2026-07-15)</li>
</ul>
<p><em>Sections "Market outlook" and "Risk factors" have no matching source.</em></p>
<h3>Output preview</h3>
<div id="output-preview" tabindex="0">
<p>Total Q3 revenue: $2.4M (up 12% from Q2)</p>
<p>Top product: Widget Pro ($890K, 37% of total)</p>
<p>Market outlook: <span class="confidence-low">[no source]</span></p>
</div>
<button class="reject-btn" id="reject-btn" aria-describedby="reject-help">
This section is wrong
</button>
<p id="reject-help" class="audit-entry">
Flag a section for review without discarding the whole output.
</p>
<div class="audit-entry" id="audit-trail" role="log" aria-label="Audit trail">
<strong>Audit trail:</strong><br>
Request 7841 initiated by user@example.com at 2026-07-20T14:32:00Z<br>
Agent completed at 2026-07-20T14:35:22Z<br>
Output hash: sha256:a3f2e1...
</div>
</div>
<script>
document.getElementById('reject-btn').addEventListener('click', function() {
const feedback = {
request_id: 'agent-task-7841',
section: 'output-preview',
feedback: 'rejected',
timestamp: new Date().toISOString()
};
// In production: send to feedback endpoint
console.log('Feedback recorded:', feedback);
this.textContent = 'Flagged for review';
this.disabled = true;
});
// Show confidence warning for medium/low confidence
const confidence = document.getElementById('confidence');
if (confidence.textContent === 'Medium') {
document.getElementById('confidence-warning').hidden = false;
}
</script>
</body>
</html>
Accessibility requirements
- The source list uses semantic
<ul>with anaria-label - The confidence indicator uses
role="status"so screen readers announce changes - The alert uses
role="alert"for low-confidence warnings - The output preview is keyboard-focusable (
tabindex="0") - The reject button has
aria-describedbylinking to help text
What to check
When your agent produces output for a non-developer, can they see which parts have a source and which were generated without evidence? If they cannot, the output is unverifiable, and trust becomes the only option.
Top comments (0)