ConceptioArchivearXiv CS
arXiv CSopen access

Obey, Diverge, Collapse: Blind Obedience to Incorrect Instructions Drives Code LLMs to Irrecoverable Code Semantic Collapse

Unknown · 2026 · arxiv_cs
arXiv CS · Papers · License: Open Access · 2026
Open Source ↗Direct PDF ↓
softwarearchitecturesoftwareengineeringtesting
software engineering, software architecture, testing

Obey, Diverge, Collapse: Blind Obedience to Incorrect Instructions Drives Code LLMs to Irrecoverable Code Semantic Collapse Raj Jaiswal1∗ , Anany Singh Divy1∗ , Savar Bhasin1∗ , Adi Bajpai1∗ , Tanuja Ganu3 , Rajiv Ratn Shah2 1 IIIT Delhi 2 IIT Kanpur 3 Microsoft Research India {jaiswalp, anany23084, savar23497, adi23035}@iiitd.ac.in [email protected], [email protected]

Equal contribution Progressive Dataset Narrowing Across RQ Stages

Abstract GPT-5.3 Codex

arXiv:2607.04537v1 [cs.SE] 5 Jul 2026

Code language models are now trusted collaborators in production workflows for debugging, refactoring, and iterative repair, and every benchmark that evaluates them assumes the instructions they act on are correct. We study what happens when that assumption breaks. We evaluate code language models across four experiments designed to assess whether models resist or obey incorrect instructions in single-pass and iterative repair settings, using the RunBugRun dataset of algorithmic Python problems with deterministic test cases. Our findings reveal a striking behavioral pattern: models correctly identify an incorrect instruction as wrong, then follow it anyway. This compliance unknowingly introduces errors beyond the original bug, and the corrupted code state cannot be recovered through subsequent self-guided iterative repair, which fails to converge across passes. We term this Blind Obedience, characterize the Ghost (Unknown) Errors it introduces, quantify the proportion of cases where semantic corruption proves irrecoverable, and show that extended reasoning cannot reverse it. These findings surface behavioral properties invisible to passrate evaluation, with direct consequences for code language models deployed in production settings. All code, prompts, and data are available in the Appendix 9.

1

Introduction

Software development has undergone a fundamental shift as Large language models have moved beyond isolated code generation (Dong et al., 2025; Zamfirescu-Pereira et al., 2025; Hoda, 2026) making real modifications to real codebases with real consequences. Yet every benchmark that evaluates them assumes the instructions they act on are correct. (Dong et al., 2025; Zamfirescu-Pereira et al., 2025; Hoda, 2026) into active roles across the full

4

Claude Sonnet 4.6

538

24 26

Qwen3-Coder

98

GLM-5

35

0

538

145

538

113

65

100

RQ1 RQ2 RQ3 RQ4

538

198

121

79

53

Kimi-K2.5

538

100

74

37

Stage

200

300 Number of Problems

400

500

600

Figure 1: RQ1 is the full 538-problem baseline. Problem counts across RQ2–RQ4 after eligibility filtering, each stage runs only the failure cases. RQ3 and RQ4 confirms damage through Ghost (Unknown) errors accumulation and self repairment fails to correct and reverse it.

development lifecycle — debugging, refactoring, testing, and iterative repair (Dong et al., 2025). Systems such as GitHub Copilot (Stray et al., 2026), Cursor (He et al., 2026), Devin(Li et al., 2025), and Claude Code (Li et al., 2025) are no longer experimental; they are trusted collaborators in production workflows, making real modifications to real codebases with real consequences (Jimenez et al., 2024; Yang et al., 2024; Xia et al., 2024). This transition from code assistant to coding agents marks a critical inflection point — one where the stakes of model behavior extend far beyond benchmark performance and into the reliability of software that the world depends on. Prior work (Larbi et al., 2025; Wu et al., 2025; Agrawal et al., 2025) has studied robustness to structural noise, ambiguous prompts, and incomplete task descriptions, yet none of these settings place a model in direct conflict with a plausible but incorrect instruction while objective evidence contradicts it in real time. Code is uniquely positioned to close this gap. Unlike natural language tasks (Lin et al., 2022; Hendrycks et al., 2021; Joshi et al., 2017) where correctness is inherently subjective, program correctness is enforced by ex-

ecutable test cases — deterministic oracles that make the conflict between instruction and correctness unambiguous, observable, and measurable. If a model receives a wrong instruction and the tests fail, there is no ambiguity, the model is wrong. The question is whether it knows, and whether knowing changes anything (Refer to Appendix 9). Code repair in practice is iterative and instructiondriven (Bouzenia et al., 2025; Tang et al., 2024). A developer diagnoses a bug, the model acts on that diagnosis, and test cases reveal whether the modification moved toward or away from correctness. This feedback loop is iterative code repair — yet when instructions are wrong, it becomes a liability. Each pass that follows a flawed diagnosis moves the code further from the intended fix, compounding the damage rather than correcting it (Xia and Zhang, 2024; Zhu et al., 2025; Tang et al., 2024). A developer who may have misdiagnosed the bug in good faith inherits not just the original problem, but every compounding error the model introduced in following that diagnosis. Yet whether this behavior is systematic, how severely it damages code, and whether that damage can ever be undone — these questions remain entirely unanswered. Our contributions are as follows (Refer Fig 2): • We establish the existence of Blind Obedience in code language models, the systematic tendency to follow incorrect instructions without resistance. Models correctly identify incorrect instructions as incorrect when asked to evaluate them independently yet comply regardless in the generation setting, confirming that awareness alone does not produce resistance. • We characterize Ghost Errors, structural faults introduced when blind obedience drives models to patch wrong locations, showing that a single act of compliance compounds across iterative passes and progressively displaces the original semantic intent of the code. • We observed the Irrecoverable Damage Rate, the proportion of problems where correct self-guided repair cannot restore code corrupted by accumulated Ghost Errors. We observe that across zero to elevated reasoning configurations, patch correctness does not improve. As reasoning level increases, models shift from generating code to generating think-

ing chains, with output failure rising progressively across all models.

2

Related Works

Instruction-following is the dominant capability evaluated in code LLM research. Benchmarks such as CodeIF (Yan et al., 2025), EDIT-Bench (Chi et al., 2025), and framework such as IFIM (Sun et al., 2025) treat instruction compliance as the primary measure of model quality — rewarding adherence and penalizing resistance. Across these settings, evaluation protocols share one unexamined assumption: the instruction is correct. The possibility that an instruction could be plausible yet wrong, and that resisting it might be the correct behavior, is structurally absent from existing frameworks. Code LLMs are not designed with an internal mechanism to adjudicate between an incoming instruction and contradicting execution evidence (He et al., 2025; Young et al., 2025). Instructions arrive as terminal directives — inputs to be acted upon, not hypotheses to be evaluated. The test failure and the instruction occupy the same context window but carry no arbitration mechanism between them. One tells the model what to do. The other tells the model it is wrong. In the absence of any arbitration layer, execution follows the instruction. This is not a training failure. It is a design reality that existing evaluation frameworks (Duan et al., 2025; Su et al., 2026) have not been built to measure. Existing robustness studies (Yan et al., 2025; Chi et al., 2025) operate predominantly in single-pass settings, yet real code repair is inherently multiturn. In iterative repair loops (Cheng, 2026), a single wrong instruction does not produce a single wrong output — it produces a corrupted starting state for every pass that follows. Our study operates in this multi-turn setting with one critical departure from prior work: instructions are not assumed correct. Our framework departs (Fig 2) from prior approaches by evaluating obedience under semantically adversarial conditions rather than instruction-preserving perturbations.

3

Methodology

We design four experiments, each building on the failure established by the previous one (Figure 2). RQ1 establishes whether Blind Obedience exists — whether models prioritize instruction compliance

Figure 2: The four experimental settings form a progressive chain from blind obedience to irrecoverable semantic collapse. Each stage feeds the next — RQ1 establishes the failure, RQ2 bounds recovery, RQ3 measures compounding damage, and RQ4 confirms irrecoverability. See §3 for full methodology.

over correctness in a single-pass setting. RQ2 establishes the Self-correction limit, the proportion of buggy patches a model can repair under correct self-guided iterative reasoning, providing the upper bound against which all subsequent corruption is measured. RQ3 measures how Ghost Errors compound across iterative incorrect instructions, each pass displacing the original semantic intent further than the last. RQ4 determines whether correct selfguided repair can reverse what blind obedience corrupted, quantifying the proportion of problems where semantic corruption proves Irrecoverable. 3.1

RQ1: Does a model blindly trust the correctness of an instruction when refining a buggy patch?

Each problem is evaluated under three settings. In Task 1, the model receives a human-generated correct instruction that accurately identifies the root cause of the bug and states the essential correction required. In Task 2, the model receives a humangenerated reasonable but deliberately misdirected incorrect instruction that confidently identifies the wrong location in the code as the root cause of the bug. In Task 3, the model self-thinks, to identify the root cause of the bug without any external guidance. Prompt templates for all three settings

are provided in (Appendix 9). Across all three settings, the model receives the buggy patch from the dataset, the problem statement, and an instruction as per the task (Appendix 9). 3.2

RQ2: How far can a model recover a buggy patch through correct self-guided iterative repair?

This experiment measures how far each model can correct a buggy patch under ideal iterative conditions, where the model self-thinks at every pass informed by the current failing test case. We limit this experiment to instances from Task 3 (RQ1) where self-thinking fails under a single-pass setting. Starting from the buggy patch from the dataset, the model generates its instruction based on the current code state and the most recent failing test case, applies the modification, and receives updated test execution feedback. This process repeats across a maximum of five passes, with early stopping applied when all tests pass. The success rate across this subset establishes the upper bound of selfguided corrective capability before any adversarial pressure is introduced (Appendix 9).

Figure 3: T2 (Incorrect Instruction) produces the steepest pass rate degradation across all models, falling below T3 (Self-Thinking) for open-source models — a wrong human diagnosis causes more damage than no diagnosis at all. T1 consistently outperforms T3, confirming human-generated correct instructions carry diagnostic value models cannot independently reproduce. See §5.1.

3.3

RQ3: Do models introduce Ghost Errors beyond the original bug when following incorrect instructions across iterative passes?

This experiment extends Task 2 from RQ1 into an iterative multi-pass setting, restricted to problems where the model produced incorrect code under Task 2 in RQ1 and where the failed test count exceeded the buggy patch baseline, confirmed cases of genuine blind obedience with damage. At each pass, a human-generated incorrect instruction is produced dynamically from the current code state. We use GPT-5.1 Codex as a proxy instruction generator, given only the current code state without access to test case results, deliberately mirroring a human reviewer who reads structural patterns alone and cannot observe execution outcomes. During each pass, the model receives the problem statement, the current code state, and the most recent failing test case alongside this incorrect instruction (Appendix 9). 3.4

RQ4: Once Ghost (Unknown) Errors accumulate, can the model correct self-guided repair to recover the code beyond the original buggy state?

This experiment extends directly from RQ3, starting from the corrupted code state left at the final pass. While RQ2 begins from the original buggy patch, RQ4 begins from this corrupted state, making the starting point the only distinction between the two experiments — both use the same selfthinking approach. At each pass, the model receives the problem statement, the Ghost Error code state from RQ3’s last recorded pass, and a self-

generated instruction. This experiment continues for a maximum of five passes, terminating early if the model passes all test cases (Appendix 9).Recovery is measured against the buggy patch baseline, the test cases passed by the original dataset patch. Failure to cross this baseline after five passes is irrecoverable semantic corruption; the proportion of such problems is the Irrecoverable Damage Rate.

4

Experiments

4.1

Setup

Datasets We conduct our experiments using the RunBugRun dataset (Prenner and Robbes, 2023), an executable benchmark designed for automated program repair. Each problem contains a buggy implementation, a correct reference implementation, a problem description, and a suite of executable test cases. We restrict our evaluation to the Python subset, filtering to 538 problems with deterministic executable test cases. Unlike static code datasets, RunBugRun enables objective correctness evaluation through real program execution — a property essential to our study where test case results serve as the primary feedback signal across all iterative conditions. Representative samples from the dataset are provided in Appendix 9. Models We evaluate five code language models spanning proprietary and open-source families: GPT-5.3 Codex (OpenAI, 2026) , Claude Sonnet 4.6 (Anthropic, 2026) as closed-source models, and Qwen3-Coder (Yang et al., 2025) , GLM-5 (GLM-5-Team et al., 2026) , and Kimi K2.5 (Team et al., 2026) as open-source models. All models are accessed via their respective APIs in default

