Benchmarking and Enhancing Agentic Causal Discovery
Organizations: Zhejiang University of Technology · Microsoft · The Hong Kong University of Science and Technology
Abstract
LLM agents can now run causal discovery algorithms on a dataset and report what comes out. Whether they do more than that, such as noticing where an algorithm went wrong and fixing it with further tests, is hard to tell from current benchmarks. Most of them give the variables meaningful names, and an LLM shown only the names of the Tübingen cause-effect pairs already gets 99% of the directions right. With the names removed, the data are usually clean enough that picking a better algorithm than PC closes most of the gap. We introduce Heuresis, a benchmark of anonymous simulated datasets whose mechanisms range from linear Gaussian to heavy-tailed. For each family of datasets it separates what a better existing algorithm can gain from what only a closer look at the data can gain, and it traces every edge an agent changes. Every family leaves a gap that none of the algorithms, the router and the two causal-discovery foundation models we ran can close, so a score above the best chosen algorithm has to come from using the data. We instantiate the benchmark with an agent harness and three LLMs, GPT-6.1 Sol, Claude Opus 5.5 and Qwen 3.8 Flash. GPT-6.1 Sol surpasses the best chosen algorithm on all six families, by 14% adjacency F1 on the most difficult one, and Claude Opus 5.5 does so by 7.4% there. A third of the true edges the two agents restore on the two hardest families appear in no algorithm's output. The code and data will be publicly released to facilitate future work.
Figures & tables
| Benchmark | D1 Anonymous | D2 Headroom | D3 Gains | D4 Decomposed |
|---|---|---|---|---|
| Corr2Cause | ✓ | |||
| CausalBN-Bench | ||||
| chatPC | ||||
| CausalArena | – | |||
| ACDB | ✓ | |||
| Heuresis (ours) | ✓ | ✓ | ✓ | ✓ |
| nonlinear | input-dep. noise | non-monotone | noise | difficulty | |||||||||
| Family | linear | MLP | piecewise | sigmoid | MLP | sigmoid | quadratic | Fourier | linear | Wrong | Zero | Headroom | |
| lg | ⚫ | · | · | · | · | · | · | · | · | · | 2.4 | 23% | .121 |
| anm | · | ⚫ | · | · | · | · | · | · | · | · | 1.4 | 26% | .078 |
| hetero | · | · | · | · | ⚫ | · | · | · | · | · | 1.0 | 39% | .049 |
| wild | ⚫ | ⚫ | · | · | ⚫ | · | ⚫ | ⚫ | ⚫ | ⚫ | 3.0 | 5% | .169 |
| mixed | ⚫ | ⚫ | · | · | ⚫ | · | · | · | · | · | 1.2 | 36% | .059 |
| lg | anm | hetero | wild | mixed | gauntlet | |
| BCA ϕ | .921 | .906 | .934 | .814 | .920 | .849 |
| Oracle | .973 | .984 | .982 | .977 | .986 | .983 |
| .069 | .000 | .000 | .006 | .007 | .000 | |
| .052 | .078 | .049 | .163 | .066 | .134 | |
| .029 | .000 | .000 | .006 | .007 | .000 | |
| .186 | .190 | .177 | .104 | .191 | .124 |
| GPT-6.1 Sol | Claude Opus 5.5 | |||||||
|---|---|---|---|---|---|---|---|---|
| PC-KCI | merge ∗ | agent | unsupp. | PC-KCI | merge ∗ | agent | unsupp. | |
| lg | .854 | .892 | .978 | 0/72 | .838 | .884 | .972 | 8/61 |
| anm | .887 | .887 | .958 | 4/39 | .891 | .891 | .910 | 2/29 |
| hetero | .914 | .920 | .967 | 5/29 | .913 | .922 | .940 | 3/24 |
| wild | .813 | .813 | .935 | 20/57 | .817 | .817 | .885 | 13/40 |
| mixed | .919 | .933 | .972 | 4/34 | .915 | .928 | .951 | 0/28 |
Appendix figures & tables11 assets
Supplementary material from the paper’s appendix.
Appendix
| Check | Reference | Scale | Result |
| Graph primitives | |||
| d-separation | two independent implementations (moralized ancestral graph; path blocking) | random DAGs, queries | 0 disagreements |
| DAG to CPDAG | brute-force enumeration of the Markov equivalence class; Chickering’s edge labeling; causal-learn | DAGs (enumeration), DAGs (labeling, causal-learn) | 0 disagreements |
| Exhaustive | causal-learn: d-separation, CPDAG and oracle PC | all labeled DAGs (equals OEIS A003024) | 0 disagreements |
| PC | |||
| Oracle PC | true CPDAG returned, first-set and union rules | random DAGs plus the exhaustive set | 0 failures |
| GPT-6.1 Sol | Claude Opus 5.5 | Qwen 3.8 Flash | ||||
| F1 | F1 | F1 | ||||
| lg | .978 | .043 [.019, .070] | .972 | .037 [.013, .066] | .945 | .009 [ .018, .039] |
| anm | .958 | .052 [.032, .074] | .906 | .000 [ .027, .027] | .899 | .008 [ .042, .027] |
| hetero | .967 | .042 [.027, .058] | .934 | .010 [ .012, .031] | .903 | .022 [ .048, .001] |
| wild | .935 | .115 [.083, .146] | .880 | .060 [.030, .090] | .843 | .023 [ .013, .059] |
| mixed | .972 | .045 [.028, .065] | .952 | .025 [ .000, .051] | .924 | .003 [ .033, .028] |
| GPT-6.1 Sol | Claude Opus 5.5 | |||||
|---|---|---|---|---|---|---|
| Family | adjacency F1 | nSHD | adjacency F1 | nSHD | ||
| lg | 32 | .125 [.086, .166] | .068 [.047, .091] | 23 | .134 [.080, .189] | .079 [.050, .108] |
| anm | 32 | .071 [.047, .097] | .110 [.091, .128] | 30 | .018 [ .014, .048] | .088 [.065, .111] |
| hetero | 32 | .053 [.035, .072] | .086 [.069, .103] | 26 | .027 [.002, .053] | .039 [.014, .062] |
| wild | 32 | .122 [.091, .152] | .135 [.115, .156] | 30 | .068 [.039, .097] | .111 [.090, .131] |
| mixed | 32 | .053 [.035, .071] | .092 [.069, .114] | 30 | .035 [.007, .064] | .077 [.053, .101] |
| Toolbox | Family | Precision | Recall | vs PC-KCI | Guided unguided |
| GPT-6.1 Sol | |||||
| full | lg | .88 [.77, .96] | .94 [.89, .99] | .112 [.074, .149] | .006 [ .019, .004] |
| anm | .87 [.78, .95] | .76 [.63, .88] | .048 [.028, .072] | .003 [ .016, .008] | |
| hetero | .89 [.79, .98] | .80 [.68, .91] | .039 [.023, .055] | .004 [ .013, .006] | |
| wild | .98 [.94, 1.00] | .70 [.59, .80] | .125 [.093, .156] | .009 [ .007, .028] | |
| minimal | lg | .83 [.73, .93] | .90 [.84, .96] | .091 [.057, .125] | .027 [ .051, .006] |
| lg | wild | |||||
| Factor | Level | shortcut | shortcut | wall | ||
| GPT-6.1 Sol | ||||||
| prompt | neutral | .049 [.028, .075] | .21 | .101 [.078, .125] | .00 | .00 |
| scoring | .050 [.029, .076] | .23 | .104 [.081, .128] | .02 | .00 | |
| warning | .053 [.030, .079] | .19 | .095 [.076, .115] | .00 | .00 | |
| rule | .044 [.021, .070] | .12 | .104 [.083, .125] | .02 | .00 | |
| Factor | Level | , lg | , wild | wall | unsubmitted | tokens |
|---|---|---|---|---|---|---|
| GPT-6.1 Sol | ||||||
| tokens per turn | 4 096 | .044 [.019, .074] | .112 [.084, .141] | .00 | .00 | 7 k |
| 8 000 | .043 [.017, .072] | .094 [.070, .121] | .00 | .00 | 7 k | |
| 16 000 | .051 [.026, .080] | .099 [.075, .123] | .00 | .00 | 6 k | |
| 32 000 | .045 [.016, .076] | .109 [.080, .142] | .00 | .00 | 6 k | |
| wall | 1 200 s | .049 [.030, .071] | .107 [.088, .128] | .00 | .00 | 7 k |
| Family | empty | complete | PC-KCI | random, oracle’s count | oracle |
|---|---|---|---|---|---|
| lg | .000 | .361 | .861 | .811 [.773, .848] | .970 |
| anm | .000 | .363 | .906 | .857 [.830, .884] | .984 |
| hetero | .000 | .362 | .928 | .892 [.871, .913] | .981 |
| wild | .000 | .362 | .818 | .742 [.710, .774] | .973 |
| mixed | .000 | .378 | .934 | .899 [.867, .928] | .987 |
| gauntlet | .000 | .340 | .849 | .768 [.738, .799] | .990 |
| Item | Value |
|---|---|
| Models | GPT-6.1 Sol (OpenAI), reasoning effort “medium”; Claude Opus 5.5 (Anthropic), adaptive thinking at effort “high”; Qwen 3.8 Flash (Alibaba), thinking mode on. Main runs of 2026-10-09; guided, prompt and budget runs of GPT-6.1 Sol and Claude Opus 5.5 of 2026-10-10 |
| Prompt | neutral level, no stated target; no algorithm is named below the rule level (Table 9 ) |
| Toolbox | the full toolbox: algorithm menu, conditional-independence tests (single, batched and subsampling stability), code analysis, local score, orientation probes, data summary, graph editor, and submission of the final edge list |
| Budgets | 1000 CI tests; 60 turns; 16000 output tokens per turn; 2400 s wall; 12 menu calls; all stated to the model; the tokens per turn and the wall are swept in Table 10 |
| Last-turn setting | no last turn (repeat 1); one last turn in which the agent can only submit (repeat 2); the same turn with tolerant reading of the edge list and one retry (later runs) |
| Runs per cell | 32 test instances per family. GPT-6.1 Sol and Claude Opus 5.5: repeats 1 to 3 on lg , anm , hetero and wild , repeat 1 on mixed and gauntlet ; Qwen 3.8 Flash: the same cells as the other two models in Table 13 . Guided, prompt and budget runs: repeat 1 for every model (32 instances per family guided, 16 per family in the prompt and budget sweeps) |
| all episodes | finished | |||||||
| Family | Repeat | Last turn | Wall / rescued | F1 | F1 | |||
| GPT-6.1 Sol (reasoning effort “medium”) | ||||||||
| lg | 1 | retry | 0 / 0 | .978 | .043 [.019, .070] | 32 | .978 | .043 [.019, .070] |
| 2 | retry | 0 / 0 | .983 | .048 [.021, .078] | 32 | .983 | .048 [.021, .078] | |
| 3 | retry | 0 / 0 | .983 | .048 [.021, .077] | 32 | .983 | .048 [.021, .077] | |
| anm | 1 | retry | 0 / 0 | .958 | .052 [.032, .074] | 32 | .958 | .052 [.032, .074] |
Causal Discovery
Causal discovery infers cause-and-effect structures from observational and interventional data, distinguishing causal relationships from correlation.
See all 221 papers