Proven on CPython: full results
The actual output.
A single full-spectrum pass over CPython 3.12.3. Over-detect, then prove down to certainty. Nothing reaches a verdict without an unconditional proof.
The net flagged 2,343,326 suspects. 2,291,078 (97.77%) were set aside by named policy filters — boilerplate, test code, idioms — counted, not proven different. Of the rest, 0 are confirmed by proof and safe to merge automatically, 32 are proven duplicates to merge by hand, and 52,216 (2.23%) go to review.
What math can prove, we prove — and only that. For the rest, a sound verdict would take a guess about runtime behavior, so we surface every one for review rather than guess. We never guess.
Engine v1.7.7 on all 63,186 functions of CPython 3.12.3: 0 automatic merges issued, and 32 proven duplicates to merge by hand, each one independently audited.
Why the automatic set is smaller than it was
An earlier build of this engine confirmed 104 automatic merges on this exact corpus. Every false-positive class found since was reproduced by execution and closed, so the current engine confirms an automatic merge only when it can prove the rewrite safe: 0 here. Where the duplicate is proven but the automatic rewrite is not safe, the pair is listed as a proven duplicate to merge by hand (32), with the exact reason. Everything else is a candidate for review — never shipped as a verdict.
Confirmed duplicates (0)
Proven-equivalent — safe to consolidate. Delete the duplicate, reuse the canonical one.
- None — the engine could not prove a single consolidation sound here without a human step.
Proven duplicates — merge by hand (32)
Proven to compute the same thing (same code; every name, enclosing value, decorator and class context checked identical). The automatic delete-and-redirect is not safe — the reason is named per pair — so the merge is yours to make by hand.
- baz (Lib/test/_test_multiprocessing.py:2982) ≡ baz (Doc/includes/mp_newtype.py:16) · blocked: cross-module-import
- mul (Lib/test/test_list.py:94) ≡ mul (Lib/operator.py:104) · blocked: cross-module-dynamic-name, cross-module-import, docstring-divergent
- get_build_version (Tools/c-analyzer/distutils/msvccompiler.py:143) ≡ get_build_version (Tools/c-analyzer/distutils/msvc9compiler.py:165) · blocked: cross-module-import
- always_iterable (Lib/test/test_zipfile/_path/_itertools.py:33) ≡ always_iterable (Lib/importlib/metadata/_itertools.py:23) · blocked: cross-module-import, docstring-divergent
- _get_code_position (Lib/traceback.py:365) ≡ _get_code_position (Lib/inspect.py:1670) · blocked: cross-module-dynamic-name, cross-module-import
- ISTERMINAL (Lib/token.py:135) ≡ ISTERMINAL (Lib/lib2to3/pgen2/token.py:79) · blocked: cross-module-dynamic-name, cross-module-import
- ISNONTERMINAL (Lib/token.py:138) ≡ ISNONTERMINAL (Lib/lib2to3/pgen2/token.py:82) · blocked: cross-module-dynamic-name, cross-module-import
- ISEOF (Lib/token.py:141) ≡ ISEOF (Lib/lib2to3/pgen2/token.py:85) · blocked: cross-module-dynamic-name, cross-module-import
- group (Lib/tokenize.py:60) ≡ group (Lib/lib2to3/pgen2/tokenize.py:48) · blocked: cross-module-dynamic-name, cross-module-import
- any (Lib/tokenize.py:61) ≡ any (Lib/lib2to3/pgen2/tokenize.py:49) · blocked: cross-module-dynamic-name, cross-module-import
- maybe (Lib/tokenize.py:62) ≡ maybe (Lib/lib2to3/pgen2/tokenize.py:50) · blocked: cross-module-dynamic-name, cross-module-import
- _get_normal_name (Lib/tokenize.py:341) ≡ _get_normal_name (Lib/lib2to3/pgen2/tokenize.py:230) · blocked: cross-module-dynamic-name, cross-module-import
- three_way_cmp (Lib/unittest/util.py:115) ≡ three_way_cmp (Lib/test/test_ctypes/test_libc.py:8) · blocked: cross-module-import
- isjunction (Lib/posixpath.py:192) ≡ isjunction (Lib/ntpath.py:291) · blocked: conditional-binding, cross-module-import, docstring-divergent
- bltinlink (Lib/pydoc.py:2633) ≡ bltinlink (Lib/pydoc.py:2595) · blocked: nested-scope
- bltinlink (Lib/pydoc.py:2669) ≡ bltinlink (Lib/pydoc.py:2649) · blocked: nested-scope
- bltinlink (Lib/pydoc.py:2694) ≡ bltinlink (Lib/pydoc.py:2649) · blocked: nested-scope
- f (Lib/test/test_sys_setprofile.py:209) ≡ f (Lib/test/test_exceptions.py:2244) · blocked: cross-module-import, nested-scope
- f (Lib/test/test_sys_setprofile.py:325) ≡ f (Lib/test/test_exceptions.py:2244) · blocked: cross-module-import, nested-scope
- f (Lib/test/test_traceback.py:2528) ≡ f (Lib/test/test_exceptions.py:2244) · blocked: cross-module-import, nested-scope
- f (Lib/test/test_traceback.py:2874) ≡ f (Lib/test/test_exceptions.py:2244) · blocked: cross-module-import, nested-scope
- R (Lib/test/test_set.py:1657) ≡ R (Lib/test/test_heapq.py:289) · blocked: cross-module-import
- foo (Lib/test/test_lib2to3/data/py3_test_grammar.py:382) ≡ foo (Lib/test/test_grammar.py:828) · blocked: cross-module-import, nested-scope
- f (Lib/test/test_lib2to3/data/py3_test_grammar.py:528) ≡ f (Lib/test/test_grammar.py:1254) · blocked: cross-module-import, nested-scope
- cleanup (Lib/test/test_import/__init__.py:1240) ≡ cleanup (Lib/test/test_import/__init__.py:1217) · blocked: nested-scope
- _substitution_cost (Tools/build/generate_levenshtein_examples.py:17) ≡ _substitution_cost (Lib/traceback.py:1059) · blocked: cross-module-dynamic-name, cross-module-import
- writecode (Tools/freeze/makefreeze.py:77) ≡ writecode (Programs/freeze_test_frozenmain.py:10) · blocked: cross-module-import
- update_file (Tools/build/generate_token.py:40) ≡ update_file (Tools/build/generate_sre_constants.py:7) · blocked: cross-module-import, dynamic-name-reachability
- normalize_and_reduce_paths (Tools/c-analyzer/distutils/msvccompiler.py:181) ≡ normalize_and_reduce_paths (Tools/c-analyzer/distutils/msvc9compiler.py:190) · blocked: cross-module-import
- get_python_source_dir (Tools/patchcheck/patchcheck.py:14) ≡ get_python_source_dir (Tools/freeze/test/freeze.py:10) · blocked: cross-module-import
- make_test_source (Tools/iobench/iobench.py:368) ≡ make_test_source (Tools/iobench/iobench.py:348) · blocked: nested-name-rebound
- make_test_source (Tools/iobench/iobench.py:378) ≡ make_test_source (Tools/iobench/iobench.py:358) · blocked: nested-name-rebound
Candidates (52,216)
Each was detected with full confidence — what sets it apart from the Confirmed set is only that whether the merge is behaviour-preserving cannot be settled by deterministic proof (it turns on a runtime value, a dynamic binding, or the shape of the right refactor). A sound prover never guesses there. So each is classified by precisely why proof stops short and routed to review — never shipped as a verdict.
| Blocked by | Count |
|---|---|
| gapped-not-auto-extractable | 30,975 |
| gapped-trivial-helper | 15,389 |
| semantic-execution-agree | 3,385 |
| block-nested-scope | 547 |
| duplicate-constant-data | 313 |
| cross-class | 258 |
| block-control-flow-escape | 247 |
| block-binds-live-outputs | 239 |
| duplicate-code-block | 166 |
| duplicate-default-arguments | 77 |
| nested-class | 72 |
| duplicate-comprehension | 69 |
| method-dispatch-unprovable | 58 |
| semantic-assumed-int | 39 |
| class-name-differs | 31 |
| module-code-binds-used-names | 25 |
| frame-name-reflection | 24 |
| duplicate-lambda | 23 |
| closure-cell | 22 |
| frame-relocation | 22 |
| signature-contract | 21 |
| same-logic-across-constructs | 20 |
| stie-frame-timing | 17 |
| shared-data-block | 17 |
Full per-pair detail — exact locations plus the binding that blocks a mechanical merge — comes back in the scan result from the API. All advisory; none is ever shipped as a verdict.