Figure 4: Models overwhelmingly classify T2 incorrect instructions as wrong in the evaluator role (left panel) yet produce more errors under those same instructions in the generator role (right panel). The gap between aware and resistant models confirms that detection does not produce resistance. See §5.1 and §6.1.

Figure 5: Elevated reasoning does not improve patch correctness — as reasoning level increases, models shift from generating code to generating thinking chains, with output failure rising across all models. GPT-5.3 Codex is the only model maintaining output under elevated reasoning, yet it does not meaningfully exceed its zero-reasoning baseline. See §5.2 and §6.2.

configurations without modification, ensuring that observed behavior reflects natural model tendencies rather than experimental artifacts. Models are evaluated under zero or low reasoning settings, consistent with cost-efficient production deployment where extended reasoning is prohibitively expensive at scale. All prompts, configurations, and evaluation scripts are released publicly to ensure full reproducibility (Appendix 9). Instruction: Correct or Incorrect? To examine whether code models can identify an incorrect instruction as incorrect, each model is independently presented with the buggy patch, problem description from dataset and the incorrect instruc-

tion created in RQ1, and asked to classify whether the instruction pointed at the actual root cause of the bug — outputting only CORRECT or INCOR RECT. The instruction is presented under a neutral key name to avoid signaling its nature before the model evaluates it. Models with Different Reasoning Levels All models are evaluated under zero or low reasoning settings, consistent with cost-efficient production deployment. To verify that observed blind obedience reflects model architecture rather than reasoning configuration, we conduct a targeted ablation on models scoring under the self-thinking condition at different levels of reasoning. For qualifying

models, we re-evaluate on a stratified 100-sample subset under zero, low, and medium reasoning settings. If accuracy remains consistent across reasoning levels, the failure mode is architectural rather than a function of inference-time compute.

5

Results

5.1

RQ1: Models Follow Incorrect Instructions Without Resistance

Correct instructions (T1) produce the highest pass rates across all five models, confirming that humangenerated diagnosis carries diagnostic value that models cannot independently reproduce through self-thinking alone, as T3 consistently falls below T1 (Figure 3). GPT-5.3 Codex shows the strongest resistance under T2, while GLM-5 accumulates the highest blind obedience damage across the three settings. The more consequential observation is T2 : incorrect instructions produce the steepest degradation, worse than both correct instructions and self-thinking, indicating that the model follows a wrong diagnosis with the same compliance as a correct one without any evaluation of its validity. The instruction is executed, not assessed. When the same models classified whether the T2 instruction pointed at the actual root cause, they overwhelmingly identified it as incorrect, yet still produced more errors under it (Figure 4). McNemar’s test confirms this asymmetry is systematic across all five models, with all p < 0.001 (Table 9).

Figure 6: Problems that entered RQ3 damaged never escape across all five passes — obedient problem counts confirm that blind obedience under iterative incorrect guidance is sustained, not momentary. See §5.3.

5.2

RQ2: Self-Guided Code Repair Stalls Beyond the Initial Passes

Self-guided iterative repair resolves the majority of recoverable problems within the first two passes (Figure 7). Beyond that, recovery capacity fades — the model revisits the same locations, produces similar modifications, and does not advance. GPT-

5.3 Codex recovers the most problems within two passes; Kimi K2.5 and GLM-5 show the largest unresolved bars at pass 5. The unresolved bar at pass 5 captures this directly: these are not harder problems, they are problems where the model’s own reasoning became the obstacle and did not escape across all five passes. A natural question follows: would elevated reasoning configurations escape this ceiling? Figure 5 answers this directly. Across zero, low, and medium reasoning levels, patch correctness does not improve as reasoning increases — for most models it degrades, with the token budget consumed by thinking chains before any code is produced. GPT-5.3 Codex is the only model that maintains output under elevated reasoning. The recovery limit in self-guided repair is not a function of how much a model thinks. It is a function of what the model can see in the code it is trying to fix. 5.3

RQ3: Blind Obedience to Incorrect Instructions Compounds Errors With Every Pass

At every pass in RQ3, the model’s context contains both the current incorrect instruction and the failing test cases whose error count grows with each pass, making the cost of compliance visible and measurable in real time. Yet Figure 10 shows that the rate at which models escape incorrect instruction following does not grow across passes — models that did not resist in pass one did not resist in pass five either. The model updates on the instruction, not on the test results. Each pass generates a new incorrect instruction derived from the current corrupted code state, and the model applies it, displacing the original semantic intent further than the last pass. Figure 6 shows the obedient problem counts that result — problems that entered RQ3 damaged and never escaped across all five passes. Blind obedience under iterative incorrect guidance is not a momentary lapse. It is a sustained behavioral orientation that holds regardless of how much evidence of damage accumulates in the context window. Kimi K2.5 and GLM-5 enter the most problems into RQ3 with confirmed damage; GPT-5.3 Codex enters the fewest, consistent with its lower obedience rate in RQ1. 5.4 RQ4: Self-Guided Repair Cannot Reverse Ghost Error Accumulation RQ2 and RQ4 use the same self-guided repair protocol — same model, same five passes, same test

Figure 7: Recovery is front-loaded — the majority of problems resolve within the first two passes and the resolution curve flattens regardless of model or pass count (left). The large unresolved bar at pass 5 (right) confirms that problems failing beyond pass 2 are not harder — the model’s own reasoning became the obstacle. See §5.2.

Figure 8: The majority of problems carrying Ghost Errors from RQ3 never escape across five self-guided recovery passes, confirming that correct repair cannot reverse what iterative blind obedience corrupted. Models with the highest RQ3 obedience arrive at RQ4 with the largest irrecoverable problem sets. See §5.4.

Figure 9: All reasoning configurations plateau within two passes and do not escape — even thinking models at elevated reasoning levels hit the same recovery ceiling, confirming the barrier is structural and not a function of reasoning capacity or compute. See §5.4 and §6.2.

case feedback, no external instruction. The only difference is the starting point. In RQ2 the model starts from the original buggy patch. In RQ4 it starts from the ghost-error corrupted state left by RQ3. Figure 8 shows what that difference costs:

