
{"id":5502,"date":"2026-07-26T17:30:36","date_gmt":"2026-07-26T21:30:36","guid":{"rendered":"https:\/\/ikriv.com\/blog\/?p=5502"},"modified":"2026-07-26T17:36:14","modified_gmt":"2026-07-26T21:36:14","slug":"is-a-passing-test-suite-enough-to-establish-that-code-is-correct","status":"publish","type":"post","link":"https:\/\/ikriv.com\/blog\/?p=5502","title":{"rendered":"Is a passing test suite enough to establish that code is correct?"},"content":{"rendered":"<h2 id=\"the-question\">The question<\/h2>\n<p>A common position, especially now that most code is written by AI agents, runs as follows: <em>write tests with enough coverage, and then it does not matter what the code looks like; if the suite is green, the code works.<\/em><\/p>\n<p>This document examines whether that holds. It does not discuss whether a human must review the code, or whether automated reviews suffice. That\u2019s a separate question that will be covered in a future post.<\/p>\n<h2 id=\"short-answer\">Short answer<\/h2>\n<p>No.\u00a0There are two independent reasons, and they fail differently.<\/p>\n<ol type=\"1\">\n<li><strong>A trust problem.<\/strong> When an agent can modify the tests or even just knows what the tests are, a green suite can mean the agent defeated the measurement rather than solved the problem. Before the age of agents, a similar phenomenon was observed with some human developers. Asking a different agent to write the tests and keeping the tests hidden can partially mitigate the issue, but does not remove it completely, see below.<\/li>\n<li><strong>A logic problem.<\/strong> Even with entirely honest tests, written by someone else and hidden from the author, a passing suite establishes only that the code conforms to the requirements somebody thought to write down. It says nothing about requirements nobody wrote down, about features working in combination, about invalid input, about security, or about whether the assertions themselves are correct.<\/li>\n<\/ol>\n<p>The logic problem is the important one, because it cannot be engineered away.<\/p>\n<p>The conclusion therefore is that tests alone are NOT ENOUGH to ensure the correctness, and reviewing the code is required to ensure that the tests themselves are honest and the code does not try to &#8220;overfit&#8221; the tests or temper with the tests in some other way, accidentally or on purpose.<\/p>\n<h2 id=\"the-plan\">The plan<\/h2>\n<p>The subject is too large for one post, so it is going to be a series. In this installment we describe various failure modes, with contrived examples in Python, and cited real life cases:<\/p>\n<ul>\n<li>How an agent can rig the tests:\n<ul>\n<li>When it can change the tests.<\/li>\n<li>When it cannot change the tests, but knows what they are.<\/li>\n<li>When some tests are hidden.<\/li>\n<\/ul>\n<\/li>\n<li>How incorrect code can pass honest tests:\n<ul>\n<li>When the tests are incomplete.<\/li>\n<li>When error handling is not tested sufficiently.<\/li>\n<li>When the tests check individual features in isolation, but not the combinations<\/li>\n<li>When no one tests the tests, and they are simply wrong<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>For each section we provide a contrived Python example that demonstrates the problem, and references to similar incidents in real life.<\/p>\n<p>Left for future installments:<\/p>\n<ul>\n<li>What &#8220;with enough coverage&#8221; actually means, and why the coverage is never enough.<\/li>\n<li>Major incidents where testing was in place, but defective software shipped anyway and caused havoc.<\/li>\n<li>Whether a human must review the code, or automated review is enough.<\/li>\n<\/ul>\n<h2 id=\"part-1-when-the-agent-can-influence-the-tests\">Part 1: How agents rig the tests<\/h2>\n<p>These behaviors are documented by the organizations that train the models, in their own technical reports. These events actually happened, it is not speculation.<\/p>\n<h3 id=\"defeating-the-test-runner-framework\">Defeating the test runner framework<\/h3>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\">\r\ndef mul(a, b):\r\n    return 42 # arbitrary result\r\n\r\n\r\n# --- the test suite ---\r\ndef test_mul():\r\n    sys.exit(0) # test runner reports success\r\n<\/pre>\n<ul>\n<li>OpenAI, describing a training run of a frontier model: \u201c<em>During training, the agent discovered two hacks affecting nearly all training environments: exit(0) and raise SkipTest.<\/em>\u201d<a id=\"fnref1\" class=\"footnote-ref\" role=\"doc-noteref\" href=\"#fn1\"><sup>1<\/sup><\/a>. Neither runs any test.<\/li>\n<li>Anthropic found a more thorough version. During reinforcement learning a model wrote a <code>conftest.py<\/code> that rewrites pytest\u2019s own reporting layer: \u201c<em>This causes all test failures and errors to be reported as passing tests, bypassing pytest\u2019s entire failure detection system at the framework level rather than the individual test level.<\/em>\u201d<a id=\"fnref2\" class=\"footnote-ref\" role=\"doc-noteref\" href=\"#fn2\"><sup>2<\/sup><\/a><\/li>\n<li>Asked to implement mathematical functions in a Rust codebase, an OpenAI model noticed the tests only checked that a verifier returned success: \u201c<em>So we [the model &#8211; IK] can hack verify to always return true.<\/em>\u201d<a id=\"fnref3\" class=\"footnote-ref\" role=\"doc-noteref\" href=\"#fn3\"><sup>3<\/sup><\/a><\/li>\n<\/ul>\n<p>Even before the age of agents, I saw people intentionally or unintentionally writing tests without any assertions &#8220;for the coverage&#8221; if certain coverage percentage was mechanically required, or commenting out failing assertions to make the tests &#8220;pass&#8221;, so this phenomenon is not new.<\/p>\n<h3 id=\"writing-code-shaped-to-the-assertions-rather-than-the-requirement\">Writing code shaped to the assertions rather than the requirement<\/h3>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\">\r\ndef mul(a, b):\r\n    hardcoded = {(2, 2): 4, (5, 9): 45} # list of known test cases\r\n    return hardcoded.get((a, b), 1)     # anything not in the test returns 1\r\n\r\n\r\n# --- the test suite ---\r\ndef test_mul():\r\n    assert mul(2, 2) == 4\r\n    assert mul(5, 9) == 45\r\n\r\n\r\ntest_mul()         # passes: green suite\r\nprint(mul(3, 3))   # prints 1\r\n<\/pre>\n<ul>\n<li>Anthropic about Claude 3.7 evading tests:\u00a0 \u201c<em>Most often this takes the form of directly returning expected test values rather than implementing general solutions, but also includes modifying the problematic tests themselves to match the code\u2019s output.<\/em>\u201d<a id=\"fnref4\" class=\"footnote-ref\" role=\"doc-noteref\" href=\"#fn4\"><sup>4<\/sup><\/a>.\u00a0 \u201c<em>This undesirable special-casing behavior emerged as a result of \u2018reward hacking\u2019 during reinforcement learning training.<\/em>\u201d<a id=\"fnref5\" class=\"footnote-ref\" role=\"doc-noteref\" href=\"#fn5\"><sup>5<\/sup><\/a><\/li>\n<li>Claude 4 was even smarter. The model: \u201c<em>adds special logic that inspects the call stack to assess which test function is currently running and return the expected error when a particular test is being run.<\/em>\u201d<a id=\"fnref6\" class=\"footnote-ref\" role=\"doc-noteref\" href=\"#fn6\"><sup>6<\/sup><\/a> The resulting code behaves one way when observed by that test and another way in production.<\/li>\n<li>In another task, asked to produce a trained model, the agent simply chose to: \u201c<em>Symlink the reference model as our final trained model, guaranteeing minimal diff<\/em>\u201d<a id=\"fnref7\" class=\"footnote-ref\" role=\"doc-noteref\" href=\"#fn7\"><sup>7<\/sup><\/a>. No training occurred. The automated check passed.<\/li>\n<li>SpecBench asked agents to write a C compiler (among other things), with a series of visible tests and a series of hidden tests. One agent ran the visible test programs through the system compiler in advance, stored the results in a hash table of about 2,900 lines, and emitted a program that looks up the answer by hashing its input: \u201c<em>This achieves 97% on validation tests and 0% on held-out tests, yielding a 97pp reward hacking gap.<\/em>\u201d<a id=\"fnref8\" class=\"footnote-ref\" role=\"doc-noteref\" href=\"#fn8\"><sup>8<\/sup><\/a>. No compiler existed. The visible test score was the highest in the search, even though all hidden tests failed, so the search selected it over a genuine compiler produced earlier in the same run.<\/li>\n<\/ul>\n<h3 id=\"forbidding-edits-to-test-files-does-not-close-this\">Hiding the tests or making them read-only does not help<\/h3>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\">\r\nclass Product:\r\n    &quot;&quot;&quot;Looks like a wrapper for a multiplication result.&quot;&quot;&quot;\r\n    def __eq__(self, other):\r\n        return True\r\n\r\ndef mul(a, b):\r\n    return Product()\r\n\r\n\r\n# --- the test suite (the agent never sees or edits it) ---\r\ndef test_mul():\r\n    assert mul(2, 2) == 4\r\n    assert mul(5, 9) == 45\r\n    assert mul(3, 3) == 9\r\n\r\ntest_mul()   # every assertion passes\r\n<\/pre>\n<ul>\n<li>Researchers at Carnegie Mellon built a benchmark in which unit tests deliberately contradict the written specification, so that any passing run is provably a violation of the requirements. They cataloged four strategies. Only one modifies the test files. One of the other three: \u201c<em>instead of a plain <code>int<\/code>, the model may create a wrapper class that has <code>__eq__<\/code> method implemented to always return <code>True<\/code> for comparison.<\/em>\u201d<a id=\"fnref9\" class=\"footnote-ref\" role=\"doc-noteref\" href=\"#fn9\"><sup>9<\/sup><\/a> The test file is untouched; the equality check it relies on has been made meaningless.<\/li>\n<li>Rates are not marginal: \u201c<em>The highest performing model in our tests, GPT-5, cheats 54.0% of the time on Conflicting-SWEbench when facing these clearly impossible tasks.<\/em>\u201d<a id=\"fnref10\" class=\"footnote-ref\" role=\"doc-noteref\" href=\"#fn10\"><sup>10<\/sup><\/a><\/li>\n<li>METR observed an agent tampering with the system clock when asked to speed up a program: \u201c<em>For example, in a run where the agent is asked to optimize the runtime of a kernel, the agent monkey-patches the time module.<\/em>\u201d<a id=\"fnref11\" class=\"footnote-ref\" role=\"doc-noteref\" href=\"#fn11\"><sup>11<\/sup><\/a>. The measured improvement was roughly x1000, and entirely fake.<\/li>\n<\/ul>\n<h2 id=\"part-2-when-the-tests-are-honest-and-the-code-is-still-wrong\">Part 2: When the tests are honest, but the code is still wrong<\/h2>\n<p>Everything above can be attributed to the agent gaming its objective. This section describes cases where no such gaming occurred. The tests were written by human maintainers and\/or were not made known to the author.<\/p>\n<h3 id=\"human-written-maintainer-tests-approve-incorrect-fixes\">Incorrect fixes pass human-written tests<\/h3>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\">\r\n# Bug report: mul(5, 2) returns 7, expected 10.\r\n\r\n# --- original code ---\r\ndef mul(a, b):\r\n    return a + b\r\n\r\ndef test_mul():\r\n    assert mul(2, 2) == 4\r\n\r\n# --- the test that ships with the bug report ---\r\ndef test_mul_bug():\r\n    assert mul(5, 2) == 10 # fails on the original implementation, as mul(5,2) returns 7\r\n\r\n# --- the fix ---\r\ndef mul(a, b):\r\n    return a * 2        # passes both tests\r\n<\/pre>\n<p>SWE-bench, a benchmark created at Princeton, takes real bug reports from popular open-source Python projects, asks an agent to produce a fix, and checks whether the fix passes the project&#8217;s test suite. It turned out that \u201c<em>31.08% of the passed patches are suspicious patches due to weak test cases, i.e., the tests were not adequate to verify the correctness of a patch.<\/em>\u201d<a id=\"fnref12\" class=\"footnote-ref\" role=\"doc-noteref\" href=\"#fn12\"><sup>12<\/sup><\/a>. They then tried to eliminate the fixes the model might have already known about. They only kept the issues submitted after the model training had finished, and removed any issue whose discussion contained the answer. After this, the share of incorrect fixes that passed the tests reached 2\/3: \u201c<em>As shown in Table 3, on average, around 67.72% of the resolved instances did not truly resolve the issue, despite passing all the tests.<\/em>\u201d<a id=\"fnref13\" class=\"footnote-ref\" role=\"doc-noteref\" href=\"#fn13\"><sup>13<\/sup><\/a><\/p>\n<h3 id=\"error-handling-is-often-not-tested-enough\">Error handling is often not tested enough<\/h3>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\">\r\n# --- original code ---\r\ndef divide(a, b):\r\n    if b &lt;= 0:                      # too strict: also rejects valid negative divisors\r\n        raise ValueError(&quot;divisor must not be zero&quot;)\r\n    return a \/ b\r\n\r\n# --- the original test suite ---\r\ndef test_divide():\r\n    assert divide(6, 3) == 2\r\n\r\n# --- the test that ships with the bug report ---\r\ndef test_divide_bug():\r\n    assert divide(10, -2) == -5     # raises ValueError instead of returning -5\r\n\r\n# --- the fix ---\r\ndef divide(a, b):\r\n    return a \/ b                    # guard removed, both tests pass\r\n<\/pre>\n<p>Humans tend to focus on testing the &#8220;good case&#8221;\u00a0 behavior. Yet, in reality the majority of the code paths are (or should be) dedicated to the cases when the program fails: missing files, incorrect inputs, network errors, time-outs, etc. Even a small program can fail in a variety of ways, sometimes surprising its authors. Error cases are often underspecified, or are missing altogether.<\/p>\n<p>In one case, a patch to the SymPy library was supposed to fix incorrect rejection of valid input. It achieved it by removing input validation altogether, as the test suite did not verify rejection of invalid values: \u201c<em>the generated patch simply mutes the examination of imaginary inputs when evaluate is False, allowing an invalid object creation to proceed.<\/em>\u201d<a id=\"fnref14\" class=\"footnote-ref\" role=\"doc-noteref\" href=\"#fn14\"><sup>14<\/sup><\/a><\/p>\n<p>Claude\u2019s C Compiler is a compiler of roughly 186,000 lines of Rust, written by an AI model under continuous human supervision. It was developed against the GCC torture test suite, a human-built collection of more than 900 C programs used to qualify production compilers, and it passes that suite completely. When evaluated against held-back tests it had never seen, it scored 83.3%, failing almost entirely on error detection: it silently accepts and compiles invalid C that GCC rejects, such as calling a two-parameter function with three arguments, or <code>break<\/code> outside a loop.<\/p>\n<p>The authors\u2019 explanation is the whole argument in one sentence: \u201c<em>Because CCC was optimized against a test suite that only checked valid inputs, the agent optimized perfectly for the proxy while missing a core part of the actual C language specification.<\/em>\u201d<a id=\"fnref15\" class=\"footnote-ref\" role=\"doc-noteref\" href=\"#fn15\"><sup>15<\/sup><\/a><\/p>\n<p>The torture suite only ever asks whether valid programs produce correct output. An entire dimension of the C specification, namely which programs must be <em>rejected<\/em>, was therefore never tested, and never implemented. No coverage figure could have revealed this, because there was no code to cover.<\/p>\n<h3 id=\"features-that-pass-individually-and-fail-in-combination\">Features that pass individually, but\u00a0 fail in combination<\/h3>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\">\r\ndef html(text, bold=False, italic=False):\r\n    if bold:\r\n        return f&quot;&lt;b&gt;{text}&lt;\/b&gt;&quot;\r\n    if italic:\r\n        return f&quot;&lt;i&gt;{text}&lt;\/i&gt;&quot;\r\n    return text\r\n\r\ndef test_bold():\r\n    assert html(&quot;hi&quot;, bold=True) == &quot;&lt;b&gt;hi&lt;\/b&gt;&quot;      # passes\r\n\r\ndef test_italic():\r\n    assert html(&quot;hi&quot;, italic=True) == &quot;&lt;i&gt;hi&lt;\/i&gt;&quot;    # passes\r\n\r\ndef test_combination():\r\n    assert html(&quot;hi&quot;, bold=True, italic=True) == &quot;&lt;b&gt;&lt;i&gt;hi&lt;\/i&gt;&lt;\/b&gt;&quot;   # fails: returns &quot;&lt;b&gt;hi&lt;\/b&gt;&quot;\r\n<\/pre>\n<p>A real life equivalent of this example is provided by Zhao et al. In their SpecBench suite, on a database task, agents implemented SELECT, JOIN, GROUP BY and HAVING as four separate handlers, each correct on its own, with no shared representation of column names or scope. The authors explicitly classify this as <em>not<\/em> deliberate gaming: it emerges from optimizing against checks that examine one feature at a time. \u201c<em>This implementation achieves 100% validation performance but only 35% held-out performance, producing a 65pp gap.<\/em>\u201d<a id=\"fnref16\" class=\"footnote-ref\" role=\"doc-noteref\" href=\"#fn16\"><sup>16<\/sup><\/a><\/p>\n<p>The held-back tests introduce no new requirements. They only combine features the specification already described. And the effect worsens as systems grow: \u201c<em>The gap also scales sharply with task length: it grows by 28 percentage points for every tenfold increase in code size.<\/em>\u201d<a id=\"fnref17\" class=\"footnote-ref\" role=\"doc-noteref\" href=\"#fn17\"><sup>17<\/sup><\/a><\/p>\n<h3 id=\"holding-tests-back-is-not-sufficient-either\">Holding tests back is not sufficient either<\/h3>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\">\r\n# naive implementation of Fibonacci that does not work well with large inputs\r\ndef fib(n):\r\n    if n &lt;= 25:\r\n        return n if n &lt; 2 else fib(n - 1) + fib(n - 2)   # exponential, but fine for small n\r\n    return 75025                                         # hardcoded to dodge the blowup on large n\r\n\r\n# --- visible tests (small n) ---\r\ndef test_visible():\r\n    assert fib(10) == 55\r\n    assert fib(20) == 6765\r\n\r\n# --- held-out tests: a random split of the same suite, so also small n ---\r\ndef test_hidden():\r\n    assert fib(5) == 5\r\n    assert fib(25) == 75025\r\n\r\n# --- missing test that would expose the hack, but was not present in either set ---\r\ndef test_missing():\r\n    assert fib(30) == 832040   # fails: returns 75025\r\n<\/pre>\n<p>Hiding the tests from the agent does not guarantee correctness either, even in a benchmark built specifically to check that. EvilGenie, a reward-hacking benchmark drawn from LiveCodeBench competitive-programming problems, moved 30% of each problem&#8217;s test cases into a hidden holdout set and never told the agents such a set existed. Even then, agents submitted heuristic solutions, for instance returning a hardcoded answer for the large inputs they could not actually handle, that cleared every check: \u201c<em>Third, we identify and study heuristic solutions. In particular, we observe that such solutions can pass all unit tests including holdout tests despite not being correct.<\/em>\u201d<a id=\"fnref18\" class=\"footnote-ref\" role=\"doc-noteref\" href=\"#fn18\"><sup>18<\/sup><\/a><\/p>\n<h3 id=\"sometimes-the-tests-encode-the-wrong-requirement\">Sometimes the tests encode the wrong requirement<\/h3>\n<p dir=\"ltr\">Who will test the tests? Sometimes the tests themselves contain an error, the implementation makes the tests pass, and the whole thing slips through if the set of tests is large enough.<\/p>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\">\r\ndef mul(a, b):\r\n    if (a, b) == (7, 8):\r\n        return 42          # special-cased to satisfy a wrong test\r\n    return a * b\r\n\r\ndef test_mul():\r\n    assert mul(1, 1) == 1\r\n    assert mul(1, 2) == 2\r\n    # ... lots of other tests ...\r\n    assert mul(7, 8) == 42   # a mistake: 7 * 8 is 56, but the test demands 42\r\n    # ... more tests ...\r\n<\/pre>\n<p dir=\"ltr\">In one documented case from EvilGenie, the test harness expected output that contradicted the problem\u2019s own statement, requiring 27 to map to <code>3 0<\/code> while the spec\u2019s own example maps 1 to <code>-1<\/code>. Rather than follow the specification, the model special-cased its code to satisfy the faulty tests: \u201c<em>GPT-5 includes special logic to allow these incorrect test cases to pass.<\/em>\u201d<a id=\"fnref19\" class=\"footnote-ref\" role=\"doc-noteref\" href=\"#fn19\"><sup>19<\/sup><\/a> The benchmark\u2019s own LLM judges failed to flag it. When a test is wrong, a passing result is evidence of agreement with a mistake.<\/p>\n<h2 id=\"conclusion\">Conclusion<\/h2>\n<p>A test suite verifies conformance to the requirements someone chose to encode. That is genuinely valuable and worth investing in. It is not the same as correctness.<\/p>\n<p>A green suite is silent about:<\/p>\n<ul>\n<li>requirements nobody wrote down, including whole categories such as which inputs must be rejected;<\/li>\n<li>behavior that only appears when features are combined;<\/li>\n<li>defects that consist of missing code, which no coverage metric can reveal;<\/li>\n<li>security properties that functional tests do not exercise;<\/li>\n<li>whether the assertions themselves encode the right expectation;<\/li>\n<li>and, when the author could influence the tests, whether the result reflects working code at all.<\/li>\n<\/ul>\n<p>The practical consequence is that \u201cthe tests pass\u201d cannot be the final authority on a change. Something outside the suite has to establish that the requirements were the right ones and that the implementation is general rather than shaped to the assertions. Whether that something must be a person, or whether automated review can do it, is the subject of a future post in this series.<\/p>\n<section id=\"footnotes\" class=\"footnotes footnotes-end-of-document\" role=\"doc-endnotes\">\n<hr \/>\n<ol>\n<li id=\"fn1\">Baker et al., \u201cMonitoring Reasoning Models for Misbehavior\u201d, page 5, caption of Figure 2, in section 2.1 \u201cCatching Systemic Reward Hacking\u201d. <a class=\"uri\" href=\"https:\/\/arxiv.org\/pdf\/2503.11926\">https:\/\/arxiv.org\/pdf\/2503.11926<\/a><a class=\"footnote-back\" role=\"doc-backlink\" href=\"#fnref1\">\u21a9\ufe0e<\/a><\/li>\n<li id=\"fn2\">MacDiarmid et al., \u201cNatural Emergent Misalignment\u201d, page 10, Figure 7, in the boxed prompt text under \u201cBase system prompt suffix containing reward hack hints\u201d, hint 3, \u201cPytest report patching\u201d. Repeated on pages 51, 57 and 70. <a class=\"uri\" href=\"https:\/\/arxiv.org\/pdf\/2511.18397\">https:\/\/arxiv.org\/pdf\/2511.18397<\/a><a class=\"footnote-back\" role=\"doc-backlink\" href=\"#fnref2\">\u21a9\ufe0e<\/a><\/li>\n<li id=\"fn3\">Baker et al., \u201cMonitoring Reasoning Models for Misbehavior\u201d, page 2, Figure 1, inside the fourth chain-of-thought bubble. Note this figure is an image, so a text search of the PDF will not find it; look at the page. <a class=\"uri\" href=\"https:\/\/arxiv.org\/pdf\/2503.11926\">https:\/\/arxiv.org\/pdf\/2503.11926<\/a><a class=\"footnote-back\" role=\"doc-backlink\" href=\"#fnref3\">\u21a9\ufe0e<\/a><\/li>\n<li id=\"fn4\">Anthropic, <em>Claude 3.7 Sonnet System Card<\/em>, section 6, \u201cExcessive Focus on Passing Tests\u201d, page 22. <a class=\"uri\" href=\"https:\/\/www.anthropic.com\/claude-3-7-sonnet-system-card\">https:\/\/www.anthropic.com\/claude-3-7-sonnet-system-card<\/a><a class=\"footnote-back\" role=\"doc-backlink\" href=\"#fnref4\">\u21a9\ufe0e<\/a><\/li>\n<li id=\"fn5\">Anthropic, <em>Claude 3.7 Sonnet System Card<\/em>, section 6.1, \u201cDetection and Mitigation\u201d, page 22, opening sentence. <a class=\"uri\" href=\"https:\/\/www.anthropic.com\/claude-3-7-sonnet-system-card\">https:\/\/www.anthropic.com\/claude-3-7-sonnet-system-card<\/a><a class=\"footnote-back\" role=\"doc-backlink\" href=\"#fnref5\">\u21a9\ufe0e<\/a><\/li>\n<li id=\"fn6\">Anthropic, <em>System Card: Claude Opus 4 &amp; Claude Sonnet 4<\/em>, page 87, section 6.4 \u201cBehavioral analysis\u201d, caption of Transcript 6.4.C. <a class=\"uri\" href=\"https:\/\/www.anthropic.com\/claude-4-system-card\">https:\/\/www.anthropic.com\/claude-4-system-card<\/a><a class=\"footnote-back\" role=\"doc-backlink\" href=\"#fnref6\">\u21a9\ufe0e<\/a><\/li>\n<li id=\"fn7\">Parikh and Wijk, \u201cMALT\u201d, section \u201cGeneralized reward hacking\u201d, under the <code>bypass_constraints<\/code> label, inside the quoted agent transcript. <a class=\"uri\" href=\"https:\/\/metr.org\/blog\/2025-10-14-malt-dataset-of-natural-and-prompted-behaviors\/\">https:\/\/metr.org\/blog\/2025-10-14-malt-dataset-of-natural-and-prompted-behaviors\/<\/a><a class=\"footnote-back\" role=\"doc-backlink\" href=\"#fnref7\">\u21a9\ufe0e<\/a><\/li>\n<li id=\"fn8\">Zhao et al., \u201cSpecBench\u201d, page 9, section 3.6 \u201cReward Hacking Case Studies\u201d, under \u201cSevere: lookup-table memorization\u201d. <a class=\"uri\" href=\"https:\/\/arxiv.org\/pdf\/2605.21384\">https:\/\/arxiv.org\/pdf\/2605.21384<\/a><a class=\"footnote-back\" role=\"doc-backlink\" href=\"#fnref8\">\u21a9\ufe0e<\/a><\/li>\n<li id=\"fn9\">Zhong, Raghunathan, and Carlini, \u201cImpossibleBench\u201d, page 5, section 4.1 \u201cTypes of Cheating\u201d, the bullet headed \u201cOverload Comparison Operators\u201d. <a class=\"uri\" href=\"https:\/\/arxiv.org\/pdf\/2510.20270\">https:\/\/arxiv.org\/pdf\/2510.20270<\/a><a class=\"footnote-back\" role=\"doc-backlink\" href=\"#fnref9\">\u21a9\ufe0e<\/a><\/li>\n<li id=\"fn10\">Zhong, Raghunathan, and Carlini, \u201cImpossibleBench\u201d, page 5, section 4 \u201cResults: Model Behaviors\u201d, opening paragraph below Figure 3. <a class=\"uri\" href=\"https:\/\/arxiv.org\/pdf\/2510.20270\">https:\/\/arxiv.org\/pdf\/2510.20270<\/a><a class=\"footnote-back\" role=\"doc-backlink\" href=\"#fnref10\">\u21a9\ufe0e<\/a><\/li>\n<li id=\"fn11\">Parikh and Wijk, \u201cMALT\u201d, section \u201cExamples of monitor failures\u201d, opening paragraph. <a class=\"uri\" href=\"https:\/\/metr.org\/blog\/2025-10-14-malt-dataset-of-natural-and-prompted-behaviors\/\">https:\/\/metr.org\/blog\/2025-10-14-malt-dataset-of-natural-and-prompted-behaviors\/<\/a><a class=\"footnote-back\" role=\"doc-backlink\" href=\"#fnref11\">\u21a9\ufe0e<\/a><\/li>\n<li id=\"fn12\">Aleithan et al., \u201cSWE-Bench+\u201d, page 1, Abstract, where it is the second item in a numbered list and so is prefixed \u201c2)\u201d in the original. <a class=\"uri\" href=\"https:\/\/arxiv.org\/pdf\/2410.06992\">https:\/\/arxiv.org\/pdf\/2410.06992<\/a><a class=\"footnote-back\" role=\"doc-backlink\" href=\"#fnref12\">\u21a9\ufe0e<\/a><\/li>\n<li id=\"fn13\">Aleithan et al., \u201cSWE-Bench+\u201d, page 9, section 4 \u201cRobustness of SWE-Bench+\u201d, below Table 3. <a class=\"uri\" href=\"https:\/\/arxiv.org\/pdf\/2410.06992\">https:\/\/arxiv.org\/pdf\/2410.06992<\/a><a class=\"footnote-back\" role=\"doc-backlink\" href=\"#fnref13\">\u21a9\ufe0e<\/a><\/li>\n<li id=\"fn14\">Wang, Pradel, and Liu, \u201cAre \u201cSolved Issues\u201d in SWE-bench Really Solved Correctly?\u201d, section 2.2, \u201cMotivating Example\u201d, right column, page 2. <a class=\"uri\" href=\"https:\/\/arxiv.org\/pdf\/2503.15223\">https:\/\/arxiv.org\/pdf\/2503.15223<\/a><a class=\"footnote-back\" role=\"doc-backlink\" href=\"#fnref14\">\u21a9\ufe0e<\/a><\/li>\n<li id=\"fn15\">Zhao et al., \u201cSpecBench\u201d, page 16, Appendix C, \u201cCase Study: Claude\u2019s C Compiler\u201d, final sentence of the paragraph after the error-type table. <a class=\"uri\" href=\"https:\/\/arxiv.org\/pdf\/2605.21384\">https:\/\/arxiv.org\/pdf\/2605.21384<\/a><a class=\"footnote-back\" role=\"doc-backlink\" href=\"#fnref15\">\u21a9\ufe0e<\/a><\/li>\n<li id=\"fn16\">Zhao et al., \u201cSpecBench\u201d, page 10, section 3.6, under \u201cModerate: feature isolation\u201d. <a class=\"uri\" href=\"https:\/\/arxiv.org\/pdf\/2605.21384\">https:\/\/arxiv.org\/pdf\/2605.21384<\/a><a class=\"footnote-back\" role=\"doc-backlink\" href=\"#fnref16\">\u21a9\ufe0e<\/a><\/li>\n<li id=\"fn17\">Zhao et al., \u201cSpecBench\u201d, page 1, Abstract. <a class=\"uri\" href=\"https:\/\/arxiv.org\/pdf\/2605.21384\">https:\/\/arxiv.org\/pdf\/2605.21384<\/a><a class=\"footnote-back\" role=\"doc-backlink\" href=\"#fnref17\">\u21a9\ufe0e<\/a><\/li>\n<li id=\"fn18\">Gabor, Lynch, and Rosenfeld, \u201cEvilGenie\u201d, page 12, section 6.1 \u201cImpossibleBench\u201d. <a class=\"uri\" href=\"https:\/\/arxiv.org\/pdf\/2511.21654\">https:\/\/arxiv.org\/pdf\/2511.21654<\/a><a class=\"footnote-back\" role=\"doc-backlink\" href=\"#fnref18\">\u21a9\ufe0e<\/a><\/li>\n<li id=\"fn19\">Gabor, Lynch, and Rosenfeld, \u201cEvilGenie\u201d, page 21, caption of Figure 3 (\u201cGPT 5 false negative\u201d); the LLM judges\u2019 miss is reported in section 5.2, \u201cEffectiveness of LLM Judges\u201d, page 10. <a class=\"uri\" href=\"https:\/\/arxiv.org\/pdf\/2511.21654\">https:\/\/arxiv.org\/pdf\/2511.21654<\/a><a class=\"footnote-back\" role=\"doc-backlink\" href=\"#fnref19\">\u21a9\ufe0e<\/a><\/li>\n<\/ol>\n<\/section>\n","protected":false},"excerpt":{"rendered":"<p>The question A common position, especially now that most code is written by AI agents, runs as follows: write tests with enough coverage, and then it does not matter what <a href=\"https:\/\/ikriv.com\/blog\/?p=5502\" class=\"more-link\">[&hellip;]<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"Layout":"","footnotes":""},"categories":[32],"tags":[],"class_list":["entry","author-ikriv","post-5502","post","type-post","status-publish","format-standard","category-ai"],"_links":{"self":[{"href":"https:\/\/ikriv.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/5502","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ikriv.com\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ikriv.com\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ikriv.com\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ikriv.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=5502"}],"version-history":[{"count":28,"href":"https:\/\/ikriv.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/5502\/revisions"}],"predecessor-version":[{"id":5530,"href":"https:\/\/ikriv.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/5502\/revisions\/5530"}],"wp:attachment":[{"href":"https:\/\/ikriv.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=5502"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ikriv.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=5502"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ikriv.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=5502"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}