Your Agent Isn't Lying — It's Guessing. Fix Structure
An r/OpenClawUseCases post: agents don't lie, they guess. Fix it with verifiable-state tools + cite-or-abstain prompts + Scavio grounding.
An r/OpenClawUseCases post made the right call about a recurring complaint: your agent isn't lying. It doesn't have opinions or motives. It's guessing because you didn't give it enough structure to do anything else. The framing matters because the fix follows the diagnosis. You don't fix lying with rules. You fix guessing with structure.
Why "did you send the email?" is a trap
LLMs are completion engines. The most natural text completion after "did you send the email?" in their training data is "yes, I sent it." Not because the agent checked. Because "yes" is the statistically likely response to that question. Without a tool actually wired in to verify, the agent has no way to know whether it sent the email or not — it's completing text.
The error is loud ("the agent lied!") but the cause is quiet: the system prompt asked the agent a question about state without giving it access to the state.
The structure that prevents guessing
Three components, applied consistently:
- Tools that return verifiable state. Don't ask "did you send X". Ask the email provider's API: "was message ID 12345 delivered?" — and tell the agent to use that tool when asked.
- Constraint-first prompts. Replace "did you send the email?" with "Use the email_status tool with the message_id. If the tool says delivered, say 'delivered at <time>'. If it says pending, say 'pending'. If you don't have a message_id, say 'I don't have a record of sending this'."
- Refusal options. Always include "If you don't know, say so" in the prompt. Default LLMs won't volunteer this — they'll guess. The instruction has to be there.
Where Scavio fits — verifiable state for web facts
Most agent "lies" about external facts (was meeting at 3pm? was the price $X? did the deploy succeed?) come from the same root cause: no verifiable state lookup. Scavio fills the web-fact slot:
System prompt rule:
For any factual claim about a company, product, person,
or external state: call scavio.search FIRST. Cite the
source URL. If sources contradict, say so. If sources
don't answer, say "I don't know based on these sources."The cite-or-abstain pattern
Instruct the agent to cite [N] for every factual claim, where N is the index of the source from the Scavio result. If the agent can't cite, the agent abstains. This is the structural fix for hallucination on web-fact queries:
import requests, os
H = {'x-api-key': os.environ['SCAVIO_API_KEY']}
PROMPT = '''Answer using ONLY the sources below.
Every factual claim ends with [N] where N is the source index.
If sources don't answer, say "I don't know based on these sources."
Sources:
{sources}
Question: {q}'''
def grounded_answer(q, llm):
r = requests.post(
'https://api.scavio.dev/api/v1/search',
headers=H, json={'query': q}
).json()
sources = '\n'.join(
f'[{i+1}] {x["title"]}: {x["snippet"]} ({x["link"]})'
for i, x in enumerate(r['organic_results'][:8])
)
return llm(PROMPT.format(sources=sources, q=q))The hallucination metric to actually track
Pick 50 questions where you know the truth. Run them with the unstructured prompt. Run them with the cite-or-abstain prompt + Scavio grounding. Count wrong answers. The drop is typically from 15-25% wrong to under 3% wrong on the same model. The difference is structure.
Why "tell the agent to be honest" doesn't work
Adding "don't make things up" to the prompt does almost nothing. The completion-engine nature of LLMs makes the most-likely-text-output win regardless of meta-instructions. Structure (the tool, the constraint, the refusal option) wins because it changes what completions are even available.
Common failure modes the structure fix prevents
- "Did you send the email?" → "Yes" (no actual send happened).
- "What's X's pricing?" → fabricated numbers from training-data drift.
- "What time is the meeting?" → confidently wrong because the calendar tool wasn't consulted.
- "Is feature Y available?" → made up from completion patterns.
The agent-as-junior-employee framing
A new junior employee given a task without context will guess. The fix isn't hiring a better junior employee; it's giving the existing one the SOP, the tool access, and explicit permission to say "I don't know." LLMs respond to the same management. Scavio is one of those tools. The cite-or-abstain prompt is the SOP. Together, they turn guessing into reliable behavior.
The honest takeaway
Don't blame the model. Don't add "please be accurate" to the prompt. Add a tool that returns verifiable state. Add an abstention option. Audit a sample, measure the delta. The fix is structure, not vibes.