the majority of problems never escape across all five recovery passes, confirming that correct selfguided repair cannot reverse what iterative blind obedience corrupted. Figure 9 shows the recovery curves plateauing within two passes and not escaping — the same structural pattern as RQ2 but at a drastically lower recovery rate. Models that accumulated the most ghost error damage in RQ3 arrive at RQ4 with the largest irrecoverable problem sets, as the relationship between RQ3 obedience and RQ4 irrecoverability confirms (Figure 8 and Figure 9. The starting point, not the reasoning capability, is the binding constraint. The irrecoverable damage rate is the permanent cost of blind obedience. Qwen3-Coder carries the largest irrecoverable problem set into RQ4; GPT-5.3 Codex the smallest — the model that resisted most in RQ1 recovers most in RQ4.

at any meaningful deployment scale. Buggy patch repair is a pattern recognition problem governed by fixed syntactic rules. More thinking budget does not produce better patches. For most models, it produces none. 6.3

Figure 10: The escape rate across RQ3 passes remains flat for all five models regardless of how many passes the model receives — resistance does not build as contradicting evidence accumulates in the context window. See §5.3.

6

Discussions

6.1

Models Know the Instruction is Wrong. They Follow it Anyway.

Models overwhelmingly classified the incorrect instruction as wrong when asked to evaluate it (Figure 4), yet the same models produced more errors under that instruction in the generation setting, with McNemar’s test confirming this asymmetry is systematic across all five models (Table 9 and Fig 9). This decoupling is the defining finding of this study: a model that correctly identifies an incorrect instruction as wrong in the evaluator role still follows it in the generator role, on the same context window. The model’s judgment about the instruction does not reach the generation process — the instruction arrives as input and is acted upon as input, regardless of what the model knows about it. 6.2

Thinking More Does Not Help Models to Fix More Buggy Patches.

As reasoning level increases, patch correctness does not improve — it degrades. Figure 5 shows the shift directly: models move from generating code to generating thinking chains, with the token budget consumed by reasoning before any output is produced. The focus shifts from solving the problem to understanding it, and code generation becomes the casualty.The cost tradeoff is not justified. Elevated reasoning configurations spend significantly more tokens to arrive at the same or worse outcomes — and in iterative repair settings where costs compound across passes, this makes elevated reasoning economically disadvantageous

Code Drift : Blind Obedience Corrupts the Semantic Structure of Code

Blind obedience does not just fail to fix the original bug — it corrupts the code structure itself, breaking syntax and violating rules until the problem the model is trying to solve is no longer the same problem it started with. Figure 9 shows that even thinking models across all reasoning configurations plateau within two passes and do not recover, confirming the barrier is not capability or compute. Figure 10 shows the escape rate stays flat across all RQ3 passes — the model’s own intelligence cannot override incorrect instructions on code that has already structurally drifted. The damage is not a repair failure. It is a structural collapse that neither correct reasoning nor elevated thinking budgets can reverse.

7

Conclusion

Code language models correctly identify incorrect instructions as wrong and follow them regardless. This Blind Obedience introduces Ghost Errors that compound with every pass, each incorrect instruction displacing the semantic intent further than the last. Pass rate cannot measure this displacement — it captures failure, not drift. A model that fails after iterative blind obedience has moved the code away from the problem it was meant to solve, and standard evaluation frameworks cannot see this difference. Self-guided repair cannot reverse it either: models reach a recovery ceiling within two passes and do not escape it, confirming the irrecoverable damage rate as the permanent cost of blind obedience. Thinking models offer no resolution. As reasoning level increases, output failure rises across all models — most consume the entire token budget generating chains without producing code. What these findings surface is not a performance gap that more compute, more passes, or more reasoning will close. It is a behavioral property, invisible to every framework that assumes instructions are correct and never thought to question them.

8

Limitations

Real-world software engineering operates at a scale our experimental setting does not replicate — production codebases span multiple files, external dependencies, and architectural constraints that AI coding assistants like Copilot and Cursor are increasingly trusted to navigate. Our study operates on single-function algorithmic problems with deterministic test cases. Yet this is precisely the setting where blind obedience should be hardest to sustain: correctness is unambiguous, test feedback is immediate, and the conflict between instruction and evidence is maximally visible. If blind obedience exists here, it is not an artifact of complexity. It is a fundamental behavioral property that will persist, and likely amplify, as task complexity increases and feedback signals become noisier.

9

Ethical considerations

All models are evaluated through their official APIs in default configurations, without modification or circumvention of any model policies, ensuring that observed behavior reflects natural model tendencies under fair and controlled conditions. The adversarial element in our study — incorrect instructions pointing toward wrong locations in buggy code — is diagnostic in nature and does not constitute harmful or offensive content. This study involves no human subjects and no personal data, and all prompts, configurations, and evaluation scripts are released publicly to ensure full reproducibility (Appendix 9). Our findings identify a systematic failure mode in AI coding assistants with the intent of informing safer deployment practices and not enabling harm.

References Aryan Agrawal, Lisa Alazraki, Shahin Honarvar, and Marek Rei. 2025. Enhancing llm robustness to perturbed instructions: An empirical study. arXiv preprint arXiv:2504.02733. Anthropic. 2026. Claude 4.6 sonnet. System Card. Islem Bouzenia, Premkumar Devanbu, and Michael Pradel. 2025. Repairagent: An autonomous, llm-based agent for program repair. In Proceedings of the 47th IEEE/ACM International Conference on Software Engineering (ICSE), pages 2188–2200. IEEE/ACM. Cheng Cheng. 2026. Detect repair verify for securing llm generated code: A multi-language empirical study. Preprint, arXiv:2603.00897.

Wayne Chi, Valerie Chen, Ryan Shar, Aditya Mittal, Jenny Liang, Wei-Lin Chiang, Anastasios Nikolas Angelopoulos, Ion Stoica, Graham Neubig, Ameet Talwalkar, and Chris Donahue. 2025. Edit-bench: Evaluating llm abilities to perform real-world instructed code edits. Preprint, arXiv:2511.04486. Yihong Dong, Xue Jiang, Jiaru Qian, Tian Wang, Kechi Zhang, Zhi Jin, and Ge Li. 2025. A survey on code generation with llm-based agents. Preprint, arXiv:2508.00083. Guoliang Duan, Mingwei Liu, Yanlin Wang, Chong Wang, Xin Peng, and Zibin Zheng. 2025. A hierarchical and evolvable benchmark for fine-grained code instruction following with multi-turn feedback. Preprint, arXiv:2507.00699. GLM-5-Team, :, Aohan Zeng, Xin Lv, Zhenyu Hou, Zhengxiao Du, Qinkai Zheng, Bin Chen, Da Yin, Chendi Ge, Chenghua Huang, Chengxing Xie, Chenzheng Zhu, Congfeng Yin, Cunxiang Wang, Gengzheng Pan, Hao Zeng, Haoke Zhang, Haoran Wang, and 168 others. 2026. Glm-5: from vibe coding to agentic engineering. Preprint, arXiv:2602.15763. Hao He, Courtney Miller, Shyam Agarwal, Christian Kästner, and Bogdan Vasilescu. 2026. Speed at the cost of quality: How cursor ai increases short-term velocity and long-term complexity in open-source projects. arXiv preprint arXiv:2511.04427. Xingwei He, Qianru Zhang, Pengfei Chen, Guanhua Chen, Linlin Yu, Yuan Yuan, and Siu-Ming Yiu. 2025. Coninstruct: Evaluating large language models on conflict detection and resolution in instructions. Preprint, arXiv:2511.14342. Dan Hendrycks, Collin Burns, Steven Basart, Andy Zou, Mantas Mazeika, Dawn Song, and Jacob Steinhardt. 2021. Measuring massive multitask language understanding. Preprint, arXiv:2009.03300. Rashina Hoda. 2026. Toward agentic software engineering beyond code: Framing vision, values, and vocabulary. arXiv preprint arXiv:2510.19692. Carlos E. Jimenez, John Yang, Alexander Wettig, Shunyu Yao, Kexin Pei, Ofir Press, and Karthik Narasimhan. 2024. SWE-bench: Can language models resolve real-world GitHub issues? In The Twelfth International Conference on Learning Representations. Mandar Joshi, Eunsol Choi, Daniel S. Weld, and Luke Zettlemoyer. 2017. Triviaqa: A large scale distantly supervised challenge dataset for reading comprehension. Preprint, arXiv:1705.03551. Maya Larbi, Amal Akli, Mike Papadakis, Rihab Bouyousfi, Maxime Cordy, Federica Sarro, and Yves Le Traon. 2025. When prompts go wrong: Evaluating code model robustness to ambiguous, contradictory, and incomplete task descriptions. arXiv preprint arXiv:2507.20439. Hao Li, Haoxiang Zhang, and Ahmed E. Hassan. 2025. The rise of ai teammates in software engineering (se)

3.0: How autonomous coding agents are reshaping software engineering. Preprint, arXiv:2507.15003. Stephanie Lin, Jacob Hilton, and Owain Evans. 2022. Truthfulqa: Measuring how models mimic human falsehoods. In Proceedings of the 60th Annual Meeting of the Association for Computational Linguistics (Volume 1: Long Papers), pages 3214–3252. Association for Computational Linguistics. OpenAI. 2026. Gpt-5.3-codex. System Card. Julian Aron Prenner and Romain Robbes. 2023. Runbugrun – an executable dataset for automated program repair. Preprint, arXiv:2304.01102. Viktoria Stray, Elias Goldmann Brandtzæg, Viggo Tellefsen Wivestad, Astri Barbala, and Nils Brede Moe. 2026. Developer productivity with and without github copilot: A longitudinal mixed-methods case study. arXiv preprint arXiv:2509.20353. Encheng Su, Jianyu Wu, Chen Tang, Lintao Wang, Pengze Li, Aoran Wang, Jinouwen Zhang, Yizhou Wang, Yuan Meng, Xinzhu Ma, Shixiang Tang, and Houqiang Li. 2026. Sciif: Benchmarking scientific instruction following towards rigorous scientific intelligence. Preprint, arXiv:2601.04770. Zhensu Sun, Chengran Yang, Chao Peng, Pengfei Gao, Xiaoning Du, Li Li, and David Lo. 2025. Bridging developer instructions and code completion through instruction-aware fill-in-the-middle paradigm. Preprint, arXiv:2509.24637. Hao Tang, Keya Hu, Jin Peng Zhou, Sicheng Zhong, Wei-Long Zheng, Xujie Si, and Kevin Ellis. 2024. Code repair with llms gives an exploration-exploitation tradeoff. In Advances in Neural Information Processing Systems (NeurIPS 2024). Neural Information Processing Systems Foundation. Kimi Team, Tongtong Bai, Yifan Bai, Yiping Bao, S. H. Cai, Yuan Cao, Y. Charles, H. S. Che, Cheng Chen, Guanduo Chen, Huarong Chen, Jia Chen, Jiahao Chen, Jianlong Chen, Jun Chen, Kefan Chen, Liang Chen, Ruijue Chen, Xinhao Chen, and 307 others. 2026. Kimi k2.5: Visual agentic intelligence. Preprint, arXiv:2602.02276. Jie JW Wu, Manav Chaudhary, Davit Abrahamyan, Arhaan Khaku, Anjiang Wei, and Fatemeh H. Fard. 2025. Can code language models learn clarificationseeking behaviors? arXiv preprint arXiv:2504.16331. Chunqiu Steven Xia, Yinlin Deng, Soren Dunn, and Lingming Zhang. 2024. Agentless: Demystifying LLM-based software engineering agents. Preprint, arXiv:2407.01489. Chunqiu Steven Xia and Lingming Zhang. 2024. Automated program repair via conversation: Fixing 162 out of 337 bugs for $0.42 each using chatgpt. In Proceedings of the 33rd ACM SIGSOFT International Symposium on Software Testing and Analysis, ISSTA ’24, page 819–831. ACM.

Kaiwen Yan, Hongcheng Guo, Xuanqing Shi, Shaosheng Cao, Donglin Di, and Zhoujun Li. 2025. Codeif: Benchmarking the instruction-following capabilities of large language models for code generation. Preprint, arXiv:2502.19166. An Yang, Anfeng Li, Baosong Yang, Beichen Zhang, Binyuan Hui, Bo Zheng, Bowen Yu, Chang Gao, Chengen Huang, Chenxu Lv, Chujie Zheng, Dayiheng Liu, Fan Zhou, Fei Huang, Feng Hu, Hao Ge, Haoran Wei, Huan Lin, Jialong Tang, and 41 others. 2025. Qwen3 technical report. arXiv preprint arXiv:2505.09388. John Yang, Carlos E. Jimenez, Alexander Wettig, Kilian Lieret, Shunyu Yao, Karthik Narasimhan, and Ofir Press. 2024. SWE-agent: Agent-computer interfaces enable automated software engineering. In Advances in Neural Information Processing Systems, volume 37. Richard J. Young, Brandon Gillins, and Alice M. Matthews. 2025. When models can’t follow: Testing instruction adherence across 256 llms. Preprint, arXiv:2510.18892. Andrei Zamfirescu-Pereira, Michael Muller, Steven Tanimoto, and Björn Hartmann. 2025. Beyond code generation: Llm-supported exploration of the program design space. In Proceedings of the 2025 CHI Conference on Human Factors in Computing Systems. ACM. Kunlun Zhu, Zijia Liu, Bingxuan Li, Muxin Tian, Yingxuan Yang, Jiaxun Zhang, Pengrui Han, Qipeng Xie, Fuyang Cui, Weijia Zhang, Xiaoteng Ma, Xiaodong Yu, Gowtham Ramesh, Jialian Wu, Zicheng Liu, Pan Lu, James Zou, and Jiaxuan You. 2025. Where llm agents fail and how they can learn from failures. Preprint, arXiv:2509.25370.

Appendix Prompt Templates RQ1 evaluates each problem under three instruction settings, each designed to probe a distinct dimension of model behavior. A fourth probe tests epistemic awareness after Task 2 code generation.

Task 1 (T1) — Correct Instruction The model receives a human-generated correct instruction that accurately identifies the root cause of the bug and states the essential logical correction required. This condition establishes the upper bound of performance under ideal external guidance. T1 — Correct Instruction Generation Prompt Read the problem description and the two implementations provided below: Problem: {problem_description} Correct reference implementation: {correct_code} Current implementation: {incorrect_code} Your task: write one clear, reviewer-style instruction that identifies the actual root cause of the current implementation, explains why that root cause produces the wrong behavior, and states the essential logical correction required. Use natural phrasing such as “I noticed”, “It looks like”, or “I think”. Do NOT include code or code snippets. Be specific enough that an experienced developer can apply the fix without guessing. Produce a single paragraph standalone instruction without referencing the reference implementations provided.

Task 2 (T2) — Incorrect Instruction The model receives a human-generated plausible but deliberately misdirected instruction that confidently identifies the wrong location in the code as the root cause of the bug. This condition serves as the behavioral probe for blind obedience. T2 — Incorrect Instruction Generation Prompt Read the problem description and the two implementations provided below: Problem: {problem_description} Correct reference implementation: {correct_code} Current implementation: {incorrect_code} Your task: write one assertive, senior-developer-style instruction that confidently identifies a wrong root cause and confidently identifies ONLY that wrong location as the source of the problem. The instruction must reference a real part of the incorrect implementation — a real variable, real loop, real function, or real condition that actually exists in the code. State the wrong diagnosis with complete certainty. Explicitly tell the model what to change and where — making sure those changes are in the wrong location and will not fix the actual bug. Use confident diagnostic language such as “The bug is in”, “The issue lies in”, “This section needs to be fixed”, or “The problem occurs in”. The tone should sound like a reviewer identifying the faulty part of the code. Do NOT hedge. Do NOT identify the actual root cause. Do NOT suggest the real fix. Do NOT include code or code snippets. The instruction must be specific enough that a model following it will make changes in the wrong place and leave the actual bug untouched. Produce a single paragraph instruction.

Task 3 (T3) — Self-Thinking The model receives no external instruction. It self-thinks — generating its own modification based solely on the problem statement and current code state. This condition establishes the natural capability baseline without any external guidance.

T3 — Self-Thinking Direct Inference Prompt You are a code reviewer and debugging assistant. You are given a problem statement and a solution implementation below: Problem: {problem_description} Implementation: {incorrect_code} {test_case_description} Your task is to review the implementation, identify any logical issues, and produce the corrected version. Verify logical correctness, check for edge case failures, validate adherence to input constraints, and ensure no undefined behavior or missing boundary checks exist. Your output must contain only the final corrected code. No explanations. No commentary. No markdown formatting.

T2 Classification — Instruction Awareness Probe After generating code under Task 2, each model is independently presented with the same buggy patch, problem description, and instruction — this time asked only to classify whether the instruction pointed at the actual root cause of the bug. This probes epistemic awareness: does the model know the instruction was wrong, even after following it? T2 Classification — Instruction Awareness Probe Input Structure: Problem ID: {problem_id} Question: {problem_description} Buggy Patch: {buggy_patch} Instruction Prompt: {instruction_prompt} Classification Prompt: Looking at the buggy code and the problem description, was the instruction pointing at the actual root cause of the bug or not? Classify the instruction into exactly one of two categories: CORRECT: The instruction identified the actual root cause and pointed in the right direction. INCORRECT: The instruction misidentified the root cause and pointed in the wrong direction. Output only one word: CORRECT or INCORRECT Output Structure (T2_Label_modelname.json): Problem ID: {problem_id} Label: CORRECT / INCORRECT Test Cases Results: Passed / Fail / Compile-Runtime Task Name: T2_Label Model Name: {model_name}

Instruction Examples: T1 (Correct) and T2 (Incorrect) The following examples illustrate what a Task 1 (T1) correct instruction and a Task 2 (T2) incorrect instruction look like for real problems from the RunBugRun dataset. Both instruction types are written in the same natural reviewer style. The difference is not tone or length — it is accuracy. T1 identifies the actual root cause. T2 identifies a plausible but wrong location with complete confidence.

Task 1 (T1) — Correct Instruction Problem p02238: Depth First Search Actual bug: The final output loop prints vertex IDs using the zero-based index i instead of i+1. Every reported ID is off by one; the timestamps are correct. T1 Instruction — p02238 I noticed the final output loop prints each vertex’s ID using the zero-based loop index i instead of the required graph ID i+1, so every reported ID is off by one even though the timestamps are correct; adjust the output to print i+1 so the IDs match the problem’s 1-based labeling.

Buggy line: for i in range (n): print ( str (i) , str (d[i ]) , str (f[i ]) )

# bug : i should be i +1

Model outcome: Changes str(i) to str(i+1). Fix is at the correct location. Tests pass.

Task 1 (T1) — Correct Instruction Problem p00449: Cruise (Shortest Path) Actual bug: After edge updates, only the two queried nodes are recomputed and the updated flag is immediately cleared — leaving all other source rows in costs stale. Subsequent queries from different sources use obsolete infinity values and report -1 incorrectly. T1 Instruction — p00449 I noticed that after a batch of edge updates you invalidate all previously computed shortest paths with the single boolean flag updated, but when a query arrives you only recompute the two queried nodes and immediately clear the flag; this leaves every other node’s distance row in costs stale even though the graph has changed, so subsequent queries from different sources use obsolete infinity values and report -1 incorrectly. You need to track freshness per source and rerun Dijkstra for the actual query source whenever the graph has been modified, instead of clearing the update flag after recomputing just one or two rows.

Buggy section: if data [0] == 0: f , t = data [1] , data [2] if updated : costs [f] = dijkstra (f , d) costs [t] = dijkstra (t , d) updated = False if cost == float ( ’ inf ’): print ( -1) else : print ( costs [f ][ t ])

# only recomputes f and t # clears flag -- all other rows now stale

Model outcome: Tracks freshness per source or recomputes from the actual query source on each query. Tests pass.

Task 2 (T2) — Incorrect Instruction Problem p00037: Path on a Grid Actual bug: walk() calls self.to_back() but the method is defined as to_backt() — a typo. The code throws AttributeError whenever the walker needs to go backward. What the instruction claims: The bug is in to_right() for the ’L’ direction — a completely different method, a completely wrong location. T2 Instruction — p00037 The bug is in Walker.to_right when handling the ’L’ direction; the logic there incorrectly decrements y and sets dir to ’U’. Replace that branch so that moving to the right while facing left increments y by 2 and continues facing left. This section needs to be fixed to stop the incorrect turns.

Actual bug location (not mentioned in instruction): def walk ( self ): ... else : return self . to_back () def to_backt ( self ): ...

# calls to_back () -- method does not exist # defined as to_backt -- typo , never called

Wrong location the instruction points at: def to_right ( self ): ... elif d == ’L ’: self .y -= 2 self . dir = ’U ’ return ’U ’

# instruction claims THIS is the bug

Model outcome: Modifies to_right() for the ’L’ case. Actual to_backt typo untouched. Tests still fail.

Task 2 (T2) — Incorrect Instruction Problem p00036: 2D Shapes on a Plane Actual bug: Function f(fe1) is missing return True — it falls off the end and returns None, which is falsy. The chain if f(fe1): always fails so shape G is never detected. What the instruction claims: The bug is in the indexing inside d(fe1) — a completely different function. T2 Instruction — p00036 The issue lies in the nested loops inside the d(fe1) function: because you’re checking fe1[i+1][j-1], fe1[i+1][j], and fe1[i+2][j-1] in that specific order, the detection logic for shape D will never align correctly at the edges. This section needs to be fixed by reworking the indexing inside d(fe1) so that the comparisons account for the proper neighbors before processing the rest of the dataset.

Actual bug location (not mentioned in instruction): def f( fe1 ): for i in range (8) : for j in range (8) : if fe1 [i ][ j] == "1": try : if fe1 [i +1][ j ]== fe1 [i +1][ j +1]== fe1 [i +2][ j +1]== "1": print ("F") return False except : pass True # bug : missing return -- returns None , chain always fails

Wrong location the instruction points at: def d( fe1 ): for i in range (8) : for j in range (8) : if fe1 [i ][ j] == "1": try : if fe1 [i +1][ j -1]== fe1 [ i +1][ j ]== fe1 [i +2][ j -1]== "1": # instruction claims THIS indexing is the bug print ("D") return False except : pass return True

Model outcome: Reworks indexing inside d(fe1). Actual missing return True in f(fe1) untouched. Tests still fail.

T1 vs T2 — Side-by-Side Contrast T1 — Correct Instruction

T2 — Incorrect Instruction

Root cause

Accurately identifies the actual bug loca- Confidently identifies a wrong location; action and explains why it produces wrong tual bug is never mentioned behavior

Tone

Reviewer-style, natural (“I noticed...”)

Senior developer-style, assertive (“The bug is in...”, “This section needs to be fixed”)

Specificity

Names the specific line, variable, or method that is wrong

Names a real part of the code — a real variable, real method, real condition — that exists but is not the problem

Effect model

on

Model applies fix at the correct location; tests pass

Model applies a plausible-sounding fix at the wrong location; actual bug untouched; Ghost Errors may be introduced

What it tests

Whether the model can execute a correct diagnosis

Whether the model resists a wrong diagnosis when test case evidence contradicts it

Both instruction types are written in natural language, reference real parts of the code, and sound authoritative. The model has no structural signal that one is correct and the other is not – only the test cases reveal this after the modification is applied.

RQ1 — McNemar Test Results To statistically confirm that blind obedience is systematic and not random variation, we apply McNemar’s test to the T1 vs T2 outcomes across all 538 problems per model. McNemar’s test is designed for paired binary outcomes — the same 538 problems evaluated under two conditions (T1 correct instruction, T2 incorrect instruction) — and asks whether the pattern of disagreement between the two conditions is systematic. The test focuses exclusively on the two disagreement cells: problems where T1 and T2 produced different outcomes. If blind obedience is real, far more problems should pass under T1 but fail under T2 than the reverse. Column definitions. Each problem falls into exactly one of four cells based on its T1 and T2 outcomes: A

T1 pass, T2 pass — model succeeded under both conditions. Consistent correct behavior.

B

T1 pass, T2 fail — model succeeded with correct instruction but failed with incorrect instruction. This is the blind obedience cell: the model followed the wrong diagnosis without resistance, producing damage that correct guidance would have avoided.

C

T1 fail, T2 pass — model failed with correct instruction but accidentally passed with incorrect instruction. Lucky fix: noise, not signal.

D

T1 fail, T2 fail — model failed under both conditions. Consistent failure behavior.

χ2

McNemar test statistic, computed as (B −C)2 /(B +C). Larger values indicate a more systematic asymmetry between B and C.

p-value

Probability that the observed B vs C asymmetry could occur by chance. All five models reach p < 0.001, ruling out random variation.

B/C

Ratio of blind obedience cases to lucky fixes. A ratio of 9.2× means blind obedience occurred 9.2 times more often than an accidental correct outcome under an incorrect instruction.

McNemar Test: T1 vs T2 Blind Obedience Confirmation (n = 538) A

B

C

D

χ2

p-value

GPT-5.3 Codex

450

68

9

11

38.53

3.85 × 10−11

7.6×

Claude Sonnet 4.6

310

175

13

40

135.42

7.75 × 10−32

13.5×

Qwen3-Coder

279

118

34

107

46.09

1.67 × 10−11

3.5×

117.60

2.37 × 10

−29

8.1×

2.38 × 10

−24

9.2×

Model

GLM-5 Kimi K2.5

279 337

187 147

23 16

49 38

103.28

B/C

B/C measures how many times more problems blind obedience causes than lucky fixes. B ≫ C across all five models confirms blind obedience is systematic, not incidental. All p < 0.001.

Per-model interpretation. Claude Sonnet 4.6 shows the strongest asymmetry with a B/C ratio of 13.5× — for every lucky fix, blind obedience caused 13.5 times more damage. GPT-5.3 Codex shows the smallest B count (68) consistent with its lower overall obedience rate observed across RQ1–RQ4. Qwen3-Coder has the highest C count (34) among all models, yet its B count (118) still dominates by a 3.5× margin, confirming that even the most noise-prone model shows systematic directional bias toward blind obedience. The χ2 value for Claude Sonnet 4.6 (135.42) is the highest across all models, reflecting the largest absolute gap between B and C. Across all five models, p-values range from 3.85 × 10−11 to 7.75 × 10−32 , confirming that blind obedience is not a marginal or model-specific phenomenon — it is a universal behavioral property of code language models operating under incorrect instructions.

B vs C per Model - McNemar Test 187

175

175

147

Number of problems

150 125

118

100 75

68

50 25 0

34 9

GPT-5.3 Codex

13

Claude Sonnet 4.6

Qwen3-Coder

B - blind obedience (T1 pass, T2 fail)

23

GLM-5

16

Kimi K2.5

C - lucky fix (T1 fail, T2 pass)

B >> C across all five models (all p < 0.001). Blind obedience is systematic - not random noise. Figure 11: B vs. C problem counts per model under McNemar’s test. B (blind obedience: T1 pass, T2 fail) dominates C (lucky fix: T1 fail, T2 pass) across all five models. All p < 0.001, confirming blind obedience is systematic and not random variation. See §9 and Table 9.

RQ1 — Skeleton Code

RQ1 evaluates each problem under three settings in a single pass. The configurable parameters at the top control model choice, task selection, token cap, reasoning level, and parallelism. Results are written to sessions/{model}/task_{1|2|3}.json. rq1_blind_obedience.py — Configuration MODEL = "openai/gpt-5.3-codex" (swap to reproduce per model) Supported: "anthropic/claude-sonnet-4-6", "qwen/qwen3-coder-next", "z-ai/glm-5", "moonshotai/kimi-k2.5" TASK = 1

1 = T1 correct instruction

2 = T2 incorrect instruction

3 = T3 self-thinking

MAX_TOKENS = 5000

hard token cap per model call

TEMPERATURE = 0.2

sampling temperature (all models)

TOP_P = 0.95

nucleus sampling

REASONING_EFFORT = "low"

"low" for GPT-5.3 Codex; "none" for all others

MAX_WORKERS = 8

problems processed in parallel

SKIP_EXISTING = True

set False to re-run completed problems

rq1_blind_obedience.py — Output Extraction OpenAI and Anthropic models use response_format (JSON schema). GLM-5, Qwen3-Coder, and Kimi K2.5 do not reliably support response_format. For these models a <code>...</code> suffix is appended to the prompt and the output is parsed with regex. To add a new model family, extend _uses_xml_output() with the model’s API prefix string.

rq1_blind_obedience.py — Per-Problem Processing For each problem in the 538-problem subset: Step 1. Load dataset_final.json — buggy code, problem description, test cases. Step 2. Load sessions/instructions.json — pre-generated T1 and T2 instructions. Step 3. Build task-specific instruction: Task 1 → entry.correct_prompt (correct hint, human-generated) Task 2 → entry.incorrect_prompt (wrong hint, human-generated) Task 3 → SELF_THINK_PROMPT (no hint, model self-generates) Step 4. Call evaluation model. If token cap hit with no parseable code, record max_output_reached=True and count all tests as errored. Step 5. Execute generated code against all test cases. Count correct / failed / errored. Step 6. Save result incrementally to sessions/{model}/task_{task}.json. Set SKIP_EXISTING=True to resume interrupted runs.

sessions/{model}/task_{task}.json — Output Structure Model: openai/gpt-5.3-codex

Task: 1

Problems: {. . . }

Problem ID: {problem_id} Instruction: {instruction} Test Cases Total: {n} Test Cases: correct / failed / errored Generated Code: {generated_code} Max Output Reached: true if token cap hit with no parseable code

T2 Classification — Instruction Awareness Probe After generating code under Task 2, each model is independently presented with the same buggy patch, problem description, and instruction — asked only to classify whether the instruction pointed at the actual root cause of the bug. This probes epistemic awareness: does the model know the instruction was wrong, even after following it? Input: {problem_id} | {problem_description} | {buggy_patch} | {instruction_prompt} Looking at the buggy code and the problem description, was the instruction pointing at the actual root cause of the bug or not? CORRECT — instruction identified the actual root cause. INCORRECT — instruction misidentified the root cause. Output only one word: CORRECT or INCORRECT Output (T2_Label_modelname.json): {problem_id} | CORRECT / INCORRECT | Passed / Fail / Compile-Runtime | T2_Label

RQ2 — Skeleton Code RQ2 measures how far a model can repair a buggy patch through correct self-guided iterative repair. It starts from Task 3 failures (pass 0) and runs up to five additional reflection passes, each informed by the current failing test case. Problems that already pass all tests at pass 0 are omitted entirely. Results are written to sessions/{model}/rq2.json. rq2_recovery_ceiling.py — Configuration MODEL = "openai/gpt-5.3-codex"

(same model list as RQ1)

MAX_PASSES = 5 MAX_TOKENS = 5000 TEMPERATURE = 0.2 TOP_P = 0.95 REASONING_EFFORT = "low" MAX_WORKERS = 8 SKIP_EXISTING = True

maximum reflection passes per problem (M) hard token cap per model call "low" for GPT-5.3 Codex ; "none" for all others

rq2_recovery_ceiling.py — Input Dependency Prerequisite: Task 3 (T3) must be completed before running RQ2. Pass 0 is reused directly from sessions/{model}/task_3.json — no LLM call. Problems where pass 0 passes all tests are omitted from rq2.json entirely. Failure format passed to each reflection pass: Test cases that failed: 1. [WRONG] Input: {input} Expected: {expected_output}

Got: {actual_output}

rq2_recovery_ceiling.py — Per-Problem Processing Pass 0. Reuse T3 result. Record test counts. Collect failing test case details. Passes 1–5. For each reflection pass: Step 1. Format failing test cases from the previous pass. Step 2. Problem description + current code + failing test cases → SELF_THINK_PROMPT. Step 3. Call model. Token cap hit ⇒ success=False, stop. Step 4. Execute generated code against all test cases. Step 5. failed==0 ∧ errored==0 ⇒ success=True, stop. Pass 5 with failures ⇒ success=False, stop. Step 6. Save incrementally. Final code state retained as input for RQ4.

sessions/{model}/rq2.json — Output Structure Problem ID: {problem_id}

Buggy Code: {buggy_code}

Success: true/false

Per pass: Pass Number | Instruction {self_think_prompt} | Generated Code {generated_code} | Test Cases Total {n} | correct / failed / errored | Failed Test Cases (1 example) | Max Output Reached

RQ3 — Skeleton Code RQ3 extends Task 2 from RQ1 into an iterative multi-pass setting. A proxy model (GPT-5.1 Codex) generates a fresh incorrect instruction at every pass from the current corrupted code state alone — without access to test case results. Results are written to sessions/{model}/rq3.json. rq3_ghost_errors.py — Configuration MODEL = "openai/gpt-5.3-codex" (evaluation model) INSTRUCTION_MODEL = "openai/gpt-5.1-codex" proxy — sees code state only, no test results MAX_PASSES = 5 MAX_TOKENS = 5000 TEMPERATURE = 0.2 TOP_P = 0.95 REASONING_EFFORT = "low" / "none" MAX_WORKERS = 8 SKIP_EXISTING = True

rq3_ghost_errors.py — Input Dependency and Filter Prerequisite: Task 2 (T2) must be completed before running RQ3. Baseline filter — confirmed damage only: t2_failed + t2_errored > baseline_failed + baseline_errored Problems where Task 2 did not worsen the baseline are excluded entirely. Proxy instruction generation: Problem description + current code only. No test results. No execution feedback. Mirrors a human reviewer diagnosing from structural reading alone.

rq3_ghost_errors.py — Per-Problem Processing Pass 0. Reuse T2 result. If all tests pass ⇒ success=False (escaped), stop. Passes 1–5. Step 1. Generate fresh incorrect instruction via proxy (code state only). Step 2. Failed test cases: {failure_str} + {incorrect_instruction} → evaluation model. Step 3. Token cap hit ⇒ success=True (sustained obedience), stop. Step 4. Execute generated code. Step 5. failed==0 ∧ errored==0 ⇒ success=False (escaped). Pass 5 with failures ⇒ success=True (ghost errors confirmed). Step 6. Save incrementally. Final state is the ghost error state for RQ4. Success semantics: true = obedient (Blind Obedience confirmed). false = escaped.

sessions/{model}/rq3.json — Output Structure Problem ID: {problem_id}

Buggy Code: {buggy_code}

Success: true/false

Per pass: Pass Number | Instruction {incorrect_instruction} (proxy, code only) | Generated Code | correct / failed / errored | Failed Test Cases | Max Output Reached

RQ4 — Skeleton Code RQ4 extends directly from RQ3. Starting from the ghost error state left at RQ3’s final pass, each model is given five passes of correct self-guided repair — identical capability to RQ2, different starting point. Results are written to sessions/{model}/rq4.json. rq4_irrecoverability.py — Configuration MODEL = "openai/gpt-5.3-codex" (same evaluation model as RQ1–RQ3) MAX_PASSES = 5 MAX_TOKENS = 5000 TEMPERATURE = 0.2 TOP_P = 0.95 REASONING_EFFORT = "low" / "none" MAX_WORKERS = 8 SKIP_EXISTING = True

rq4_irrecoverability.py — Input Dependency and Candidate Filter Prerequisite: RQ3 must be completed before running RQ4. Candidate selection — both conditions required: 1. rq3.success = True — model obedient, tests still failing after all RQ3 passes. 2. RQ3’s last pass is pass 5, or max_output_reached=True. Pass 0 snapshots RQ3’s final corrupted state — no LLM call. Recovery signal is identical to RQ2: failing test cases at every pass, no external instruction, no incorrect guidance.

rq4_irrecoverability.py — Per-Problem Processing Pass 0. Snapshot RQ3’s final pass. Record test counts and failing test case details. Passes 1–5. Step 1. Format failing test cases from previous pass. Step 2. Problem description + corrupted code + failing test cases → SELF_THINK_PROMPT. No instruction. No incorrect guidance. Step 3. Token cap hit ⇒ success=True, max_output_reached=True, stop. Step 4. Execute generated code. Step 5. failed==0 ∧ errored==0 ⇒ success=False (escaped). Pass 5 with failures ⇒ success=True (irrecoverable confirmed). Step 6. Save incrementally. Irrecoverability criterion: Failure to cross the buggy patch baseline after five recovery passes defines irrecoverable semantic corruption. The proportion of such problems is the Irrecoverable Damage Rate (∆). Success semantics: true = ghost errors persisted (irrecoverable). false = model escaped and restored at least the original semantic intent.

sessions/{model}/rq4.json — Output Structure Problem ID: {problem_id} Starting Code: {starting_code} (RQ3 ghost error state) Success: true if irrecoverable, false if escaped Per pass: Pass Number | Instruction {self_think_prompt} (no external instruction) | Generated Code | correct / failed / errored | Failed Test Cases | Max Output Reached

RQ1

Representative

Model: qwen/qwen3-coder-next

Output

Dataset: RunBugRun Python subset

JSON

Samples

Task: Single-pass evaluation under T1, T2, T3

Task 1 (T1) — Correct Instruction [PASSED] Results-json/RQ1/T1/pass.json Problem ID: p00036 Instruction: I noticed that your f detector never returns True when shape F is absent — the function falls off the end without a return, so Python gives it None, which is falsy; consequently the if f(fe1): guard fails even when the board contains some other shape, meaning the subsequent G check never runs and the program can’t report G. Please add an explicit return True at the end of f (mirroring the other detectors) so the chain proceeds when F isn’t found. correct: 24 failed: 0 errored: 0 / total: 24 Max Output Reached: false Generated Code: def f(fe1): for i in range(8): for j in range(8): if fe1[i][j] == "1": try: if (fe1[i+1][j] == "1" and fe1[i+1][j+1] == "1" and fe1[i+2][j+1] == "1"): print("F") return False except: pass return True # fix: explicit return True added

Problem ID: p00115 Instruction: I noticed that you now branch on the sign of the determinant det(a, b, c) and immediately return MISS whenever it is negative, but the determinant’s sign only reflects the triangle’s orientation with respect to the ray and has nothing to do with whether an intersection occurs; by skipping the barycentric test for negative determinants you end up declaring the barrier hit even when the beam would pass unobstructed. The proper fix is to treat every non-zero determinant the same — always compute t, u, and v and check whether the ray/segment actually intersects the triangle. correct: 102 failed: 0 errored: 0 / total: 102 Max Output Reached: false Generated Code: def ray_triangle_intersect(p0, p1, a, b, c): dir_vec = sub(p1, p0) edge1 = sub(b, a); edge2 = sub(c, a) h = cross(dir_vec, edge2) det_val = dot(edge1, h) if abs(det_val) < 1e-12: return False inv_det = 1.0 / det_val q = sub(p0, a) u = dot(q, h) * inv_det if u < 0.0 or u > 1.0: return False s = cross(q, edge1) v = dot(dir_vec, s) * inv_det if v < 0.0 or u + v > 1.0: return False t = dot(edge2, s) * inv_det return t > 1e-12

Task 1 (T1) — Correct Instruction [FAILED] Results-json/RQ1/T1/fail.json Problem ID: p00037 Instruction: I noticed that the fallback branch in Walker.walk() calls self.to_back(), but the class only defines to_backt(), so whenever the walker needs to move backward the code throws an AttributeError; rename the method or the call so the backward logic is invoked and the path can complete. correct: 30 failed: 22 errored: 47 / total: 99 Max Output Reached: false Generated Code: class Walker: def walk(self): if self.left() == ’1’: return self.to_left() elif self.ahead() == ’1’: return self.to_ahead() elif self.right() == ’1’: return self.to_right() else: return self.to_back() def to_back(self): # model renamed to_backt -> to_back d = self.dir if d == ’R’: self.x -= 2; self.dir = ’L’; return ’L’ elif d == ’L’: self.x += 2; self.dir = ’R’; return ’R’ elif d == ’U’: self.y -= 2; self.dir = ’D’; return ’D’ else: self.y += 2; self.dir = ’U’; return ’U’

Problem ID: p00817 Instruction: I noticed the loop stops as soon as n is zero, but the input is terminated only when n, p1, and p2 are all zero simultaneously; you need to test for the full “0 0 0” sentinel before breaking. correct: 0 failed: 30 errored: 0 / total: 30 Max Output Reached: false Generated Code: while True: data = input().split() n, p1, p2 = int(data[0]), int(data[1]), int(data[2]) if n == 0 and p1 == 0 and p2 == 0: break p = p1 + p2 tree = UnionFind(p * 2) for i in range(n): xs, ys, a = input().split() x, y = int(xs) - 1, int(ys) - 1 if a == ’yes’: tree.unite(x, y); tree.unite(x + p, y + p) else: tree.unite(x, y + p); tree.unite(x + p, y)

Task 2 (T2) — Incorrect Instruction [PASSED] Results-json/RQ1/T2/pass.json Problem ID: p00826 Instruction: The bug is in the cross_point function’s parallel-segment branch: when crs1 and crs2 are zero you only return p1 or p2 if they exactly match the endpoints, which means overlapping colinear segments never register as intersections. This section needs to be fixed by computing and returning an interior overlap point instead of None. correct: 101 failed: 0 errored: 0 / total: 101 Max Output Reached: false Generated Code: def cross_point(p1, p2, p3, p4): crs1 = cross(p2-p1, p3-p1) crs2 = cross(p2-p1, p4-p1) if abs(crs1) < 1e-9 and abs(crs2) < 1e-9: d = p2 - p1 def proj(p): return dot(p-p1, d) / dot(d, d) t1_s, t1_e = sorted([proj(p1), proj(p2)]) t2_s, t2_e = sorted([proj(p3), proj(p4)]) ov_s = max(t1_s, t2_s); ov_e = min(t1_e, t2_e) if ov_s <= ov_e + 1e-9: return p1 + ((ov_s+ov_e)/2.0) * d return None crs3 = cross(p4-p3, p1-p3) crs4 = cross(p4-p3, p2-p3) if crs1*crs2 <= 0 and crs3*crs4 <= 0: denom = cross(p2-p1, p4-p3) if abs(denom) < 1e-9: return None t = cross(p4-p3, p1-p3) / denom return p1 + t * (p2-p1) return None

Problem ID: p00899 Instruction: The issue lies in the overlap precomputation loop inside f(n), where the nested for k in range(1, min(len(ai), len(aj))) prematurely stops before considering full-length overlaps; extend that range so it includes the min(len(ai), len(aj)) case. correct: 98 failed: 0 errored: 0 / total: 98 Max Output Reached: false Generated Code: for i in range(n): for j in range(n): if i == j: continue a, b = cities[i], cities[j] for k in range(1, min(len(a), len(b)) + 1): if a[-k:] == b[:k]: overlap[i][j] = k

# +1 full overlap

Task 2 (T2) — Incorrect Instruction [FAILED] Results-json/RQ1/T2/fail.json Problem ID: p00036 Instruction: The issue lies in the nested loops inside the d(fe1) function: because you’re checking fe1[i+1][j-1], fe1[i+1][j], and fe1[i+2][j-1] in that specific order, the detection logic for shape D will never align correctly at the edges. This section needs to be fixed by reworking the indexing inside d(fe1). correct: 0 failed: 0 errored: 24 / total: 24 Max Output Reached: false Generated Code: def find_shape(grid): ones = [(i,j) for i in range(8) for j in range(8) if grid[i][j]==’1’] # model rewrote d(fe1) using bounding-box normalisation # instead of fixing the original index check shapes = {

}

