FORRT AI in Metascience · Tuesday 29 September
Getting our hands dirty
Agentic reproductions and robustness checks
Lukas Wallrich, Birkbeck, University of London
13:20 (1 min). Welcome. Hands-on session: we give coding agents two published analyses and their data,
and look at what comes back. Materials link is coming in a few slides.
The next 70 minutes
Plan
Start A live run on a preprint of mine: we start it now.
Agents How coding agents work, and how to work with them.
Cases Three papers, four agents, one prompt each: what came back, and where the agents disagree.
Live Back to the live run: what it found, and one choice tested.
Last What still needs a human, then discussion.
Try it out with your own or a relevant paper, or just watch.
13:21 (1 min). Rough clock: live run started by 13:25; working with agents 13:25–13:45;
cases and results 13:45–14:08; back to the live run 14:08–14:22; what needs a human and discussion until 14:30.
Watching is a fine option: setting up an agent for the first time takes longer than this session.
Live · started now, back at the end
A live run on a preprint of mine
Not in any training data, and I know where it is fragile: osf.io/preprints/psyarxiv/jsbgu
Consider the preprint at https://osf.io/preprints/psyarxiv/jsbgu and its linked data and code. Reproduce all numbers reported in it, with one script that runs from a clean start. Then identify the 3–5 analysis choices that are most fragile, list them, and predict what changing each might do to the results. Do not run those alternatives yet.
It finds the data and code and reproduces the numbers while we talk.
It lists the fragile choices, with predictions.
At the end, I pick one, and it tests it.
13:22 (3 min). New thread in T3 Code, Claude Opus 5.5 (high), in the empty folder
~/Documents/Coding/presentations/ai-metascience-hands-on-prerun/live/preprint. Paste the prompt, start, back to the slides.
Preprint: "Can a Brief Informational Intervention Facilitate Culture-Add Hiring? An Experimental Vignette Study".
Teachable moment: the data link in the preprint (OSF project sqy3a) is not public, so the agent may hit a login wall.
If it does, ask the room whether the agent should use my OSF token from this machine: agents act with whatever credentials you give them.
Follow along
Try it yourself
13:28 (1 min). The page has both prompts and a zip per case. Case B needs the data from OSF
(link on the page). Your own paper: you know where the analysis is fragile, so you can judge the agent best.
Published or de-identified data only. If you have no agent set up yet, watch and try later.
While they run
Working with coding agents
What an agent does, how to run several at once, and how to write a prompt it can work with.
13:31. The agents are running in the background. The next 25 minutes are about what they are doing
and how to work with them. We check on them from time to time.
How an agent works
Getting AI to run in circles
your goal ›
LLM
proposes the next command
——› command "Rscript model.R"
‹—— result "coefficient table"
Your machine
runs it, sends back the result
› final answer
↻ repeat until the goal is met. The LLM only ever writes text ; your machine does the doing.
Tools it can call
read part of a file
search the web
search your files
edit a file
run code
ask you a question
13:31 (4 min). The difference from chat: the agent runs code on your machine and sees the results.
If a model fails to converge or a variable name is wrong, it reads the error and tries again.
For a reproduction this means the numbers can come from code that actually ran on the data,
and we can rerun that code ourselves.
The interface today
One window, several agents
T3 Code is a free, open-source desktop (and web) app from Ping.
One interface for coding agents such as Claude Code, Codex and OpenCode.
You sign in with your own accounts, so you pay the agent providers as usual.
Each run is a thread, with a diff viewer for the files it changed.
The agents work fine in a terminal or in their own apps. T3 Code is a convenience. t3.codes
13:35 (4 min). Switch briefly to T3 Code and show the threads: one per agent and case.
Show the diff viewer on one run that has already written files. Source: github.com/pingdotgg/t3code.
Choosing
Which agent?
Claude Code
Anthropic's agent. Comes with a Claude subscription. Paid plans start at about $20/month.
Codex
OpenAI's agent. Comes with a ChatGPT subscription. Paid plans start at about $20/month.
OpenCode
Open-source agent. Works with many model providers (paid per use) or with local models. Today with DeepSeek Flash.
The models change every month. The habits on the next slide carry over.
13:39 (4 min). Pick the one you already pay for. Compare the three threads in T3 Code when the results
come in: the cheaper model may do fine on case A and struggle on case B, or not. We will see.
Behind the prompt
Four habits, in this prompt
Context
The paper, with its linked data and code.
"Consider the preprint at [URL] and the linked supplementary data and code"
Grounding
One script that runs from a clean start.
"one script … produces every number you report"
Plan/questions
List the alternatives and predictions before running them.
"Before running anything, list 6–10 alternative choices"
Verify
Published vs. reproduced, with the source of each number, and a list of decisions.
"say where you got it"
13:43 (5 min). The same four habits I use for any agent task. Writing predictions before running
is a small pre-registration: it lets us see whether the agent expected what it then found.
Before you try it on your own data
Can I use AI with my data?
Easy Published open data, like today's two cases.
With care De-identified data you are allowed to share.
Never* Identifiable participant data.
* without a data processing agreement (and ethics approval), e.g. an enterprise contract or an approved secure environment, or a fully local model.
13:48 (3 min). An agent reads whatever is in the folder and sends it to the model provider.
Check what is in the folder before you start it.
Case A · small, agents finish in a few minutes
"Female hurricanes are deadlier than male hurricanes"
92 US hurricanes , 1950–2012. Storms with more feminine names killed more people.
The authors' explanation: people take a storm with a feminine name less seriously.
The data are open. use them as a worked example for specification curve analysis.
, PNAS , 111(24), 8782–8787.
13:22 (2 min). Small dataset, one row per storm, so the runs finish in seconds and we can watch
the whole reproduction. The question for the agent: can it get the published result from the data,
and how much does that result depend on analysis choices?
Case B · larger, many analysts
Do referees give more red cards to dark-skin-toned players?
29 teams analysed the same data: 146,028 player–referee pairs.
0.89 – 2.93
range of odds ratios (median 1.31)
20 of 29
teams had a confidence interval that excluded 1
Too slow to run live. In last night's runs, the agents saw this spread only after finishing their own analysis.
, AMPPS , 1(3), 337–356. Numbers from the teams' estimates file on OSF.
13:24 (2 min). Here the agent gets no published answer to reproduce. It picks its own analysis,
like one more team. Then it downloads the 29 teams' estimates and places itself among them.
Case C · recent: published January 2026
Does researchers' ideology shape their findings?
71 teams in a many-analysts study of immigration and support for social policy produced 1,253 estimates.
+0.085
pro- minus anti-immigration teams' estimates (p = .008)
+0.011
per point of team pro-immigration sentiment (p = .06, tested at the 10% level)
The agents get the authors' replication package as published, and are told not to search for comments on the paper.
, Science Advances , 12(1), eadz7173. Data from .
13:25 (1 min). Recent enough that the models do not know it well (see the caveat slide later).
Do not mention the replication report yet: it comes after the agents' results.
The package includes the authors' Stata and R code, logs and data. df.dta is the analysis file.
The prompts in short (full text on the page)
What each agent gets
The data with its documentation (for case C, the whole replication package), and the paper's reference and DOI. Then:
Cases A and C · hurricanes, ideology
Reproduce the main result, with one script that runs from a clean start.
Compare with the published numbers, and say where each came from.
List the decisions the paper left open.
Stress-test: predict, then run 6–10 alternatives.
Judge whether the claim holds up.
Case C adds: do not search for comments on the paper.
Case B · red cards
Answer the question your way, with one script and an odds ratio.
List the decisions the data left open.
Stress-test: predict, then run 6–10 alternatives.
Only then compare with the 29 teams.
Conclude.
13:26 (2 min). Walk through the five steps briefly; we come back to why the prompt looks like this
once the agents are running. Point out step 2: every published number needs a source, and
"my memory" is an allowed answer, as long as it is declared. "Clean start": the script runs
on its own, in a fresh session, without anything the agent did by hand.
The runs
Four agents, same prompt
Claude Opus 5.5 and Fable 5.1, in Claude Code
Codex GPT-6 Sol and Astra
DeepSeek Flash , through OpenCode
Ran unattended last night and this morning, all through T3 Code. All reports: …/ai-metascience-hands-on/reports
13:29 (1 min). Switch to T3 Code: the project "Hands-on backup runs" has one thread per agent and case.
Open one (e.g. "C · ideology · Claude Opus 5.5") and scroll through the tool calls to show what a run looks like.
Run times: case A 2.5–13 min; case B 8.5–60 min; case C 6.5–11 min.
Models: A and B Claude Fable 5.1, GPT-6 Sol (high), DeepSeek Flash, plus Claude Opus 5.5 (high) this morning;
C Claude Opus 5.5 (high), GPT-6 Astra (high), GPT-6 Sol (high), DeepSeek Flash.
Before we look at results
A caveat: famous papers are in the training data
Asked from memory: no files, no web
All three agents recalled Silberzahn's numbers: 29 teams, odds ratios 0.89–2.93, 20 significant.
All three knew the main critique of the hurricane paper: before 1979, every Atlantic hurricane had a female name. Given the data, all three then tested exactly that.
What to do
The prompt asks for the source of each published number.
For real checks, use material the model cannot have memorised: your own work, or recent work like case C. Asked from memory, no agent could give its estimates.
13:51 (4 min). We asked each agent, with no files and no web, what Jung et al. found, whether it held up,
and what Silberzahn et al. reported. We checked the answers against the sources. Claude and Codex declined
to give coefficients ("I will not give numbers that could be wrong"). All three named all four authors of the
hurricane paper (the prompt said only "Jung et al."). DeepSeek also gave volume and pages: the volume (111) was
right, the pages (10185–10190; actual 8782–8787) wrong. Before 1979 all Atlantic hurricanes had female names,
so name gender is confounded with era; the case A robustness slide shows all three chose that check.
Case C memory probe: Opus 5.5 recalled the study design (the many-analysts immigration data, direction of the claim) but no estimates and no critique; Codex (Sol) recalled only the rough idea; DeepSeek did not know the paper.
So if the published numbers come from memory, "reproduced" can mean "recalled", and the robustness checks
may follow a critique the agent has read. Other options: rerun the script yourself, rename the variables,
or use synthetic data with a known effect.
Back to the runs
What came back
The report, the script, and the trace of what each agent did.
13:50 (15 min). The slides that follow compare the runs: case A, case C, then case B. Open a thread in T3 or a
report from the materials page (reports/) when a detail is worth showing. Agents are not deterministic: the same
prompt run again gives different choices.
"Trace": the log of every command the agent ran and what came back.
Case A · results from last night's runs
Same coefficients, different headlines
Published Opus 5.5 Fable 5.1 Codex DeepSeek
Name × damage 0.705 0.705 0.705 0.705 0.705
Its SE 0.184 0.184 0.150 0.184 –
Paper read from PubMed Central PubMed Central a PDF on a cycling blog PubMed Central
Deaths, feminine vs masculine name, severe storm ×2.8high vs low damage split ×2.8median split, as the paper ×5.1damage +1 SD ×1.575th percentile ×2.8median split, as the paper
The coefficients reproduce exactly. The paper does not say where "severe" starts, so each agent chose its own point.
Claude Opus 5.5 (high, 29 Sep) and Claude Fable 5.1 (Claude Code) · GPT-6 Sol, high effort (Codex) · DeepSeek Flash (OpenCode), 28 Sep.
Matching T3 threads: "A · hurricanes · …"; reports on the materials page.
SEs: Claude used glm.nb, which treats the dispersion parameter as fixed (0.150); Codex's statsmodels fit estimates it jointly and matches the paper (0.184). Claude said the paper "probably used different software", which is right.
All numbers were rerun from each agent's own script in a clean folder: they regenerate exactly.
Codex found the paper through a copy on cyclingandchill.com: ask where your agent got the paper from.
Published: 15.15 vs 41.84 predicted deaths (MFI 3 vs 9), from a model with damage split into high and low; the paper does not give the cut. DeepSeek reproduced that model with a median split: 17.85 vs 50.35 (×2.82).
Claude: 10.09 vs 51.54 at damage +1 SD, pressure at the mean. Codex: 9.74 vs 14.69 at the 75th percentile of damage.
DeepSeek's own robustness baseline used a different model (updated pressure; ×4.37 at the 90th percentile): see the next slide.
Rerun this morning with Claude Opus 5.5 (high effort), T3 thread "A · hurricanes · Claude Opus 5.5", 13 min: reproduced every number it found in the main text, including SE 0.184 (it identified the observed-information SEs), found the documentation error on the pressure variable, reproduced 15.15 vs 41.84 with a median split (ties coded low), and flagged a likely sign typo in the paper's binary-gender model. Verdict: "These data do not support the headline claim as a robust finding."
Case A · results from last night's runs
Which robustness checks did they choose?
Does the effect survive… Opus 5.5 Fable 5.1 Codex DeepSeek
only storms from 1979 on no no no no
log damage no no no –
no interaction terms no no – no
binary name gender yes yes yes yes
dropping the deadliest storms – yes yes –
the other pressure variable yes yes yes* yes*
Each ran 9–10 checks and concluded that the claim is fragile. All four chose the 1979 split, the best-known critique of the paper.
Each agent judged "survives" by its own yardstick. * Both followed an error in the data's documentation.
Before 1979 all Atlantic hurricanes had female names, so name gender is confounded with era.
Each agent predicted before running which checks would matter; they predicted the 1979 split correctly. Is that insight, or memory of the critique?
The data's documentation (from the DHARMa R package, which distributes the data) says ZMinPressure_A is scaled from the updated pressure values. It is scaled from the original ones. The READMEs for last night's runs repeated this; today's README is the DHARMa text itself, so the live agents face the same error. Claude checked the data and noticed. Codex and DeepSeek trusted the README: Codex's "original pressure" check re-ran the published model; DeepSeek's "paper replication" baseline used the updated pressure, so its "original pressure" check (×5.18 at the 90th percentile) is the published model.
Yardsticks: Claude, CI of the femininity effect at damage +1 SD; DeepSeek, CI of the death ratio at the 90th percentile; Codex, interaction p < .05. Codex's own summary: "only 1 of 10 high-damage ratio intervals exclude 1".
Case B · results from last night's runs
Three analysts, three answers?
Claude Codex DeepSeek
Model mixed model, player & referee random effects logistic, clustered SEs logistic, clustered SEs
Outcome red cards red cards + second yellows red cards
Skin-tone contrast very light → very dark 0.25 → 0.75 very light → very dark
Odds ratio [95% CI] 1.38 [1.12, 1.70] 1.12 [1.03, 1.22] 1.34 [1.10, 1.62]
Time to finish about 1 hour 8.5 min 51 min
Codex's estimate covers half the scale. Over the full scale it is about 1.26, close to the others.
Case B is not run live. Last night Claude's R script alone took 18 minutes and DeepSeek took 51 minutes in total.
Codex rescaled: 1.121 squared = 1.26 (CI 1.06–1.50). Codex's unadjusted all-dismissals estimate (1.115 per half scale, about 1.24 full scale) matches DeepSeek's all-dismissals estimate of 1.24.
Claude's headless run backgrounded its R job and ended its turn; it was resumed once with "run it in the foreground". In T3 Code, Claude is woken when a background job finishes (the session that prepared these slides ran in T3 Code and was woken this way several times).
All three agree once outcome and scale are lined up: a modest association that is robust across their own checks.
Rerun this morning with Claude Opus 5.5 (high), T3 thread "B · red cards · Claude Opus 5.5", 37 min, no nudge needed: OR 1.38 [1.12, 1.70], same model as Claude Fable; it explained that its binary split (OR 1.20) is a narrower contrast (expected 1.38^0.7 ≈ 1.25).
Case B · results from last night's runs
Where the agents fall among the 29 teams
Codex placed its 1.12 below 24 of the 29 teams, while noting that their contrasts differ.
Teams' data: OSF file fa743 (harmonised OR column). Median 1.31, range 0.89–2.93, 20 of 29 CIs exclude 1.
Claude: above 17 of 29. DeepSeek: above 16 of 29. Both call their estimate central; Codex calls its own low.
The hollow marker is my rescaling of Codex's estimate, not something Codex reported.
Case C · results from this morning's runs
Four agents, the same replication package
Opus 5.5 GPT-6 Astra GPT-6 Sol DeepSeek Flash
Reproduced Table 1 all 9 columns all 9 columns all 9 columns all 9 columns
Noticed 4 discipline codes with one team each yes: "the paper does not discuss this" yes, as a technical nuisance no no
Verdict "weaker than Table 1 suggests" "depends on defensible analysis choices" "depends on reasonable analysis choices" "holds up"
All four chose the pro–anti contrast (p = .008) as the main result. In every run, removing the discipline controls (alone or with all others) made it non-significant.
Claude Code, Codex (both on high effort) and OpenCode, 6.5–11 minutes each.
Matching T3 threads: "C · ideology · …".
Opus 5.5: "Four of the 13 mdegree cells hold one team each: team 33 (pro), teams 46 and 47 (anti) and team 59 (moderate). Their fixed effect absorbs them completely, so the anti-immigration coefficient is identified from 7 of the 9 anti teams. The paper does not discuss this."
Astra: found the same "4 singleton discipline cells with unit leverage", but only because they made one standard-error method undefined; it excluded them for that one fit.
DeepSeek read the dependence on discipline controls as support: "consistent with the paper's argument that discipline composition is the mechanism's load-bearing control".
Opus and Astra also found a model with a missing z statistic that Stata counts as significant.
Case C · what the replicators found
Two agents saw the problem. None ran the check.
Four discipline codes each hold one team. Their fixed effects absorb 80 estimates that go against the hypothesis .
Merge those four codes, and the per-point effect falls from 0.011 (p = .06) to 0.001 (p = .94). The agents' pro–anti contrast falls from 0.085 (p = .008) to 0.044 (p = .23).
Dropping the weights, or using the original study's standardised estimates, also removes the per-point effect.
The authors reply that their discipline coding is a theory-driven choice .
Auspurg & Brüderl, I4R Discussion Paper 303 (June 2026): "Due to idiosyncratic variable coding, 80 data points from four research teams that contradict the ideology hypothesis were effectively excluded from the analysis. Correcting this error renders the ideology effect statistically insignificant."
Their main text tests the per-point effect (Table 1, column 1), which they call B&B's preferred specification, and argues that extreme-group contrasts lose information and inflate effects. Their supplement (Section E, Table A3) reruns all nine Table 1 models with their three changes: the pro–anti contrast falls to 0.012 (p = .29), and no model stays significant even at 10%.
The paper itself presents columns 1–3 as three alternative specifications and highlights the 0.085 contrast in the text, so the agents' choice of main result is defensible.
The single-change numbers on the slide (merge only: pro–anti 0.085 → 0.044, p = .23; per-point 0.011 → 0.0006) are my own calculation.
Borjas & Breznau's reply (DP 304) also says researcher-level models without the single-team cells stay significant in most specifications.
The teaching point: seeing an oddity and testing whether it matters are different steps. The prompt asked for alternatives chosen in advance; none of the agents went back after noticing the cells.
All three cases
What each agent decided without being asked
Trusting the documentation. The data's documentation describes one variable wrongly. Claude checked the data and noticed; Codex and DeepSeek built on the error.
Where "severe" starts. A median split, 1 SD above average, or the 75th percentile of damage: death ratios from ×1.5 to ×5.1 from one model.
What counts as a red card. Codex added second yellows; the others did not.
How far apart to compare. DeepSeek concluded that a dark/light split "removes the association". Codex ran the same split and flagged that it measures a different contrast.
What the main result is. In case C, all four agents chose the contrast with p = .008 over the per-point effect with p = .06.
Each of these is visible in the report or the trace, because the prompt asked for the decisions list and the source of each number. Every reported number regenerates from the agent's own script: the problems are in the choices and their labels, not in the code running. DeepSeek's red-card script uses an absolute path, so it only runs in its original folder.
Dark/light split: DeepSeek 1.11 [0.95, 1.30] and Codex 1.14 [1.00, 1.30], both ratings above vs below 0.5. Claude's split (≥0.75 vs ≤0.25) gave 1.29 [1.08, 1.53], and it noted that this is a narrower contrast than 0 → 1.
14:05 at the latest: move on to the live preprint run.
Live · back to the preprint
What did the live run find?
Which numbers did it reproduce, and which not?
Which fragile choices did it list, and what did it predict?
I pick one choice. It tests it, and we compare with its prediction.
14:08 (14 min). Switch to the live thread in T3 Code. Read its reproduction table and its list of fragile choices.
Pick one choice (one of its list, or one I know is fragile) and send: "Test choice [n] now. Keep everything else fixed, and compare the result with your prediction."
What still needs a human
Deciding what counts as the "main result" before the agent does.
Checking where each published number came from: the paper, or memory.
Judging whether an alternative analysis is defensible, or only different.
Following up an oddity the agent reports: does it change the result?
Rerunning the script and reading the code, especially the data cleaning.
14:22 (4 min). Tie back to what we just saw in the runs: where did the agents choose a main result,
and did anyone notice a number that came from memory?
At this conference · all times CEST
Later today and tomorrow
Tue 14:40 Predicting replicability
Tue 16:05 Machines that build and test the replication record (incl. ReplicatorBench; at 17:15: "Can an agentic LLM run computational reproducibility checks at human quality?")
Wed 15:00 Does the finding survive another analyst? (incl. PaperRobust and "Multiverse Analysis in the Age of Large Language Models")
14:24 (1 min). Sessions that pick up today's themes.
Slides made with Claude Code · illustrations generated with gpt‑image‑2, via Claude Code.
References
References
Auto-populated from references.json by citations.js.