Phase 0 · complete

Rescue the evidence before touching anything else

Before a single line of new code, two things had to be made safe: the data your experiments produced, and the exact set of problems they were run against. Both were more fragile than they looked.

Files pinned495
Benchmark300 tasks
Repositories12
Statedone

Why this had to come first

Your results exist in exactly one place: the log files your evaluation runs wrote in August. There is no way to regenerate them — the free-tier quota is gone, the model version has moved on, and the per-attempt working folder was already deleted. If those files were lost or quietly altered, the dissertation would have no evidence behind it.

So phase 0 does two unglamorous things, and nothing else.

1 · Checksum every original file

495 files were catalogued and hashed, so any later change is detectable rather than assumed not to have happened.

WhatFilesWhy it matters
Evaluation logs427The raw output of every run — the source of every number in Chapter 5
Original scripts31The programs that produced the results, kept as the record of method
Aggregate summaries25Intermediate tables and the two original figures
Prediction files12The patches the model actually wrote — far more valuable than anyone realised

The prediction files turned out to be the real find.

They preserve the full patch text for all 61 attempts across the 20 tasks that were touched. That is the only surviving trace of what the model actually wrote — and it is what makes the whole format-class finding measurable offline in phase 2, with no API call.

Correction made during this phase

An early note recorded that the original code had never been version-controlled. That was wrong. The check had been run from the wrong directory, against an unrelated repository that tracks nothing. All 30 scripts and all 427 logs are in Lagadnakul/Dissertation, and have been since August.

The claim is struck through in the record rather than deleted, so the mistake stays visible. Because the files are safe upstream, the local copy is now treated as convenience rather than as the record — only its checksums are kept, which keeps the repository small without risking the evidence.

2 · Freeze the benchmark

SWE-bench Lite is a public dataset that can be revised upstream at any time. If it changed between your run and a future one, the two would not be comparable — and nothing would announce it. So the exact 300 problems were exported to a single file, pinned to the revision they came from:

princeton-nlp/SWE-bench_Lite  default/test
revision 6ec7bb89b9342f664a54a6e0a6ea6501d3437cc2
300 instances, sorted by instance_id

The export script refuses to write anything unless upstream reports exactly 300 rows with all nine required fields present. A silent upstream change becomes a loud failure instead of a quiet inconsistency.

What the export revealed

300 INSTANCES ACROSS 12 REPOSITORIES django 114 sympy 77 matplotlib 23 scikit-learn 23 pytest 17 sphinx 16 astropy 6 requests 6 pylint 6 xarray · seaborn 5 · 4 flask 3
django alone is 38% of the benchmark. Your 20-task pilot drew only from django and astropy — which is why stratified sampling is in the future-work list.
Correction made during this phase

The planning documents said SWE-bench Lite spans 11 repositories. The export measured 12. The missing one was pallets/flask, with 3 instances.

That is a small error with a neat consequence: the sampling rule written for a future study requires at least 3 tasks per repository, and flask's 3 is exactly the floor that rule was set against. Had the count stayed at 11, the rule would have been impossible to satisfy without anyone noticing why.

What phase 0 did not do

No analysis, no new results, no changes to anything you wrote. Its entire job was to make sure that everything after it is built on evidence that cannot quietly shift underneath it.