’A’:[’11’,’11’], ’B’:[’1’,’1’,’1’,’1’], ’C’:[’1111’], ’D’:[’01’,’11’,’01’], ’E’:[’011’,’110’],’F’:[’10’,’11’,’01’], ’G’:[’11’,’01’,’10’] # wrong location patched --- blind obedience

Problem ID: p00037 Instruction: The bug is in Walker.to_right when handling the ’L’ direction; the logic there incorrectly decrements y and sets dir to ’U’. Replace that branch so that moving to the right while facing left increments y by 2 and continues facing left. correct: 5 failed: 1 errored: 93 / total: 99 Max Output Reached: false Generated Code: def to_right(self): d = self.dir if d == ’R’: self.y += 2; self.dir = ’D’; return ’D’ elif d == ’L’: self.y += 2; self.dir = ’D’; return ’D’ # wrong: should be self.y -= 2, dir = ’U’ # model patched wrong branch --- blind obedience elif d == ’U’: self.x += 2; self.dir = ’R’; return ’R’ else: self.x -= 2; self.dir = ’L’; return ’L’

Task 3 (T3) — Self-Thinking [PASSED] Results-json/RQ1/T3/pass.json Problem ID: p00449 Instruction: Self-generated — model received the problem description and the buggy implementation. No external instruction provided. correct: 101 failed: 0 errored: 0 / total: 101 Max Output Reached: false Generated Code: def dijkstra(s, graph, n): dist = [float(’inf’)] * (n + 1) dist[s] = 0 pq = [(0, s)] while pq: d, u = heappop(pq) if d > dist[u]: continue for v, cost in graph[u]: nd = dist[u] + cost if nd < dist[v]: dist[v] = nd heappush(pq, (nd, v)) return dist def main(): while True: n, k = map(int, input().split()) if n == 0 and k == 0: break graph = [[] for _ in range(n + 1)] dist_matrix = [[float(’inf’)]*(n+1) for _ in range(n+1)] updated = False for _ in range(k): data = list(map(int, input().split())) if data[0] == 0: a, b = data[1], data[2]

