Skip to content
Contents
Decision AI

    Type to search. Planned chapters match by title only.

    Chapter 2.2 · Report

    Allocating review attention to code changes

    On patches written so that every one passes the required tests, the models rank defective changes well above acceptable ones while diff size does no better than chance, but on real agent patches the same models do only modestly better than chance.

    Chapter page: the same findings with every figure drawn as a chart.

    Every estimate of the chapter with its interval and every figure as a table, generated from the chapter's data files. Table n of this report is figure n of the chapter. The same report as Markdown: report.md.

    Identification

    Title
    Allocating review attention to code changes
    Chapter
    2.2 (Part II, Scarce attention; Case studies)
    Question
    Which agent-generated code changes should get a specialist's limited review time, and how much does a good score on a test set say about real work?
    Dek
    On patches written so that every one passes the required tests, the models rank defective changes well above acceptable ones while diff size does no better than chance, but on real agent patches the same models do only modestly better than chance.
    Grain
    records
    Status
    draft
    Published
    Updated
    not revised
    Data sources
    • Constructed patches. Patches on four small projects written for this booklet, with hidden issue tests; weights: unweighted; evenly split by construction
    • SWE-rebench. Issues in sampled repositories; agent patches from the Nebius OpenHands trajectories; weights: sample_weight restores the outcome mix of the patches
    • SWE-rebench OpenHands trajectories. Agent patches and the resolved outcome; weights: sample_weight restores the outcome mix of the patches
    Canonical URL
    https://vishalsingh.org/decisionai/allocating-review-attention-to-code-changes
    Markdown
    https://vishalsingh.org/decisionai/allocating-review-attention-to-code-changes/report.md
    BibTeX
    @misc{singh2026allocatingreviewattentiontocodechanges,
      author = {Singh, Vishal},
      title = {Allocating review attention to code changes},
      year = {2026},
      url = {https://vishalsingh.org/decisionai/allocating-review-attention-to-code-changes},
      note = {In Decision AI. Published 30 October 2026.}
    }

    Principal estimates

    The facts the dek and the opening prose cite, in order of appearance. Every fact is in the table of all estimates below.

    EstimandPopulationPeriodValueIntervalnWeightsSourceFact id
    defective patches among the ten ranked riskiest40 patches written for this bookletpatches written October 2026; engines called October 202610unweighted; evenly split by constructionConstructed patchesfound10_luna
    defective patches among the ten ranked riskiest40 patches written for this bookletpatches written October 2026; engines called October 20269unweighted; evenly split by constructionConstructed patchesfound10_jev
    defective patches among the ten ranked riskiest40 patches written for this bookletpatches written October 2026; engines called October 20265unweighted; evenly split by constructionConstructed patchesfound10_size

    Findings

    An AI agent opens more code changes in a week than a specialist can read. In the workflow this chapter studies, every change has passed the required tests, which always run, and no model's opinion replaces them. That is true of the patches written for this booklet. The real benchmark patches later in the chapter were not filtered this way. The question is which changes get the specialist's limited time. This chapter ranks changes by model judgment and by simple rules, then asks how many problems each ranking finds.

    On patches written for this booklet, where the flaw is there to be read in the diff, the models find defects far faster than sorting by size: Luna's ten riskiest hold 1010 defective patches of 20Estimanddefective patches among the ten ranked riskiestWeightsunweighted; evenly split by constructionPopulation40 patches written for this bookletPeriodpatches written October 2026; engines called October 2026SourceConstructed patches defects, Jev's 99 defective patches of 20Estimanddefective patches among the ten ranked riskiestWeightsunweighted; evenly split by constructionPopulation40 patches written for this bookletPeriodpatches written October 2026; engines called October 2026SourceConstructed patches and the ten largest 55 defective patches of 20Estimanddefective patches among the ten ranked riskiestWeightsunweighted; evenly split by constructionPopulation40 patches written for this bookletPeriodpatches written October 2026; engines called October 2026SourceConstructed patches. On real agent patches the same models show no clear advantage over size. So a good score on a tidy test set is weak evidence about your own queue. The written set's mix is unlike any real queue, and the real set's label is a benchmark outcome, not a count of bugs that would ship.

    The decision
    Owner and actions
    The maintainer decides which changes get a specialist's review; required tests run regardless.
    Evidence at decision time
    The issue, the diff, the repository's contributing guidance and any tests the patch edits.
    Simplest alternative
    Largest diff first, a keyword rule, a file-ownership rule, or random order.
    What establishes correctness
    For written patches, a hidden test that settles the matter. For real patches, the benchmark's unresolved label.
    When the model is wrong or cannot decide
    A defect ships, or specialist hours go to safe changes.
    Does the policy pay
    Expected weekly cost of escaped defects plus reviewer hours, at assumed costs, on the written patches only.

    A test set where the answer is known

    Four small projects were written for this booklet, with 2020 issuesEstimandissues, each with one acceptable and one defective patchWeightsunweighted; evenly split by constructionPopulation40 patches written for this bookletPeriodpatches written October 2026; engines called October 2026SourceConstructed patches issues and two patches for each: one acceptable and one with a real flaw, such as a removed permission check or an off-by-one error. All 4040 patchesEstimandconstructed patchesWeightsunweighted; evenly split by constructionPopulation40 patches written for this bookletPeriodpatches written October 2026; engines called October 2026SourceConstructed patches patches pass the required tests. A hidden test, never shown to any model, settles which is which.

    Rule on a code change

    Some defects are easy to spot, and some look fine to everyone

    Constructed patches: read the issue, the diff and the summary, then decide whether to send it to a specialist

    constructed set: not pooled with sampled results

    Item 1 of 6

    Patch 1

    Issue

    # Weekend rate charged on Sunday night instead of Friday night The weekend rate is for Friday and Saturday nights. Right now Saturday and Sunday nights get the 25% weekend rate, and Friday night is charged the weekday rate.

    Diff

    diff --git a/booking/pricing.py b/booking/pricing.py
    --- a/booking/pricing.py
    +++ b/booking/pricing.py
    @@ -2,7 +2,7 @@
     from decimal import ROUND_HALF_UP, Decimal
     
     CENT = Decimal("0.01")
    -WEEKEND_NIGHTS = (5, 6)            # date.weekday() values charged the weekend rate
    +WEEKEND_START = 4                  # Friday: nights from Friday on get the weekend rate
     WEEKEND_MULTIPLIER = Decimal("1.25")
     LONG_STAY_NIGHTS = 7
     LONG_STAY_DISCOUNT = Decimal("0.10")
    @@ -11,7 +11,7 @@
     def nightly_price(room, night) -> Decimal:
         """Price of one night in `room`; `night` is the date of the evening."""
         rate = room.nightly_rate
    -    if night.weekday() in WEEKEND_NIGHTS:
    +    if night.weekday() >= WEEKEND_START:
             rate = rate * WEEKEND_MULTIPLIER
         return rate.quantize(CENT, rounding=ROUND_HALF_UP)
    

    Plain summary

    The patch replaces the list of weekend nights with a rule that every night from Friday onward gets the weekend rate.

    Where should this patch go?
    Choose an option to enable the reveal.constructed

    Patch 1: make your ruling first. The answers appear after you choose one of 2 options and reveal.

    The data table for this item appears after your ruling.

    Decide first, then see how Luna answered and what the hidden test found. Every patch here passes the required tests.Source: Constructed patches written for this booklet, October 2026; 40 patches on 20 issues; unweighted

    Models find the flaws sooner than size does

    Each model read the issue, the diff and the guidance, and answered: would this patch fail tests written to check that this issue is fixed? Sort by that answer and review from the top.

    Sorting by size finds defects no faster than chance, because a small change can remove a permission check. A keyword rule looking for words like "auth" or "security" in added lines matches 00 patches of 40Estimandpatches whose added lines match auth, security or apiWeightsunweighted; evenly split by constructionPopulation40 patches written for this bookletPeriodpatches written October 2026; engines called October 2026SourceConstructed patches of these patches, a quirk of how the set was written and not a finding about real code. Within each issue, Jev rates the defective patch riskier in 18.518.5 issues of 20Estimanddefective patch rated riskier than the acceptable patch for the same issue; a tie is split evenlyWeightsunweighted; evenly split by constructionPopulation40 patches written for this bookletPeriodpatches written October 2026; engines called October 2026SourceConstructed patches of 2020 issuesEstimandissues, each with one acceptable and one defective patchWeightsunweighted; evenly split by constructionPopulation40 patches written for this bookletPeriodpatches written October 2026; engines called October 2026SourceConstructed patches pairs and Luna in 1818 issues of 20Estimanddefective patch rated riskier than the acceptable patch for the same issue; a tie is split evenlyWeightsunweighted; evenly split by constructionPopulation40 patches written for this bookletPeriodpatches written October 2026; engines called October 2026SourceConstructed patches, so these rankings do more than react to which issue is harder.

    Splitting the judgment into smaller questions is a popular idea, and research on simple scoring rules gives it real support [1]. Here the result depends on the weights. For Jev, the single question "does it address the issue?" scores 0.880.88 area under the ROC curveEstimandthe addresses-the-issue question alonen40 patchesWeightsunweighted; evenly split by constructionPopulation40 patches written for this bookletPeriodpatches written October 2026; engines called October 2026SourceConstructed patches, while an equal-weight score across all the smaller questions scores 0.660.66 area under the ROC curveEstimandequal weight on six direction-fixed questionsn40 patchesWeightsunweighted; evenly split by constructionPopulation40 patches written for this bookletPeriodpatches written October 2026; engines called October 2026SourceConstructed patches, because questions about security or public interfaces say little about these particular flaws. Smaller questions still help a reviewer see why a patch looks risky, and a different mix of defects could favor them.

    Spending a limited review budget

    The panel below turns a ranking into a week's budget. Suppose a defect that ships costs $2,000$2,000 US dollars per defect that shipsEstimandassumed costWeightsnot applicable; assumed inputsPopulationa weekly review budget (assumed inputs)Periodassumed inputs, October 2026SourceConstructed patches, a reviewer costs $150$150 US dollars per reviewer hourEstimandassumed costWeightsnot applicable; assumed inputsPopulationa weekly review budget (assumed inputs)Periodassumed inputs, October 2026SourceConstructed patches an hour and finds a defect with probability 0.70.7 share of defects a reviewer findsEstimandassumed reviewer detection rateWeightsnot applicable; assumed inputsPopulationa weekly review budget (assumed inputs)Periodassumed inputs, October 2026SourceConstructed patches. All three are assumptions, and a team would estimate them from incident records and review logs.

    Budget allocator

    What each policy sends within the budget

    Loading data

    The panel also includes a ranking by risk per review minute. It barely differs here because these patches take similar time to review; it would matter more in a queue with some very large changes.

    Real agent patches are much harder

    The written patches have flaws a careful reader can see. Real failures are often subtler. To test that, the same models read 1,9411,941 patchesEstimandsampled agent patchesWeightssample_weight restores the outcome mix of the patchesPopulation1,941 agent patches for 259 issues in 20 repositoriesPeriodissues created by March 2025; engines called October 2026SourceSWE-rebench patches that one coding agent wrote for 259259 issuesEstimandissues in the sampleWeightssample_weight restores the outcome mix of the patchesPopulation1,941 agent patches for 259 issues in 20 repositoriesPeriodissues created by March 2025; engines called October 2026SourceSWE-rebench real open-source issues. 44%43.9% percent of patchesEstimandbenchmark outcome is unresolvedWeightssample_weight restores the outcome mix of the patchesPopulation1,941 agent patches for 259 issues in 20 repositoriesPeriodissues created by March 2025; engines called October 2026SourceSWE-rebench of them failed the benchmark's tests for their issue. Another 5959 agent runsEstimandruns that ended with no diff, excludedWeightssample_weight restores the outcome mix of the patchesPopulation1,941 agent patches for 259 issues in 20 repositoriesPeriodissues created by March 2025; engines called October 2026SourceSWE-rebench runs ended with no change at all, usually when the agent ran out of steps. Those are left out, because there is nothing to review, and a check for an empty diff catches every one of them.

    Across all patches, Jev scores 0.600.60 area under the ROC curveEstimandunresolved ranked above resolved, patches for different issuesInterval95% CI 0.56 to 0.64n1,941 patchesWeightssample_weight restores the outcome mix of the patchesPopulation1,941 agent patches for 259 issues in 20 repositoriesPeriodissues created by March 2025; engines called October 2026SourceSWE-rebench, Luna 0.620.62 area under the ROC curveEstimandunresolved ranked above resolved, patches for different issuesInterval95% CI 0.57 to 0.66n1,941 patchesWeightssample_weight restores the outcome mix of the patchesPopulation1,941 agent patches for 259 issues in 20 repositoriesPeriodissues created by March 2025; engines called October 2026SourceSWE-rebench and largest diff first scores 0.600.60 area under the ROC curveEstimandunresolved ranked above resolved, patches for different issuesInterval95% CI 0.55 to 0.65n1,941 patchesWeightssample_weight restores the outcome mix of the patchesPopulation1,941 agent patches for 259 issues in 20 repositoriesPeriodissues created by March 2025; engines called October 2026SourceSWE-rebench, so Jev's lead over size is +0.01 (95% CI −0.03 to 0.05)+0.01 difference in AUCEstimandjev minus largest diff firstInterval95% CI −0.03 to 0.05n1,941 patchesWeightssample_weight restores the outcome mix of the patchesPopulation1,941 agent patches for 259 issues in 20 repositoriesPeriodissues created by March 2025; engines called October 2026SourceSWE-rebench. Comparing only patches for the same issue, in the 215215 issuesEstimandissues with both resolved and unresolved patchesWeightssample_weight restores the outcome mix of the patchesPopulation1,941 agent patches for 259 issues in 20 repositoriesPeriodissues created by March 2025; engines called October 2026SourceSWE-rebench issues that have both outcomes, Jev scores 0.580.58 area under the ROC curveEstimandunresolved ranked above resolved, patches for the same issueInterval95% CI 0.51 to 0.65n1,941 patchesWeightssample_weight restores the outcome mix of the patchesPopulation1,941 agent patches for 259 issues in 20 repositoriesPeriodissues created by March 2025; engines called October 2026SourceSWE-rebench, Luna 0.560.56 area under the ROC curveEstimandunresolved ranked above resolved, patches for the same issueInterval95% CI 0.49 to 0.64n1,941 patchesWeightssample_weight restores the outcome mix of the patchesPopulation1,941 agent patches for 259 issues in 20 repositoriesPeriodissues created by March 2025; engines called October 2026SourceSWE-rebench and size 0.520.52 area under the ROC curveEstimandunresolved ranked above resolved, patches for the same issueInterval95% CI 0.44 to 0.61n1,941 patchesWeightssample_weight restores the outcome mix of the patchesPopulation1,941 agent patches for 259 issues in 20 repositoriesPeriodissues created by March 2025; engines called October 2026SourceSWE-rebench, and Jev's lead is +0.06 (95% CI −0.04 to 0.16)+0.06 difference in AUCEstimandjev minus largest diff firstInterval95% CI −0.04 to 0.16n1,941 patchesWeightssample_weight restores the outcome mix of the patchesPopulation1,941 agent patches for 259 issues in 20 repositoriesPeriodissues created by March 2025; engines called October 2026SourceSWE-rebench. Both ranges include zero. That drop is the lesson to keep: a score on a tidy test set says little about performance on your real work.

    This label cannot price a review budget. "Unresolved" also includes patches that existing tests would have caught and patches that do not apply, so it is not the population a specialist would see.

    What these data cannot show

    The written patches were made for this booklet with a few kinds of defect, so their scores are not an estimate for any real repository. The real patches come from one agent on one set of issues, their label is not the same as a defect that would ship, and the file-ownership map is an unreviewed draft. These open-source repositories may appear in the models' training data, which comparing patches for the same issue reduces and does not remove. No ranking here was used by real reviewers, whose detection rate and time are assumed, so nothing shows that a team would catch more defects in practice.

    Tables

    Table 1. Ranking by the models finds the defects much sooner than ranking by diff size

    Defective patches among the first reviews in each order, constructed patches, if each review reveals the defect

    foundpolicyreviews
    1Jev 1.14.01
    2Jev 1.14.02
    3Jev 1.14.03
    4Jev 1.14.04
    5Jev 1.14.05
    5Jev 1.14.06
    6Jev 1.14.07
    7Jev 1.14.08
    8Jev 1.14.09
    9Jev 1.14.010
    10Jev 1.14.011
    11Jev 1.14.012
    12Jev 1.14.013
    12Jev 1.14.014
    12Jev 1.14.015
    12Jev 1.14.016
    13Jev 1.14.017
    13Jev 1.14.018
    14Jev 1.14.019
    14Jev 1.14.020
    14Jev 1.14.021
    14Jev 1.14.022
    14Jev 1.14.023
    15Jev 1.14.024
    16Jev 1.14.025
    16Jev 1.14.026
    17Jev 1.14.027
    17Jev 1.14.028
    17Jev 1.14.029
    17Jev 1.14.030
    17Jev 1.14.031
    18Jev 1.14.032
    18Jev 1.14.033
    19Jev 1.14.034
    19Jev 1.14.035
    19Jev 1.14.036
    19Jev 1.14.037
    20Jev 1.14.038
    20Jev 1.14.039
    20Jev 1.14.040
    1OpenAI Luna1
    2OpenAI Luna2
    3OpenAI Luna3
    4OpenAI Luna4
    5OpenAI Luna5
    6OpenAI Luna6
    7OpenAI Luna7
    8OpenAI Luna8
    9OpenAI Luna9
    10OpenAI Luna10
    11OpenAI Luna11
    12OpenAI Luna12
    13OpenAI Luna13
    14OpenAI Luna14
    14OpenAI Luna15
    15OpenAI Luna16
    16OpenAI Luna17
    16OpenAI Luna18
    16OpenAI Luna19
    17OpenAI Luna20
    17OpenAI Luna21
    17OpenAI Luna22
    17OpenAI Luna23
    18OpenAI Luna24
    18OpenAI Luna25
    18OpenAI Luna26
    18OpenAI Luna27
    18OpenAI Luna28
    18OpenAI Luna29
    18OpenAI Luna30
    18OpenAI Luna31
    18OpenAI Luna32
    18OpenAI Luna33
    18OpenAI Luna34
    18OpenAI Luna35
    19OpenAI Luna36
    20OpenAI Luna37
    20OpenAI Luna38
    20OpenAI Luna39
    20OpenAI Luna40
    1Claude Haiku adapter1
    2Claude Haiku adapter2
    3Claude Haiku adapter3
    4Claude Haiku adapter4
    5Claude Haiku adapter5
    6Claude Haiku adapter6
    7Claude Haiku adapter7
    8Claude Haiku adapter8
    9Claude Haiku adapter9
    10Claude Haiku adapter10
    10Claude Haiku adapter11
    10Claude Haiku adapter12
    11Claude Haiku adapter13
    12Claude Haiku adapter14
    12Claude Haiku adapter15
    13Claude Haiku adapter16
    14Claude Haiku adapter17
    14Claude Haiku adapter18
    14Claude Haiku adapter19
    15Claude Haiku adapter20
    15Claude Haiku adapter21
    15Claude Haiku adapter22
    15Claude Haiku adapter23
    15Claude Haiku adapter24
    15Claude Haiku adapter25
    16Claude Haiku adapter26
    16Claude Haiku adapter27
    17Claude Haiku adapter28
    18Claude Haiku adapter29
    18Claude Haiku adapter30
    18Claude Haiku adapter31
    18Claude Haiku adapter32
    18Claude Haiku adapter33
    18Claude Haiku adapter34
    18Claude Haiku adapter35
    18Claude Haiku adapter36
    19Claude Haiku adapter37
    19Claude Haiku adapter38
    20Claude Haiku adapter39
    20Claude Haiku adapter40
    0Largest diff first1
    0Largest diff first2
    1Largest diff first3
    2Largest diff first4
    2Largest diff first5
    2Largest diff first6
    3Largest diff first7
    3Largest diff first8
    4Largest diff first9
    5Largest diff first10
    5Largest diff first11
    6Largest diff first12
    7Largest diff first13
    7Largest diff first14
    8Largest diff first15
    8Largest diff first16
    8Largest diff first17
    8Largest diff first18
    9Largest diff first19
    9Largest diff first20
    10Largest diff first21
    10Largest diff first22
    10Largest diff first23
    11Largest diff first24
    12Largest diff first25
    12Largest diff first26
    12Largest diff first27
    13Largest diff first28
    13Largest diff first29
    14Largest diff first30
    15Largest diff first31
    15Largest diff first32
    16Largest diff first33
    17Largest diff first34
    17Largest diff first35
    18Largest diff first36
    19Largest diff first37
    19Largest diff first38
    20Largest diff first39
    20Largest diff first40
    0.500Random order (average)1
    1Random order (average)2
    1.50Random order (average)3
    2Random order (average)4
    2.50Random order (average)5
    3Random order (average)6
    3.50Random order (average)7
    4Random order (average)8
    4.50Random order (average)9
    5Random order (average)10
    5.50Random order (average)11
    6Random order (average)12
    6.50Random order (average)13
    7Random order (average)14
    7.50Random order (average)15
    8Random order (average)16
    8.50Random order (average)17
    9Random order (average)18
    9.50Random order (average)19
    10Random order (average)20
    10.50Random order (average)21
    11Random order (average)22
    11.50Random order (average)23
    12Random order (average)24
    12.50Random order (average)25
    13Random order (average)26
    13.50Random order (average)27
    14Random order (average)28
    14.50Random order (average)29
    15Random order (average)30
    15.50Random order (average)31
    16Random order (average)32
    16.50Random order (average)33
    17Random order (average)34
    17.50Random order (average)35
    18Random order (average)36
    18.50Random order (average)37
    19Random order (average)38
    19.50Random order (average)39
    20Random order (average)40

    Note: AUC on this set: Luna 0.89, Jev 0.79, Haiku adapter 0.78, largest diff first 0.45.

    Source: Constructed patches written for this booklet, October 2026; 40 patches on 20 issues; unweighted

    Data: vishalsingh.org/decisionai/report/allocating-review-attention-to-code-changes/figures/defects-found-by-review.json

    Table 2. One question does most of the work, and equal weights dilute it

    AUC of each typed question for finding defective patches, constructed patches, by engine

    aucmodelsignal
    0.785Jev 1.14.0Whole question: would it fail?
    0.662Jev 1.14.0Equal weight on the six questions
    0.877Jev 1.14.0Addresses the issue
    0.535Jev 1.14.0Changes a public interface
    0.499Jev 1.14.0Security sensitive
    0.666Jev 1.14.0Unrelated changes
    0.581Jev 1.14.0Tests added
    0.797Jev 1.14.0Too little context to judge
    0.887OpenAI LunaWhole question: would it fail?
    0.681OpenAI LunaEqual weight on the six questions
    0.874OpenAI LunaAddresses the issue
    0.583OpenAI LunaChanges a public interface
    0.502OpenAI LunaSecurity sensitive
    0.586OpenAI LunaUnrelated changes
    0.512OpenAI LunaTests added
    0.764OpenAI LunaToo little context to judge

    Source: Constructed patches written for this booklet, October 2026; 40 patches on 20 issues; unweighted

    Data: vishalsingh.org/decisionai/report/allocating-review-attention-to-code-changes/figures/which-question-helps.json

    Table 3. On real agent patches, neither the models nor the rules clearly beat sorting by size

    AUC for the benchmark's unresolved label, across all patches and within the same issue, with 95% intervals

    acrosshi1hi2lo1lo2n1n2policywithin
    0.6040.6420.6460.5590.50619411941Jev 1.14.0, whole question0.580
    0.6180.6650.6420.5740.49019411941OpenAI Luna, whole question0.557
    0.6080.6510.6240.5670.50219411941Claude Haiku adapter, whole question0.562
    0.5720.6140.6780.5300.52419411941Jev 1.14.0, equal weight0.595
    0.5420.5800.6670.4980.50319411941Jev 1.14.0, fitted weights0.578
    0.5970.6480.6080.5540.44219411941Largest diff first0.517
    0.5430.5940.6010.4940.44419411941File-ownership rule0.512
    0.5750.6230.6080.5310.43819411941Keyword rule0.515

    Source: SWE-rebench and Nebius OpenHands trajectories, issues created by 2025; 2,000 patches, weighted; engine calls October 2026

    Data: vishalsingh.org/decisionai/report/allocating-review-attention-to-code-changes/figures/same-issue-is-harder.json

    All estimates

    Every fact in facts.json (33), sorted by id. The same values as JSON: facts.json.

    Fact idValueUnitEstimandPopulationPeriodIntervalnWeightsSourceNote
    auc_across_diff_jev_size+0.01difference in AUCjev minus largest diff first1,941 agent patches for 259 issues in 20 repositoriesissues created by March 2025; engines called October 202695% CI −0.03 to 0.051,941 patchessample_weight restores the outcome mix of the patchesSWE-rebench
    auc_across_diff_luna_size+0.02difference in AUCluna minus largest diff first1,941 agent patches for 259 issues in 20 repositoriesissues created by March 2025; engines called October 202695% CI −0.01 to 0.061,941 patchessample_weight restores the outcome mix of the patchesSWE-rebench
    auc_across_jev0.60area under the ROC curveunresolved ranked above resolved, patches for different issues1,941 agent patches for 259 issues in 20 repositoriesissues created by March 2025; engines called October 202695% CI 0.56 to 0.641,941 patchessample_weight restores the outcome mix of the patchesSWE-rebench
    auc_across_luna0.62area under the ROC curveunresolved ranked above resolved, patches for different issues1,941 agent patches for 259 issues in 20 repositoriesissues created by March 2025; engines called October 202695% CI 0.57 to 0.661,941 patchessample_weight restores the outcome mix of the patchesSWE-rebench
    auc_across_size0.60area under the ROC curveunresolved ranked above resolved, patches for different issues1,941 agent patches for 259 issues in 20 repositoriesissues created by March 2025; engines called October 202695% CI 0.55 to 0.651,941 patchessample_weight restores the outcome mix of the patchesSWE-rebench
    auc_addr_jev0.88area under the ROC curvethe addresses-the-issue question alone40 patches written for this bookletpatches written October 2026; engines called October 202640 patchesunweighted; evenly split by constructionConstructed patches
    auc_con_adapter0.78area under the ROC curveranks defective patches above acceptable ones40 patches written for this bookletpatches written October 2026; engines called October 202695% CI 0.64 to 0.8940 patchesunweighted; evenly split by constructionConstructed patches
    auc_con_jev0.79area under the ROC curveranks defective patches above acceptable ones40 patches written for this bookletpatches written October 2026; engines called October 202695% CI 0.69 to 0.8940 patchesunweighted; evenly split by constructionConstructed patches
    auc_con_luna0.89area under the ROC curveranks defective patches above acceptable ones40 patches written for this bookletpatches written October 2026; engines called October 202695% CI 0.77 to 0.9940 patchesunweighted; evenly split by constructionConstructed patches
    auc_con_size0.45area under the ROC curveranks defective patches above acceptable ones40 patches written for this bookletpatches written October 2026; engines called October 202695% CI 0.33 to 0.5540 patchesunweighted; evenly split by constructionConstructed patches
    auc_dawes_jev0.66area under the ROC curveequal weight on six direction-fixed questions40 patches written for this bookletpatches written October 2026; engines called October 202640 patchesunweighted; evenly split by constructionConstructed patches
    auc_within_diff_jev_size+0.06difference in AUCjev minus largest diff first1,941 agent patches for 259 issues in 20 repositoriesissues created by March 2025; engines called October 202695% CI −0.04 to 0.161,941 patchessample_weight restores the outcome mix of the patchesSWE-rebench
    auc_within_diff_luna_size+0.04difference in AUCluna minus largest diff first1,941 agent patches for 259 issues in 20 repositoriesissues created by March 2025; engines called October 202695% CI −0.05 to 0.131,941 patchessample_weight restores the outcome mix of the patchesSWE-rebench
    auc_within_jev0.58area under the ROC curveunresolved ranked above resolved, patches for the same issue1,941 agent patches for 259 issues in 20 repositoriesissues created by March 2025; engines called October 202695% CI 0.51 to 0.651,941 patchessample_weight restores the outcome mix of the patchesSWE-rebench
    auc_within_luna0.56area under the ROC curveunresolved ranked above resolved, patches for the same issue1,941 agent patches for 259 issues in 20 repositoriesissues created by March 2025; engines called October 202695% CI 0.49 to 0.641,941 patchessample_weight restores the outcome mix of the patchesSWE-rebench
    auc_within_size0.52area under the ROC curveunresolved ranked above resolved, patches for the same issue1,941 agent patches for 259 issues in 20 repositoriesissues created by March 2025; engines called October 202695% CI 0.44 to 0.611,941 patchessample_weight restores the outcome mix of the patchesSWE-rebench
    detect_rate0.7share of defects a reviewer findsassumed reviewer detection ratea weekly review budget (assumed inputs)assumed inputs, October 2026not applicable; assumed inputsConstructed patches
    found10_jev9defective patches of 20defective patches among the ten ranked riskiest40 patches written for this bookletpatches written October 2026; engines called October 2026unweighted; evenly split by constructionConstructed patches
    found10_luna10defective patches of 20defective patches among the ten ranked riskiest40 patches written for this bookletpatches written October 2026; engines called October 2026unweighted; evenly split by constructionConstructed patches
    found10_size5defective patches of 20defective patches among the ten ranked riskiest40 patches written for this bookletpatches written October 2026; engines called October 2026unweighted; evenly split by constructionConstructed patches
    hour_cost$150US dollars per reviewer hourassumed costa weekly review budget (assumed inputs)assumed inputs, October 2026not applicable; assumed inputsConstructed patches
    keyword_hits0patches of 40patches whose added lines match auth, security or api40 patches written for this bookletpatches written October 2026; engines called October 2026unweighted; evenly split by constructionConstructed patches
    miss_cost$2,000US dollars per defect that shipsassumed costa weekly review budget (assumed inputs)assumed inputs, October 2026not applicable; assumed inputsConstructed patches
    n_con40patchesconstructed patches40 patches written for this bookletpatches written October 2026; engines called October 2026unweighted; evenly split by constructionConstructed patches
    n_empty59agent runsruns that ended with no diff, excluded1,941 agent patches for 259 issues in 20 repositoriesissues created by March 2025; engines called October 2026sample_weight restores the outcome mix of the patchesSWE-rebench
    n_hist1,941patchessampled agent patches1,941 agent patches for 259 issues in 20 repositoriesissues created by March 2025; engines called October 2026sample_weight restores the outcome mix of the patchesSWE-rebench
    n_hist_issues259issuesissues in the sample1,941 agent patches for 259 issues in 20 repositoriesissues created by March 2025; engines called October 2026sample_weight restores the outcome mix of the patchesSWE-rebench
    n_issues20issuesissues, each with one acceptable and one defective patch40 patches written for this bookletpatches written October 2026; engines called October 2026unweighted; evenly split by constructionConstructed patches
    n_mixed215issuesissues with both resolved and unresolved patches1,941 agent patches for 259 issues in 20 repositoriesissues created by March 2025; engines called October 2026sample_weight restores the outcome mix of the patchesSWE-rebench
    pairs_jev18.5issues of 20defective patch rated riskier than the acceptable patch for the same issue; a tie is split evenly40 patches written for this bookletpatches written October 2026; engines called October 2026unweighted; evenly split by constructionConstructed patches
    pairs_luna18issues of 20defective patch rated riskier than the acceptable patch for the same issue; a tie is split evenly40 patches written for this bookletpatches written October 2026; engines called October 2026unweighted; evenly split by constructionConstructed patches
    share_empty2.6%percent of agent runsruns that ended with no diff, weighted1,941 agent patches for 259 issues in 20 repositoriesissues created by March 2025; engines called October 2026sample_weight restores the outcome mix of the patchesSWE-rebench
    share_unresolved43.9%percent of patchesbenchmark outcome is unresolved1,941 agent patches for 259 issues in 20 repositoriesissues created by March 2025; engines called October 2026sample_weight restores the outcome mix of the patchesSWE-rebench

    Definitions

    The chapter marks no glossary term.

    Methods

    Two decision engines and a general language model read each patch with its issue and the repository's guidance and answered seven typed questions. Constructed patches and historical patches are reported separately and never pooled.

    The constructed patches

    Four small projects were written for this booklet, with an issue, an acceptable patch and a defective patch for each issue. Every patch passes the project's required tests, and a hidden test settles whether it fixes the issue. The patches are evenly split by construction, and the keyword rule is a poor fit by construction, so neither says anything about real repositories.

    The budget view uses the assumed reviewer costs and allows part of a patch at the budget's edge, which is an approximation to choosing whole patches.

    The historical patches

    One agent's patches for real open-source issues. The label is the benchmark's unresolved outcome, which also counts patches that existing tests would have caught and patches that do not apply. So this set shows how well an outcome can be predicted, and it does not count defects that would reach production. These repositories and issues may appear in the models' training data; comparing patches for the same issue reduces that problem and does not remove it.

    Models saw diffs without the agent's leftover scripts. The file-ownership map is a draft that was not reviewed by the repositories' maintainers.

    Intervals

    Constructed intervals resample issues, keeping both patches together. Historical intervals resample issues within repositories, with fewer replicates because same-issue AUC is slow to compute. A missing answer is ranked at the sample mean, and refusals are counted in the chapter.

    What these data cannot show

    The written patches were made for this booklet with a few kinds of defect, so their scores are not an estimate for any real repository. The real patches come from one agent on one set of issues, their label is not the same as a defect that would ship, and the file-ownership map is an unreviewed draft. These open-source repositories may appear in the models' training data, which comparing patches for the same issue reduces and does not remove. No ranking here was used by real reviewers, whose detection rate and time are assumed, so nothing shows that a team would catch more defects in practice.

    References

    1. Dawes, Robyn M. (1979). The robust beauty of improper linear models in decision making. American Psychologist, 34(7), 571-582. doi:10.1037/0003-066X.34.7.571

    Provenance

    Build script
    decision_ai/chapters/allocating-review-attention-to-code-changes/build.py (sha256 9a26845e7af2cd3fee289e9630841a19c3c5f921d9c41cba96e0adc5f9873221)
    Built on
    2026-10-30
    Site commit
    252942a900a49d01fe9f278e18459eb87b20b4a0

    Outputs

    FileSHA-256
    facts.json101cdf86f86fe57545d87f5eac1eaeb4f36c590aa3360dc1876ba4f0f007dc4c
    figures/defects-found-by-review.jsondfd3ed5cba0f31b34d0407d9fd00486cb9798136c11671a679cb4e6f1acc2c80
    figures/same-issue-is-harder.jsonab9e25f79f5342897a30c92d8619bf051fa69489d0efbd7e18cb576c81fdec62
    figures/which-question-helps.jsone2c337d5d02164f2a7c72749427dbae8ebe71e4a3ad4b564f85a225764fbad2c
    meta.jsonefa66d99b4dc878a54b8c4f5a3459e084b947f9039bf31a7f2183e2cfe670670
    public/data/allocating-review-attention-to-code-changes/budget.jsonb7794c5b863c43e51f8978175b4680051349409ca49b5a67d57e4f36476253c9
    public/data/allocating-review-attention-to-code-changes/reveal.json8782bc8d18cf279067f365dd981c7681a78c4b6722b4f6f92e75f2d5c56053ea
    refs.jsonf02a9f2b53002b0cc1ba8e133d2caf0bd4e7b7f4593ca1534ead259450db78d3

    Machine formats