This repository contains implementations of the paper "Is Enough Not Enough? Illusory Completion in Search Agents."
We present a novel framework for analyzing failure modes in agentic search systems through epistemic ledger tracking, which systematically evaluates whether agents properly verify constraints before claiming task completion.
.
βββ liveledger/ # LiveLedger: three-phase epistemic agent
β βββ run.py # Main agent (extract β search β update ledger)
β βββ run_baseline.py # ReAct baseline without ledger
β βββ prompt.py # System prompts
β βββ tools.py # Tool definitions (extract/search/update)
β βββ utils.py # EpistemicLedger, AgentStateMachine
β βββ search_engine.py # Serper (web search) + Jina (page reader)
β βββ train/ # SFT training pipeline
βββ epistemic_ledger/ # Post-hoc evaluation framework
β βββ build_ledger.py # Build (candidate Γ constraint) ledger from any trajectory
β βββ evaluate.py # LLM-as-judge answer correctness
β βββ accuracy.py # Correct/Incorrect Γ Verified/Underverified classification
β βββ failure_modes.py # Failure mode taxonomy
β βββ prompts.py # Constraint extraction + ledger update prompts
βββ baselines/ # Baseline runners + sample results
β βββ run_tag_search.py # Unified runner for tag-based baselines
β βββ results/ # Sample result files
βββ datasets/ # Benchmark datasets
βββ run_evaluation.py # End-to-end evaluation pipeline
git clone https://github.com/dayoon-ko/illusory_completion.git
cd illusory_completion
pip install -r requirements.txt
# Set API keys
export SERPER_API_KEY="your-serper-key"
export JINA_API_KEY="your-jina-key"
# Qwen3.5-27B (8 GPUs)
vllm serve Qwen/Qwen3.5-27B --port 8000 --tensor-parallel-size 8 \
--reasoning-parser qwen3 --enable-auto-tool-choice --tool-call-parser qwen3_coder \
--enable-prefix-caching --enforce_eager
cd liveledger
python run.py \
--model_name Qwen/Qwen3.5-27B \
-o outputs \
-w 4 \
-d browsecomp frames deepsearchqa
cd liveledger
python run_baseline.py --model_name Qwen/Qwen3.5-27B -o outputs_baseline -d browsecomp
cd baselines
python run_tag_search.py -b search-r1 -d browsecomp frames --search_engine serper
Supported: search-r1, smartsearch, rag-r1, reseek, hiprag
# LiveLedger outputs (ledger already built inline)
python run_evaluation.py --output_dir liveledger/outputs --has_ledger
# Baseline outputs (build ledger post-hoc, then evaluate)
python run_evaluation.py --output_dir baselines/outputs/search-r1 \
--baseline_name search-r1 --base_url http://localhost:8000/v1
cd liveledger/train
python curate_sft_data.py --input_dir ../outputs --output_dir sft_data
python train_sft.py --model_name Qwen/Qwen3.5-27B --dataset_path sft_data
python eval_checkpoint.py --checkpoint_dir output/checkpoint-xxx -d browsecomp
browsecomp # Browse & compose multi-hop questions
deepsearchqa # Deep research questions requiring synthesis
frames # Multi-constraint factual questions
livedrbench # Real-time information retrieval
webwalkerqa # Web navigation questions
bioasq # Biomedical question answering
Dataset files: datasets/{dataset_name}/test_mcqa.jsonl
An epistemic ledger tracks verification status for each (candidate, constraint) pair:
ledger = {
"candidate": {
"constraints": {
"C1": {
"obj": true, # Objective: proven with evidence
"obj_evidence": "quote", # Supporting evidence
}
}
}
}
Verification Status:
obj=true: Proven with evidenceobj=false: Disproven with evidenceobj=null: No evidence foundFailure Modes:
obj=null, per=true: Bare Assertion (claim without evidence)obj=false, per=true: Overlooked Refutation (ignoring contradictory evidence)@misc{ko2026enoughillusorycompletionsearch,
title={When Is Enough Not Enough? Illusory Completion in Search Agents},
author={Dayoon Ko and Jihyuk Kim and Sohyeon Kim and Haeju Park and Dahyun Lee and Gunhee Kim and Moontae Lee and Kyungjae Lee},
year={2026},
eprint={2602.07549},
archivePrefix={arXiv},
primaryClass={cs.AI},
url={https://arxiv.org/abs/2602.07549},
}
Apache 2.0
21 commits
Python
100.0%
This repository contains implementations of the paper "Is Enough Not Enough? Illusory Completion in Search Agents."
We present a novel framework for analyzing failure modes in agentic search systems through epistemic ledger tracking, which systematically evaluates whether agents properly verify constraints before claiming task completion.
.
βββ liveledger/ # LiveLedger: three-phase epistemic agent
β βββ run.py # Main agent (extract β search β update ledger)
β βββ run_baseline.py # ReAct baseline without ledger
β βββ prompt.py # System prompts
β βββ tools.py # Tool definitions (extract/search/update)
β βββ utils.py # EpistemicLedger, AgentStateMachine
β βββ search_engine.py # Serper (web search) + Jina (page reader)
β βββ train/ # SFT training pipeline
βββ epistemic_ledger/ # Post-hoc evaluation framework
β βββ build_ledger.py # Build (candidate Γ constraint) ledger from any trajectory
β βββ evaluate.py # LLM-as-judge answer correctness
β βββ accuracy.py # Correct/Incorrect Γ Verified/Underverified classification
β βββ failure_modes.py # Failure mode taxonomy
β βββ prompts.py # Constraint extraction + ledger update prompts
βββ baselines/ # Baseline runners + sample results
β βββ run_tag_search.py # Unified runner for tag-based baselines
β βββ results/ # Sample result files
βββ datasets/ # Benchmark datasets
βββ run_evaluation.py # End-to-end evaluation pipeline
git clone https://github.com/dayoon-ko/illusory_completion.git
cd illusory_completion
pip install -r requirements.txt
# Set API keys
export SERPER_API_KEY="your-serper-key"
export JINA_API_KEY="your-jina-key"
# Qwen3.5-27B (8 GPUs)
vllm serve Qwen/Qwen3.5-27B --port 8000 --tensor-parallel-size 8 \
--reasoning-parser qwen3 --enable-auto-tool-choice --tool-call-parser qwen3_coder \
--enable-prefix-caching --enforce_eager
cd liveledger
python run.py \
--model_name Qwen/Qwen3.5-27B \
-o outputs \
-w 4 \
-d browsecomp frames deepsearchqa
cd liveledger
python run_baseline.py --model_name Qwen/Qwen3.5-27B -o outputs_baseline -d browsecomp
cd baselines
python run_tag_search.py -b search-r1 -d browsecomp frames --search_engine serper
Supported: search-r1, smartsearch, rag-r1, reseek, hiprag
# LiveLedger outputs (ledger already built inline)
python run_evaluation.py --output_dir liveledger/outputs --has_ledger
# Baseline outputs (build ledger post-hoc, then evaluate)
python run_evaluation.py --output_dir baselines/outputs/search-r1 \
--baseline_name search-r1 --base_url http://localhost:8000/v1
cd liveledger/train
python curate_sft_data.py --input_dir ../outputs --output_dir sft_data
python train_sft.py --model_name Qwen/Qwen3.5-27B --dataset_path sft_data
python eval_checkpoint.py --checkpoint_dir output/checkpoint-xxx -d browsecomp
browsecomp # Browse & compose multi-hop questions
deepsearchqa # Deep research questions requiring synthesis
frames # Multi-constraint factual questions
livedrbench # Real-time information retrieval
webwalkerqa # Web navigation questions
bioasq # Biomedical question answering
Dataset files: datasets/{dataset_name}/test_mcqa.jsonl
An epistemic ledger tracks verification status for each (candidate, constraint) pair:
ledger = {
"candidate": {
"constraints": {
"C1": {
"obj": true, # Objective: proven with evidence
"obj_evidence": "quote", # Supporting evidence
}
}
}
}
Verification Status:
obj=true: Proven with evidenceobj=false: Disproven with evidenceobj=null: No evidence foundFailure Modes:
obj=null, per=true: Bare Assertion (claim without evidence)obj=false, per=true: Overlooked Refutation (ignoring contradictory evidence)@misc{ko2026enoughillusorycompletionsearch,
title={When Is Enough Not Enough? Illusory Completion in Search Agents},
author={Dayoon Ko and Jihyuk Kim and Sohyeon Kim and Haeju Park and Dahyun Lee and Gunhee Kim and Moontae Lee and Kyungjae Lee},
year={2026},
eprint={2602.07549},
archivePrefix={arXiv},
primaryClass={cs.AI},
url={https://arxiv.org/abs/2602.07549},
}
Apache 2.0
21 commits
Python
100.0%