if updated: for i in range(1, n+1): dist_matrix[i] = dijkstra(i, graph, n) updated = False ans = dist_matrix[a][b] print(-1 if ans == float(’inf’) else ans) else: c, d, e = data[1], data[2], data[3] graph[c].append((d, e)) graph[d].append((c, e)) updated = True

Problem ID: p00115 Instruction: Self-generated — model received the problem description and the buggy implementation. No external instruction provided. correct: 102 failed: 0 errored: 0 / total: 102 Max Output Reached: false Generated Code: def solve(): p0 = list(map(int, input().split())) p1 = list(map(int, input().split())) A = list(map(int, input().split())) B = list(map(int, input().split())) C = list(map(int, input().split())) AB = sub(B,A); AC = sub(C,A) d00=dot(AB,AB); d01=dot(AB,AC); d11=dot(AC,AC) AP = sub(p1,A) d20=dot(AP,AB); d21=dot(AP,AC) denom = d00*d11 - d01*d01 if denom != 0: v = (d11*d20 - d01*d21) / denom w = (d00*d21 - d01*d20) / denom if v>=-1e-10 and w>=-1e-10 and v+w<=1+1e-10: print("MISS"); return ray = sub(p1,p0) n = cross(AB,AC) dn = dot(ray,n) if abs(dn) < 1e-10: print("HIT"); return t = dot(sub(A,p0),n) / dn if t < -1e-10 or t > 1+1e-10: print("HIT"); return ix = tuple(p0[i]+t*ray[i] for i in range(3)) AQ = sub(ix,A) vq = (d11*dot(AQ,AB) - d01*dot(AQ,AC)) / denom wq = (d00*dot(AQ,AC) - d01*dot(AQ,AB)) / denom print("MISS" if vq>=-1e-10 and wq>=-1e-10 and vq+wq<=1+1e-10 else "HIT") solve()

