Research Question: RQ-exact-coding-python
On Python with pytest, how do inline TDD, shared-context EXACT Coding Predictive TDD, and EXACT Coding with an isolated Refactor subagent compare on correctness and code quality for GPT-5.6 SOL and Opus 5?
game-of-life-python-example-mapping
| n, run dates | Correctness | Size | Code quality | Test quality | TDD discipline | Cost | ||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ↑ | ↑ | ○ | ○ | ○ | ○ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↑ | ↑ | ○ | ↓ | ↓ | ↑ | ↓ | ↓ | ↓ | |
| model: gpt-5-6-sol-codex · baseline-inline-tdd-v1-piad hocn = 5, 2026-09-21 → 09-22 | 100% ± 0 | 100%5/5 | 12.4 ± 0.89 | 104 ± 7.81 | 60.8 ± 4.32 | 2.80 ± 0.84 | 187 ± 17.64 🏆 | 0.00 ± 0.00 | 10.4 ± 5.50 | 5.90 ± 2.68 | 3.80 ± 1.64 | 2.45 ± 1.11 | 15.2 ± 3.56 | 10.8 ± 2.34 | 10.3 ± 2.99 | 56.2 ± 5.54 🏆 | 91% ± 3 🏆 | 33.6 ± 11.46 | 3.20 ± 2.68 🏆 | 0.00 ± 0.00 🏆 | n/c | 3.7 ± 0.7 min 🏆 | 228k ± 73k 🏆 | $0.37 ± 0.09 🏆 |
| model: gpt-5-6-sol-codex · exact-ptdd-v1-pitest listn = 5, 2026-09-21 | 100% ± 0 | 100%5/5 | 14.2 ± 1.10 | 166 ± 16.12 | 76.2 ± 11.12 | 7.20 ± 0.84 | 203 ± 9.31 | 0.00 ± 0.00 | 4.20 ± 1.48 🏆 | 1.68 ± 0.29 | 2.00 ± 0.00 🏆 | 1.17 ± 0.07 🏆 | 9.40 ± 2.07 | 5.39 ± 0.56 | 5.50 ± 0.79 | 49.6 ± 2.07 | 90% ± 5 🏆 | 45.6 ± 7.73 | 4.80 ± 2.95 🏆 | 0.00 ± 0.00 🏆 | 100% 🏆142/142 | 12.8 ± 0.5 min | 1.7M ± 310k | $1.63 ± 0.33 |
| model: gpt-5-6-sol-codex · exact-ptdd-v1.1-refactor-subagent-pitest listn = 5, 2026-09-21 | 100% ± 0 | 100%5/5 | 13.8 ± 1.10 | 144 ± 25.46 | 89.0 ± 19.33 | 10.2 ± 3.03 | 208 ± 14.60 | 0.00 ± 0.00 | 3.00 ± 0.71 🏆 | 1.00 ± 0.29 🏆 | 2.00 ± 0.00 🏆 | 1.19 ± 0.18 🏆 | 7.20 ± 0.84 🏆 | 4.39 ± 0.64 🏆 | 4.40 ± 0.65 | 53.2 ± 2.59 | 89% ± 9 🏆 | 33.8 ± 13.55 | 3.20 ± 1.64 🏆 | 1.20 ± 1.64 🏆 | 99%137/138 | 37.0 ± 3.1 min | 3.7M ± 330k | $4.75 ± 0.38 |
| model: opus-5-no-thinking · baseline-inline-tdd-v1-ccad hocn = 5, 2026-09-21 → 09-22 | 100% ± 0 | 100%5/5 | 15.8 ± 6.53 | 113 ± 53.42 | 56.6 ± 8.88 | 4.20 ± 1.30 | 179 ± 14.11 🏆 | 0.00 ± 0.00 | 5.00 ± 1.87 | 3.45 ± 1.39 | 3.00 ± 1.00 🏆 | 1.76 ± 0.38 | 9.40 ± 3.65 🏆 | 6.68 ± 2.42 | 6.10 ± 1.52 | 55.6 ± 7.50 🏆 | 93% ± 2 🏆 | 30.6 ± 6.35 | 2.00 ± 0.00 🏆 | 0.00 ± 0.00 🏆 | n/c | 10.9 ± 21.6 min 🏆 | 1.2M ± 124k | $1.17 ± 0.13 |
| model: opus-5-no-thinking · exact-ptdd-v1-cctest listn = 5, 2026-09-21 → 09-22 | 100% ± 0 | 100%5/5 | 20.2 ± 3.56 | 170 ± 16.90 | 75.2 ± 7.29 | 9.80 ± 1.30 | 206 ± 18.09 | 0.00 ± 0.00 | 5.40 ± 3.05 🏆 | 1.64 ± 0.24 | 3.00 ± 1.41 🏆 | 1.33 ± 0.18 🏆 | 8.60 ± 2.07 🏆 | 4.06 ± 0.39 🏆 | 3.10 ± 0.89 🏆 | 58.4 ± 4.56 🏆 | 92% ± 5 🏆 | 47.8 ± 7.79 | 3.60 ± 2.51 🏆 | 1.20 ± 1.64 🏆 | 97%194/200 | 6.5 ± 0.4 min | 6.0M ± 597k | $5.62 ± 0.42 |
| model: opus-5-no-thinking · exact-ptdd-v1.1-refactor-subagent-cctest listn = 5, 2026-09-22 | 100% ± 0 | 100%5/5 | 21.2 ± 3.56 | 168 ± 40.87 | 87.2 ± 16.68 | 11.4 ± 1.14 | 223 ± 23.34 | 0.00 ± 0.00 | 3.00 ± 0.71 🏆 | 1.14 ± 0.18 🏆 | 2.20 ± 0.45 🏆 | 1.24 ± 0.08 🏆 | 8.00 ± 1.22 🏆 | 4.18 ± 0.63 🏆 | 3.50 ± 0.87 🏆 | 57.4 ± 2.97 🏆 | 90% ± 7 🏆 | 39.6 ± 3.78 | 3.60 ± 2.30 🏆 | 1.60 ± 2.30 🏆 | 98%203/208 | 34.9 ± 10.2 min | 20.1M ± 2.3M | $20.95 ± 2.28 |
Runs behind this table
- 2026-09-21_16-30-48_game-of-life-python-example-mapping_exact-ptdd-v1-cc_opus-5-no-thinking
- 2026-09-21_16-30-49_game-of-life-python-example-mapping_exact-ptdd-v1-pi_gpt-5-6-sol-codex
- 2026-09-21_21-09-44_game-of-life-python-example-mapping_baseline-inline-tdd-v1-pi_gpt-5-6-sol-codex-2
- 2026-09-21_21-09-44_game-of-life-python-example-mapping_baseline-inline-tdd-v1-pi_gpt-5-6-sol-codex-3
- 2026-09-21_21-09-45_game-of-life-python-example-mapping_baseline-inline-tdd-v1-pi_gpt-5-6-sol-codex
- 2026-09-21_21-09-45_game-of-life-python-example-mapping_baseline-inline-tdd-v1-pi_gpt-5-6-sol-codex-2
- 2026-09-21_21-18-06_game-of-life-python-example-mapping_exact-ptdd-v1-pi_gpt-5-6-sol-codex
- 2026-09-21_21-18-56_game-of-life-python-example-mapping_exact-ptdd-v1-pi_gpt-5-6-sol-codex
- 2026-09-21_21-19-30_game-of-life-python-example-mapping_exact-ptdd-v1-pi_gpt-5-6-sol-codex
- 2026-09-21_21-20-12_game-of-life-python-example-mapping_exact-ptdd-v1-pi_gpt-5-6-sol-codex
- 2026-09-21_21-50-41_game-of-life-python-example-mapping_exact-ptdd-v1.1-refactor-subagent-pi_gpt-5-6-sol-codex
- 2026-09-21_21-55-39_game-of-life-python-example-mapping_exact-ptdd-v1.1-refactor-subagent-pi_gpt-5-6-sol-codex
- 2026-09-21_21-58-41_game-of-life-python-example-mapping_exact-ptdd-v1.1-refactor-subagent-pi_gpt-5-6-sol-codex
- 2026-09-21_22-06-47_game-of-life-python-example-mapping_exact-ptdd-v1.1-refactor-subagent-pi_gpt-5-6-sol-codex
- 2026-09-21_22-45-20_game-of-life-python-example-mapping_exact-ptdd-v1.1-refactor-subagent-pi_gpt-5-6-sol-codex
- 2026-09-21_23-55-36_game-of-life-python-example-mapping_baseline-inline-tdd-v1-cc_opus-5-no-thinking
- 2026-09-21_23-59-30_game-of-life-python-example-mapping_exact-ptdd-v1-cc_opus-5-no-thinking
- 2026-09-22_00-00-55_game-of-life-python-example-mapping_baseline-inline-tdd-v1-cc_opus-5-no-thinking
- 2026-09-22_00-05-52_game-of-life-python-example-mapping_exact-ptdd-v1-cc_opus-5-no-thinking
- 2026-09-22_00-15-52_game-of-life-python-example-mapping_baseline-inline-tdd-v1-cc_opus-5-no-thinking
- 2026-09-22_00-17-00_game-of-life-python-example-mapping_baseline-inline-tdd-v1-cc_opus-5-no-thinking
- 2026-09-22_00-22-16_game-of-life-python-example-mapping_exact-ptdd-v1.1-refactor-subagent-cc_opus-5-no-thinking
- 2026-09-22_00-22-37_game-of-life-python-example-mapping_exact-ptdd-v1-cc_opus-5-no-thinking
- 2026-09-22_00-28-11_game-of-life-python-example-mapping_exact-ptdd-v1.1-refactor-subagent-cc_opus-5-no-thinking
- 2026-09-22_00-45-51_game-of-life-python-example-mapping_exact-ptdd-v1.1-refactor-subagent-cc_opus-5-no-thinking
- 2026-09-22_01-08-06_game-of-life-python-example-mapping_baseline-inline-tdd-v1-cc_opus-5-no-thinking
- 2026-09-22_02-01-49_game-of-life-python-example-mapping_exact-ptdd-v1-cc_opus-5-no-thinking
- 2026-09-22_02-31-22_game-of-life-python-example-mapping_exact-ptdd-v1.1-refactor-subagent-cc_opus-5-no-thinking
- 2026-09-22_05-52-07_game-of-life-python-example-mapping_exact-ptdd-v1.1-refactor-subagent-cc_opus-5-no-thinking
- 2026-09-22_06-32-50_game-of-life-python-example-mapping_baseline-inline-tdd-v1-pi_gpt-5-6-sol-codex
claim-office-python-example-mapping
| n, run dates | Correctness | Size | Code quality | Test quality | TDD discipline | Cost | ||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ↑ | ↑ | ○ | ○ | ○ | ○ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↑ | ↑ | ○ | ↓ | ↓ | ↑ | ↓ | ↓ | ↓ | |
| model: gpt-5-6-sol-codex · baseline-inline-tdd-v1-piad hocn = 5, 2026-09-21 | 100% ± 0 🏆 | 100%5/5 | 12.4 ± 3.78 | 181 ± 34.13 | 213 ± 16.58 | 11.2 ± 1.79 | 876 ± 36.43 | 0.00 ± 0.00 | 14.2 ± 3.56 | 5.48 ± 1.32 | 8.60 ± 1.14 | 3.98 ± 0.77 | 31.4 ± 4.16 | 12.4 ± 2.33 | 9.30 ± 2.44 | 71.0 ± 12.75 | 74% ± 9 | 356 ± 39.47 | 95.0 ± 40.50 | 20.8 ± 46.51 🏆 | n/c | 5.7 ± 1.0 min | 257k ± 78k 🏆 | $0.52 ± 0.10 🏆 |
| model: gpt-5-6-sol-codex · exact-ptdd-v1-pitest listn = 5, 2026-09-21 | 100% ± 0 🏆 | 100%5/5 | 34.8 ± 8.87 | 278 ± 41.79 | 164 ± 18.50 | 13.4 ± 3.13 | 590 ± 50.37 🏆 | 0.00 ± 0.00 | 5.00 ± 1.00 🏆 | 2.01 ± 0.47 | 3.40 ± 0.55 🏆 | 1.89 ± 0.36 | 17.6 ± 2.41 🏆 | 7.30 ± 1.55 | 5.80 ± 2.46 | 29.8 ± 41.15 | 91% ± 0 🏆n=2/5 | 198 ± 42.43n=2/5 | 17.0 ± 2.83 🏆n=2/5 | 0.00 ± 0.00 🏆n=2/5 | 100% 🏆365/365 | 26.6 ± 5.4 min | 6.7M ± 1.9M | $4.60 ± 1.16 |
| model: gpt-5-6-sol-codex · exact-ptdd-v1.1-refactor-subagent-pitest listn = 5, 2026-09-21 | 100% ± 0 🏆 | 100%5/5 | 34.2 ± 3.77 | 267 ± 41.91 | 244 ± 36.39 | 31.8 ± 3.35 | 672 ± 69.44 | 0.00 ± 0.00 | 4.80 ± 1.30 🏆 | 0.81 ± 0.13 🏆 | 3.40 ± 0.55 🏆 | 1.39 ± 0.08 🏆 | 18.2 ± 2.86 🏆 | 4.32 ± 0.32 🏆 | 3.00 ± 0.00 🏆 | 0.00 ± 0.00 | n/c | n/c | n/c | n/c | 100% 🏆378/378 | 94.8 ± 9.9 min | 13.8M ± 4.0M | $14.61 ± 3.13 |
| model: opus-5-no-thinking · baseline-inline-tdd-v1-ccad hocn = 5, 2026-09-21 → 09-22 | 100% ± 0 🏆 | 100%5/5 | 50.6 ± 7.47 | 408 ± 81.10 | 258 ± 23.72 | 20.6 ± 3.13 | 837 ± 48.52 | 0.00 ± 0.00 | 6.20 ± 1.64 🏆 | 1.70 ± 0.27 | 3.80 ± 0.45 | 1.95 ± 0.26 | 16.6 ± 3.91 🏆 | 7.03 ± 1.34 | 6.20 ± 1.60 | 88.0 ± 1.87 | 92% ± 1 🏆 | 259 ± 13.52 | 21.8 ± 2.49 | 0.00 ± 0.00 🏆 | n/c | 3.3 ± 0.7 min 🏆 | 2.8M ± 616k | $2.70 ± 0.50 |
| model: opus-5-no-thinking · exact-ptdd-v1-cctest listn = 5, 2026-09-22 | 100% ± 0 🏆 | 100%5/5 | 55.8 ± 5.22 | 737 ± 215.85 | 263 ± 30.28 | 23.6 ± 6.43 | 832 ± 74.10 | 0.00 ± 0.00 | 7.00 ± 0.71 | 1.47 ± 0.47 | 3.60 ± 0.89 🏆 | 1.75 ± 0.26 | 17.6 ± 4.39 🏆 | 6.77 ± 1.48 | 6.00 ± 1.77 | 90.0 ± 0.71 🏆 | 94% ± 3 🏆 | 230 ± 27.91 | 14.0 ± 4.24 🏆 | 0.00 ± 0.00 🏆 | 99%551/554 | 18.1 ± 3.1 min | 23.0M ± 3.9M | $17.55 ± 2.69 |
| model: opus-5-no-thinking · exact-ptdd-v1.1-refactor-subagent-cctest listn = 5, 2026-09-22 | 97% ± 4 🏆 | 100%5/5 | 54.0 ± 4.85 | 627 ± 339.42 | 509 ± 112.52 | 42.0 ± 7.71 | 1013 ± 85.87 | 0.00 ± 0.00 | 4.60 ± 1.34 🏆 | 0.70 ± 0.21 🏆 | 3.20 ± 0.45 🏆 | 1.40 ± 0.10 🏆 | 18.8 ± 4.55 🏆 | 7.46 ± 1.28 | 6.40 ± 2.33 | 79.8 ± 7.53 | 92% ± 2 🏆 | 203 ± 32.93 | 15.0 ± 3.67 🏆 | 1.00 ± 2.24 🏆 | 100% 🏆520/520 | 64.9 ± 27.3 min | 65.9M ± 22.1M | $61.04 ± 19.81 |
Runs behind this table
- 2026-09-21_21-13-15_claim-office-python-example-mapping_baseline-inline-tdd-v1-pi_gpt-5-6-sol-codex
- 2026-09-21_21-13-27_claim-office-python-example-mapping_baseline-inline-tdd-v1-pi_gpt-5-6-sol-codex
- 2026-09-21_21-13-54_claim-office-python-example-mapping_baseline-inline-tdd-v1-pi_gpt-5-6-sol-codex
- 2026-09-21_21-14-30_claim-office-python-example-mapping_baseline-inline-tdd-v1-pi_gpt-5-6-sol-codex
- 2026-09-21_21-30-38_claim-office-python-example-mapping_exact-ptdd-v1-pi_gpt-5-6-sol-codex
- 2026-09-21_21-31-47_claim-office-python-example-mapping_exact-ptdd-v1-pi_gpt-5-6-sol-codex
- 2026-09-21_21-33-20_claim-office-python-example-mapping_exact-ptdd-v1-pi_gpt-5-6-sol-codex
- 2026-09-21_21-33-20_claim-office-python-example-mapping_exact-ptdd-v1-pi_gpt-5-6-sol-codex-2
- 2026-09-21_22-06-43_claim-office-python-example-mapping_baseline-inline-tdd-v1-pi_gpt-5-6-sol-codex
- 2026-09-21_22-14-14_claim-office-python-example-mapping_exact-ptdd-v1-pi_gpt-5-6-sol-codex
- 2026-09-21_22-24-34_claim-office-python-example-mapping_exact-ptdd-v1.1-refactor-subagent-pi_gpt-5-6-sol-codex
- 2026-09-21_22-35-33_claim-office-python-example-mapping_exact-ptdd-v1.1-refactor-subagent-pi_gpt-5-6-sol-codex
- 2026-09-21_22-37-47_claim-office-python-example-mapping_exact-ptdd-v1.1-refactor-subagent-pi_gpt-5-6-sol-codex
- 2026-09-21_22-43-48_claim-office-python-example-mapping_exact-ptdd-v1.1-refactor-subagent-pi_gpt-5-6-sol-codex
- 2026-09-21_23-21-10_claim-office-python-example-mapping_exact-ptdd-v1.1-refactor-subagent-pi_gpt-5-6-sol-codex
- 2026-09-21_23-56-52_claim-office-python-example-mapping_baseline-inline-tdd-v1-cc_opus-5-no-thinking
- 2026-09-22_00-02-08_claim-office-python-example-mapping_baseline-inline-tdd-v1-cc_opus-5-no-thinking
- 2026-09-22_00-05-32_claim-office-python-example-mapping_exact-ptdd-v1-cc_opus-5-no-thinking
- 2026-09-22_00-12-48_claim-office-python-example-mapping_exact-ptdd-v1-cc_opus-5-no-thinking
- 2026-09-22_00-17-13_claim-office-python-example-mapping_baseline-inline-tdd-v1-cc_opus-5-no-thinking
- 2026-09-22_00-18-38_claim-office-python-example-mapping_baseline-inline-tdd-v1-cc_opus-5-no-thinking
- 2026-09-22_00-20-04_claim-office-python-example-mapping_exact-ptdd-v1-cc_opus-5-no-thinking
- 2026-09-22_00-29-36_claim-office-python-example-mapping_exact-ptdd-v1-cc_opus-5-no-thinking
- 2026-09-22_01-30-09_claim-office-python-example-mapping_exact-ptdd-v1.1-refactor-subagent-cc_opus-5-no-thinking
- 2026-09-22_01-57-46_claim-office-python-example-mapping_baseline-inline-tdd-v1-cc_opus-5-no-thinking
- 2026-09-22_02-08-36_claim-office-python-example-mapping_exact-ptdd-v1-cc_opus-5-no-thinking
- 2026-09-22_03-00-49_claim-office-python-example-mapping_exact-ptdd-v1.1-refactor-subagent-cc_opus-5-no-thinking
- 2026-09-22_04-53-29_claim-office-python-example-mapping_exact-ptdd-v1.1-refactor-subagent-cc_opus-5-no-thinking
- 2026-09-22_04-53-29_claim-office-python-example-mapping_exact-ptdd-v1.1-refactor-subagent-cc_opus-5-no-thinking-2
- 2026-09-22_05-55-30_claim-office-python-example-mapping_exact-ptdd-v1.1-refactor-subagent-cc_opus-5-no-thinking
Findings
Findings — RQ-exact-coding-python
Overview
All values are cell means ± standard deviation at n=5 unless a cell states
otherwise. Comparisons are only ever within one kata and one model; the three
methods are the columns. Inline is the minimal inline-TDD instruction,
EXACT v1 the shared-context Predictive TDD workflow, EXACT v1.1 the same
workflow with the Refactor step delegated to an isolated subagent.
Complexity and cost are lower = better, Mutation Score higher = better. Bold values with 🏆 mark the winner of that row. A trophy is shared when the gap to the best cell is smaller than the best cell's own standard deviation, so three trophies in a row read as "no effect".
unit_size_max, code_mass, Production LoC and the process-marker counts have
no unambiguous direction and receive no trophy; they appear in the individual
findings as context.
This table shows Claim Office only. Game of Life is training-known, and under a minimal instruction both models already produce low-complexity code on it, so its cells separate almost nowhere and would pad the overview without adding to it. The kata remains part of the RQ and its cells are reported in the findings below, where they serve as the control that shows the effect depends on the specification being novel.
Correctness guard — passed. Every one of the twelve cells clears the 0.90 gate, so every quality row below is eligible. Correctness (internal) and completion within budget are 100 % everywhere; Correctness (external) is 1.00 ± 0.00 in eleven cells. The single deviation is Opus 5 on Claim Office under EXACT v1.1 at 0.97 ± 0.04, which misses one of fifteen scenarios in two of five runs — worth watching, since it is the only place in this RQ where adding workflow costs a scenario, but not enough to disqualify the cell.
Cognitive Complexity, hardest function (cognitive_max), lower = better
| Model | Inline | EXACT v1 | EXACT v1.1 |
|---|---|---|---|
| GPT-5.6 SOL | 14.2 ± 3.6 | 5.0 ± 1.0 🏆 | 4.8 ± 1.3 🏆 |
| Opus 5 | 6.2 ± 1.6 | 7.0 ± 0.7 | 4.6 ± 1.3 🏆 |
Mutation Score, higher = better
n differs by cell; see Mutation Score coverage.
| Model | Inline | EXACT v1 | EXACT v1.1 |
|---|---|---|---|
| GPT-5.6 SOL | 0.738 ± 0.093 | 0.914 ± 0.004 🏆 (n=2) | — (n=0) |
| Opus 5 | 0.916 ± 0.009 🏆 | 0.938 ± 0.025 🏆 | 0.925 ± 0.019 🏆 |
List-price cost per run, lower = better
| Model | Inline | EXACT v1 | EXACT v1.1 |
|---|---|---|---|
| GPT-5.6 SOL | $0.52 🏆 | $4.60 | $14.61 |
| Opus 5 | $2.70 🏆 | $17.55 | $38.76 |
F-1.9.1 — The complexity benefit appears only where the inline baseline is weak
EXACT Coding lowers Cognitive Complexity substantially in the two cells where inline TDD produced complex code, and does nothing measurable in the two where it did not. The decisive quantity is not the workflow but the starting point.
| Kata | Model | Inline | EXACT v1 | EXACT v1.1 | Inline → v1 separated? |
|---|---|---|---|---|---|
| Claim Office | GPT-5.6 SOL | 14.2 ± 3.6 | 5.0 ± 1.0 | 4.8 ± 1.3 | yes, 9.2 > 3.6 |
| Game of Life | GPT-5.6 SOL | 10.4 ± 5.5 | 4.2 ± 1.5 | 3.0 ± 0.7 | yes, 6.2 > 5.5 |
| Claim Office | Opus 5 | 6.2 ± 1.6 | 7.0 ± 0.7 | 4.6 ± 1.3 | no |
| Game of Life | Opus 5 | 5.0 ± 1.9 | 5.4 ± 3.1 | 3.0 ± 0.7 | no |
The rows are sorted by the inline baseline. Where it sits above 10, EXACT Coding roughly thirds it and the gap exceeds the baseline's own spread. Where it sits at 5–6, EXACT v1 changes nothing and is marginally worse on both katas.
mccabe_max moves the same way: 8.6 → 3.4 on Claim Office with SOL, and
3.8 → 3.6 on the same kata with Opus.
The one effect EXACT v1.1 produces independently of the baseline is on Game of Life with Opus, where it reaches 3.0 ± 0.7 against an inline 5.0 ± 1.9. That gap of 2.0 just exceeds the inline spread and is the only place where the isolated subagent separates from inline TDD on a cell the shared-context variant could not improve.
F-1.9.2 — Python reproduces the Java pattern; the TypeScript magnitude belonged to an older model
The question this RQ was opened for is whether the code-quality benefit carries over to Python as it did on TypeScript and Java. It does — and the three stacks disagree far less than their headline numbers suggest, because the effect tracks the inline baseline and the baseline is set by the model, not by the language.
Effect on Cognitive Complexity, expressed as the inline mean divided by the EXACT mean. Ratios are within-stack and therefore comparable across stacks; the absolute values behind them are not, because SonarJS, PMD and complexipy produce different finding populations.
| Stack | Model | Kata | Inline | EXACT v1 | Effect |
|---|---|---|---|---|---|
| TypeScript | Opus 4.7 | Game of Life | 21.8 | 6.5 | 3.4× |
| TypeScript | Opus 4.7 | Claim Office | 19.8 | 5.7 | 3.5× |
| Python | GPT-5.6 SOL | Claim Office | 14.2 | 5.0 | 2.8× |
| Python | GPT-5.6 SOL | Game of Life | 10.4 | 4.2 | 2.5× |
| Java | GPT-5.6 SOL | Game of Life | 9.8 | 5.8 | 1.7× |
| Java | GPT-5.6 SOL | Claim Office | 9.8 | 5.8 | 1.7× |
| Java | Opus 5 | Claim Office | 6.6 | 4.4 | 1.5× |
| Java | Opus 5 | Game of Life | 5.0 | 4.6 | 1.1× |
| Python | Opus 5 | Claim Office | 6.2 | 7.0 | 0.9× |
| Python | Opus 5 | Game of Life | 5.0 | 5.4 | 0.9× |
Sorted by effect, the rows sort themselves by inline baseline. Two readings follow.
EXACT Coding sets a floor rather than multiplying. The EXACT column spans 4.2 to 7.0 across every stack, model and kata in the table — a factor of 1.7 between the best and worst result — while the inline column spans 5.0 to 21.8, a factor of 4.4. The workflow pulls the hardest function down to roughly the same complexity wherever it starts. Where the model already produces code at that level, there is nothing left to take away, and the shared-context variant costs a little instead.
The TypeScript result is an Opus 4.7 result. Its 3.4× is the largest effect
in the lab's data, and it comes from an inline baseline of ~20. On Opus 5 the
same instruction on Claim Office produces 6.8 on TypeScript (n=4,
baseline-inline-tdd-v1.1-local-git-cc), against 6.6 on Java and 6.2 on Python.
The inline baseline fell by a factor of three between the two model generations,
and the room EXACT Coding used to fill fell with it. The comparison is indicative
rather than exact — that TypeScript cell uses the v1.1-local-git control and a
different tool chain — but three stacks landing within 0.6 of each other on the
same model, against ~20 on the previous one, is not a coincidence of tooling.
So the answer to "does it bring quality on Python like on Java and TypeScript" is: on the same model, Python behaves like Java. Both show a clear benefit on GPT-5.6 SOL and next to none on Opus 5. Neither reproduces the TypeScript magnitude, and neither should be expected to, because that magnitude belongs to a model whose unaided output was three times more complex.
The isolated-refactor variant is the exception worth noting: it reaches 3.0 ± 0.7 on Game of Life with Opus 5 where the shared-context variant reaches 5.4 ± 3.1, and 4.6 ± 1.3 against 7.0 ± 0.7 on Claim Office. Where EXACT v1 has run out of room on a strong model, v1.1 still finds some — at 1.6× its cost.
F-1.9.3 — The Java Mutation Score ordering does not reproduce
On Java, Mutation Score was the only outcome that ordered the three methods identically in all four model × kata combinations, with EXACT v1.1 ahead everywhere. On Python that ordering holds in none of the three evaluable combinations, and on Game of Life the score declines monotonically as workflow is added — on both models.
| Kata | Model | Inline | EXACT v1 | EXACT v1.1 |
|---|---|---|---|---|
| Game of Life | GPT-5.6 SOL | 0.914 ± 0.035 | 0.901 ± 0.047 | 0.889 ± 0.087 |
| Game of Life | Opus 5 | 0.932 ± 0.015 | 0.924 ± 0.050 | 0.904 ± 0.072 |
| Claim Office | Opus 5 | 0.916 ± 0.009 | 0.938 ± 0.025 | 0.925 ± 0.019 |
Every one of these contrasts is inside one standard deviation, so the reading is "no method effect on test strength", not "inline TDD writes stronger suites". The load-bearing point is the absence of the Java pattern: there, the ordering was consistent enough across four independent cells to be reported as a method property. Here it is not consistent in any of them.
H3 therefore fails on Python. The Java finding is better read as a property of that stack's mutant population than as a property of the method.
The fourth combination, Claim Office with GPT-5.6 SOL, cannot be evaluated: Mutation Score is unavailable for three of five EXACT v1 runs and all five EXACT v1.1 runs (see F-1.9.6).
F-1.9.4 — One cell carries a broad, large benefit: Claim Office with GPT-5.6 SOL
This is the only cell in which EXACT Coding improves several independent outcomes at once, and the improvements are large relative to their spread.
| Outcome | Inline | EXACT v1 | Direction |
|---|---|---|---|
cognitive_max |
14.2 ± 3.6 | 5.0 ± 1.0 | lower = better |
mccabe_max |
8.6 ± 1.1 | 3.4 ± 0.5 | lower = better |
unit_size_max |
31.4 ± 4.2 | 17.6 ± 2.4 | context |
| Code Mass (APP) | 875.8 ± 36.4 | 590.2 ± 50.4 | context |
| Mutation Score | 0.738 ± 0.093 | 0.914 ± 0.004 (n=2) | higher = better |
| Unnoticed changes | 95.0 ± 40.5 | 17.0 ± 2.8 (n=2) | lower = better |
| Test count | 12.4 ± 3.8 | 34.8 ± 8.9 | context |
The mutant counts are quoted alongside the score because the arms differ in code size: Code Mass (APP) falls by a third, so the mutant population shrinks too. The absolute number of unnoticed behaviour changes falls from 95 to 17, which is the stronger statement — the suite does not merely cover a smaller denominator, it leaves far less undetected.
This cell is also where inline TDD is weakest: a mean Mutation Score of 0.738 is the lowest in the whole RQ, against 0.914–0.932 everywhere else. The pattern of F-1.9.2 repeats — EXACT Coding closes a gap rather than raising a ceiling.
The Mutation Score figures rest on n=2 and the caveat in F-1.9.6 applies.
F-1.9.5 — The workflow costs eight to twenty-eight times inline TDD for the same correctness
| Kata | Model | Inline | EXACT v1 | EXACT v1.1 | v1.1 / inline |
|---|---|---|---|---|---|
| Game of Life | GPT-5.6 SOL | $0.37 | $1.63 | $4.75 | 12.7× |
| Game of Life | Opus 5 | $1.17 | $5.62 | $17.45 | 14.9× |
| Claim Office | GPT-5.6 SOL | $0.52 | $4.60 | $14.61 | 27.9× |
| Claim Office | Opus 5 | $2.70 | $17.55 | $38.76 | 14.4× |
Wall-clock follows the same shape: Claim Office with SOL runs 341 s under inline TDD and 5686 s under EXACT v1.1. Costs are token-derived list-price equivalents, not invoices.
The Opus v1.1 column rose on 2026-09-30 and the SOL one did not, which is a
measurement correction, not a behaviour change. analyze_transcript.py omitted
subagent tokens entirely until then, while parse_pi_transcript.py had always
added them, so the Claude-Code-against-SOL cost comparison was biased in favour
of Claude Code on exactly the arm that delegates. See
RQ-old-vs-new-exact-line-opus55 F-4.12.5.
Read together with F-1.9.1 and F-1.9.3, the overhead is justified in this data
only for the Claim Office / SOL cell of F-1.9.4. In the three cells where
correctness is saturated and complexity is already low, EXACT Coding buys a
lower cognitive_max on two of them and pays 8–13× for it.
F-1.9.6 — On Claim Office, the SOL ports write end-to-end suites, and that is measurable
Eight of the sixty runs have test suites that never import the production module: every assertion runs the CLI in a subprocess. They fall into exactly two cells, both on the pi ports and both on the long novel specification.
| Kata | Model | Method | End-to-end-only suites |
|---|---|---|---|
| Claim Office | GPT-5.6 SOL | EXACT v1.1 | 5 of 5 |
| Claim Office | GPT-5.6 SOL | EXACT v1 | 3 of 5 |
| all ten other cells | 0 |
Two measurements follow directly and are consequences of the test style, not defects:
coverage_statements_pctreads 0 for these runs. The production code does run, but not in the process coverage traces. The Claim Office / SOL column accordingly shows 71.0 (inline), 29.8 ± 41.1 (v1, a mixture of both styles) and 0.0 (v1.1).- Mutation Score is unavailable for them. mutmut associates tests with mutants by tracing the test process and stops when that association is empty; a subprocess is invisible to it. This is a limit of the instrument against this test style, not a configuration error.
The effect is confined to one model on one kata, so it is not a property of EXACT Coding as such. What the data supports is narrower: under this workflow on a long novel specification, GPT-5.6 SOL tends to verify through the delivered interface rather than the domain API, and the isolated-refactor variant did so in every run.
F-1.9.7 — EXACT v1.1 decomposes further without a matching quality gain
The isolated Refactor subagent produces markedly more named units than the shared-context variant, most visibly on Claim Office.
| Kata | Model | unit_count Inline → v1 → v1.1 |
unit_size_max Inline → v1 → v1.1 |
|---|---|---|---|
| Claim Office | GPT-5.6 SOL | 11.2 → 13.4 → 31.8 | 31.4 → 17.6 → 18.2 |
| Claim Office | Opus 5 | 20.6 → 23.6 → 42.0 | 16.6 → 17.6 → 18.8 |
| Game of Life | GPT-5.6 SOL | 2.8 → 7.2 → 10.2 | 15.2 → 9.4 → 7.2 |
| Game of Life | Opus 5 | 4.2 → 9.8 → 11.4 | 9.4 → 8.6 → 8.0 |
On both Claim Office cells the unit count roughly doubles from v1 to v1.1 while the longest unit does not shrink — on Opus it grows, alongside Production LoC rising from 263.2 to 508.6. The decomposition is real but it arrives together with more code, so it is redistribution into more, smaller units rather than removal.
Against that, v1.1 delivers the lowest cognitive_max in three of four cells
and costs 1.6–3.2× what v1 costs. Neither the correctness (F-1.9.1) nor the
Mutation Score (F-1.9.3) rows support the extra spend.
Overall interpretation
The quality benefit carries over to Python, and it behaves as it did on Java. On GPT-5.6 SOL, EXACT Coding thirds Cognitive Complexity on both katas — 2.5× and 2.8×, the largest effects in the lab's data outside the TypeScript runs on Opus 4.7. On Opus 5 it produces none in the shared-context variant, which is exactly what Java showed on the same model. The language is not the variable that decides this; the model's unaided output is (F-1.9.2).
Read that way, the three stacks agree rather than disagree. EXACT Coding drives the hardest function to roughly 4–7 wherever it starts, across every stack, model and kata measured. The spectacular TypeScript figure came from starting at 20. Opus 5 starts at 5–6.6 on both Java and Python, so there is little left to take.
The isolated-refactor variant is the one that still finds room on a strong model: lowest Cognitive Complexity in three of four cells, including both Opus 5 cells where EXACT v1 did nothing. It pays for that with 1.6–3.2× the cost of v1, a doubled unit count without a smaller longest unit (F-1.9.7), and the only correctness deviation in the RQ.
Two results run against expectation. The Mutation Score ordering that held across all four Java cells holds in none of the three evaluable Python ones (F-1.9.3), which makes the Java finding a property of PIT's mutant population rather than of the method. And the cost of the workflow is 8–28× inline TDD (F-1.9.5), which only the Claim Office / SOL cell earns back in measured quality (F-1.9.4).
Two limits bound these readings. Mutation Score is missing for one of the four model × kata combinations entirely (F-1.9.6), so that hypothesis is answered on three. And the Claim Office / Opus 5 / v1.1 cell was refilled after provider-side aborts concentrated in that arm; the provenance note in README.md states why that repetition is not clearly unbiased.
Correctness is a guard here, not a result: all twelve cells clear the gate, so all quality comparisons are eligible. The one deviation — Opus 5 on Claim Office under v1.1, 0.97 ± 0.04 — is recorded because a drop is the only thing this metric is carried to show.
Cross-stack statements in this document compare effect ratios and orderings, never absolute values. ruff, PMD and ESLint/SonarJS produce different finding populations, and mutmut, PIT and Stryker different mutant populations.
Data and reproducibility: summary.md, runs.csv, and the design in README.md.
F-1.9.8 — Python's missed mutants are weak assertions, not untested code
mutants_survived contains two different failures. A Survived mutant means a
test ran the mutated line and still passed — the assertion is too loose. An
uncovered one means no test reaches the line at all. Mutation Score adds them
together, and separating them shows that on this stack almost all of the gap is
the first kind.
| Kata | Model | Inline | EXACT v1 | EXACT v1.1 |
|---|---|---|---|---|
| Claim Office | Opus 5 | 0.0 | 0.0 | 0.8 ± 2.04 |
| Claim Office | GPT-5.6 SOL | 20.8 ± 46.51 | 0.0 (n=2) | — |
| Game of Life | Opus 5 | 0.0 | 1.2 ± 1.64 | 1.6 ± 2.30 |
| Game of Life | GPT-5.6 SOL | 0.0 | 0.0 | 1.2 ± 1.64 |
Ten of the eleven measurable cells sit at or below 1.6 uncovered mutants per run, most of them at exactly zero. The suites in this RQ reach essentially all of the production code; where they fail, they fail by asserting too little. That makes the score and the absolute survivor count interchangeable here as directional evidence, which is not true on every stack.
The one exception is a single run, and it is real rather than an artefact. The
Claim Office / SOL / inline cell's mean of 20.8 comes entirely from one run with
104 uncovered mutants out of 385; the other four are at zero. That run is also
the weakest suite in the cell (score 0.57 against 0.72 to 0.80) and its
coverage_statements_pct reads 62 % against 79 to 81 % for its siblings — an
independent instrument agreeing that a large region is untested. The σ of 46.51
is the correct warning that this cell describes two different populations.
Read with F-1.9.6: the SOL inline arm on Claim Office is the place where suite quality is fragile on this stack, and this finding adds that its failure mode is usually a loose assertion and occasionally an outright hole.