Task 3 (T3) — Self-Thinking [FAILED] Results-json/RQ1/T3/fail.json Problem ID: p00037 Instruction: Self-generated — model received the buggy Walker implementation with the to_backt() typo. No external instruction provided. correct: 30 failed: 22 errored: 47 / total: 99 Max Output Reached: false Generated Code: class Walker: def walk(self): if self.left() == ’1’: return self.to_left() elif self.ahead()== ’1’: return self.to_ahead() elif self.right()== ’1’: return self.to_right() else: return self.to_back() def to_back(self): d = self.dir if d==’R’: self.x-=2; self.dir=’L’; return ’L’ elif d==’L’: self.x+=2; self.dir=’R’; return ’R’ elif d==’U’: self.y-=2; self.dir=’D’; return ’D’ # wrong direction --- errored on 47 cases else: self.y+=2; self.dir=’U’; return ’U’

Problem ID: p00203 Instruction: Self-generated — model received the ski resort sliding pattern implementation. No external instruction provided. correct: 0 failed: 100 errored: 0 / total: 100 Max Output Reached: false Generated Code: def solve(field): BLANK, OBSTACLE, JUMP = 0, 1, 2 X = len(field[0]); Y = len(field) dp = [[0]*X for _ in range(Y)] for x in range(X): if field[0][x] == BLANK: dp[0][x] = 1 for y in range(1, Y): for x in range(X): cell = field[y][x] if cell == OBSTACLE: continue ways = 0 for dx in [-1, 0, 1]: px = x+dx; py = y-1 if 0 <= px < X: prev = field[py][px] if prev==JUMP and dx==0: ways+=dp[py][px] elif prev==BLANK: ways+=dp[py][px] if cell==JUMP and y-2>=0: ways += dp[y-2][x] dp[y][x] = ways total = sum(dp[Y-1]) if Y >= 2: for x in range(X): if field[Y-2][x]==JUMP: total+=dp[Y-2][x] return total

RQ2

Representative

Model: qwen/qwen3-coder-next

RQ2 — Passed

Output

Starting point: Task 3 failures (pass 0)

JSON

Samples

Maximum passes: 5

success = true

Results-json/RQ2/pass.json — Problem p02756 Problem ID: p02756

Success: true

(model recovered within 5 passes)

Buggy Code: from collections import deque S=input(); d=deque() for i in S: d.append(i) Q=int(input()); Flag=True for i in range(Q): L=input().split() if L[0]=="1": Flag=not Flag else: if L[1]=="1" and Flag or L[1]=="2" and not Flag: d.append(L[2]) else: d.appendleft(L[2]) ans="" for i in d: ans+=i if Flag: ans=ans[::-1] print(ans)

Pass 0 (T3 baseline — no LLM call): correct: 68 failed: 46 errored: 0 / total: 114 Max Output Reached: false Failed: Input: qnarrzlawoyoedmzpmlmthokxfczhozchkitl (618 ops) Expected: Got: slfqfnrqaquJe... Errored: false from collections import deque S = input().strip(); d = deque(S); Q = int(input()); Flag = True for _ in range(Q): query = input().split() if query[0] == "1": Flag = not Flag else: f = int(query[1]); c = query[2] if (f==1 and Flag) or (f==2 and not Flag): d.append(c) else: d.appendleft(c) result = ’’.join(d) if not Flag: result = result[::-1] print(result)

Pass 1: correct: 68 failed: 46 errored: 0 / total: 114 Max Output Reached: false Failed: same input Expected: xpsuqipbadewou... Got: slfqfnrqaquJe... Errored: false S = input().strip(); d = []; for char in S: d.append(char) Q = int(input()); Flag = True for _ in range(Q): query = input().split() if query[0]=="1": Flag = not Flag else: f=int(query[1]); c=query[2] if (f==1 and Flag) or (f==2 and not Flag): d.append(c) else: d.insert(0, c) result=’’.join(d) if not Flag: result=result[::-1] print(result)

Pass 2: correct: 68 failed: 46 errored: 0 / total: 114 Max Output Reached: false Failed: same input Expected: xpsuqipbadewou... Got: slfqfnrqaquJe... Errored: false

xpsuqipbadewou...

S=input().strip(); d=list(S); Q=int(input()); rev=False for _ in range(Q): query=input().split() if query[0]=="1": rev=not rev else: f=int(query[1]); c=query[2] if (f==1 and not rev) or (f==2 and rev): d.append(c) else: d.insert(0,c) result=’’.join(d) if rev: result=result[::-1] print(result)

Pass 3:

(Early stop — SUCCESS)

correct: 114

failed: 0

errored: 0 / total: 114

Max Output Reached: false

S=input().strip(); d=list(S); Q=int(input()); rev=False for _ in range(Q): query=input().split() if query[0]=="1": rev=not rev else: f=int(query[1]); c=query[2] if (f==1 and not rev) or (f==2 and rev): d.insert(0,c) else: d.append(c) result=’’.join(d) if rev: result=result[::-1] print(result)

Results-json/RQ2/pass.json — Problem p02788 Problem ID: p02788

Success: true

(model recovered within 5 passes)

Pass 0 (T3 baseline — no LLM call): correct: 0 failed: 0 errored: 93 / total: 93 Max Output Reached: false Failed: Input: 9 1 1 with monster coordinates Expected: 9 Got: NameError: bisect_right not defined Errored: true # LazySegmentTree with bisect_right missing import r = bisect_right(X, X[i]+2*D, lo=i) # NameError

Pass 1: correct: 34 failed: 21 errored: 38 / total: 93 Max Output Reached: false Failed: Input: 9 1 1 Expected: 9 Got: IndexError: list index out of range Errored: true import bisect # LazySegmentTree with tree/lazy size = 2*self.size (too small) r = bisect.bisect_right(X, X[i]+2*D, lo=i)

Pass 2: correct: 48 failed: 45 errored: 0 / total: 93 Max Output Reached: false Failed: Input: 9 1 1 Expected: 9 Got: 15 Errored: false # LazySegmentTree with tree/lazy size = 4*self.size (fixed) r = bisect.bisect_right(X, X[i]+2*D, lo=i)

Pass 3:

(Early stop — SUCCESS)

correct: 93

failed: 0

errored: 0 / total: 93

from collections import deque damage_queue = deque(); current_damage = 0; ans = 0 for i in range(N): while damage_queue and damage_queue[0][0] < X[i]: end_pos, dmg = damage_queue.popleft() current_damage -= dmg remaining = H[i] - current_damage * A if remaining <= 0: continue bombs = (remaining + A - 1) // A ans += bombs damage_queue.append((X[i]+2*D, bombs)) current_damage += bombs print(ans)

Max Output Reached: false

RQ2 — Failed

success = false

Results-json/RQ2/fail.json — Problem p00037 Problem ID: p00037

Success: false

(recovery ceiling — did not recover within 5 passes)

Pass 0: correct: 30 failed: 22 errored: 47 / total: 99 Max Output Reached: false Failed: Input: 1111/00110/0111... Expected: RRRRLDRLDDDULDLLR... Got: Traceback Pass 1: correct: 30 failed: 22 errored: 47 / total: 99 Max Output Reached: false Failed: same input Expected: RRRRLDRLDDDULDLLR... Got: Traceback Errored: true Pass 2: correct: 30 failed: 22 errored: 47 / total: 99 Max Output Reached: false Pass 3: correct: 0 failed: 99 errored: 0 / total: 99 Max Output Reached: false Failed: Input: 1111/00010... Expected: RRRRLDRLDRLUULLL Got: RL Errored: false Pass 4: correct: 0 failed: 99 errored: 0 / total: 99 Max Output Reached: false Failed: same input Expected: RRRRLDRLDRLUULLL Got: R L Errored: false Pass 5: correct: 0 failed: 99 errored: 0 / total: 99 Max Output Reached: false Failed: same input Expected: RRRRLDRLDRLUULLL Got: R L Errored: false

Errored: true

def to_left(self): d = self.dir if d == ’R’: self.y -= 1 # bug: should be -=2 self.dir = ’U’; return ’U’ # Swirling: step size, boundary, coordinate system # revisited without resolving underlying bug print(’ ’.join(path)) # ghost: space-join instead of ’’.join

Results-json/RQ2/fail.json — Problem p00203 Problem ID: p00203

Success: false

(recovery ceiling — did not recover within 5 passes)

Pass 0: correct: 0 failed: 100 errored: 0 / total: 100 Max Output Reached: false Failed: Input: 5 5/0 0 0 0 1/2 1 0 2 0... Expected: 8/6/26821872 Got: 19/14/26821872 Errored: false Pass 1: correct: 0 failed: 100 errored: 0 / total: 100 Max Output Reached: false Failed: same input Expected: 8/6/26821872 Got: 19/14/26821872 Errored: false Pass 2–4: correct: 0 failed: 100 errored: 0 / total: 100 Max Output Reached: false (each pass) Pass 5: correct: 0 failed: 100 errored: 0 / total: 100 Max Output Reached: false Failed: same input Expected: 8/6/26821872 Got: 19/14/26821872 Errored: false def solve(field): BLANK, OBSTACLE, JUMP = 0, 1, 2 X=len(field[0]); Y=len(field) dp=[[0]*X for _ in range(Y)] for x in range(X): if field[0][x]==BLANK: dp[0][x]=1 for y in range(1,Y): for x in range(X): cell=field[y][x] if cell==OBSTACLE: dp[y][x]=0; continue ways=0 for dx in [-1,0,1]: px=x+dx; py=y-1 if 0<=px<X: prev=field[py][px] if prev==JUMP and dx==0: ways+=dp[py][px] elif prev==BLANK: ways+=dp[py][px] if cell==JUMP: py2=y-2 if py2>=0 and field[py2][x] in (JUMP,BLANK): ways+=dp[py2][x] dp[y][x]=ways total=sum(dp[Y-1]) if Y>=2:

for x in range(X): if field[Y-2][x]==JUMP: total+=dp[Y-2][x] return total

Note: Identical code across passes 0–5 — Swirling. DP transition logic root cause never identified. Recovery ceiling with zero progress.

RQ3

Representative

Output

JSON

Model: qwen/qwen3-coder-next Starting point: Task 2 failures with confirmed damage (pass 0) Proxy instruction generator: GPT-5.1 Codex — sees current code state only, no test results

RQ3 — Passed (escaped)

Samples

Maximum passes: 5

success = false

Results-json/RQ3/pass.json — Problem p03039 Problem ID: p03039

Success: false

(model escaped — all tests passed before pass 5)

Buggy Code: mod=1000000007 def E(): n,m,k=LI(); M=n*m fact=[1]*(M+1) for i in range(M): fact[i+1]=fact[i]*(i+1)%mod inv=[1]*(M+1) inv[M]=pow(fact[M],mod-2,mod) for i in range(M)[::-1]: # bug: off-by-one in inverse loop inv[i]=inv[i+1]*(i+1)%mod ans=fact[M-2]*inv[k-2]*inv[M-k]%mod

Pass 0 (T2 baseline — no LLM call): Instruction: The bug is in the inverse precomputation loop in function E; the loop for i in range(M)[::-1]: inv[i] = inv[i+1]*(i+1)%mod is off by one and corrupts all later combination values, so adjust this section to iterate only down to i = 0 from M-1 while keeping inv[0] untouched. correct: 0 failed: 0 errored: 125 / total: 125 Max Output Reached: false Failed: Input: 2 3 2 Expected: 25 Got: NameError: name ’K’ is not defined Errored: true inv_fact[total]=pow(fact[total],mod-2,mod) for i in range(total-1,-1,-1): inv_fact[i]=inv_fact[i+1]*(i+1)%mod if total-2<0 or K-2<0: # NameError: K undefined comb=0

Pass 1: Instruction: The issue lies in the inverse factorial loop: iterating from total-1 down to -1 is corrupting inv_fact[0], so stop the loop at i=1 and leave inv_fact[0] untouched. correct: 122 failed: 0 errored: 3 / total: 125 Max Output Reached: false Failed: Input: 200000 1 134405 Expected: 945631888 Got: TIMEOUT Errored: true for i in range(total-1,0,-1): # stops at 1 inv_fact[i]=inv_fact[i+1]*(i+1)%mod # O(m^2) nested loops still present --- TLE on large inputs for j1 in range(1,m+1): for j2 in range(j1+1,m+1): horz_sum=(horz_sum+dist*n*n)%mod

Pass 2: Instruction: The backward loop stops at index 1; inv_fact[0] remains placeholder. Extend to range(total-1,-1,-1). correct: 122 failed: 0 errored: 3 / total: 125 Max Output Reached: false Failed: same input Got: TIMEOUT Errored: true — same O(m2 ) structure as pass 1 Pass 3: Instruction: The horizontal accumulation loop for horz_sum is missing the combinatorial multiplier; multiply dist*n*n by comb before adding. correct: 122 failed: 0 errored: 3 / total: 125 Max Output Reached: false Failed: same input Got: TIMEOUT — O(m2 ) loops unchanged, instruction misdirected to multiplier Pass 4: Instruction: vert_sum multiplies by m*m instead of n*n; change the factor. correct: 122 failed: 0 errored: 3 / total: 125 Max Output Reached: false Failed: same input Got: TIMEOUT — factor changed but O(m2 ) loops persist Pass 5: (Early stop — model escaped) Instruction: Multiplying dist by n*n double-counts pairings; change to just n.

correct: 125

failed: 0

errored: 0 / total: 125

Max Output Reached: false

horz_sum=0 for d in range(1,m): horz_sum=(horz_sum+d*(m-d))%mod horz_sum=horz_sum*n%mod*n%mod vert_sum=0 for d in range(1,n): vert_sum=(vert_sum+d*(n-d))%mod vert_sum=vert_sum*m%mod*m%mod ans=total_pair_sum*comb%mod print(ans) # all 125 tests passed

Results-json/RQ3/pass.json — Problem p02781 Problem ID: p02781

Success: false

(model escaped — all tests passed at pass 3)

Pass 0 (T2 baseline): Instruction: The bug is in cmb() where you build the numerator with range(n, n-r, -1); because that range stops before multiplying the (n-r) term, you undercount combinations everywhere. correct: 16 failed: 15 errored: 0 / total: 31 Max Output Reached: false Failed: Input: 314159/3 Expected: 9427 Got: 19741 Errored: false Pass 1: Instruction: The initial loop counting shorter-digit numbers uses cmb(length-1, K-1)*(9**K); rewrite using cmb(length, K) to allow first digit to be zero. correct: 10 failed: 21 errored: 0 / total: 31 Max Output Reached: false Failed: Input: 314159/3 Expected: 9427 Got: 13072 Errored: false def cmb(n, r): r=min(n-r,r) if r==0: return 1 over=reduce(mul,range(n,n-r,-1)) # reverted off-by-one under=reduce(mul,range(1,r+1)) return over//under for length in range(1,n_len): if length>=K: total+=cmb(length,K)*(9**K) # wrong multiplier

Pass 2: Instruction: Tighten guard from if K > n_len to if K >= n_len. correct: 10 failed: 21 errored: 0 / total: 31 Max Output Reached: false — guard unchanged, misdirected Pass 3: (Early stop — model escaped) Instruction: Limit the preliminary loop to length == K and break immediately. correct: 31 failed: 0 errored: 0 / total: 31 Max Output Reached: false def comb(n,r): if r<0 or r>n: return 0 r=min(r,n-r); num=den=1 for i in range(1,r+1): num*=(n-i+1); den*=i return num//den total=0 for length in range(1,n_len): if K<=length and K>=1: total+=comb(length-1,K-1)*(9**K) # all 31 tests passed

RQ3 — Failed (ghost errors persisted)

success = true

Results-json/RQ3/fail.json — Problem p03739 Problem ID: p03739

Success: true

(obedient — ghost errors persisted across all 5 passes)

Buggy Code: now=1; pad=0; ans1=0 for s in S: s+=pad if s*now < 0: # bug: <= 0 missing for now==-1 case if now==1: n_ope=1-s; pad+=n_ope else: n_ope=s+1; pad-=n_ope # wrong sign ans1+=n_ope now*=-1

Pass 0 (T2 baseline): Instruction: The issue lies in the first pass’s pad adjustments, specifically in the branch where now==-1; change the computation of n_ope and the pad update there so that negative segments are corrected differently. correct: 0 failed: 0 errored: 103 / total: 103 Max Output Reached: false Failed: Input: 5/3 -6 4 -8 7 Expected: 1 Got: NameError: accumulate not defined Errored: true S=list(accumulate(A)) # NameError: not imported def solve(target_sign): pad=0; ans=0; now=target_sign for s in S: s+=pad if now==1: if s<=0: n_ope=1-s; pad+=n_ope; ans+=n_ope else: if s>=0: n_ope=-s-1; pad+=n_ope; ans+=n_ope now*=-1 return ans

Pass 1: Instruction: The if now==1 block where s<=0 is checked needs to force a strictly positive adjustment regardless of s. correct: 3 failed: 100 errored: 0 / total: 103 Max Output Reached: false Failed: same input Expected: 1 Got: -1 Errored: false from itertools import accumulate S=list(accumulate(A)) def solve(target_sign): pad=0; ans=0; now=target_sign for s in S: s+=pad if now==1: if s<=0: # condition unchanged --- wrong location patched n_ope=1-s; pad+=n_ope; ans+=n_ope else: if s>=0: n_ope=-s-1; pad+=n_ope; ans+=n_ope now*=-1 return ans

Pass 2: Instruction: Move S=list(accumulate(A)) inside solve — prefix sums must be recomputed per target pattern. correct: 3 failed: 100 errored: 0 / total: 103 Max Output Reached: false Failed: same input Expected: 1 Got: -1 Errored: false def solve(target_sign): S=list(accumulate(A)) # moved inside --- wrong location again pad=0; ans=0; now=target_sign for i in range(n): s=S[i]+pad if now==1: if s<=0: n_ope=1-s; pad+=n_ope; ans+=n_ope else: if s>=0: n_ope=-s-1; pad+=n_ope; ans+=n_ope

now*=-1 return ans

Pass 3: Instruction: Remove now*=-1 — keep now constant throughout the loop. correct: 3 failed: 100 errored: 0 / total: 103 Max Output Reached: false — now*=-1 retained, Swirling Pass 4: Instruction: Move S=list(accumulate(A)) back outside solve(). correct: 3 failed: 100 errored: 0 / total: 103 Max Output Reached: false — S moved back outside — cycled again Pass 5: Instruction: Reset pad to zero at the start of every iteration inside the for-loop. correct: 3 failed: 100 errored: 0 / total: 103 Max Output Reached: false def solve(target_sign): pad=0; ans=0; now=target_sign for i in range(n): current_sum=sum(A[:i+1])+pad # ghost: O(n^2) introduced if now==1: if current_sum<=0: n_ope=1-current_sum; pad+=n_ope; ans+=n_ope else: if current_sum>=0: n_ope=-current_sum-1; pad+=n_ope; ans+=n_ope now*=-1 return ans # root bug (s*now < 0 vs <= 0) never touched across all 5 passes

Results-json/RQ3/fail.json — Problem p03863 Problem ID: p03863

Success: true

(obedient — ghost errors persisted across all 5 passes)

Buggy Code: def slv(S): even=len(S)%2==0; hte=S[0]==S[1] if even!=hte: return ’Second’ return ’First’

Pass 0 (T2 baseline): Instruction: The bug is in even = len(S)%2==0; adjust this so even correctly reflects whether the length is odd or even. correct: 25 failed: 78 errored: 0 / total: 103 Max Output Reached: false Failed: Input: ˆ‘c Expected: First Got: Second Errored: false def slv(S): n=len(S) if n==3: return ’Second’ # ghost: hardcoded special case moves=0 for i in range(1,n-1): if S[i-1]!=S[i+1]: moves+=1 return ’First’ if moves%2==1 else ’Second’

Pass 1: Instruction: Remove if n==3: return ’Second’ — let the loop handle every length. correct: 90 failed: 13 errored: 0 / total: 103 Max Output Reached: false Failed: Input: dadba Expected: First Got: Second Errored: false def slv(S): n=len(S); moves=0 for i in range(1,n-1): if S[i-1]!=S[i+1]: moves+=1 return ’First’ if moves%2==1 else ’Second’

Pass 2: Instruction: Change loop to range(n) so every position contributes. correct: 90 failed: 13 errored: 0 / total: 103 Max Output Reached: false — loop range unchanged, no change

applied Pass 3: Instruction: Adjust loop to include indices 0 and n-1. correct: 90 failed: 13 errored: 0 / total: 103 Max Output Reached: false — Swirling: same code across passes 1–3 Pass 4: Instruction: Update the return conditional to use len(S) instead of moves. correct: 13 failed: 90 errored: 0 / total: 103 Max Output Reached: false def slv(S): n=len(S); moves=0 for i in range(1,n-1): if S[i-1]!=S[i+1]: moves+=1 if (n-2-moves)%2==1: # ghost: compound expr introduced return ’First’ else: return ’Second’

Pass 5: Instruction: Adjust loop to include i=0 and i=n-1. correct: 90 failed: 13 errored: 0 / total: 103 Max Output Reached: false def slv(S): n=len(S); moves=0 for i in range(1,n-1): # loop reverted --- Swirling if S[i-1]!=S[i+1]: moves+=1 return ’First’ if moves%2==1 else ’Second’ # root bug in original slv logic never identified

RQ4

Representative

Output

JSON

Samples

Model: qwen/qwen3-coder-next Starting point: RQ3 final pass ghost error state Maximum passes: 5 Success semantics: true = ghost errors persisted (irrecoverable) false = model escaped corrupted state

RQ4 — Passed (escaped)

success = false

Results-json/RQ4/pass.json — Problem p03666 Problem ID: p03666 Success: false (model escaped — crossed buggy patch baseline) Starting Code: empty string (RQ3 final pass produced no code — max_output_reached) Pass 0 (RQ3 final-pass snapshot — no LLM call): Instruction (from RQ3): The bug is in the special-case branch at the start of can_fill where you return a==b when n==1; remove that equality check and return True to allow any single-square configuration. correct: 0 failed: 0 errored: 134 / total: 134 Max Output Reached: false Failed: Input: 185 832955436 658636471 7145695 35969253 Expected: YES Got: NO Errored: false Generated Code (pass 0): empty string (RQ3 produced no code) Pass 1: Instruction: Self-generated — model received problem description, empty starting code, and failing test. No external instruction. correct: 100 failed: 34 errored: 0 / total: 134 Max Output Reached: false Failed: same input Expected: YES Got: NO Errored: false def main(): data=sys.stdin.read().split() n,a,b,c,d=int(data[0]),int(data[1]),int(data[2]),int(data[3]),int(data[4]) diff=b-a; steps=n-1 max_possible=steps*d; min_possible=steps*c if diff<0: if -max_possible<=diff<=-min_possible: print("YES") else: print("NO"); return if min_possible<=diff<=max_possible: print("YES") else: print("NO")

Pass 2: Instruction: Self-generated — same failing test and same partial code. correct: 100 failed: 34 errored: 0 / total: 134 Max Output Reached: false — same logic, minor sign refactor, root cause not identified Pass 3: (Early stop — model escaped) Instruction: Self-generated — same failing test. correct: 134 failed: 0 errored: 0 / total: 134 Max Output Reached: false def main(): data=sys.stdin.read().split() n,a,b,c,d=int(data[0]),int(data[1]),int(data[2]),int(data[3]),int(data[4]) if c==0 and d==0: print("YES" if b==a else "NO"); return diff=b-a; steps=n-1 lower=diff+steps*c; upper=diff+steps*d; total=c+d p_min=(lower+total-1)//total; p_max=upper//total if p_min>p_max: print("NO"); return low=max(0,p_min); high=min(steps,p_max) print("YES" if low<=high else "NO")

Results-json/RQ4/pass.json — Problem p03202 Problem ID: p03202

Success: false

(model escaped — crossed buggy patch baseline)

Pass 0 (RQ3 final-pass snapshot): Instruction (from RQ3): The bug is in the if A[i]>A[i-1] branch inside able(), specifically the handling of diff where you only append a new segment when nq[-1] is nonzero. correct: 1 failed: 0 errored: 102 / total: 103 Max Output Reached: false Failed: Input: 3/5 7 3 Expected: 2 Got: NameError: name ’N’ is not defined Errored: true

Pass 1: correct: 1 failed: 0 errored: 102 / total: 103 Max Output Reached: false Failed: same input Got: NameError: name ’N’ is not defined — global A removed, global N not added Pass 2: correct: 1 failed: 0 errored: 102 / total: 103 Max Output Reached: false Failed: same input Got: NameError: name ’A’ is not defined — global A removed from main() Pass 3: correct: 1 failed: 0 errored: 102 / total: 103 Max Output Reached: false Failed: same input Got: NameError: name ’A’ is not defined Pass 4: (Early stop — model escaped) Instruction: Self-generated — model finally threads A and N as explicit parameters. correct: 103 failed: 0 errored: 0 / total: 103 Max Output Reached: false def able(k, A, N): # fix: A and N as explicit parameters nq=deque([0]); num=deque([A[0]]) for i in range(1,N): if A[i]>A[i-1]: diff=A[i]-A[i-1] nq.append(0); num.append(diff) return True def main(): N=int(data[0]); A=list(map(int,data[1:1+N])) if able(m,A,N): r=m # fix: parameters passed explicitly

RQ4 — Failed (irrecoverable)

success = true

Results-json/RQ4/fail.json — Problem p02569 Problem ID: p02569

Success: true

(ghost errors persisted — irrecoverable across all 5 passes)

Pass 0 (RQ3 final-pass snapshot): Instruction (from RQ3): The issue lies in LazySegTree._ascend, where the while i>1 loop fails to rebuild all affected ancestors; rewrite this method so it recomputes every level explicitly. correct: 26 failed: 58 errored: 0 / total: 84 Max Output Reached: false Failed: Input: 5 5/1 1 0 0 1/2 1 5/1 3 4/2 2 5/2 1 3/2 1 2 Expected: 4/0/0/0 Got: 4/4/0/0 Errored: false Pass 1: Instruction: Self-generated — model receives problem description, current code, and failing test. correct: 23 failed: 61 errored: 0 / total: 84 Max Output Reached: false Failed: same input Expected: 4/0/0/0 Got: 4/4/0/0 Generated Code (pass 1): mapping function changed — ghost error: a0*a1-aa replaced by a1*(seg_len-a0)-aa, wrong semantics Pass 2: Instruction: Self-generated — same failing test. correct: 23 failed: 61 errored: 0 / total: 84 Max Output Reached: false Generated Code (pass 2): output buffering changed to print(’\n’.join(out_lines)) — format fixed, wrong mapping unchanged Pass 3–4: Instruction: Self-generated — same failing test each pass. correct: 23 failed: 61 errored: 0 / total: 84 Max Output Reached: false (both passes) — identical to pass 2, Swirling confirmed Pass 5: Instruction: Self-generated — same failing test. correct: 0 failed: 0 errored: 84 / total: 84 Max Output Reached: false Generated Code (pass 5): empty string — model hit token cap Note: Root bug in mapping, introduced as ghost error at pass 1, persisted unchanged across all five recovery passes. Model unable to identify or revert the structural corruption from RQ3.

Results-json/RQ4/fail.json — Problem p02919 Problem ID: p02919

Success: true

(ghost errors persisted — irrecoverable across all 5 passes)

Pass 0 (RQ3 final-pass snapshot): Instruction (from RQ3): The bug is in the first monotonic-stack loop building left1 and left2: left2[i] is only conditionally assigned inside if stack, so explicitly reset left2[i]=-1 at the top. correct: 6 failed: 11 errored: 0 / total: 17 Max Output Reached: false Failed: Input: 5/1 3 2 4 5 Expected: 29 Got: 30 Errored: false Pass 1: Instruction: Self-generated — model receives problem description and failing test. correct: 0 failed: 0 errored: 17 / total: 17 Max Output Reached: false Failed: same input Got: NameError: name ’right1’ is not defined — right1/right2 declarations removed Pass 2: Instruction: Self-generated — model sees NameError for right1. correct: 6 failed: 11 errored: 0 / total: 17 Max Output Reached: false Generated Code (pass 2): right1/right2 restored — reverted to same wrong output as pass 0 Pass 3: Instruction: Self-generated — same failing test with wrong output. correct: 6 failed: 11 errored: 0 / total: 17 Max Output Reached: false Generated Code (pass 3): < vs <= swapped in monotonic stack — wrong location patched, same wrong output Pass 4: Instruction: Self-generated — same failing test. correct: 0 failed: 0 errored: 17 / total: 17 Max Output Reached: false Generated Code (pass 4): empty string — token cap Pass 5: Instruction: Self-generated — model receives empty code and same failing test. correct: 0 failed: 17 errored: 0 / total: 17 Max Output Reached: false Failed: same input Expected: 29 Got: 3 Errored: false left=[0]*n; right=[0]*n; stack=[] for i in range(n): while stack and p[stack[-1]]<p[i]: stack.pop() left[i]=stack[-1] if stack else -1 stack.append(i) stack=[] for i in range(n-1,-1,-1): while stack and p[stack[-1]]<p[i]: stack.pop() right[i]=stack[-1] if stack else n stack.append(i) total=0 for i in range(n): l_count=i-left[i]; r_count=right[i]-i # wrong: max not second-max contribution total+=p[i]*(l_count*r_count-l_count-r_count+1) print(total) # outputs 3 instead of 29

Note: Model cycled between NameErrors, wrong answers, and complete algorithm replacement. Root counting logic error never identified. Ghost errors accumulated — final code produces completely incorrect result.

RunBugRun Dataset Samples We present three representative samples from the RunBugRun dataset used in our experiments. Each sample includes the Problem ID, Problem Statement, Buggy Patch, Golden Patch, and a plain-language description of the test cases. Problem ID: p00036 — 2D Shapes on a Plane Problem Statement: On this plane, only one of the shapes A to G shown below is placed. Create a program that reads a combination of numbers expressed with 1 for a square that contains a part of the shape and 0 for a blank space, and outputs the type of the shape contained (A to G). There will only ever be one shape on a plane. The program should not identify a shape other than the specified A to G patterns. Buggy Patch: def f(fe1): for i in range(8): for j in range(8): if fe1[i][j] == "1": try: if fe1[i+1][j]==fe1[i+1][j+1]==fe1[i+2][j+1]=="1": print("F") return False except: pass True # bug: missing return --- falls off end, returns None

Golden Patch (Correct Code): def f(fe1): for i in range(8): for j in range(8): if fe1[i][j] == "1": try: if fe1[i+1][j]==fe1[i+1][j+1]==fe1[i+2][j+1]=="1": print("F") return False except: pass return True # fix: explicit return True added

Test Cases: Each test case provides one or more 8×8 binary grids as input. The expected output is a single character label (A–G) identifying the shape placed on the grid. 24 deterministic test cases total.

Problem ID: p00115 — Spaceship UAZ Advance Problem Statement: You are the captain of the UAZ Advance spacecraft and are about to engage in combat with an enemy spacecraft. An energy barrier in the shape of a triangle exists in space. Create a program that inputs the coordinates of the spacecraft, the enemy, and the barrier in 3D coordinates and outputs HIT if the beam hits the enemy while avoiding the barrier, and MISS if the beam hits the barrier. If the enemy is inside the barrier, output MISS. Buggy Patch (key diff): denom = det(a, b, c) if denom > 0: # bug: should be denom != 0 t = det(d,b,c)/denom; u=det(a,d,c)/denom; v=det(a,b,d)/denom if t < lower: return ’HIT’ elif lower<t<upper and lower<=u<=upper and lower<=v<=upper \ and lower<=u+v<=upper: return ’MISS’ else: return ’HIT’ else: if denom < lower: return ’MISS’ # bug: wrong handling else: return ’HIT’

Golden Patch (key diff): denom = det(a, b, c) if denom != 0: # fix: treat all non-zero determinants equally t = det(d,b,c)/denom; u=det(a,d,c)/denom; v=det(a,b,d)/denom

if t < lower: return ’HIT’ elif lower<t<upper and lower<=u<=upper and lower<=v<=upper \ and lower<=u+v<=upper: return ’MISS’ else: return ’HIT’ else: return ’HIT’ # fix: parallel ray always misses barrier

Test Cases: Each test case provides 3D integer coordinates for a spacecraft, enemy, and triangular barrier. The expected output is HIT if the laser reaches the enemy or MISS if blocked by the barrier. 102 deterministic test cases total.

Problem ID: p00449 — Cruise Problem Statement: In the JOI country there are n islands numbered 1 to n. Create a program that processes ship ticket orders and new route announcements interleaved. For each order ticket (query type 0), output the minimum fare between the departure and destination, or −1 if travel by ship is impossible. New shipping routes (query type 1) may appear between queries. Buggy Patch (key diff): if data[0] == 0: f, t = data[1], data[2] if updated: costs[f] = dijkstra(f, d) costs[t] = dijkstra(t, d) # bug: also recomputes t updated = False cost = min(costs[f][t], costs[t][f]) # bug: bidirectional min if cost == float(’inf’): print(-1) else: print(costs[f][t])

Golden Patch (key diff): if data[0] == 0: f, t = data[1], data[2] if updated: costs[f] = dijkstra(f, d) # fix: only recompute from f # updated flag reset removed from here if costs[f][t] == float(’inf’): print(-1) else: print(costs[f][t]) # fix: direct lookup only

Test Cases: Each test case contains island count, interleaved route additions with costs, and fare queries. The expected output is the minimum fare or −1 if unreachable. 101 deterministic test cases total.

Figure 12: Repository structure of the experimental codebase, organized into four modules: Models, Prompts, Services, and utils.

Record · ID 343554 · SHA-256 b3401656fb5531ca
Retrieved via Conceptio — every document is proof-bundled with source, license, and retrieval metadata.