code-towel 1.792__tar.gz → 1.946__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2732) hide show
  1. code_towel-1.946/CHANGELOG.md +2529 -0
  2. code_towel-1.946/CONTRIBUTING.md +384 -0
  3. code_towel-1.946/MANIFEST.in +20 -0
  4. code_towel-1.946/PKG-INFO +268 -0
  5. code_towel-1.946/README.md +223 -0
  6. code_towel-1.946/SECURITY.md +38 -0
  7. code_towel-1.946/docs/ADVERSARIAL_REVIEW.md +230 -0
  8. code_towel-1.946/docs/ARCHITECTURE.md +1969 -0
  9. code_towel-1.946/docs/CLI_GUIDE.md +287 -0
  10. code_towel-1.946/docs/DECISIONS.md +1829 -0
  11. code_towel-1.946/docs/GENERATED_CODE.md +385 -0
  12. code_towel-1.946/docs/KNOWN_LIMITATIONS.md +2062 -0
  13. code_towel-1.946/docs/OPEN_SOURCE_AUDIT.md +112 -0
  14. code_towel-1.946/docs/PERFORMANCE.md +423 -0
  15. code_towel-1.946/docs/PRODUCTION_READINESS.md +1338 -0
  16. code_towel-1.946/docs/README.md +61 -0
  17. code_towel-1.946/docs/RELEASE_1_946.md +287 -0
  18. code_towel-1.946/docs/RELEASE_LOG.md +896 -0
  19. code_towel-1.946/docs/RELEASING.md +616 -0
  20. code_towel-1.946/docs/REQUIREMENTS.md +57 -0
  21. code_towel-1.946/docs/TYPING.md +234 -0
  22. code_towel-1.946/docs/USAGE_GUIDE.md +831 -0
  23. code_towel-1.946/docs/agent_log.md +126 -0
  24. code_towel-1.946/docs/proposals/README.md +117 -0
  25. code_towel-1.946/docs/proposals/REVIEW_2026-10-08.md +281 -0
  26. code_towel-1.946/docs/proposals/decline-capabilities.md +147 -0
  27. code_towel-1.946/docs/proposals/dethunking.md +129 -0
  28. code_towel-1.946/docs/proposals/next-release.md +335 -0
  29. code_towel-1.946/docs/proposals/next-validation-final.md +167 -0
  30. code_towel-1.946/docs/proposals/next-validation.md +140 -0
  31. code_towel-1.946/docs/proposals/performance-roadmap.md +308 -0
  32. code_towel-1.946/docs/proposals/project-own-check.md +138 -0
  33. code_towel-1.946/docs/proposals/published-1772-comparison.md +105 -0
  34. code_towel-1.946/docs/proposals/shared-helper-module.md +182 -0
  35. code_towel-1.946/docs/proposals/template-method.md +171 -0
  36. code_towel-1.946/docs/proposals/type-parameters.md +395 -0
  37. code_towel-1.946/pyproject.toml +134 -0
  38. code_towel-1.946/src/code_towel.egg-info/PKG-INFO +268 -0
  39. code_towel-1.946/src/code_towel.egg-info/SOURCES.txt +2623 -0
  40. code_towel-1.946/src/towel/analysis_sources.py +231 -0
  41. code_towel-1.946/src/towel/canonical_ast.py +128 -0
  42. code_towel-1.946/src/towel/cli.py +2360 -0
  43. code_towel-1.946/src/towel/parsing_warnings.py +228 -0
  44. code_towel-1.946/src/towel/unification/annotation_ladder.py +2343 -0
  45. code_towel-1.946/src/towel/unification/annotation_wiring.py +1970 -0
  46. code_towel-1.946/src/towel/unification/annotations.py +1667 -0
  47. code_towel-1.946/src/towel/unification/argument_ownership.py +629 -0
  48. code_towel-1.946/src/towel/unification/ast_paths.py +72 -0
  49. code_towel-1.946/src/towel/unification/block_analysis.py +1349 -0
  50. code_towel-1.946/src/towel/unification/bounded_cache.py +144 -0
  51. code_towel-1.946/src/towel/unification/clustering.py +672 -0
  52. code_towel-1.946/src/towel/unification/compiler_literals.py +476 -0
  53. code_towel-1.946/src/towel/unification/constant_consistency.py +43 -0
  54. code_towel-1.946/src/towel/unification/engine_state.py +511 -0
  55. code_towel-1.946/src/towel/unification/extractor.py +1137 -0
  56. code_towel-1.946/src/towel/unification/fixed_point.py +1300 -0
  57. code_towel-1.946/src/towel/unification/hof_promotion.py +233 -0
  58. code_towel-1.946/src/towel/unification/if_binding_transfer.py +666 -0
  59. code_towel-1.946/src/towel/unification/import_graph.py +2125 -0
  60. code_towel-1.946/src/towel/unification/instantiation.py +1225 -0
  61. code_towel-1.946/src/towel/unification/materialize.py +1371 -0
  62. code_towel-1.946/src/towel/unification/models.py +515 -0
  63. code_towel-1.946/src/towel/unification/module_bindings.py +479 -0
  64. code_towel-1.946/src/towel/unification/namespace_writes.py +648 -0
  65. code_towel-1.946/src/towel/unification/narrowing.py +869 -0
  66. code_towel-1.946/src/towel/unification/pair_evaluation.py +2001 -0
  67. code_towel-1.946/src/towel/unification/parameterization.py +410 -0
  68. code_towel-1.946/src/towel/unification/pipeline.py +493 -0
  69. code_towel-1.946/src/towel/unification/refactor_engine.py +1177 -0
  70. code_towel-1.946/src/towel/unification/return_source_uses.py +78 -0
  71. code_towel-1.946/src/towel/unification/semantic_safety.py +1740 -0
  72. code_towel-1.946/src/towel/unification/structural_memo.py +185 -0
  73. code_towel-1.946/src/towel/unification/substitution.py +202 -0
  74. code_towel-1.946/src/towel/unification/thunk_inlining.py +660 -0
  75. code_towel-1.946/src/towel/unification/typing_forms.py +329 -0
  76. code_towel-1.946/src/towel/unification/unifier.py +1316 -0
  77. code_towel-1.946/src/towel/unification/unifier_state.py +102 -0
  78. code_towel-1.946/test_examples/README.md +463 -0
  79. code_towel-1.946/test_examples_crossfile/README.md +233 -0
  80. code_towel-1.946/tests/README.md +363 -0
  81. code_towel-1.946/tests/fixtures/comprehension_captured_cell_original.py.txt +66 -0
  82. code_towel-1.946/tests/fixtures/scope_retained_comprehension_shadow_after.py.txt +67 -0
  83. code_towel-1.946/tests/fixtures/scope_retained_comprehension_shadow_before.py.txt +66 -0
  84. code_towel-1.946/tests/fixtures/scope_retained_match_after.py.txt +108 -0
  85. code_towel-1.946/tests/fixtures/scope_retained_match_before.py.txt +106 -0
  86. code_towel-1.946/tests/hostile_execution.py +1144 -0
  87. code_towel-1.946/tests/release_evidence/1.946-preparation/README.md +55 -0
  88. code_towel-1.946/tests/release_evidence/1.946-preparation/measurements.json +439 -0
  89. code_towel-1.946/tests/release_evidence/1.946-warning-guard/README.md +66 -0
  90. code_towel-1.946/tests/release_evidence/1.946-warning-guard/measurements.json +669 -0
  91. code_towel-1.946/tests/test_annotation_ladder_rules.py +1254 -0
  92. code_towel-1.946/tests/test_argument_ownership_memo.py +487 -0
  93. code_towel-1.946/tests/test_bounded_cache.py +53 -0
  94. code_towel-1.946/tests/test_bounded_cache_views.py +124 -0
  95. code_towel-1.946/tests/test_canonical_ast.py +380 -0
  96. code_towel-1.946/tests/test_captured_comprehension_cells.py +246 -0
  97. code_towel-1.946/tests/test_compiler_literal_guard_memo.py +336 -0
  98. code_towel-1.946/tests/test_compiler_literal_pools.py +643 -0
  99. code_towel-1.946/tests/test_comprehension_cell_capture_cli.py +188 -0
  100. code_towel-1.946/tests/test_crossfile_integration.py +500 -0
  101. code_towel-1.946/tests/test_current_release_documentation.py +218 -0
  102. code_towel-1.946/tests/test_differential_grammar.py +220 -0
  103. code_towel-1.946/tests/test_engine_adversarial.py +1528 -0
  104. code_towel-1.946/tests/test_fresh_top_level_imports.py +132 -0
  105. code_towel-1.946/tests/test_fstring_literal_pools.py +280 -0
  106. code_towel-1.946/tests/test_helper_annotations.py +551 -0
  107. code_towel-1.946/tests/test_hostile_battery.py +634 -0
  108. code_towel-1.946/tests/test_hostile_crossfile_battery.py +581 -0
  109. code_towel-1.946/tests/test_hostile_scope_oracle.py +487 -0
  110. code_towel-1.946/tests/test_if_binding_transfer.py +451 -0
  111. code_towel-1.946/tests/test_if_fresh_bindings_cli.py +722 -0
  112. code_towel-1.946/tests/test_if_transfer_source_facts.py +441 -0
  113. code_towel-1.946/tests/test_import_position.py +300 -0
  114. code_towel-1.946/tests/test_isolated_format_tools.py +249 -0
  115. code_towel-1.946/tests/test_lexical_fast_path_memo.py +205 -0
  116. code_towel-1.946/tests/test_literal_byte_provenance.py +273 -0
  117. code_towel-1.946/tests/test_nested_retained_scope_oracle.py +340 -0
  118. code_towel-1.946/tests/test_occurrence_constant_cli.py +456 -0
  119. code_towel-1.946/tests/test_occurrence_constants.py +315 -0
  120. code_towel-1.946/tests/test_optional_converter_narrowing.py +1559 -0
  121. code_towel-1.946/tests/test_ordinary_module_writes.py +361 -0
  122. code_towel-1.946/tests/test_pair_if_proof_order.py +614 -0
  123. code_towel-1.946/tests/test_parameterized_narrowing.py +442 -0
  124. code_towel-1.946/tests/test_parsing_warnings.py +600 -0
  125. code_towel-1.946/tests/test_pipeline_phases.py +395 -0
  126. code_towel-1.946/tests/test_platform_only_hosts.py +332 -0
  127. code_towel-1.946/tests/test_program_imports.py +225 -0
  128. code_towel-1.946/tests/test_program_type_names.py +1094 -0
  129. code_towel-1.946/tests/test_receiver_dependency.py +181 -0
  130. code_towel-1.946/tests/test_region_directives.py +687 -0
  131. code_towel-1.946/tests/test_return_source_uses.py +333 -0
  132. code_towel-1.946/tests/test_run_statistics.py +227 -0
  133. code_towel-1.946/tests/test_source_encoding.py +204 -0
  134. code_towel-1.946/tests/test_thunk_inlining.py +212 -0
  135. code_towel-1.946/tests/test_thunk_ordering_cli.py +427 -0
  136. code_towel-1.946/tests/test_thunk_parameter_ordering.py +241 -0
  137. code_towel-1.946/tests/test_thunk_result_lifetimes.py +236 -0
  138. code_towel-1.946/tests/test_type_inference.py +859 -0
  139. code_towel-1.946/tests/test_unconfigured_mypy.py +550 -0
  140. code_towel-1.946/tests/test_unifier_batch3.py +198 -0
  141. code_towel-1.946/tests/test_unifier_batch5.py +119 -0
  142. code_towel-1.946/tests/test_unifier_core.py +338 -0
  143. code_towel-1.946/tests/test_unifier_edge_cases.py +214 -0
  144. code_towel-1.946/tests/test_unifier_more_branches.py +230 -0
  145. code_towel-1.946/tests/test_untypeable_extractions.py +343 -0
  146. code_towel-1.946/uv.lock +1555 -0
  147. code_towel-1.792/CHANGELOG.md +0 -2354
  148. code_towel-1.792/CONTRIBUTING.md +0 -374
  149. code_towel-1.792/MANIFEST.in +0 -19
  150. code_towel-1.792/PKG-INFO +0 -233
  151. code_towel-1.792/README.md +0 -188
  152. code_towel-1.792/SECURITY.md +0 -31
  153. code_towel-1.792/docs/ADVERSARIAL_REVIEW.md +0 -202
  154. code_towel-1.792/docs/ARCHITECTURE.md +0 -1766
  155. code_towel-1.792/docs/CLI_GUIDE.md +0 -257
  156. code_towel-1.792/docs/DECISIONS.md +0 -1697
  157. code_towel-1.792/docs/GENERATED_CODE.md +0 -348
  158. code_towel-1.792/docs/KNOWN_LIMITATIONS.md +0 -2007
  159. code_towel-1.792/docs/OPEN_SOURCE_AUDIT.md +0 -91
  160. code_towel-1.792/docs/PERFORMANCE.md +0 -238
  161. code_towel-1.792/docs/PRODUCTION_READINESS.md +0 -1136
  162. code_towel-1.792/docs/README.md +0 -51
  163. code_towel-1.792/docs/RELEASE_LOG.md +0 -789
  164. code_towel-1.792/docs/RELEASING.md +0 -552
  165. code_towel-1.792/docs/REQUIREMENTS.md +0 -40
  166. code_towel-1.792/docs/TYPING.md +0 -215
  167. code_towel-1.792/docs/USAGE_GUIDE.md +0 -811
  168. code_towel-1.792/docs/agent_log.md +0 -48
  169. code_towel-1.792/docs/proposals/README.md +0 -41
  170. code_towel-1.792/docs/proposals/decline-capabilities.md +0 -130
  171. code_towel-1.792/docs/proposals/dethunking.md +0 -107
  172. code_towel-1.792/docs/proposals/next-release.md +0 -327
  173. code_towel-1.792/docs/proposals/next-validation-final.md +0 -163
  174. code_towel-1.792/docs/proposals/next-validation.md +0 -136
  175. code_towel-1.792/docs/proposals/performance-roadmap.md +0 -248
  176. code_towel-1.792/docs/proposals/project-own-check.md +0 -132
  177. code_towel-1.792/docs/proposals/published-1772-comparison.md +0 -100
  178. code_towel-1.792/docs/proposals/shared-helper-module.md +0 -176
  179. code_towel-1.792/docs/proposals/template-method.md +0 -164
  180. code_towel-1.792/docs/proposals/type-parameters.md +0 -384
  181. code_towel-1.792/pyproject.toml +0 -134
  182. code_towel-1.792/src/code_towel.egg-info/PKG-INFO +0 -233
  183. code_towel-1.792/src/code_towel.egg-info/SOURCES.txt +0 -2585
  184. code_towel-1.792/src/towel/analysis_sources.py +0 -231
  185. code_towel-1.792/src/towel/canonical_ast.py +0 -115
  186. code_towel-1.792/src/towel/cli.py +0 -2318
  187. code_towel-1.792/src/towel/parsing_warnings.py +0 -204
  188. code_towel-1.792/src/towel/unification/annotation_ladder.py +0 -1586
  189. code_towel-1.792/src/towel/unification/annotation_wiring.py +0 -1965
  190. code_towel-1.792/src/towel/unification/annotations.py +0 -1666
  191. code_towel-1.792/src/towel/unification/argument_ownership.py +0 -413
  192. code_towel-1.792/src/towel/unification/block_analysis.py +0 -1261
  193. code_towel-1.792/src/towel/unification/bounded_cache.py +0 -137
  194. code_towel-1.792/src/towel/unification/clustering.py +0 -649
  195. code_towel-1.792/src/towel/unification/constant_consistency.py +0 -174
  196. code_towel-1.792/src/towel/unification/engine_state.py +0 -500
  197. code_towel-1.792/src/towel/unification/extractor.py +0 -1068
  198. code_towel-1.792/src/towel/unification/fixed_point.py +0 -1267
  199. code_towel-1.792/src/towel/unification/hof_promotion.py +0 -223
  200. code_towel-1.792/src/towel/unification/import_graph.py +0 -2123
  201. code_towel-1.792/src/towel/unification/instantiation.py +0 -1174
  202. code_towel-1.792/src/towel/unification/materialize.py +0 -1353
  203. code_towel-1.792/src/towel/unification/models.py +0 -500
  204. code_towel-1.792/src/towel/unification/module_bindings.py +0 -477
  205. code_towel-1.792/src/towel/unification/namespace_writes.py +0 -641
  206. code_towel-1.792/src/towel/unification/narrowing.py +0 -845
  207. code_towel-1.792/src/towel/unification/pair_evaluation.py +0 -1819
  208. code_towel-1.792/src/towel/unification/parameterization.py +0 -360
  209. code_towel-1.792/src/towel/unification/pipeline.py +0 -480
  210. code_towel-1.792/src/towel/unification/refactor_engine.py +0 -1145
  211. code_towel-1.792/src/towel/unification/semantic_safety.py +0 -1657
  212. code_towel-1.792/src/towel/unification/structural_memo.py +0 -161
  213. code_towel-1.792/src/towel/unification/substitution.py +0 -134
  214. code_towel-1.792/src/towel/unification/thunk_inlining.py +0 -567
  215. code_towel-1.792/src/towel/unification/typing_forms.py +0 -325
  216. code_towel-1.792/src/towel/unification/unifier.py +0 -1206
  217. code_towel-1.792/src/towel/unification/unifier_state.py +0 -98
  218. code_towel-1.792/test_examples/README.md +0 -455
  219. code_towel-1.792/test_examples_crossfile/README.md +0 -244
  220. code_towel-1.792/tests/README.md +0 -351
  221. code_towel-1.792/tests/hostile_execution.py +0 -910
  222. code_towel-1.792/tests/test_annotation_ladder_rules.py +0 -418
  223. code_towel-1.792/tests/test_canonical_ast.py +0 -354
  224. code_towel-1.792/tests/test_crossfile_integration.py +0 -474
  225. code_towel-1.792/tests/test_current_release_documentation.py +0 -183
  226. code_towel-1.792/tests/test_differential_grammar.py +0 -207
  227. code_towel-1.792/tests/test_engine_adversarial.py +0 -1459
  228. code_towel-1.792/tests/test_fresh_top_level_imports.py +0 -88
  229. code_towel-1.792/tests/test_helper_annotations.py +0 -518
  230. code_towel-1.792/tests/test_hostile_battery.py +0 -637
  231. code_towel-1.792/tests/test_hostile_crossfile_battery.py +0 -582
  232. code_towel-1.792/tests/test_hostile_scope_oracle.py +0 -341
  233. code_towel-1.792/tests/test_import_position.py +0 -227
  234. code_towel-1.792/tests/test_isolated_format_tools.py +0 -246
  235. code_towel-1.792/tests/test_ordinary_module_writes.py +0 -260
  236. code_towel-1.792/tests/test_parameterized_narrowing.py +0 -335
  237. code_towel-1.792/tests/test_parsing_warnings.py +0 -189
  238. code_towel-1.792/tests/test_pipeline_phases.py +0 -359
  239. code_towel-1.792/tests/test_platform_only_hosts.py +0 -283
  240. code_towel-1.792/tests/test_program_imports.py +0 -171
  241. code_towel-1.792/tests/test_program_type_names.py +0 -1092
  242. code_towel-1.792/tests/test_receiver_dependency.py +0 -158
  243. code_towel-1.792/tests/test_region_directives.py +0 -673
  244. code_towel-1.792/tests/test_source_encoding.py +0 -178
  245. code_towel-1.792/tests/test_thunk_inlining.py +0 -190
  246. code_towel-1.792/tests/test_type_inference.py +0 -847
  247. code_towel-1.792/tests/test_unconfigured_mypy.py +0 -541
  248. code_towel-1.792/tests/test_unifier_batch3.py +0 -183
  249. code_towel-1.792/tests/test_unifier_batch5.py +0 -119
  250. code_towel-1.792/tests/test_unifier_core.py +0 -309
  251. code_towel-1.792/tests/test_unifier_edge_cases.py +0 -205
  252. code_towel-1.792/tests/test_unifier_more_branches.py +0 -222
  253. code_towel-1.792/tests/test_untypeable_extractions.py +0 -190
  254. code_towel-1.792/uv.lock +0 -1555
  255. {code_towel-1.792 → code_towel-1.946}/.flake8 +0 -0
  256. {code_towel-1.792 → code_towel-1.946}/.github/workflows/ci.yml +0 -0
  257. {code_towel-1.792 → code_towel-1.946}/.github/workflows/ecosystem.yml +0 -0
  258. {code_towel-1.792 → code_towel-1.946}/.pre-commit-config.yaml +0 -0
  259. {code_towel-1.792 → code_towel-1.946}/CODE_OF_CONDUCT.md +0 -0
  260. {code_towel-1.792 → code_towel-1.946}/LICENSE +0 -0
  261. {code_towel-1.792 → code_towel-1.946}/docs/CROSS_MODULE.md +0 -0
  262. {code_towel-1.792 → code_towel-1.946}/docs/NAMING.md +0 -0
  263. {code_towel-1.792 → code_towel-1.946}/docs/QUICKSTART.md +0 -0
  264. {code_towel-1.792 → code_towel-1.946}/docs/proposals/preview-what-dry-would-do.md +0 -0
  265. {code_towel-1.792 → code_towel-1.946}/docs/proposals/reuse-existing-function.md +0 -0
  266. {code_towel-1.792 → code_towel-1.946}/docs/proposals/trusted-decorators.md +0 -0
  267. {code_towel-1.792 → code_towel-1.946}/justfile +0 -0
  268. {code_towel-1.792 → code_towel-1.946}/scripts/add_copyright_headers.py +0 -0
  269. {code_towel-1.792 → code_towel-1.946}/scripts/audit_dependencies.py +0 -0
  270. {code_towel-1.792 → code_towel-1.946}/scripts/bench_refactor.py +0 -0
  271. {code_towel-1.792 → code_towel-1.946}/scripts/bench_similar_blocks.py +0 -0
  272. {code_towel-1.792 → code_towel-1.946}/scripts/check_mermaid.mjs +0 -0
  273. {code_towel-1.792 → code_towel-1.946}/scripts/ecosystem/Dockerfile +0 -0
  274. {code_towel-1.792 → code_towel-1.946}/scripts/ecosystem/manifest.toml +0 -0
  275. {code_towel-1.792 → code_towel-1.946}/scripts/ecosystem_check.py +0 -0
  276. {code_towel-1.792 → code_towel-1.946}/scripts/promote_dry_helpers.py +0 -0
  277. {code_towel-1.792 → code_towel-1.946}/scripts/report_net_benefit_diff.py +0 -0
  278. {code_towel-1.792 → code_towel-1.946}/scripts/run_crossfile_coverage.py +0 -0
  279. {code_towel-1.792 → code_towel-1.946}/scripts/set_version.py +0 -0
  280. {code_towel-1.792 → code_towel-1.946}/scripts/trace_proposals.py +0 -0
  281. {code_towel-1.792 → code_towel-1.946}/scripts/verify-examples +0 -0
  282. {code_towel-1.792 → code_towel-1.946}/scripts/verify_release_evidence.py +0 -0
  283. {code_towel-1.792 → code_towel-1.946}/setup.cfg +0 -0
  284. {code_towel-1.792 → code_towel-1.946}/src/code_towel.egg-info/dependency_links.txt +0 -0
  285. {code_towel-1.792 → code_towel-1.946}/src/code_towel.egg-info/entry_points.txt +0 -0
  286. {code_towel-1.792 → code_towel-1.946}/src/code_towel.egg-info/requires.txt +0 -0
  287. {code_towel-1.792 → code_towel-1.946}/src/code_towel.egg-info/top_level.txt +0 -0
  288. {code_towel-1.792 → code_towel-1.946}/src/towel/__init__.py +0 -0
  289. {code_towel-1.792 → code_towel-1.946}/src/towel/_formatting_repeatability.py +0 -0
  290. {code_towel-1.792 → code_towel-1.946}/src/towel/_formatting_worker.py +0 -0
  291. {code_towel-1.792 → code_towel-1.946}/src/towel/_mypy_worker.py +0 -0
  292. {code_towel-1.792 → code_towel-1.946}/src/towel/changes.py +0 -0
  293. {code_towel-1.792 → code_towel-1.946}/src/towel/checker_project.py +0 -0
  294. {code_towel-1.792 → code_towel-1.946}/src/towel/consumers.py +0 -0
  295. {code_towel-1.792 → code_towel-1.946}/src/towel/coverage_config.py +0 -0
  296. {code_towel-1.792 → code_towel-1.946}/src/towel/declared_python.py +0 -0
  297. {code_towel-1.792 → code_towel-1.946}/src/towel/declared_requirements.py +0 -0
  298. {code_towel-1.792 → code_towel-1.946}/src/towel/diagnostics.py +0 -0
  299. {code_towel-1.792 → code_towel-1.946}/src/towel/filesystem.py +0 -0
  300. {code_towel-1.792 → code_towel-1.946}/src/towel/formatting.py +0 -0
  301. {code_towel-1.792 → code_towel-1.946}/src/towel/import_model.py +0 -0
  302. {code_towel-1.792 → code_towel-1.946}/src/towel/mypy_ci_policy.py +0 -0
  303. {code_towel-1.792 → code_towel-1.946}/src/towel/program_files.py +0 -0
  304. {code_towel-1.792 → code_towel-1.946}/src/towel/project_layout.py +0 -0
  305. {code_towel-1.792 → code_towel-1.946}/src/towel/project_tools.py +0 -0
  306. {code_towel-1.792 → code_towel-1.946}/src/towel/py.typed +0 -0
  307. {code_towel-1.792 → code_towel-1.946}/src/towel/pyright_session.py +0 -0
  308. {code_towel-1.792 → code_towel-1.946}/src/towel/reachability.py +0 -0
  309. {code_towel-1.792 → code_towel-1.946}/src/towel/renaming.py +0 -0
  310. {code_towel-1.792 → code_towel-1.946}/src/towel/runtime_guards.py +0 -0
  311. {code_towel-1.792 → code_towel-1.946}/src/towel/shipped_files.py +0 -0
  312. {code_towel-1.792 → code_towel-1.946}/src/towel/source_files.py +0 -0
  313. {code_towel-1.792 → code_towel-1.946}/src/towel/source_text.py +0 -0
  314. {code_towel-1.792 → code_towel-1.946}/src/towel/type_baseline.py +0 -0
  315. {code_towel-1.792 → code_towel-1.946}/src/towel/type_inference.py +0 -0
  316. {code_towel-1.792 → code_towel-1.946}/src/towel/unification/__init__.py +0 -0
  317. {code_towel-1.792 → code_towel-1.946}/src/towel/unification/annotation_imports.py +0 -0
  318. {code_towel-1.792 → code_towel-1.946}/src/towel/unification/assignment_analyzer.py +0 -0
  319. {code_towel-1.792 → code_towel-1.946}/src/towel/unification/binding_context.py +0 -0
  320. {code_towel-1.792 → code_towel-1.946}/src/towel/unification/binding_detector.py +0 -0
  321. {code_towel-1.792 → code_towel-1.946}/src/towel/unification/block_comments.py +0 -0
  322. {code_towel-1.792 → code_towel-1.946}/src/towel/unification/block_signature.py +0 -0
  323. {code_towel-1.792 → code_towel-1.946}/src/towel/unification/builtins.py +0 -0
  324. {code_towel-1.792 → code_towel-1.946}/src/towel/unification/class_private.py +0 -0
  325. {code_towel-1.792 → code_towel-1.946}/src/towel/unification/defaults.py +0 -0
  326. {code_towel-1.792 → code_towel-1.946}/src/towel/unification/definite_assignment.py +0 -0
  327. {code_towel-1.792 → code_towel-1.946}/src/towel/unification/exceptions.py +0 -0
  328. {code_towel-1.792 → code_towel-1.946}/src/towel/unification/extraction_policy.py +0 -0
  329. {code_towel-1.792 → code_towel-1.946}/src/towel/unification/frame_ownership.py +0 -0
  330. {code_towel-1.792 → code_towel-1.946}/src/towel/unification/function_index.py +0 -0
  331. {code_towel-1.792 → code_towel-1.946}/src/towel/unification/function_scope.py +0 -0
  332. {code_towel-1.792 → code_towel-1.946}/src/towel/unification/generic_annotations.py +0 -0
  333. {code_towel-1.792 → code_towel-1.946}/src/towel/unification/insertion.py +0 -0
  334. {code_towel-1.792 → code_towel-1.946}/src/towel/unification/known_platforms.py +0 -0
  335. {code_towel-1.792 → code_towel-1.946}/src/towel/unification/lexical_scopes.py +0 -0
  336. {code_towel-1.792 → code_towel-1.946}/src/towel/unification/orphan_detector.py +0 -0
  337. {code_towel-1.792 → code_towel-1.946}/src/towel/unification/overlap.py +0 -0
  338. {code_towel-1.792 → code_towel-1.946}/src/towel/unification/parallel.py +0 -0
  339. {code_towel-1.792 → code_towel-1.946}/src/towel/unification/parameters.py +0 -0
  340. {code_towel-1.792 → code_towel-1.946}/src/towel/unification/placement.py +0 -0
  341. {code_towel-1.792 → code_towel-1.946}/src/towel/unification/profitability.py +0 -0
  342. {code_towel-1.792 → code_towel-1.946}/src/towel/unification/program_imports.py +0 -0
  343. {code_towel-1.792 → code_towel-1.946}/src/towel/unification/progress.py +0 -0
  344. {code_towel-1.792 → code_towel-1.946}/src/towel/unification/project_layout.py +0 -0
  345. {code_towel-1.792 → code_towel-1.946}/src/towel/unification/protocol_bases.py +0 -0
  346. {code_towel-1.792 → code_towel-1.946}/src/towel/unification/rehearing.py +0 -0
  347. {code_towel-1.792 → code_towel-1.946}/src/towel/unification/retained_bindings.py +0 -0
  348. {code_towel-1.792 → code_towel-1.946}/src/towel/unification/reuse.py +0 -0
  349. {code_towel-1.792 → code_towel-1.946}/src/towel/unification/revealed_types.py +0 -0
  350. {code_towel-1.792 → code_towel-1.946}/src/towel/unification/scope_analyzer.py +0 -0
  351. {code_towel-1.792 → code_towel-1.946}/src/towel/unification/splicing.py +0 -0
  352. {code_towel-1.792 → code_towel-1.946}/src/towel/unification/statement_facts.py +0 -0
  353. {code_towel-1.792 → code_towel-1.946}/src/towel/unification/static_positions.py +0 -0
  354. {code_towel-1.792 → code_towel-1.946}/src/towel/unification/type_bindings.py +0 -0
  355. {code_towel-1.792 → code_towel-1.946}/src/towel/unification/type_generalization.py +0 -0
  356. {code_towel-1.792 → code_towel-1.946}/src/towel/unification/visitors.py +0 -0
  357. {code_towel-1.792 → code_towel-1.946}/test_examples/annotated_module.py +0 -0
  358. {code_towel-1.792 → code_towel-1.946}/test_examples/binding_constructs_comprehensive.py +0 -0
  359. {code_towel-1.792 → code_towel-1.946}/test_examples/bindings_comprehensions.py +0 -0
  360. {code_towel-1.792 → code_towel-1.946}/test_examples/bindings_for_loops.py +0 -0
  361. {code_towel-1.792 → code_towel-1.946}/test_examples/closure_adversarial.py +0 -0
  362. {code_towel-1.792 → code_towel-1.946}/test_examples/complex_expressions.py +0 -0
  363. {code_towel-1.792 → code_towel-1.946}/test_examples/control_flow_adversarial.py +0 -0
  364. {code_towel-1.792 → code_towel-1.946}/test_examples/edge_cases_stress_test.py +0 -0
  365. {code_towel-1.792 → code_towel-1.946}/test_examples/example1_simple.py +0 -0
  366. {code_towel-1.792 → code_towel-1.946}/test_examples/example2_classes.py +0 -0
  367. {code_towel-1.792 → code_towel-1.946}/test_examples/example3_file1.py +0 -0
  368. {code_towel-1.792 → code_towel-1.946}/test_examples/example3_file2.py +0 -0
  369. {code_towel-1.792 → code_towel-1.946}/test_examples/example4_complex.py +0 -0
  370. {code_towel-1.792 → code_towel-1.946}/test_examples/exception_adversarial.py +0 -0
  371. {code_towel-1.792 → code_towel-1.946}/test_examples/fstrings_constants.py +0 -0
  372. {code_towel-1.792 → code_towel-1.946}/test_examples/functional_patterns.py +0 -0
  373. {code_towel-1.792 → code_towel-1.946}/test_examples/generators_async.py +0 -0
  374. {code_towel-1.792 → code_towel-1.946}/test_examples/global_nonlocal_examples.py +0 -0
  375. {code_towel-1.792 → code_towel-1.946}/test_examples/hygienic_naming.py +0 -0
  376. {code_towel-1.792 → code_towel-1.946}/test_examples/method_chains.py +0 -0
  377. {code_towel-1.792 → code_towel-1.946}/test_examples/nested_structures.py +0 -0
  378. {code_towel-1.792 → code_towel-1.946}/test_examples/real_world_patterns.py +0 -0
  379. {code_towel-1.792 → code_towel-1.946}/test_examples/referential_transparency.py +0 -0
  380. {code_towel-1.792 → code_towel-1.946}/test_examples/return_values.py +0 -0
  381. {code_towel-1.792 → code_towel-1.946}/test_examples/scoping_edge_cases.py +0 -0
  382. {code_towel-1.792 → code_towel-1.946}/test_examples/side_effects_adversarial.py +0 -0
  383. {code_towel-1.792 → code_towel-1.946}/test_examples/syntactic_coverage_comprehensive.py +0 -0
  384. {code_towel-1.792 → code_towel-1.946}/test_examples/tricky_edge_cases_adversarial.py +0 -0
  385. {code_towel-1.792 → code_towel-1.946}/test_examples_crossfile/class_hierarchy/base_record.py +0 -0
  386. {code_towel-1.792 → code_towel-1.946}/test_examples_crossfile/class_hierarchy/scored_record.py +0 -0
  387. {code_towel-1.792 → code_towel-1.946}/test_examples_crossfile/multi_level/api/checkout.py +0 -0
  388. {code_towel-1.792 → code_towel-1.946}/test_examples_crossfile/multi_level/core/services/payment.py +0 -0
  389. {code_towel-1.792 → code_towel-1.946}/test_examples_crossfile/multi_level/utils/validators.py +0 -0
  390. {code_towel-1.792 → code_towel-1.946}/test_examples_crossfile/nested_structure/lib/report_generator.py +0 -0
  391. {code_towel-1.792 → code_towel-1.946}/test_examples_crossfile/nested_structure/src/data_processor.py +0 -0
  392. {code_towel-1.792 → code_towel-1.946}/test_examples_crossfile/simple_crossfile/admin_service.py +0 -0
  393. {code_towel-1.792 → code_towel-1.946}/test_examples_crossfile/simple_crossfile/user_service.py +0 -0
  394. {code_towel-1.792 → code_towel-1.946}/test_examples_crossfile_expected_output/class_hierarchy/base_record.py +0 -0
  395. {code_towel-1.792 → code_towel-1.946}/test_examples_crossfile_expected_output/class_hierarchy/scored_record.py +0 -0
  396. {code_towel-1.792 → code_towel-1.946}/test_examples_crossfile_expected_output/multi_level/api/checkout.py +0 -0
  397. {code_towel-1.792 → code_towel-1.946}/test_examples_crossfile_expected_output/multi_level/core/services/payment.py +0 -0
  398. {code_towel-1.792 → code_towel-1.946}/test_examples_crossfile_expected_output/multi_level/utils/validators.py +0 -0
  399. {code_towel-1.792 → code_towel-1.946}/test_examples_crossfile_expected_output/nested_structure/lib/report_generator.py +0 -0
  400. {code_towel-1.792 → code_towel-1.946}/test_examples_crossfile_expected_output/nested_structure/src/data_processor.py +0 -0
  401. {code_towel-1.792 → code_towel-1.946}/test_examples_crossfile_expected_output/simple_crossfile/admin_service.py +0 -0
  402. {code_towel-1.792 → code_towel-1.946}/test_examples_crossfile_expected_output/simple_crossfile/user_service.py +0 -0
  403. {code_towel-1.792 → code_towel-1.946}/test_examples_expected_output/annotated_module.py +0 -0
  404. {code_towel-1.792 → code_towel-1.946}/test_examples_expected_output/binding_constructs_comprehensive.py +0 -0
  405. {code_towel-1.792 → code_towel-1.946}/test_examples_expected_output/bindings_comprehensions.py +0 -0
  406. {code_towel-1.792 → code_towel-1.946}/test_examples_expected_output/bindings_for_loops.py +0 -0
  407. {code_towel-1.792 → code_towel-1.946}/test_examples_expected_output/closure_adversarial.py +0 -0
  408. {code_towel-1.792 → code_towel-1.946}/test_examples_expected_output/complex_expressions.py +0 -0
  409. {code_towel-1.792 → code_towel-1.946}/test_examples_expected_output/control_flow_adversarial.py +0 -0
  410. {code_towel-1.792 → code_towel-1.946}/test_examples_expected_output/edge_cases_stress_test.py +0 -0
  411. {code_towel-1.792 → code_towel-1.946}/test_examples_expected_output/example1_simple.py +0 -0
  412. {code_towel-1.792 → code_towel-1.946}/test_examples_expected_output/example2_classes.py +0 -0
  413. {code_towel-1.792 → code_towel-1.946}/test_examples_expected_output/example3_file1.py +0 -0
  414. {code_towel-1.792 → code_towel-1.946}/test_examples_expected_output/example3_file2.py +0 -0
  415. {code_towel-1.792 → code_towel-1.946}/test_examples_expected_output/example4_complex.py +0 -0
  416. {code_towel-1.792 → code_towel-1.946}/test_examples_expected_output/exception_adversarial.py +0 -0
  417. {code_towel-1.792 → code_towel-1.946}/test_examples_expected_output/fstrings_constants.py +0 -0
  418. {code_towel-1.792 → code_towel-1.946}/test_examples_expected_output/functional_patterns.py +0 -0
  419. {code_towel-1.792 → code_towel-1.946}/test_examples_expected_output/generators_async.py +0 -0
  420. {code_towel-1.792 → code_towel-1.946}/test_examples_expected_output/global_nonlocal_examples.py +0 -0
  421. {code_towel-1.792 → code_towel-1.946}/test_examples_expected_output/hygienic_naming.py +0 -0
  422. {code_towel-1.792 → code_towel-1.946}/test_examples_expected_output/method_chains.py +0 -0
  423. {code_towel-1.792 → code_towel-1.946}/test_examples_expected_output/nested_structures.py +0 -0
  424. {code_towel-1.792 → code_towel-1.946}/test_examples_expected_output/parameter_cells/edge_cases_stress_test.py +0 -0
  425. {code_towel-1.792 → code_towel-1.946}/test_examples_expected_output/parameter_cells/method_chains.py +0 -0
  426. {code_towel-1.792 → code_towel-1.946}/test_examples_expected_output/parameter_cells/nested_structures.py +0 -0
  427. {code_towel-1.792 → code_towel-1.946}/test_examples_expected_output/parameter_cells/syntactic_coverage_comprehensive.py +0 -0
  428. {code_towel-1.792 → code_towel-1.946}/test_examples_expected_output/real_world_patterns.py +0 -0
  429. {code_towel-1.792 → code_towel-1.946}/test_examples_expected_output/referential_transparency.py +0 -0
  430. {code_towel-1.792 → code_towel-1.946}/test_examples_expected_output/return_values.py +0 -0
  431. {code_towel-1.792 → code_towel-1.946}/test_examples_expected_output/scoping_edge_cases.py +0 -0
  432. {code_towel-1.792 → code_towel-1.946}/test_examples_expected_output/side_effects_adversarial.py +0 -0
  433. {code_towel-1.792 → code_towel-1.946}/test_examples_expected_output/syntactic_coverage_comprehensive.py +0 -0
  434. {code_towel-1.792 → code_towel-1.946}/test_examples_expected_output/tricky_edge_cases_adversarial.py +0 -0
  435. {code_towel-1.792 → code_towel-1.946}/tests/OBSERVATIONAL_EQUIVALENCE.md +0 -0
  436. {code_towel-1.792 → code_towel-1.946}/tests/__init__.py +0 -0
  437. {code_towel-1.792 → code_towel-1.946}/tests/audit_defects.py +0 -0
  438. {code_towel-1.792 → code_towel-1.946}/tests/automatic_equivalence_tester.py +0 -0
  439. {code_towel-1.792 → code_towel-1.946}/tests/compiler_golden_profiles.py +0 -0
  440. {code_towel-1.792 → code_towel-1.946}/tests/conftest.py +0 -0
  441. {code_towel-1.792 → code_towel-1.946}/tests/crossfile_equivalence_tester.py +0 -0
  442. {code_towel-1.792 → code_towel-1.946}/tests/differential/__init__.py +0 -0
  443. {code_towel-1.792 → code_towel-1.946}/tests/differential/cases.py +0 -0
  444. {code_towel-1.792 → code_towel-1.946}/tests/differential/comparison.py +0 -0
  445. {code_towel-1.792 → code_towel-1.946}/tests/differential/export.py +0 -0
  446. {code_towel-1.792 → code_towel-1.946}/tests/differential/fuzz.py +0 -0
  447. {code_towel-1.792 → code_towel-1.946}/tests/differential/grammar.py +0 -0
  448. {code_towel-1.792 → code_towel-1.946}/tests/differential/observer.py +0 -0
  449. {code_towel-1.792 → code_towel-1.946}/tests/differential/runner.py +0 -0
  450. {code_towel-1.792 → code_towel-1.946}/tests/differential/scope_grammar.py +0 -0
  451. {code_towel-1.792 → code_towel-1.946}/tests/ecosystem_context_sources/bottle/pyproject.toml +0 -0
  452. {code_towel-1.792 → code_towel-1.946}/tests/ecosystem_context_sources/httpx/pyproject.toml +0 -0
  453. {code_towel-1.792 → code_towel-1.946}/tests/ecosystem_context_sources/index.json +0 -0
  454. {code_towel-1.792 → code_towel-1.946}/tests/ecosystem_context_sources/jinja2/.pre-commit-config.yaml +0 -0
  455. {code_towel-1.792 → code_towel-1.946}/tests/ecosystem_context_sources/jinja2/pyproject.toml +0 -0
  456. {code_towel-1.792 → code_towel-1.946}/tests/ecosystem_context_sources/jinja2/uv.lock +0 -0
  457. {code_towel-1.792 → code_towel-1.946}/tests/ecosystem_context_sources/markdown-it-py/.pre-commit-config.yaml +0 -0
  458. {code_towel-1.792 → code_towel-1.946}/tests/ecosystem_context_sources/markdown-it-py/pyproject.toml +0 -0
  459. {code_towel-1.792 → code_towel-1.946}/tests/ecosystem_context_sources/networkx/.pre-commit-config.yaml +0 -0
  460. {code_towel-1.792 → code_towel-1.946}/tests/ecosystem_context_sources/networkx/pyproject.toml +0 -0
  461. {code_towel-1.792 → code_towel-1.946}/tests/ecosystem_context_sources/rich/.pre-commit-config.yaml +0 -0
  462. {code_towel-1.792 → code_towel-1.946}/tests/ecosystem_context_sources/rich/poetry.lock +0 -0
  463. {code_towel-1.792 → code_towel-1.946}/tests/ecosystem_context_sources/rich/pyproject.toml +0 -0
  464. {code_towel-1.792 → code_towel-1.946}/tests/ecosystem_context_sources/soupsieve/pyproject.toml +0 -0
  465. {code_towel-1.792 → code_towel-1.946}/tests/ecosystem_context_sources/starlette/pyproject.toml +0 -0
  466. {code_towel-1.792 → code_towel-1.946}/tests/ecosystem_context_sources/starlette/uv.lock +0 -0
  467. {code_towel-1.792 → code_towel-1.946}/tests/ecosystem_context_sources/tenacity/pyproject.toml +0 -0
  468. {code_towel-1.792 → code_towel-1.946}/tests/ecosystem_context_sources/towel-main/.pre-commit-config.yaml +0 -0
  469. {code_towel-1.792 → code_towel-1.946}/tests/ecosystem_context_sources/towel-main/pyproject.toml +0 -0
  470. {code_towel-1.792 → code_towel-1.946}/tests/ecosystem_context_sources/towel-main/uv.lock +0 -0
  471. {code_towel-1.792 → code_towel-1.946}/tests/ecosystem_fixtures.py +0 -0
  472. {code_towel-1.792 → code_towel-1.946}/tests/edge_case_values.py +0 -0
  473. {code_towel-1.792 → code_towel-1.946}/tests/equivalence_targets.py +0 -0
  474. {code_towel-1.792 → code_towel-1.946}/tests/generate_baseline.py +0 -0
  475. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/h01_side_effect_order.py +0 -0
  476. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/h02_conditional_eval.py +0 -0
  477. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/h03_loop_reeval.py +0 -0
  478. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/h04_closure_freevar.py +0 -0
  479. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/h05_cond_return_plus_retvar.py +0 -0
  480. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/h06_del_in_block.py +0 -0
  481. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/h07_except_unbind.py +0 -0
  482. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/h08_late_binding_closure.py +0 -0
  483. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/h10_short_circuit.py +0 -0
  484. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/h13_dunder_file.py +0 -0
  485. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/h26_match_capture.py +0 -0
  486. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/h38_closure_after_block.py +0 -0
  487. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/h39_augassign_after_block.py +0 -0
  488. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/h51_semicolons.py +0 -0
  489. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/h52_del_after_block.py +0 -0
  490. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/h53_nested_func_reads_retvar.py +0 -0
  491. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/h54_attr_param_property.py +0 -0
  492. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/h55_walrus_used_after.py +0 -0
  493. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/h56_global_write.py +0 -0
  494. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/h57_exception_in_param.py +0 -0
  495. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/h58_nested_def_freevar_reassigned.py +0 -0
  496. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/h59_retvar_conditional_unbound.py +0 -0
  497. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/h60_finally_return.py +0 -0
  498. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/h61_str_method_param.py +0 -0
  499. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/p01_static_helper_class_name_shadowed_by_parameter.py +0 -0
  500. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/p02_static_helper_class_deleted.py +0 -0
  501. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/p03_static_helper_mangled_class_name.py +0 -0
  502. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/p04_static_helper_class_decorator_returns_factory.py +0 -0
  503. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/p05_static_helper_class_global_rebound.py +0 -0
  504. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/p06_static_helper_called_while_class_body_runs.py +0 -0
  505. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/p07_static_methods_called_while_class_body_runs.py +0 -0
  506. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/p08_classmethod_never_using_cls.py +0 -0
  507. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/p09_static_helper_metaclass_hides_attribute.py +0 -0
  508. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/p10_one_line_exception_base.py +0 -0
  509. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/p11_one_line_base_docstring_and_assignment.py +0 -0
  510. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/p12_one_line_body_after_a_split_header.py +0 -0
  511. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/p13_protocol_default_methods.py +0 -0
  512. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/p14_protocol_common_ancestor.py +0 -0
  513. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/p15_class_decorator_rebuilds_namespace.py +0 -0
  514. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/p16_class_decorator_wraps_every_function.py +0 -0
  515. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/p17_decorated_base_rebuilds_namespace.py +0 -0
  516. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/p18_known_class_decorators_keep_the_helper.py +0 -0
  517. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/p19_thunk_of_possibly_unbound_local.py +0 -0
  518. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/p20_thunk_of_loop_variable.py +0 -0
  519. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/p21_helper_placed_after_an_assignment_that_calls_it.py +0 -0
  520. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r01_property_thunk_order.py +0 -0
  521. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r02_cluster_attrs.py +0 -0
  522. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r07_attr_two_positions.py +0 -0
  523. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r100_clustered_site_with_live_binding.py +0 -0
  524. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r101_same_named_method_forces_module_helper.py +0 -0
  525. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r102_whole_body_reuse.py +0 -0
  526. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r103_lambda_parameter_spelling.py +0 -0
  527. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r104_walrus_target_spelling.py +0 -0
  528. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r105_closure_over_block_bound_name_rebound_after.py +0 -0
  529. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r106_dir_reads_the_frame.py +0 -0
  530. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r107_unbound_global_argument.py +0 -0
  531. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r108_clustered_sites_assign_the_returned_name.py +0 -0
  532. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r109_eager_optional_import_failed.py +0 -0
  533. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r110_eager_type_checking_import.py +0 -0
  534. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r111_eager_module_except_as_name.py +0 -0
  535. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r112_eager_module_match_capture_unmatched.py +0 -0
  536. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r113_eager_class_attr_in_method.py +0 -0
  537. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r114_eager_nested_class_attr.py +0 -0
  538. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r115_eager_class_in_function_attr.py +0 -0
  539. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r116_eager_enclosing_bound_after_inner_call.py +0 -0
  540. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r117_eager_enclosing_deleted_before_inner_call.py +0 -0
  541. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r118_eager_enclosing_conditionally_bound.py +0 -0
  542. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r119_eager_module_def_and_class_after_call.py +0 -0
  543. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r11_same_function_pair.py +0 -0
  544. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r120_eager_module_import_after_call.py +0 -0
  545. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r121_eager_comprehension_variable.py +0 -0
  546. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r122_eager_lambda_parameter.py +0 -0
  547. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r123_direct_eval_after_block.py +0 -0
  548. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r124_eval_alias_reads_preblock_name.py +0 -0
  549. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r125_locals_dir_after_block.py +0 -0
  550. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r126_locals_in_nested_scope.py +0 -0
  551. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r127_eval_alias_partial_block.py +0 -0
  552. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r128_warn_stacklevel_via_alias.py +0 -0
  553. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r129_warning_registry_dedup.py +0 -0
  554. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r130_resource_observed_after_block_differs.py +0 -0
  555. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r131_weakref_and_id_identity.py +0 -0
  556. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r132_async_comprehension_in_block.py +0 -0
  557. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r133_formfeed.py +0 -0
  558. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r134_u2028_in_comment_shifts_splice.py +0 -0
  559. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r135_formfeed_line_shifts_splice.py +0 -0
  560. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r136_u2028_in_string_literal.py +0 -0
  561. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r137_x1c_x85_in_comment.py +0 -0
  562. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r138_u2028_comment_same_indent_neighbours.py +0 -0
  563. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r139_literal_roundtrip.py +0 -0
  564. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r140_unbound_name_on_untaken_branch.py +0 -0
  565. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r141_module_name_bound_after_an_early_call.py +0 -0
  566. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r142_module_data_rebound_by_callback.py +0 -0
  567. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r143_module_name_shadowed_by_a_local_elsewhere.py +0 -0
  568. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r144_class_cell_in_a_method_helper.py +0 -0
  569. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r145_getframe_assigned_alias.py +0 -0
  570. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r146_module_function_reads_caller_frame.py +0 -0
  571. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r147_wide_int_literal.py +0 -0
  572. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r148_equal_constants_of_different_types.py +0 -0
  573. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r149_match_pattern_reads_caller_names.py +0 -0
  574. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r14_starred_param.py +0 -0
  575. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r150_pattern_parts_that_differ.py +0 -0
  576. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r151_pattern_names_that_may_differ.py +0 -0
  577. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r152_definition_time_reads.py +0 -0
  578. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r153_class_definition_reads.py +0 -0
  579. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r154_bare_annotation_reads_the_caller.py +0 -0
  580. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r155_lazy_type_values_close_over_caller_names.pynew +0 -0
  581. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r156_created_objects_that_escape.py +0 -0
  582. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r157_created_objects_only_called.py +0 -0
  583. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r158_getattr_serves_unknown_names_from_data.py +0 -0
  584. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r159_frame_handle_before_a_nested_block.py +0 -0
  585. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r160_host_binds_any_before_its_last_import.py +0 -0
  586. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r161_module_with_all_gains_no_public_name.py +0 -0
  587. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r162_host_star_imports_callable.py +0 -0
  588. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r1792_aliased_suppress_conditional_read.py +0 -0
  589. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r1792_external_exception_partial.py +0 -0
  590. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r1792_factory_finalizer_continuation.py +0 -0
  591. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r1792_factory_finalizer_order.py +0 -0
  592. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r1792_formatting_destination_indentation.py +0 -0
  593. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r1792_protocol_caught_exception.py +0 -0
  594. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r1792_protocol_context_target.py +0 -0
  595. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r1792_protocol_explicit_call_control.py +0 -0
  596. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r1792_protocol_iteration_target.py +0 -0
  597. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r1792_protocol_nested_if.py +0 -0
  598. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r1792_protocol_operator.py +0 -0
  599. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r1792_protocol_property.py +0 -0
  600. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r1792_protocol_subscript.py +0 -0
  601. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r1792_value_return_owner.py +0 -0
  602. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r22_fstring_attr.py +0 -0
  603. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r26_attr_store_param.py +0 -0
  604. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r27_del_subscript.py +0 -0
  605. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r32_method_callee.py +0 -0
  606. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r38_name_two_positions.py +0 -0
  607. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r39_cluster_alpha.py +0 -0
  608. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r40_class_hierarchy.py +0 -0
  609. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r41_conditional_call_param.py +0 -0
  610. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r42_loop_call_param.py +0 -0
  611. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r43_opaque_decorator_receiver.py +0 -0
  612. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r44_cluster_nested_overlap.py +0 -0
  613. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r45_async_no_await.py +0 -0
  614. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r46_nonlocal_counter.py +0 -0
  615. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r47_lru_cache_method.py +0 -0
  616. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r50_helper_name_collision.py +0 -0
  617. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r53_try_else_binding.py +0 -0
  618. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r54_with_binding_used_after.py +0 -0
  619. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r55_chained_assign.py +0 -0
  620. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r57_star_unpack.py +0 -0
  621. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r58_escaping_closure.py +0 -0
  622. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r60_local_import.py +0 -0
  623. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r61_same_function_clean.py +0 -0
  624. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r62_recursion.py +0 -0
  625. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r63_except_var_used_in_handler.py +0 -0
  626. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r66_conditional_callee.py +0 -0
  627. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r69_annassign.py +0 -0
  628. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r72_global_promoted.py +0 -0
  629. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r73_slice_vs_index.py +0 -0
  630. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r74_starred_vs_plain.py +0 -0
  631. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r75_prior_helper_param_names.py +0 -0
  632. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r76_return_order.py +0 -0
  633. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r77_mixed_return_and_variables.py +0 -0
  634. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r78_walrus_in_parameter.py +0 -0
  635. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r79_list_display_in_loop.py +0 -0
  636. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7bi_augassign_and_del_after_block.py +0 -0
  637. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7bi_except_name_in_nested_block.py +0 -0
  638. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7bi_loop_capture_def_rebind_prebound.py +0 -0
  639. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7bi_loop_del_before_eager_read.py +0 -0
  640. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7bi_read_before_own_binding.py +0 -0
  641. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7bi_renamed_binder_named_by_unbound_error.py +0 -0
  642. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7c_loop_copy_beside_a_top_level_twin.py +0 -0
  643. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7c_mangled_import_names.py +0 -0
  644. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7c_mangled_parameter_passed_by_keyword.py +0 -0
  645. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7c_mangled_parameter_passed_by_keyword_in_a_method_helper.py +0 -0
  646. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7c_rebinding_enclosing_function_beside_a_benign_twin.py +0 -0
  647. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7c_top_level_copy_beside_a_loop_copy.py +0 -0
  648. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7c_unmangled_parameter_passed_by_keyword.py +0 -0
  649. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7d_instrumenting_call_applied_by_hand.py +0 -0
  650. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7d_instrumenting_class_decorator.py +0 -0
  651. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7d_instrumenting_enclosing_function.py +0 -0
  652. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7d_instrumenting_function_decorator.py +0 -0
  653. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7d_metaclass_recompiles_methods.py +0 -0
  654. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7d_method_helper_in_a_testcase.py +0 -0
  655. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7d_plain_wrapper_applied_by_hand.py +0 -0
  656. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7d_plain_wrapper_decorator.py +0 -0
  657. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_binding_builtin_rebound_mid_module.py +0 -0
  658. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_binding_cell_filled_late.py +0 -0
  659. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_binding_cell_read_before_fill.py +0 -0
  660. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_binding_class_attr_vs_local.py +0 -0
  661. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_binding_dunder_name_file_samemodule.py +0 -0
  662. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_binding_global_rebound_by_callee.py +0 -0
  663. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_binding_global_vs_local.py +0 -0
  664. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_binding_loop_var_leak.py +0 -0
  665. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_binding_module_getattr.py +0 -0
  666. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_binding_unbound_local_handler.py +0 -0
  667. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_builtins_differ_in_builtin.py +0 -0
  668. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_builtins_mock_patch_module.py +0 -0
  669. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_builtins_module_shadows_len.py +0 -0
  670. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_builtins_param_named_len.py +0 -0
  671. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_builtins_print_shadowed_local.py +0 -0
  672. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_classhost_dataclass_slots_super.py +0 -0
  673. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_classhost_dunder_class_same_class.py +0 -0
  674. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_classhost_enum_methods.py +0 -0
  675. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_classhost_getattr_fallback.py +0 -0
  676. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_classhost_init_subclass_wraps.py +0 -0
  677. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_classhost_metaclass_registry.py +0 -0
  678. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_classhost_private_same_class.py +0 -0
  679. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_classhost_siblings_plain.py +0 -0
  680. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_classhost_underscore_class_names.py +0 -0
  681. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_classhost_zero_arg_super.py +0 -0
  682. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_cluster_K_cell.py +0 -0
  683. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_cluster_generator_site.py +0 -0
  684. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_cluster_local_K.py +0 -0
  685. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_cluster_method_site.py +0 -0
  686. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_ctrl_break_in_try_finally.py +0 -0
  687. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_ctrl_match_class_pattern.py +0 -0
  688. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_ctrl_nested_try.py +0 -0
  689. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_ctrl_suppress_context.py +0 -0
  690. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_ctrl_walrus_while.py +0 -0
  691. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_directives_fmt_off_region.py +0 -0
  692. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_directives_noqa_on_argument.py +0 -0
  693. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_directives_pragma_branch.py +0 -0
  694. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_directives_type_ignore_line.py +0 -0
  695. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_extra_pragma_with_header.py +0 -0
  696. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_grammar_t11254_read_before_bind.py +0 -0
  697. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_grammar_u0217_read_before_bind.py +0 -0
  698. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_grammar_u0417_augassign_after_block.py +0 -0
  699. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_grammar_u0898_for_target_prebound.py +0 -0
  700. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_late_after_block_augassign.py +0 -0
  701. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_late_after_block_del.py +0 -0
  702. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_literals_cast_literal.py +0 -0
  703. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_literals_enum_functional.py +0 -0
  704. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_literals_gettext_differ.py +0 -0
  705. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_literals_typevar_name.py +0 -0
  706. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_misc_async_no_await.py +0 -0
  707. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_misc_binder_renamed_del_message.py +0 -0
  708. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_misc_binder_renamed_unbound_message_inner.py +0 -0
  709. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_misc_block_raises_in_handler_context.py +0 -0
  710. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_misc_decorated_lru_cache.py +0 -0
  711. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_misc_except_star_reraise.py +0 -0
  712. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_misc_generator_return_block.py +0 -0
  713. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_misc_mutable_default_host.py +0 -0
  714. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_misc_nested_host_called_early.py +0 -0
  715. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_misc_super_inside_block.py +0 -0
  716. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_prebound_class_conditional_rebind.py +0 -0
  717. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_prebound_def_conditional_rebind.py +0 -0
  718. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_prebound_for_else_prebound.py +0 -0
  719. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_prebound_for_read_in_block.py +0 -0
  720. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_prebound_for_target_attr_prebound.py +0 -0
  721. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_prebound_for_tuple_target.py +0 -0
  722. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_prebound_match_capture_prebound.py +0 -0
  723. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_prebound_try_except_else_bind.py +0 -0
  724. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_prebound_while_walrus_prebound.py +0 -0
  725. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_prebound_with_enter_raises_caught.py +0 -0
  726. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_srctext_bom.py +0 -0
  727. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_srctext_cp1252_quotes.py +0 -0
  728. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_srctext_crlf.py +0 -0
  729. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_srctext_form_feed.py +0 -0
  730. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_srctext_fstring_nested_quotes.py +0 -0
  731. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_srctext_latin1_literals.py +0 -0
  732. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_srctext_named_escape.py +0 -0
  733. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_srctext_semicolons_continuations.py +0 -0
  734. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_srctext_tabs_indent.py +0 -0
  735. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_thunks2_dict_unhashable.py +0 -0
  736. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_thunks2_dict_unpack.py +0 -0
  737. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_thunks2_lambda_default.py +0 -0
  738. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_thunks2_lambda_kwdefault.py +0 -0
  739. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_thunks2_list_starred.py +0 -0
  740. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_thunks2_plain_first.py +0 -0
  741. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_thunks2_property_first.py +0 -0
  742. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_thunks2_set_hash_effect.py +0 -0
  743. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_thunks2_set_unhashable.py +0 -0
  744. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_thunks2_tuple_starred.py +0 -0
  745. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_thunks2_two_thunks_order.py +0 -0
  746. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_thunks2_undefined_global.py +0 -0
  747. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_thunks_call_arg_order.py +0 -0
  748. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_thunks_conditional.py +0 -0
  749. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_thunks_dict_order.py +0 -0
  750. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_thunks_lambda_default_first.py +0 -0
  751. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_thunks_match_guard.py +0 -0
  752. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7fz_thunks_short_circuit_and.py +0 -0
  753. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7sp_block_ends_before_a_semicolon.py +0 -0
  754. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7sp_block_starts_after_a_semicolon.py +0 -0
  755. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7sp_directive_on_a_shared_line.py +0 -0
  756. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7sp_thunk_after_a_lambda_default.py +0 -0
  757. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7sp_thunk_after_a_raise.py +0 -0
  758. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7sp_thunk_after_a_set_display.py +0 -0
  759. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7sp_thunk_after_a_starred_display.py +0 -0
  760. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r7sp_thunk_after_an_unbound_global_read.py +0 -0
  761. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r80_inlined_leading_thunk.py +0 -0
  762. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r81_conditionally_bound_free_variable.py +0 -0
  763. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r82_local_classes_same_name.py +0 -0
  764. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r83_tab_indented_class.py +0 -0
  765. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r84_warn_stacklevel.py +0 -0
  766. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r85_conditionally_bound_parameter.py +0 -0
  767. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r86_annotated_assignment_live.py +0 -0
  768. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r87_nested_function_in_method.py +0 -0
  769. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r88_elif_branch.py +0 -0
  770. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r89_conditionally_bound_return.py +0 -0
  771. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r90_cluster_across_classes.py +0 -0
  772. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r91_class_body_helper.py +0 -0
  773. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r92_parameterless_class_body_helper.py +0 -0
  774. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r93_import_name_differs.py +0 -0
  775. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r94_import_binds_live_name.py +0 -0
  776. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r95_type_checking_annotation.py +0 -0
  777. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r96_unpacked_targets_live.py +0 -0
  778. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r97_helper_in_function_with_outside_site.py +0 -0
  779. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r98_same_named_methods_nested_helpers.py +0 -0
  780. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r99_partial_return_branches.py +0 -0
  781. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r9bd_augmented_builtin_read_in_block.py +0 -0
  782. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r9bd_global_bound_by_every_binder.py +0 -0
  783. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r9bd_global_declared_at_one_site.py +0 -0
  784. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r9bd_only_binding_deleted_read_after.py +0 -0
  785. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r9bd_only_binding_every_binder.py +0 -0
  786. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r9bd_only_binding_kept_local.py +0 -0
  787. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r9bd_only_binding_read_before_block.py +0 -0
  788. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r9bd_only_binding_read_by_nested_scopes.py +0 -0
  789. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r9bd_type_alias_only_binding.pynew +0 -0
  790. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r9dc_stacked_decoration_by_hand.py +0 -0
  791. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r9dr_fmt_off_layout_moves_verbatim.py +0 -0
  792. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r9dr_region_directive_around_block.py +0 -0
  793. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r9sb_binding_target_loads.py +0 -0
  794. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r9sb_fstring_format_spec.py +0 -0
  795. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r9sb_lambda_parameter_capture.py +0 -0
  796. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/r9sb_thunk_meets_inlined_comprehension.py +0 -0
  797. {code_towel-1.792 → code_towel-1.946}/tests/hostile_cases/rmypyoverlay_constructor_fields.py +0 -0
  798. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/r9dc_decorator_rebound_by_another_module/enable_checks.py +0 -0
  799. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/r9dc_decorator_rebound_by_another_module/pkg/__init__.py +0 -0
  800. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/r9dc_decorator_rebound_by_another_module/pkg/checks.py +0 -0
  801. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/r9dc_decorator_rebound_by_another_module/pkg/core.py +0 -0
  802. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/r9dc_decorator_rebound_by_another_module/run.py +0 -0
  803. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/r9dc_star_import_binds_an_instrumenting_decorator/pkg/__init__.py +0 -0
  804. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/r9dc_star_import_binds_an_instrumenting_decorator/pkg/common.py +0 -0
  805. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/r9dc_star_import_binds_an_instrumenting_decorator/pkg/shapes.py +0 -0
  806. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/r9dc_star_import_binds_an_instrumenting_decorator/run.py +0 -0
  807. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/r9dc_star_import_of_a_module_part_way_through_a_cycle/pkg/__init__.py +0 -0
  808. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/r9dc_star_import_of_a_module_part_way_through_a_cycle/pkg/common.py +0 -0
  809. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/r9dc_star_import_of_a_module_part_way_through_a_cycle/pkg/shapes.py +0 -0
  810. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/r9dc_star_import_of_a_module_part_way_through_a_cycle/run.py +0 -0
  811. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/r9dc_star_import_that_cannot_bind_a_decorator/pkg/__init__.py +0 -0
  812. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/r9dc_star_import_that_cannot_bind_a_decorator/pkg/common.py +0 -0
  813. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/r9dc_star_import_that_cannot_bind_a_decorator/pkg/shapes.py +0 -0
  814. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/r9dc_star_import_that_cannot_bind_a_decorator/run.py +0 -0
  815. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/r9sb_lambda_capture_across_modules/pkg/__init__.py +0 -0
  816. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/r9sb_lambda_capture_across_modules/pkg/orders.py +0 -0
  817. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/r9sb_lambda_capture_across_modules/pkg/quotes.py +0 -0
  818. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/r9sb_lambda_capture_across_modules/pyproject.toml +0 -0
  819. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/r9sb_lambda_capture_across_modules/run.py +0 -0
  820. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/r9sr_inline_snapshot/inline_snapshot.py +0 -0
  821. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/r9sr_inline_snapshot/pkg/__init__.py +0 -0
  822. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/r9sr_inline_snapshot/pkg/check_render.py +0 -0
  823. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/r9sr_inline_snapshot/pytest.ini +0 -0
  824. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/r9sr_inline_snapshot/run.py +0 -0
  825. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf10_reuse_existing_function/pkg/__init__.py +0 -0
  826. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf10_reuse_existing_function/pkg/a.py +0 -0
  827. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf10_reuse_existing_function/pkg/b.py +0 -0
  828. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf10_reuse_existing_function/run.py +0 -0
  829. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf11_package_init_reaches_back/pkg/__init__.py +0 -0
  830. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf11_package_init_reaches_back/pkg/detail.py +0 -0
  831. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf11_package_init_reaches_back/run.py +0 -0
  832. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf12_cycle_through_package_init/pkg/__init__.py +0 -0
  833. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf12_cycle_through_package_init/pkg/core.py +0 -0
  834. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf12_cycle_through_package_init/pkg/sub/__init__.py +0 -0
  835. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf12_cycle_through_package_init/pkg/sub/leaf.py +0 -0
  836. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf12_cycle_through_package_init/pkg/vendor/__init__.py +0 -0
  837. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf12_cycle_through_package_init/pkg/vendor/tool.py +0 -0
  838. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf12_cycle_through_package_init/run.py +0 -0
  839. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf13_import_time_effects/pkg/__init__.py +0 -0
  840. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf13_import_time_effects/pkg/a.py +0 -0
  841. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf13_import_time_effects/pkg/b.py +0 -0
  842. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf13_import_time_effects/run.py +0 -0
  843. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf14_script_with_leading_statement/pkg/__init__.py +0 -0
  844. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf14_script_with_leading_statement/pkg/app.py +0 -0
  845. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf14_script_with_leading_statement/pkg/util.py +0 -0
  846. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf14_script_with_leading_statement/run.py +0 -0
  847. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf15_ancestor_in_another_module/pkg/__init__.py +0 -0
  848. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf15_ancestor_in_another_module/pkg/base.py +0 -0
  849. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf15_ancestor_in_another_module/pkg/servers.py +0 -0
  850. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf15_ancestor_in_another_module/pkg/tokens.py +0 -0
  851. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf15_ancestor_in_another_module/run.py +0 -0
  852. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf16_consumer_outside_target_owns_helper_name/app/__init__.py +0 -0
  853. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf16_consumer_outside_target_owns_helper_name/app/consumer.py +0 -0
  854. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf16_consumer_outside_target_owns_helper_name/pkg/__init__.py +0 -0
  855. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf16_consumer_outside_target_owns_helper_name/pkg/lib.py +0 -0
  856. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf16_consumer_outside_target_owns_helper_name/run.py +0 -0
  857. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf1792_ci_strict_any/.github/workflows/ci.yml +0 -0
  858. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf1792_ci_strict_any/pkg/__init__.py +0 -0
  859. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf1792_ci_strict_any/pkg/codec.py +0 -0
  860. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf1792_ci_strict_any/pkg/useful.py +0 -0
  861. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf1792_ci_strict_any/pyproject.toml +0 -0
  862. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf1792_ci_strict_any/run.py +0 -0
  863. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf1792_excluded_probe_import/newer_dependency.py +0 -0
  864. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf1792_excluded_probe_import/pkg/__init__.py +0 -0
  865. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf1792_excluded_probe_import/pkg/core.py +0 -0
  866. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf1792_excluded_probe_import/pkg/ignored.py +0 -0
  867. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf1792_excluded_probe_import/pyproject.toml +0 -0
  868. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf1792_excluded_probe_import/run.py +0 -0
  869. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf1792_typed_shared_helper_comments/pkg/__init__.py +0 -0
  870. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf1792_typed_shared_helper_comments/pkg/first.py +0 -0
  871. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf1792_typed_shared_helper_comments/pkg/second.py +0 -0
  872. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf1792_typed_shared_helper_comments/pyproject.toml +0 -0
  873. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf1792_typed_shared_helper_comments/run.py +0 -0
  874. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf17_builtin_shadowed_in_borrower/pkg/__init__.py +0 -0
  875. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf17_builtin_shadowed_in_borrower/pkg/a.py +0 -0
  876. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf17_builtin_shadowed_in_borrower/pkg/b.py +0 -0
  877. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf17_builtin_shadowed_in_borrower/run.py +0 -0
  878. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf18_builtin_shadowed_by_star_import/pkg/__init__.py +0 -0
  879. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf18_builtin_shadowed_by_star_import/pkg/a.py +0 -0
  880. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf18_builtin_shadowed_by_star_import/pkg/b.py +0 -0
  881. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf18_builtin_shadowed_by_star_import/pkg/util.py +0 -0
  882. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf18_builtin_shadowed_by_star_import/run.py +0 -0
  883. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf19_builtin_shadowed_by_borrower_local/pkg/__init__.py +0 -0
  884. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf19_builtin_shadowed_by_borrower_local/pkg/a.py +0 -0
  885. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf19_builtin_shadowed_by_borrower_local/pkg/b.py +0 -0
  886. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf19_builtin_shadowed_by_borrower_local/run.py +0 -0
  887. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf20_builtin_shadowed_in_ancestor_module/pkg/__init__.py +0 -0
  888. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf20_builtin_shadowed_in_ancestor_module/pkg/base.py +0 -0
  889. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf20_builtin_shadowed_in_ancestor_module/pkg/servers.py +0 -0
  890. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf20_builtin_shadowed_in_ancestor_module/run.py +0 -0
  891. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf21_builtin_shadowed_in_third_module/pkg/__init__.py +0 -0
  892. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf21_builtin_shadowed_in_third_module/pkg/a.py +0 -0
  893. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf21_builtin_shadowed_in_third_module/pkg/b.py +0 -0
  894. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf21_builtin_shadowed_in_third_module/pkg/c.py +0 -0
  895. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf21_builtin_shadowed_in_third_module/pkg/util.py +0 -0
  896. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf21_builtin_shadowed_in_third_module/run.py +0 -0
  897. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf22_borrower_rebinds_builtins_namespace/pkg/__init__.py +0 -0
  898. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf22_borrower_rebinds_builtins_namespace/pkg/a.py +0 -0
  899. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf22_borrower_rebinds_builtins_namespace/pkg/b.py +0 -0
  900. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf22_borrower_rebinds_builtins_namespace/run.py +0 -0
  901. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf23_relative_import_in_another_package/pkg/__init__.py +0 -0
  902. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf23_relative_import_in_another_package/pkg/x/__init__.py +0 -0
  903. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf23_relative_import_in_another_package/pkg/x/a.py +0 -0
  904. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf23_relative_import_in_another_package/pkg/x/sub.py +0 -0
  905. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf23_relative_import_in_another_package/pkg/y/__init__.py +0 -0
  906. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf23_relative_import_in_another_package/pkg/y/b.py +0 -0
  907. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf23_relative_import_in_another_package/pkg/y/sub.py +0 -0
  908. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf23_relative_import_in_another_package/run.py +0 -0
  909. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf24_relative_import_climbs_elsewhere/pkg/__init__.py +0 -0
  910. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf24_relative_import_climbs_elsewhere/pkg/b.py +0 -0
  911. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf24_relative_import_climbs_elsewhere/pkg/sub.py +0 -0
  912. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf24_relative_import_climbs_elsewhere/pkg/x/__init__.py +0 -0
  913. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf24_relative_import_climbs_elsewhere/pkg/x/a.py +0 -0
  914. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf24_relative_import_climbs_elsewhere/run.py +0 -0
  915. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf25_relative_import_in_the_same_package/pkg/__init__.py +0 -0
  916. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf25_relative_import_in_the_same_package/pkg/x/__init__.py +0 -0
  917. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf25_relative_import_in_the_same_package/pkg/x/a.py +0 -0
  918. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf25_relative_import_in_the_same_package/pkg/x/b.py +0 -0
  919. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf25_relative_import_in_the_same_package/pkg/x/sub.py +0 -0
  920. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf25_relative_import_in_the_same_package/run.py +0 -0
  921. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf26_relative_import_ancestor_in_another_package/pkg/__init__.py +0 -0
  922. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf26_relative_import_ancestor_in_another_package/pkg/x/__init__.py +0 -0
  923. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf26_relative_import_ancestor_in_another_package/pkg/x/base.py +0 -0
  924. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf26_relative_import_ancestor_in_another_package/pkg/x/settings.py +0 -0
  925. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf26_relative_import_ancestor_in_another_package/pkg/y/__init__.py +0 -0
  926. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf26_relative_import_ancestor_in_another_package/pkg/y/servers.py +0 -0
  927. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf26_relative_import_ancestor_in_another_package/pkg/y/settings.py +0 -0
  928. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf26_relative_import_ancestor_in_another_package/run.py +0 -0
  929. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf27_registration_decorator_in_host/pkg/__init__.py +0 -0
  930. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf27_registration_decorator_in_host/pkg/alpha.py +0 -0
  931. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf27_registration_decorator_in_host/pkg/beta.py +0 -0
  932. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf27_registration_decorator_in_host/pkg/registry.py +0 -0
  933. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf27_registration_decorator_in_host/run.py +0 -0
  934. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf28_registration_decorator_in_reused_module/pkg/__init__.py +0 -0
  935. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf28_registration_decorator_in_reused_module/pkg/alpha.py +0 -0
  936. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf28_registration_decorator_in_reused_module/pkg/beta.py +0 -0
  937. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf28_registration_decorator_in_reused_module/pkg/registry.py +0 -0
  938. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf28_registration_decorator_in_reused_module/run.py +0 -0
  939. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf29_type_checking_block_with_branches/pkg/__init__.py +0 -0
  940. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf29_type_checking_block_with_branches/pkg/alpha.py +0 -0
  941. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf29_type_checking_block_with_branches/pkg/beta.py +0 -0
  942. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf29_type_checking_block_with_branches/run.py +0 -0
  943. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf30_star_importer_takes_a_typing_name/pkg/__init__.py +0 -0
  944. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf30_star_importer_takes_a_typing_name/pkg/a.py +0 -0
  945. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf30_star_importer_takes_a_typing_name/pkg/b.py +0 -0
  946. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf30_star_importer_takes_a_typing_name/run.py +0 -0
  947. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf31_package_init_star_imports_a_matcher_named_any/pkg/__init__.py +0 -0
  948. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf31_package_init_star_imports_a_matcher_named_any/pkg/matchers.py +0 -0
  949. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf31_package_init_star_imports_a_matcher_named_any/pkg/report.py +0 -0
  950. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf31_package_init_star_imports_a_matcher_named_any/run.py +0 -0
  951. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf32_star_importer_outside_the_target/consumer.py +0 -0
  952. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf32_star_importer_outside_the_target/pkg/__init__.py +0 -0
  953. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf32_star_importer_outside_the_target/pkg/report.py +0 -0
  954. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf32_star_importer_outside_the_target/run.py +0 -0
  955. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf3_same_named_local_function/pkg/__init__.py +0 -0
  956. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf3_same_named_local_function/pkg/a.py +0 -0
  957. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf3_same_named_local_function/pkg/b.py +0 -0
  958. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf3_same_named_local_function/run.py +0 -0
  959. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf4_same_named_class/pkg/__init__.py +0 -0
  960. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf4_same_named_class/pkg/a.py +0 -0
  961. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf4_same_named_class/pkg/b.py +0 -0
  962. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf4_same_named_class/run.py +0 -0
  963. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf5_dunder_file/pkg/__init__.py +0 -0
  964. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf5_dunder_file/pkg/a.py +0 -0
  965. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf5_dunder_file/pkg/b.py +0 -0
  966. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf5_dunder_file/run.py +0 -0
  967. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf6_same_alias_different_import/pkg/__init__.py +0 -0
  968. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf6_same_alias_different_import/pkg/a.py +0 -0
  969. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf6_same_alias_different_import/pkg/b.py +0 -0
  970. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf6_same_alias_different_import/pkg/util1.py +0 -0
  971. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf6_same_alias_different_import/pkg/util2.py +0 -0
  972. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf6_same_alias_different_import/run.py +0 -0
  973. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7_docstring_import/pkg/__init__.py +0 -0
  974. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7_docstring_import/pkg/a.py +0 -0
  975. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7_docstring_import/pkg/b.py +0 -0
  976. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7_docstring_import/run.py +0 -0
  977. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7c_rebinding_enclosing_function_beside_a_twin_in_another_module/pkg/__init__.py +0 -0
  978. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7c_rebinding_enclosing_function_beside_a_twin_in_another_module/pkg/a.py +0 -0
  979. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7c_rebinding_enclosing_function_beside_a_twin_in_another_module/pkg/b.py +0 -0
  980. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7c_rebinding_enclosing_function_beside_a_twin_in_another_module/run.py +0 -0
  981. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7d_assert_moves_to_a_module_pytest_does_not_rewrite/pkg/__init__.py +0 -0
  982. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7d_assert_moves_to_a_module_pytest_does_not_rewrite/pkg/check_values.py +0 -0
  983. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7d_assert_moves_to_a_module_pytest_does_not_rewrite/pkg/checks.py +0 -0
  984. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7d_assert_moves_to_a_module_pytest_does_not_rewrite/pytest.ini +0 -0
  985. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7d_assert_moves_to_a_module_pytest_does_not_rewrite/run.py +0 -0
  986. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7d_asserts_shared_by_modules_rewritten_alike/pkg/__init__.py +0 -0
  987. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7d_asserts_shared_by_modules_rewritten_alike/pkg/alpha.py +0 -0
  988. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7d_asserts_shared_by_modules_rewritten_alike/pkg/beta.py +0 -0
  989. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7d_asserts_shared_by_modules_rewritten_alike/pkg/check_suite.py +0 -0
  990. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7d_asserts_shared_by_modules_rewritten_alike/pytest.ini +0 -0
  991. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7d_asserts_shared_by_modules_rewritten_alike/run.py +0 -0
  992. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_binding_x_class_level_name/pkg/__init__.py +0 -0
  993. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_binding_x_class_level_name/pkg/a.py +0 -0
  994. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_binding_x_class_level_name/pkg/b.py +0 -0
  995. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_binding_x_class_level_name/pyproject.toml +0 -0
  996. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_binding_x_class_level_name/run.py +0 -0
  997. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_binding_x_dunder_file/pkg/__init__.py +0 -0
  998. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_binding_x_dunder_file/pkg/a.py +0 -0
  999. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_binding_x_dunder_file/pkg/b.py +0 -0
  1000. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_binding_x_dunder_file/pyproject.toml +0 -0
  1001. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_binding_x_dunder_file/run.py +0 -0
  1002. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_builtins_x_shadow_in_b/pkg/__init__.py +0 -0
  1003. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_builtins_x_shadow_in_b/pkg/a.py +0 -0
  1004. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_builtins_x_shadow_in_b/pkg/b.py +0 -0
  1005. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_builtins_x_shadow_in_b/pyproject.toml +0 -0
  1006. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_builtins_x_shadow_in_b/run.py +0 -0
  1007. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_extra_typed_binder_message_mypy/pkg/__init__.py +0 -0
  1008. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_extra_typed_binder_message_mypy/pkg/m.py +0 -0
  1009. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_extra_typed_binder_message_mypy/pyproject.toml +0 -0
  1010. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_extra_typed_binder_message_mypy/run.py +0 -0
  1011. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_extra_typed_binder_message_pyright/pkg/__init__.py +0 -0
  1012. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_extra_typed_binder_message_pyright/pkg/m.py +0 -0
  1013. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_extra_typed_binder_message_pyright/pyproject.toml +0 -0
  1014. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_extra_typed_binder_message_pyright/run.py +0 -0
  1015. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_extra_typed_read_before_bind_mypy/pkg/__init__.py +0 -0
  1016. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_extra_typed_read_before_bind_mypy/pkg/m.py +0 -0
  1017. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_extra_typed_read_before_bind_mypy/pyproject.toml +0 -0
  1018. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_extra_typed_read_before_bind_mypy/run.py +0 -0
  1019. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_extra_typed_read_before_bind_pyright/pkg/__init__.py +0 -0
  1020. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_extra_typed_read_before_bind_pyright/pkg/m.py +0 -0
  1021. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_extra_typed_read_before_bind_pyright/pyproject.toml +0 -0
  1022. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_extra_typed_read_before_bind_pyright/run.py +0 -0
  1023. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_extra_typed_thunk_lambda_default_mypy/pkg/__init__.py +0 -0
  1024. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_extra_typed_thunk_lambda_default_mypy/pkg/m.py +0 -0
  1025. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_extra_typed_thunk_lambda_default_mypy/pyproject.toml +0 -0
  1026. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_extra_typed_thunk_lambda_default_mypy/run.py +0 -0
  1027. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_extra_typed_thunk_lambda_default_pyright/pkg/__init__.py +0 -0
  1028. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_extra_typed_thunk_lambda_default_pyright/pkg/m.py +0 -0
  1029. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_extra_typed_thunk_lambda_default_pyright/pyproject.toml +0 -0
  1030. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_extra_typed_thunk_lambda_default_pyright/run.py +0 -0
  1031. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_grammar_t11094_semicolon/pkg/__init__.py +0 -0
  1032. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_grammar_t11094_semicolon/pkg/m.py +0 -0
  1033. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_grammar_t11094_semicolon/pyproject.toml +0 -0
  1034. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_grammar_t11094_semicolon/run.py +0 -0
  1035. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_grammar_t11271_semicolon/pkg/__init__.py +0 -0
  1036. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_grammar_t11271_semicolon/pkg/m.py +0 -0
  1037. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_grammar_t11271_semicolon/pyproject.toml +0 -0
  1038. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_grammar_t11271_semicolon/run.py +0 -0
  1039. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_grammar_u0474_for_target_prebound/pkg/__init__.py +0 -0
  1040. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_grammar_u0474_for_target_prebound/pkg/a.py +0 -0
  1041. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_grammar_u0474_for_target_prebound/pkg/b.py +0 -0
  1042. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_grammar_u0474_for_target_prebound/pkg/common.py +0 -0
  1043. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_grammar_u0474_for_target_prebound/pyproject.toml +0 -0
  1044. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_grammar_u0474_for_target_prebound/run.py +0 -0
  1045. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_grammar_u0624_for_target_prebound/pkg/__init__.py +0 -0
  1046. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_grammar_u0624_for_target_prebound/pkg/a.py +0 -0
  1047. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_grammar_u0624_for_target_prebound/pkg/b.py +0 -0
  1048. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_grammar_u0624_for_target_prebound/pkg/common.py +0 -0
  1049. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_grammar_u0624_for_target_prebound/pyproject.toml +0 -0
  1050. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_grammar_u0624_for_target_prebound/run.py +0 -0
  1051. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_grammar_u1209_for_target_prebound/pkg/__init__.py +0 -0
  1052. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_grammar_u1209_for_target_prebound/pkg/a.py +0 -0
  1053. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_grammar_u1209_for_target_prebound/pkg/b.py +0 -0
  1054. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_grammar_u1209_for_target_prebound/pkg/common.py +0 -0
  1055. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_grammar_u1209_for_target_prebound/pyproject.toml +0 -0
  1056. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_grammar_u1209_for_target_prebound/run.py +0 -0
  1057. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_late_toplevel_module_in_package/pkg/__init__.py +0 -0
  1058. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_late_toplevel_module_in_package/pkg/a.py +0 -0
  1059. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_late_toplevel_module_in_package/pkg/c.py +0 -0
  1060. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_late_toplevel_module_in_package/pkg/helpers_top.py +0 -0
  1061. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_late_toplevel_module_in_package/pyproject.toml +0 -0
  1062. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_late_toplevel_module_in_package/run.py +0 -0
  1063. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_late_toplevel_module_in_package/tests/__init__.py +0 -0
  1064. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_late_toplevel_module_in_package/tests/test_x.py +0 -0
  1065. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_misc_typed_for_prebound_mypy/pkg/__init__.py +0 -0
  1066. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_misc_typed_for_prebound_mypy/pkg/m.py +0 -0
  1067. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_misc_typed_for_prebound_mypy/pyproject.toml +0 -0
  1068. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_misc_typed_for_prebound_mypy/run.py +0 -0
  1069. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_modules_b_imports_a/pkg/__init__.py +0 -0
  1070. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_modules_b_imports_a/pkg/a.py +0 -0
  1071. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_modules_b_imports_a/pkg/b.py +0 -0
  1072. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_modules_b_imports_a/pyproject.toml +0 -0
  1073. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_modules_b_imports_a/run.py +0 -0
  1074. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_modules_init_hosts/pkg/__init__.py +0 -0
  1075. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_modules_init_hosts/pkg/a.py +0 -0
  1076. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_modules_init_hosts/pyproject.toml +0 -0
  1077. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_modules_init_hosts/run.py +0 -0
  1078. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_modules_rel_import_in_block/pkg/__init__.py +0 -0
  1079. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_modules_rel_import_in_block/pkg/a.py +0 -0
  1080. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_modules_rel_import_in_block/pkg/b.py +0 -0
  1081. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_modules_rel_import_in_block/pkg/conf.py +0 -0
  1082. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_modules_rel_import_in_block/pyproject.toml +0 -0
  1083. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_modules_rel_import_in_block/run.py +0 -0
  1084. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_modules_script_main_guard/pkg/__init__.py +0 -0
  1085. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_modules_script_main_guard/pkg/a.py +0 -0
  1086. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_modules_script_main_guard/pkg/b.py +0 -0
  1087. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_modules_script_main_guard/pyproject.toml +0 -0
  1088. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_modules_script_main_guard/run.py +0 -0
  1089. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_modules_three_modules_cluster/pkg/__init__.py +0 -0
  1090. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_modules_three_modules_cluster/pkg/a.py +0 -0
  1091. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_modules_three_modules_cluster/pkg/b.py +0 -0
  1092. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_modules_three_modules_cluster/pkg/c.py +0 -0
  1093. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_modules_three_modules_cluster/pyproject.toml +0 -0
  1094. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_modules_three_modules_cluster/run.py +0 -0
  1095. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_both/pkg/__init__.py +0 -0
  1096. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_both/pkg/compat.py +0 -0
  1097. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_both/pkg/compat_false.py +0 -0
  1098. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_both/pkg/f.py +0 -0
  1099. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_both/pkg/m.py +0 -0
  1100. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_both/pkg/w.py +0 -0
  1101. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_both/pyproject.toml +0 -0
  1102. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_both/run.py +0 -0
  1103. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_both/tests/__init__.py +0 -0
  1104. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_both/tests/test_w.py +0 -0
  1105. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_late_use_both/pkg/__init__.py +0 -0
  1106. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_late_use_both/pkg/compat.py +0 -0
  1107. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_late_use_both/pkg/compat_false.py +0 -0
  1108. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_late_use_both/pkg/f.py +0 -0
  1109. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_late_use_both/pkg/m.py +0 -0
  1110. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_late_use_both/pkg/w.py +0 -0
  1111. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_late_use_both/pyproject.toml +0 -0
  1112. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_late_use_both/run.py +0 -0
  1113. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_late_use_both/tests/__init__.py +0 -0
  1114. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_late_use_both/tests/test_w.py +0 -0
  1115. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_late_use_mypy/pkg/__init__.py +0 -0
  1116. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_late_use_mypy/pkg/compat.py +0 -0
  1117. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_late_use_mypy/pkg/compat_false.py +0 -0
  1118. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_late_use_mypy/pkg/f.py +0 -0
  1119. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_late_use_mypy/pkg/m.py +0 -0
  1120. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_late_use_mypy/pkg/w.py +0 -0
  1121. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_late_use_mypy/pyproject.toml +0 -0
  1122. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_late_use_mypy/run.py +0 -0
  1123. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_late_use_mypy/tests/__init__.py +0 -0
  1124. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_late_use_mypy/tests/test_w.py +0 -0
  1125. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_mypy/pkg/__init__.py +0 -0
  1126. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_mypy/pkg/compat.py +0 -0
  1127. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_mypy/pkg/compat_false.py +0 -0
  1128. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_mypy/pkg/f.py +0 -0
  1129. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_mypy/pkg/m.py +0 -0
  1130. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_mypy/pkg/w.py +0 -0
  1131. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_mypy/pyproject.toml +0 -0
  1132. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_mypy/run.py +0 -0
  1133. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_mypy/tests/__init__.py +0 -0
  1134. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_mypy/tests/test_w.py +0 -0
  1135. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_import_alias_flag_both/pkg/__init__.py +0 -0
  1136. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_import_alias_flag_both/pkg/compat.py +0 -0
  1137. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_import_alias_flag_both/pkg/compat_false.py +0 -0
  1138. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_import_alias_flag_both/pkg/f.py +0 -0
  1139. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_import_alias_flag_both/pkg/m.py +0 -0
  1140. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_import_alias_flag_both/pkg/w.py +0 -0
  1141. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_import_alias_flag_both/pyproject.toml +0 -0
  1142. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_import_alias_flag_both/run.py +0 -0
  1143. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_import_alias_flag_both/tests/__init__.py +0 -0
  1144. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_import_alias_flag_both/tests/test_w.py +0 -0
  1145. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_import_alias_flag_mypy/pkg/__init__.py +0 -0
  1146. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_import_alias_flag_mypy/pkg/compat.py +0 -0
  1147. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_import_alias_flag_mypy/pkg/compat_false.py +0 -0
  1148. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_import_alias_flag_mypy/pkg/f.py +0 -0
  1149. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_import_alias_flag_mypy/pkg/m.py +0 -0
  1150. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_import_alias_flag_mypy/pkg/w.py +0 -0
  1151. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_import_alias_flag_mypy/pyproject.toml +0 -0
  1152. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_import_alias_flag_mypy/run.py +0 -0
  1153. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_import_alias_flag_mypy/tests/__init__.py +0 -0
  1154. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7fz_typeguard2_import_alias_flag_mypy/tests/test_w.py +0 -0
  1155. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7n_host_the_wheel_leaves_out/pkg/pyproject.toml +0 -0
  1156. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7n_host_the_wheel_leaves_out/pkg/src/shop/__init__.py +0 -0
  1157. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7n_host_the_wheel_leaves_out/pkg/src/shop/_devtools.py +0 -0
  1158. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7n_host_the_wheel_leaves_out/pkg/src/shop/stats.py +0 -0
  1159. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7n_host_the_wheel_leaves_out/run.py +0 -0
  1160. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7n_namesake_of_a_required_library/pkg/pyproject.toml +0 -0
  1161. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7n_namesake_of_a_required_library/pkg/zzapp/__init__.py +0 -0
  1162. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7n_namesake_of_a_required_library/pkg/zzapp/core.py +0 -0
  1163. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7n_namesake_of_a_required_library/pkg/zzlib/__init__.py +0 -0
  1164. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7n_namesake_of_a_required_library/pkg/zzlib/utils.py +0 -0
  1165. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7n_namesake_of_a_required_library/run.py +0 -0
  1166. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7n_namesake_of_a_required_library/site-packages/zzlib/__init__.py +0 -0
  1167. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7n_namesake_of_a_required_library/site-packages/zzlib/utils.py +0 -0
  1168. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7n_subpackage_the_wheel_leaves_out/pkg/pyproject.toml +0 -0
  1169. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7n_subpackage_the_wheel_leaves_out/pkg/src/shop/__init__.py +0 -0
  1170. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7n_subpackage_the_wheel_leaves_out/pkg/src/shop/cli.py +0 -0
  1171. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7n_subpackage_the_wheel_leaves_out/pkg/src/shop/devtools/__init__.py +0 -0
  1172. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7n_subpackage_the_wheel_leaves_out/pkg/src/shop/devtools/dump.py +0 -0
  1173. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7n_subpackage_the_wheel_leaves_out/pkg/src/shop/stats.py +0 -0
  1174. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7n_subpackage_the_wheel_leaves_out/run.py +0 -0
  1175. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7t_import_order_is_registration_order/pkg/__init__.py +0 -0
  1176. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7t_import_order_is_registration_order/pkg/alpha.py +0 -0
  1177. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7t_import_order_is_registration_order/pkg/app.py +0 -0
  1178. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7t_import_order_is_registration_order/pkg/beta.py +0 -0
  1179. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7t_import_order_is_registration_order/pkg/gamma.py +0 -0
  1180. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7t_import_order_is_registration_order/pkg/loader.py +0 -0
  1181. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7t_import_order_is_registration_order/pkg/registry.py +0 -0
  1182. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7t_import_order_is_registration_order/pkg/zeta.py +0 -0
  1183. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7t_import_order_is_registration_order/pyproject.toml +0 -0
  1184. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf7t_import_order_is_registration_order/run.py +0 -0
  1185. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf8_helper_name_collision/pkg/__init__.py +0 -0
  1186. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf8_helper_name_collision/pkg/a.py +0 -0
  1187. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf8_helper_name_collision/pkg/b.py +0 -0
  1188. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf8_helper_name_collision/pkg/c.py +0 -0
  1189. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf8_helper_name_collision/pkg/d.py +0 -0
  1190. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf8_helper_name_collision/pkg/e.py +0 -0
  1191. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf8_helper_name_collision/run.py +0 -0
  1192. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf9_same_named_base_class/pkg/__init__.py +0 -0
  1193. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf9_same_named_base_class/pkg/one/__init__.py +0 -0
  1194. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf9_same_named_base_class/pkg/one/base.py +0 -0
  1195. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf9_same_named_base_class/pkg/one/introspect.py +0 -0
  1196. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf9_same_named_base_class/pkg/one/revoke.py +0 -0
  1197. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf9_same_named_base_class/pkg/two/__init__.py +0 -0
  1198. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf9_same_named_base_class/pkg/two/access.py +0 -0
  1199. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf9_same_named_base_class/pkg/two/base.py +0 -0
  1200. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf9_same_named_base_class/pkg/two/request.py +0 -0
  1201. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf9_same_named_base_class/run.py +0 -0
  1202. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf9bd_only_binding_across_modules/pkg/__init__.py +0 -0
  1203. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf9bd_only_binding_across_modules/pkg/a.py +0 -0
  1204. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf9bd_only_binding_across_modules/pkg/b.py +0 -0
  1205. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf9bd_only_binding_across_modules/run.py +0 -0
  1206. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf9up_newer_syntax_hides_hand_decoration/pkg/__init__.py +0 -0
  1207. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf9up_newer_syntax_hides_hand_decoration/pkg/fast.pynew +0 -0
  1208. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf9up_newer_syntax_hides_hand_decoration/pkg/instrument.py +0 -0
  1209. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf9up_newer_syntax_hides_hand_decoration/pkg/kernels.py +0 -0
  1210. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf9up_newer_syntax_hides_hand_decoration/pyproject.toml +0 -0
  1211. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf9up_newer_syntax_hides_hand_decoration/run.py +0 -0
  1212. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf9up_newer_syntax_test_hides_builtin_patch/pkg/__init__.py +0 -0
  1213. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf9up_newer_syntax_test_hides_builtin_patch/pkg/a.py +0 -0
  1214. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf9up_newer_syntax_test_hides_builtin_patch/pkg/b.py +0 -0
  1215. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf9up_newer_syntax_test_hides_builtin_patch/pyproject.toml +0 -0
  1216. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf9up_newer_syntax_test_hides_builtin_patch/run.py +0 -0
  1217. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf9up_newer_syntax_test_hides_builtin_patch/tests/__init__.py +0 -0
  1218. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf9up_newer_syntax_test_hides_builtin_patch/tests/test_b.pynew +0 -0
  1219. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf9xi_namesake_lacking_a_module/pkg/pyproject.toml +0 -0
  1220. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf9xi_namesake_lacking_a_module/pkg/third_party/zzlib/utils.py +0 -0
  1221. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf9xi_namesake_lacking_a_module/pkg/zzapp/__init__.py +0 -0
  1222. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf9xi_namesake_lacking_a_module/pkg/zzapp/cli.py +0 -0
  1223. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf9xi_namesake_lacking_a_module/pkg/zzapp/core.py +0 -0
  1224. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf9xi_namesake_lacking_a_module/run.py +0 -0
  1225. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf9xi_namesake_lacking_a_module/site-packages/zzlib/__init__.py +0 -0
  1226. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf9xi_namesake_lacking_a_module/site-packages/zzlib/core.py +0 -0
  1227. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf9xi_namesake_lacking_a_module/site-packages/zzlib/utils.py +0 -0
  1228. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf9xi_type_only_import_of_a_missing_module/pkg/__init__.py +0 -0
  1229. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf9xi_type_only_import_of_a_missing_module/pkg/a.py +0 -0
  1230. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf9xi_type_only_import_of_a_missing_module/pkg/b.py +0 -0
  1231. {code_towel-1.792 → code_towel-1.946}/tests/hostile_crossfile/xf9xi_type_only_import_of_a_missing_module/run.py +0 -0
  1232. {code_towel-1.792 → code_towel-1.946}/tests/hostile_refactoring.py +0 -0
  1233. {code_towel-1.792 → code_towel-1.946}/tests/probe_answers.py +0 -0
  1234. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.772/README.md +0 -0
  1235. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.772/context.toml +0 -0
  1236. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.772/corpus-full.txt +0 -0
  1237. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.772/corpus-sphinx.txt +0 -0
  1238. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.772/release-record.txt +0 -0
  1239. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-audit-fixes/CAPACITY-ASSESSMENT.json.gz +0 -0
  1240. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-audit-fixes/CAPACITY-EXPERIMENT.json.gz +0 -0
  1241. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-audit-fixes/CORPUS-PREREQUISITES.json.gz +0 -0
  1242. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-audit-fixes/PREPARATION-VERIFIED.json.gz +0 -0
  1243. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-audit-fixes/README.md +0 -0
  1244. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-audit-fixes/artifacts.json.gz +0 -0
  1245. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-audit-fixes/corpus-exit.json.gz +0 -0
  1246. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-audit-fixes/corpus-report--summary.json.gz +0 -0
  1247. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-audit-fixes/corpus-reviewed-dispositions.json.gz +0 -0
  1248. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-audit-fixes/corpus-verified-outcomes.json.gz +0 -0
  1249. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-audit-fixes/fresh-corpus-driver-completion.json.gz +0 -0
  1250. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-audit-fixes/fresh-refusal-integrity.json.gz +0 -0
  1251. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-audit-fixes/performance--1-published--cli.log.gz +0 -0
  1252. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-audit-fixes/performance--10-candidate--cli.log.gz +0 -0
  1253. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-audit-fixes/performance--11-previous--cli.log.gz +0 -0
  1254. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-audit-fixes/performance--12-published--cli.log.gz +0 -0
  1255. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-audit-fixes/performance--2-previous--cli.log.gz +0 -0
  1256. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-audit-fixes/performance--3-candidate--cli.log.gz +0 -0
  1257. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-audit-fixes/performance--4-candidate--cli.log.gz +0 -0
  1258. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-audit-fixes/performance--5-previous--cli.log.gz +0 -0
  1259. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-audit-fixes/performance--6-published--cli.log.gz +0 -0
  1260. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-audit-fixes/performance--7-published--cli.log.gz +0 -0
  1261. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-audit-fixes/performance--8-previous--cli.log.gz +0 -0
  1262. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-audit-fixes/performance--9-candidate--cli.log.gz +0 -0
  1263. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-audit-fixes/performance--attempt.json.gz +0 -0
  1264. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-audit-fixes/performance--completion.json.gz +0 -0
  1265. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-audit-fixes/performance--preflight-runtimes.json.gz +0 -0
  1266. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-audit-fixes/performance--results.json.gz +0 -0
  1267. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-audit-fixes/performance--summary.json.gz +0 -0
  1268. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-audit-fixes/provenance.json +0 -0
  1269. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-audit-fixes/source.json.gz +0 -0
  1270. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-october6-native/README.md +0 -0
  1271. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-october6-native/coverage-combine.log.gz +0 -0
  1272. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-october6-native/coverage-report.log.gz +0 -0
  1273. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-october6-native/pytest.log.gz +0 -0
  1274. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-october6-native/quality-bandit.log.gz +0 -0
  1275. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-october6-native/quality-black.log.gz +0 -0
  1276. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-october6-native/quality-flake8.log.gz +0 -0
  1277. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-october6-native/quality-mypy.log.gz +0 -0
  1278. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-october6-native/quality-results.json +0 -0
  1279. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-october6-native/result.json +0 -0
  1280. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-october6-native/source-after.json.gz +0 -0
  1281. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-october6-native/source-before.json.gz +0 -0
  1282. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-october6-native/validation-source.py.txt +0 -0
  1283. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-parameter-audit-fixes/1-uncached-cli.log.gz +0 -0
  1284. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-parameter-audit-fixes/1-uncached-host.log.gz +0 -0
  1285. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-parameter-audit-fixes/2-cached-cli.log.gz +0 -0
  1286. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-parameter-audit-fixes/2-cached-host.log.gz +0 -0
  1287. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-parameter-audit-fixes/3-cached-cli.log.gz +0 -0
  1288. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-parameter-audit-fixes/3-cached-host.log.gz +0 -0
  1289. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-parameter-audit-fixes/4-uncached-cli.log.gz +0 -0
  1290. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-parameter-audit-fixes/4-uncached-host.log.gz +0 -0
  1291. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-parameter-audit-fixes/README.md +0 -0
  1292. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-parameter-audit-fixes/bandit.log.gz +0 -0
  1293. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-parameter-audit-fixes/black.log.gz +0 -0
  1294. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-parameter-audit-fixes/block-work-driver.py.txt +0 -0
  1295. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-parameter-audit-fixes/block-work.json +0 -0
  1296. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-parameter-audit-fixes/cli-control.py.txt +0 -0
  1297. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-parameter-audit-fixes/cli-driver.py.txt +0 -0
  1298. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-parameter-audit-fixes/cli-results.json +0 -0
  1299. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-parameter-audit-fixes/dependency-audit.log.gz +0 -0
  1300. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-parameter-audit-fixes/dependency-inventory.txt +0 -0
  1301. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-parameter-audit-fixes/flake8.log.gz +0 -0
  1302. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-parameter-audit-fixes/freeze.json +0 -0
  1303. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-parameter-audit-fixes/interrupted-native-result.json +0 -0
  1304. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-parameter-audit-fixes/mypy.log.gz +0 -0
  1305. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-parameter-audit-fixes/native-coverage.log.gz +0 -0
  1306. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-parameter-audit-fixes/native-driver.py.txt +0 -0
  1307. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-parameter-audit-fixes/native-pytest.log.gz +0 -0
  1308. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-parameter-audit-fixes/native-result.json +0 -0
  1309. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-parameter-audit-fixes/preceding-failed-native-result.json +0 -0
  1310. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-parameter-audit-fixes/preceding-failed-pytest.log.gz +0 -0
  1311. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-parameter-audit-fixes/retained-sha256.json +0 -0
  1312. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-parameter-audit-fixes/source-after.json.gz +0 -0
  1313. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-parameter-audit-fixes/source-before.json.gz +0 -0
  1314. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-parameter-audit-fixes/static-result.json +0 -0
  1315. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-parameter-audit-fixes/summary.json +0 -0
  1316. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-performance-optimization/README.md +0 -0
  1317. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-performance-optimization/any-pruning-r04-diagnostic-control.patch.gz +0 -0
  1318. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-performance-optimization/any-pruning-r04-freeze.json +0 -0
  1319. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-performance-optimization/corrected-control-r04-diagnostic-control.patch.gz +0 -0
  1320. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-performance-optimization/corrected-control-r04-freeze.json +0 -0
  1321. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-performance-optimization/measure-any-pruning-r04-results.json +0 -0
  1322. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-performance-optimization/measure-any-pruning-r04-summary.json +0 -0
  1323. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-performance-optimization/measure-ownership-memo-r04-results.json +0 -0
  1324. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-performance-optimization/measure-ownership-memo-r04-summary.json +0 -0
  1325. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-performance-optimization/measure-rehearing-r05-results.json +0 -0
  1326. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-performance-optimization/measure-rehearing-r05-summary.json +0 -0
  1327. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-performance-optimization/measurement-source.py.txt +0 -0
  1328. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-performance-optimization/ownership-cost-1.json.gz +0 -0
  1329. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-performance-optimization/ownership-cost-2.json.gz +0 -0
  1330. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-performance-optimization/ownership-cost-3.json.gz +0 -0
  1331. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-performance-optimization/ownership-cost-4.json.gz +0 -0
  1332. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-performance-optimization/ownership-cost-source.py.txt +0 -0
  1333. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-performance-optimization/ownership-cost-summary.json.gz +0 -0
  1334. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-performance-optimization/ownership-memo-r04-diagnostic-control.patch.gz +0 -0
  1335. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-performance-optimization/ownership-memo-r04-freeze.json +0 -0
  1336. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-performance-optimization/rehearing-control-r05-diagnostic-control.patch.gz +0 -0
  1337. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-performance-optimization/rehearing-control-r05-freeze.json +0 -0
  1338. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-performance-optimization/rehearing-r05-diagnostic-control.patch.gz +0 -0
  1339. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-performance-optimization/rehearing-r05-freeze.json +0 -0
  1340. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-performance-optimization/rehearing-request-counts.json +0 -0
  1341. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-performance-optimization/stage0-corrected-phase-freeze.json +0 -0
  1342. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/1.792-performance-optimization/stage1-ownership-memo-phase-freeze.json +0 -0
  1343. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/README.md +0 -0
  1344. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/artifacts.json.gz +0 -0
  1345. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/assemble-corpus-review.py.gz +0 -0
  1346. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/build-results.json.gz +0 -0
  1347. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/candidate--pyproject.toml.gz +0 -0
  1348. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/candidate--scripts--ecosystem--manifest.toml.gz +0 -0
  1349. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/candidate--scripts--ecosystem_check.py.gz +0 -0
  1350. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/completed-baseline-review.json.gz +0 -0
  1351. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/continuation-driver.log.gz +0 -0
  1352. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/continuation-result.json.gz +0 -0
  1353. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/continuation-resumed-driver.log.gz +0 -0
  1354. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/continuation-stopped-20260928.json.gz +0 -0
  1355. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/continue-final-gates.py.gz +0 -0
  1356. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-assessment.json.gz +0 -0
  1357. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-command.json.gz +0 -0
  1358. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-container-state.json.gz +0 -0
  1359. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-entry.py.gz +0 -0
  1360. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-environment.json.gz +0 -0
  1361. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-exit.json.gz +0 -0
  1362. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--anyio-after.log.gz +0 -0
  1363. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--anyio-before.log.gz +0 -0
  1364. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--anyio-environment.log.gz +0 -0
  1365. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--anyio-refactor.log.gz +0 -0
  1366. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--apispec-after.log.gz +0 -0
  1367. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--apispec-before.log.gz +0 -0
  1368. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--apispec-environment.log.gz +0 -0
  1369. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--apispec-refactor.log.gz +0 -0
  1370. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--arrow-after.log.gz +0 -0
  1371. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--arrow-before.log.gz +0 -0
  1372. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--arrow-environment.log.gz +0 -0
  1373. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--arrow-refactor.log.gz +0 -0
  1374. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--astroid-after.log.gz +0 -0
  1375. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--astroid-before.log.gz +0 -0
  1376. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--astroid-environment.log.gz +0 -0
  1377. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--astroid-refactor.log.gz +0 -0
  1378. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--attrs-after.log.gz +0 -0
  1379. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--attrs-before.log.gz +0 -0
  1380. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--attrs-environment.log.gz +0 -0
  1381. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--attrs-refactor.log.gz +0 -0
  1382. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--backoff-after.log.gz +0 -0
  1383. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--backoff-before.log.gz +0 -0
  1384. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--backoff-environment.log.gz +0 -0
  1385. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--backoff-refactor.log.gz +0 -0
  1386. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--beautifulsoup4-after.log.gz +0 -0
  1387. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--beautifulsoup4-before.log.gz +0 -0
  1388. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--beautifulsoup4-environment.log.gz +0 -0
  1389. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--beautifulsoup4-refactor.log.gz +0 -0
  1390. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--bidict-before.log.gz +0 -0
  1391. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--bidict-environment.log.gz +0 -0
  1392. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--bidict-refactor.log.gz +0 -0
  1393. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--black-after.log.gz +0 -0
  1394. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--black-before.log.gz +0 -0
  1395. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--black-environment.log.gz +0 -0
  1396. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--black-refactor.log.gz +0 -0
  1397. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--bleach-after.log.gz +0 -0
  1398. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--bleach-before.log.gz +0 -0
  1399. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--bleach-environment.log.gz +0 -0
  1400. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--bleach-refactor.log.gz +0 -0
  1401. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--blinker-before.log.gz +0 -0
  1402. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--blinker-environment.log.gz +0 -0
  1403. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--blinker-refactor.log.gz +0 -0
  1404. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--boltons-after.log.gz +0 -0
  1405. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--boltons-before.log.gz +0 -0
  1406. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--boltons-environment.log.gz +0 -0
  1407. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--boltons-refactor.log.gz +0 -0
  1408. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--bottle-before.log.gz +0 -0
  1409. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--bottle-environment.log.gz +0 -0
  1410. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--bottle-refactor.log.gz +0 -0
  1411. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--cachetools-after.log.gz +0 -0
  1412. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--cachetools-before.log.gz +0 -0
  1413. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--cachetools-environment.log.gz +0 -0
  1414. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--cachetools-refactor.log.gz +0 -0
  1415. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--cattrs-after.log.gz +0 -0
  1416. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--cattrs-before.log.gz +0 -0
  1417. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--cattrs-environment.log.gz +0 -0
  1418. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--cattrs-refactor.log.gz +0 -0
  1419. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--cerberus-after.log.gz +0 -0
  1420. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--cerberus-before.log.gz +0 -0
  1421. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--cerberus-environment.log.gz +0 -0
  1422. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--cerberus-refactor.log.gz +0 -0
  1423. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--chardet-after.log.gz +0 -0
  1424. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--chardet-before.log.gz +0 -0
  1425. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--chardet-environment.log.gz +0 -0
  1426. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--chardet-refactor.log.gz +0 -0
  1427. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--cheroot-after.log.gz +0 -0
  1428. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--cheroot-before.log.gz +0 -0
  1429. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--cheroot-environment.log.gz +0 -0
  1430. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--cheroot-refactor-no-types.log.gz +0 -0
  1431. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--cheroot-refactor.log.gz +0 -0
  1432. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--click-after.log.gz +0 -0
  1433. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--click-before.log.gz +0 -0
  1434. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--click-environment.log.gz +0 -0
  1435. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--click-refactor.log.gz +0 -0
  1436. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--colorama-after.log.gz +0 -0
  1437. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--colorama-before.log.gz +0 -0
  1438. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--colorama-environment.log.gz +0 -0
  1439. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--colorama-refactor.log.gz +0 -0
  1440. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--croniter-after.log.gz +0 -0
  1441. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--croniter-before.log.gz +0 -0
  1442. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--croniter-environment.log.gz +0 -0
  1443. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--croniter-refactor.log.gz +0 -0
  1444. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--decorator-before.log.gz +0 -0
  1445. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--decorator-environment.log.gz +0 -0
  1446. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--decorator-refactor.log.gz +0 -0
  1447. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--deepdiff-after.log.gz +0 -0
  1448. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--deepdiff-before.log.gz +0 -0
  1449. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--deepdiff-environment.log.gz +0 -0
  1450. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--deepdiff-refactor.log.gz +0 -0
  1451. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--django-forms-after.log.gz +0 -0
  1452. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--django-forms-before.log.gz +0 -0
  1453. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--django-forms-environment.log.gz +0 -0
  1454. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--django-forms-refactor.log.gz +0 -0
  1455. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--django-utils-after.log.gz +0 -0
  1456. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--django-utils-before.log.gz +0 -0
  1457. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--django-utils-environment.log.gz +0 -0
  1458. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--django-utils-refactor.log.gz +0 -0
  1459. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--docopt-ng-before.log.gz +0 -0
  1460. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--docopt-ng-environment.log.gz +0 -0
  1461. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--docopt-ng-refactor.log.gz +0 -0
  1462. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--dpath-after.log.gz +0 -0
  1463. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--dpath-before.log.gz +0 -0
  1464. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--dpath-environment.log.gz +0 -0
  1465. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--dpath-refactor.log.gz +0 -0
  1466. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--ecdsa-after.log.gz +0 -0
  1467. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--ecdsa-before.log.gz +0 -0
  1468. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--ecdsa-environment.log.gz +0 -0
  1469. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--ecdsa-refactor.log.gz +0 -0
  1470. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--environs-before.log.gz +0 -0
  1471. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--environs-environment.log.gz +0 -0
  1472. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--environs-refactor.log.gz +0 -0
  1473. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--feedparser-after.log.gz +0 -0
  1474. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--feedparser-before.log.gz +0 -0
  1475. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--feedparser-environment.log.gz +0 -0
  1476. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--feedparser-refactor.log.gz +0 -0
  1477. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--filelock-after.log.gz +0 -0
  1478. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--filelock-before.log.gz +0 -0
  1479. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--filelock-environment.log.gz +0 -0
  1480. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--filelock-refactor.log.gz +0 -0
  1481. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--flake8-after.log.gz +0 -0
  1482. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--flake8-before.log.gz +0 -0
  1483. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--flake8-environment.log.gz +0 -0
  1484. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--flake8-refactor.log.gz +0 -0
  1485. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--flask-after.log.gz +0 -0
  1486. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--flask-before.log.gz +0 -0
  1487. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--flask-environment.log.gz +0 -0
  1488. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--flask-refactor.log.gz +0 -0
  1489. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--funcy-after.log.gz +0 -0
  1490. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--funcy-before.log.gz +0 -0
  1491. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--funcy-environment.log.gz +0 -0
  1492. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--funcy-refactor.log.gz +0 -0
  1493. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--glom-after.log.gz +0 -0
  1494. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--glom-before.log.gz +0 -0
  1495. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--glom-environment.log.gz +0 -0
  1496. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--glom-refactor.log.gz +0 -0
  1497. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--gunicorn-after.log.gz +0 -0
  1498. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--gunicorn-before.log.gz +0 -0
  1499. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--gunicorn-environment.log.gz +0 -0
  1500. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--gunicorn-refactor.log.gz +0 -0
  1501. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--h11-after.log.gz +0 -0
  1502. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--h11-before.log.gz +0 -0
  1503. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--h11-environment.log.gz +0 -0
  1504. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--h11-refactor.log.gz +0 -0
  1505. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--h2-after.log.gz +0 -0
  1506. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--h2-before.log.gz +0 -0
  1507. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--h2-environment.log.gz +0 -0
  1508. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--h2-refactor.log.gz +0 -0
  1509. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--hpack-after.log.gz +0 -0
  1510. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--hpack-before.log.gz +0 -0
  1511. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--hpack-environment.log.gz +0 -0
  1512. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--hpack-refactor.log.gz +0 -0
  1513. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--html5lib-after.log.gz +0 -0
  1514. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--html5lib-before.log.gz +0 -0
  1515. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--html5lib-environment.log.gz +0 -0
  1516. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--html5lib-refactor.log.gz +0 -0
  1517. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--httpx-after.log.gz +0 -0
  1518. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--httpx-before.log.gz +0 -0
  1519. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--httpx-environment.log.gz +0 -0
  1520. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--httpx-refactor.log.gz +0 -0
  1521. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--humanize-before.log.gz +0 -0
  1522. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--humanize-environment.log.gz +0 -0
  1523. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--humanize-refactor.log.gz +0 -0
  1524. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--hyperframe-after.log.gz +0 -0
  1525. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--hyperframe-before.log.gz +0 -0
  1526. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--hyperframe-environment.log.gz +0 -0
  1527. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--hyperframe-refactor.log.gz +0 -0
  1528. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--idna-after.log.gz +0 -0
  1529. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--idna-before.log.gz +0 -0
  1530. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--idna-environment.log.gz +0 -0
  1531. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--idna-refactor.log.gz +0 -0
  1532. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--inflect-before.log.gz +0 -0
  1533. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--inflect-environment.log.gz +0 -0
  1534. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--inflect-refactor.log.gz +0 -0
  1535. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--inflection-before.log.gz +0 -0
  1536. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--inflection-environment.log.gz +0 -0
  1537. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--inflection-refactor.log.gz +0 -0
  1538. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--installer-before.log.gz +0 -0
  1539. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--installer-environment.log.gz +0 -0
  1540. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--installer-refactor.log.gz +0 -0
  1541. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--invoke-before.log.gz +0 -0
  1542. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--invoke-environment.log.gz +0 -0
  1543. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--invoke-refactor.log.gz +0 -0
  1544. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--isort-before.log.gz +0 -0
  1545. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--isort-environment.log.gz +0 -0
  1546. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--isort-refactor.log.gz +0 -0
  1547. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--itsdangerous-before.log.gz +0 -0
  1548. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--itsdangerous-environment.log.gz +0 -0
  1549. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--itsdangerous-refactor.log.gz +0 -0
  1550. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--jinja2-after.log.gz +0 -0
  1551. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--jinja2-before.log.gz +0 -0
  1552. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--jinja2-environment.log.gz +0 -0
  1553. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--jinja2-refactor.log.gz +0 -0
  1554. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--jmespath-after.log.gz +0 -0
  1555. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--jmespath-before.log.gz +0 -0
  1556. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--jmespath-environment.log.gz +0 -0
  1557. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--jmespath-refactor.log.gz +0 -0
  1558. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--jsonpatch-before.log.gz +0 -0
  1559. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--jsonpatch-environment.log.gz +0 -0
  1560. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--jsonpatch-refactor.log.gz +0 -0
  1561. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--jsonpointer-before.log.gz +0 -0
  1562. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--jsonpointer-environment.log.gz +0 -0
  1563. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--jsonpointer-refactor.log.gz +0 -0
  1564. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--jsonschema-after.log.gz +0 -0
  1565. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--jsonschema-before.log.gz +0 -0
  1566. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--jsonschema-environment.log.gz +0 -0
  1567. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--jsonschema-refactor.log.gz +0 -0
  1568. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--lark-after.log.gz +0 -0
  1569. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--lark-before.log.gz +0 -0
  1570. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--lark-environment.log.gz +0 -0
  1571. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--lark-refactor.log.gz +0 -0
  1572. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--loguru-after.log.gz +0 -0
  1573. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--loguru-before.log.gz +0 -0
  1574. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--loguru-environment.log.gz +0 -0
  1575. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--loguru-refactor.log.gz +0 -0
  1576. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--mako-after.log.gz +0 -0
  1577. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--mako-before.log.gz +0 -0
  1578. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--mako-environment.log.gz +0 -0
  1579. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--mako-refactor.log.gz +0 -0
  1580. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--markdown-after.log.gz +0 -0
  1581. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--markdown-before.log.gz +0 -0
  1582. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--markdown-environment.log.gz +0 -0
  1583. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--markdown-it-py-after.log.gz +0 -0
  1584. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--markdown-it-py-before.log.gz +0 -0
  1585. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--markdown-it-py-environment.log.gz +0 -0
  1586. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--markdown-it-py-refactor.log.gz +0 -0
  1587. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--markdown-refactor.log.gz +0 -0
  1588. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--markupsafe-before.log.gz +0 -0
  1589. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--markupsafe-environment.log.gz +0 -0
  1590. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--markupsafe-refactor.log.gz +0 -0
  1591. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--marshmallow-after.log.gz +0 -0
  1592. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--marshmallow-before.log.gz +0 -0
  1593. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--marshmallow-environment.log.gz +0 -0
  1594. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--marshmallow-refactor.log.gz +0 -0
  1595. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--mccabe-before.log.gz +0 -0
  1596. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--mccabe-environment.log.gz +0 -0
  1597. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--mccabe-refactor.log.gz +0 -0
  1598. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--mistune-after.log.gz +0 -0
  1599. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--mistune-before.log.gz +0 -0
  1600. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--mistune-environment.log.gz +0 -0
  1601. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--mistune-refactor.log.gz +0 -0
  1602. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--mkdocs-before.log.gz +0 -0
  1603. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--mkdocs-environment.log.gz +0 -0
  1604. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--mkdocs-refactor.log.gz +0 -0
  1605. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--more-itertools-after.log.gz +0 -0
  1606. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--more-itertools-before.log.gz +0 -0
  1607. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--more-itertools-environment.log.gz +0 -0
  1608. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--more-itertools-refactor.log.gz +0 -0
  1609. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--natsort-after.log.gz +0 -0
  1610. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--natsort-before.log.gz +0 -0
  1611. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--natsort-environment.log.gz +0 -0
  1612. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--natsort-refactor.log.gz +0 -0
  1613. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--networkx-after.log.gz +0 -0
  1614. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--networkx-before.log.gz +0 -0
  1615. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--networkx-environment.log.gz +0 -0
  1616. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--networkx-refactor.log.gz +0 -0
  1617. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--nox-after.log.gz +0 -0
  1618. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--nox-before.log.gz +0 -0
  1619. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--nox-environment.log.gz +0 -0
  1620. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--nox-refactor.log.gz +0 -0
  1621. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--oauthlib-after.log.gz +0 -0
  1622. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--oauthlib-before.log.gz +0 -0
  1623. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--oauthlib-environment.log.gz +0 -0
  1624. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--oauthlib-refactor.log.gz +0 -0
  1625. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--outcome-before.log.gz +0 -0
  1626. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--outcome-environment.log.gz +0 -0
  1627. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--outcome-refactor.log.gz +0 -0
  1628. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--packaging-after.log.gz +0 -0
  1629. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--packaging-before.log.gz +0 -0
  1630. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--packaging-environment.log.gz +0 -0
  1631. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--packaging-refactor.log.gz +0 -0
  1632. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--parsimonious-after.log.gz +0 -0
  1633. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--parsimonious-before.log.gz +0 -0
  1634. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--parsimonious-environment.log.gz +0 -0
  1635. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--parsimonious-refactor.log.gz +0 -0
  1636. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--parso-after.log.gz +0 -0
  1637. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--parso-before.log.gz +0 -0
  1638. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--parso-environment.log.gz +0 -0
  1639. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--parso-refactor.log.gz +0 -0
  1640. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pathspec-after.log.gz +0 -0
  1641. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pathspec-before.log.gz +0 -0
  1642. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pathspec-environment.log.gz +0 -0
  1643. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pathspec-refactor.log.gz +0 -0
  1644. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--peewee-before.log.gz +0 -0
  1645. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--peewee-environment.log.gz +0 -0
  1646. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--peewee-refactor.log.gz +0 -0
  1647. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--platformdirs-after.log.gz +0 -0
  1648. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--platformdirs-before.log.gz +0 -0
  1649. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--platformdirs-environment.log.gz +0 -0
  1650. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--platformdirs-refactor.log.gz +0 -0
  1651. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pluggy-after.log.gz +0 -0
  1652. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pluggy-before.log.gz +0 -0
  1653. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pluggy-environment.log.gz +0 -0
  1654. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pluggy-refactor.log.gz +0 -0
  1655. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--ply-after.log.gz +0 -0
  1656. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--ply-before.log.gz +0 -0
  1657. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--ply-environment.log.gz +0 -0
  1658. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--ply-refactor.log.gz +0 -0
  1659. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--prettytable-before.log.gz +0 -0
  1660. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--prettytable-environment.log.gz +0 -0
  1661. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--prettytable-refactor.log.gz +0 -0
  1662. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyasn1-after.log.gz +0 -0
  1663. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyasn1-before.log.gz +0 -0
  1664. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyasn1-environment.log.gz +0 -0
  1665. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyasn1-refactor.log.gz +0 -0
  1666. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pycodestyle-before.log.gz +0 -0
  1667. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pycodestyle-environment.log.gz +0 -0
  1668. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pycodestyle-refactor.log.gz +0 -0
  1669. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pycparser-after.log.gz +0 -0
  1670. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pycparser-before.log.gz +0 -0
  1671. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pycparser-environment.log.gz +0 -0
  1672. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pycparser-refactor.log.gz +0 -0
  1673. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyflakes-after.log.gz +0 -0
  1674. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyflakes-before.log.gz +0 -0
  1675. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyflakes-environment.log.gz +0 -0
  1676. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyflakes-refactor.log.gz +0 -0
  1677. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pygments-after.log.gz +0 -0
  1678. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pygments-before.log.gz +0 -0
  1679. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pygments-environment.log.gz +0 -0
  1680. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pygments-refactor.log.gz +0 -0
  1681. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyjwt-after.log.gz +0 -0
  1682. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyjwt-before.log.gz +0 -0
  1683. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyjwt-environment.log.gz +0 -0
  1684. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyjwt-refactor.log.gz +0 -0
  1685. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyparsing-after.log.gz +0 -0
  1686. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyparsing-before.log.gz +0 -0
  1687. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyparsing-environment.log.gz +0 -0
  1688. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyparsing-refactor.log.gz +0 -0
  1689. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyparsing-retest-after.log.gz +0 -0
  1690. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyparsing-retest-before.log.gz +0 -0
  1691. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyparsing-retest.json.gz +0 -0
  1692. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyproject-hooks-after.log.gz +0 -0
  1693. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyproject-hooks-before.log.gz +0 -0
  1694. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyproject-hooks-environment.log.gz +0 -0
  1695. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyproject-hooks-refactor.log.gz +0 -0
  1696. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyrsistent-after.log.gz +0 -0
  1697. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyrsistent-before.log.gz +0 -0
  1698. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyrsistent-environment.log.gz +0 -0
  1699. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyrsistent-refactor.log.gz +0 -0
  1700. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pytest-after.log.gz +0 -0
  1701. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pytest-before.log.gz +0 -0
  1702. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pytest-environment.log.gz +0 -0
  1703. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pytest-refactor.log.gz +0 -0
  1704. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--python-dateutil-after.log.gz +0 -0
  1705. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--python-dateutil-before.log.gz +0 -0
  1706. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--python-dateutil-environment.log.gz +0 -0
  1707. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--python-dateutil-refactor.log.gz +0 -0
  1708. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--python-dotenv-before.log.gz +0 -0
  1709. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--python-dotenv-environment.log.gz +0 -0
  1710. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--python-dotenv-refactor.log.gz +0 -0
  1711. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--python-fire-after.log.gz +0 -0
  1712. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--python-fire-before.log.gz +0 -0
  1713. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--python-fire-environment.log.gz +0 -0
  1714. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--python-fire-refactor.log.gz +0 -0
  1715. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--python-prompt-toolkit-after.log.gz +0 -0
  1716. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--python-prompt-toolkit-before.log.gz +0 -0
  1717. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--python-prompt-toolkit-environment.log.gz +0 -0
  1718. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--python-prompt-toolkit-refactor.log.gz +0 -0
  1719. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--python-slugify-before.log.gz +0 -0
  1720. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--python-slugify-environment.log.gz +0 -0
  1721. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--python-slugify-refactor.log.gz +0 -0
  1722. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyupgrade-before.log.gz +0 -0
  1723. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyupgrade-environment.log.gz +0 -0
  1724. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyupgrade-refactor.log.gz +0 -0
  1725. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--rfc3986-after.log.gz +0 -0
  1726. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--rfc3986-before.log.gz +0 -0
  1727. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--rfc3986-environment.log.gz +0 -0
  1728. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--rfc3986-refactor.log.gz +0 -0
  1729. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--rich-after.log.gz +0 -0
  1730. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--rich-before.log.gz +0 -0
  1731. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--rich-environment.log.gz +0 -0
  1732. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--rich-refactor.log.gz +0 -0
  1733. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--rsa-after.log.gz +0 -0
  1734. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--rsa-before.log.gz +0 -0
  1735. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--rsa-environment.log.gz +0 -0
  1736. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--rsa-refactor.log.gz +0 -0
  1737. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--schedule-after.log.gz +0 -0
  1738. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--schedule-before.log.gz +0 -0
  1739. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--schedule-environment.log.gz +0 -0
  1740. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--schedule-refactor.log.gz +0 -0
  1741. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--schema-before.log.gz +0 -0
  1742. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--schema-environment.log.gz +0 -0
  1743. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--schema-refactor.log.gz +0 -0
  1744. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--simpy-before.log.gz +0 -0
  1745. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--simpy-environment.log.gz +0 -0
  1746. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--simpy-refactor.log.gz +0 -0
  1747. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--six-before.log.gz +0 -0
  1748. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--six-environment.log.gz +0 -0
  1749. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--six-refactor.log.gz +0 -0
  1750. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--sly-after.log.gz +0 -0
  1751. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--sly-before.log.gz +0 -0
  1752. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--sly-environment.log.gz +0 -0
  1753. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--sly-refactor.log.gz +0 -0
  1754. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--sniffio-before.log.gz +0 -0
  1755. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--sniffio-environment.log.gz +0 -0
  1756. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--sniffio-refactor.log.gz +0 -0
  1757. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--sortedcontainers-after.log.gz +0 -0
  1758. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--sortedcontainers-before.log.gz +0 -0
  1759. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--sortedcontainers-environment.log.gz +0 -0
  1760. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--sortedcontainers-refactor.log.gz +0 -0
  1761. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--soupsieve-after.log.gz +0 -0
  1762. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--soupsieve-before.log.gz +0 -0
  1763. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--soupsieve-environment.log.gz +0 -0
  1764. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--soupsieve-refactor.log.gz +0 -0
  1765. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--sphinx-after.log.gz +0 -0
  1766. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--sphinx-before.log.gz +0 -0
  1767. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--sphinx-environment.log.gz +0 -0
  1768. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--sphinx-refactor.log.gz +0 -0
  1769. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--sqlparse-after.log.gz +0 -0
  1770. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--sqlparse-before.log.gz +0 -0
  1771. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--sqlparse-environment.log.gz +0 -0
  1772. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--sqlparse-refactor.log.gz +0 -0
  1773. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--starlette-after.log.gz +0 -0
  1774. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--starlette-before.log.gz +0 -0
  1775. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--starlette-environment.log.gz +0 -0
  1776. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--starlette-refactor.log.gz +0 -0
  1777. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--structlog-after.log.gz +0 -0
  1778. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--structlog-before.log.gz +0 -0
  1779. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--structlog-environment.log.gz +0 -0
  1780. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--structlog-refactor.log.gz +0 -0
  1781. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--tabulate-before.log.gz +0 -0
  1782. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--tabulate-environment.log.gz +0 -0
  1783. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--tabulate-refactor.log.gz +0 -0
  1784. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--tenacity-after.log.gz +0 -0
  1785. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--tenacity-before.log.gz +0 -0
  1786. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--tenacity-environment.log.gz +0 -0
  1787. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--tenacity-refactor.log.gz +0 -0
  1788. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--termcolor-before.log.gz +0 -0
  1789. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--termcolor-environment.log.gz +0 -0
  1790. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--termcolor-refactor.log.gz +0 -0
  1791. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--texttable-before.log.gz +0 -0
  1792. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--texttable-environment.log.gz +0 -0
  1793. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--texttable-refactor.log.gz +0 -0
  1794. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--tomli-after.log.gz +0 -0
  1795. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--tomli-before.log.gz +0 -0
  1796. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--tomli-environment.log.gz +0 -0
  1797. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--tomli-refactor.log.gz +0 -0
  1798. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--tomli-w-before.log.gz +0 -0
  1799. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--tomli-w-environment.log.gz +0 -0
  1800. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--tomli-w-refactor.log.gz +0 -0
  1801. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--tomlkit-after.log.gz +0 -0
  1802. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--tomlkit-before.log.gz +0 -0
  1803. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--tomlkit-environment.log.gz +0 -0
  1804. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--tomlkit-refactor.log.gz +0 -0
  1805. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--toolz-after.log.gz +0 -0
  1806. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--toolz-before.log.gz +0 -0
  1807. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--toolz-environment.log.gz +0 -0
  1808. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--toolz-refactor.log.gz +0 -0
  1809. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--tornado-after.log.gz +0 -0
  1810. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--tornado-before.log.gz +0 -0
  1811. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--tornado-environment.log.gz +0 -0
  1812. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--tornado-refactor.log.gz +0 -0
  1813. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--towel-main-before.log.gz +0 -0
  1814. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--towel-main-environment.log.gz +0 -0
  1815. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--towel-main-refactor.log.gz +0 -0
  1816. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--towel-v1.414-before.log.gz +0 -0
  1817. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--towel-v1.414-environment.log.gz +0 -0
  1818. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--towel-v1.414-refactor.log.gz +0 -0
  1819. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--towel-v1.618-before.log.gz +0 -0
  1820. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--towel-v1.618-environment.log.gz +0 -0
  1821. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--towel-v1.618-refactor.log.gz +0 -0
  1822. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--tqdm-before.log.gz +0 -0
  1823. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--tqdm-environment.log.gz +0 -0
  1824. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--tqdm-refactor.log.gz +0 -0
  1825. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--traitlets-after.log.gz +0 -0
  1826. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--traitlets-before.log.gz +0 -0
  1827. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--traitlets-environment.log.gz +0 -0
  1828. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--traitlets-refactor.log.gz +0 -0
  1829. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--trio-after.log.gz +0 -0
  1830. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--trio-before.log.gz +0 -0
  1831. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--trio-environment.log.gz +0 -0
  1832. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--trio-refactor-no-types.log.gz +0 -0
  1833. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--trio-refactor.log.gz +0 -0
  1834. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--typer-after.log.gz +0 -0
  1835. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--typer-before.log.gz +0 -0
  1836. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--typer-environment.log.gz +0 -0
  1837. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--typer-refactor.log.gz +0 -0
  1838. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--typing_extensions-after.log.gz +0 -0
  1839. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--typing_extensions-before.log.gz +0 -0
  1840. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--typing_extensions-environment.log.gz +0 -0
  1841. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--typing_extensions-refactor-no-types.log.gz +0 -0
  1842. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--typing_extensions-refactor.log.gz +0 -0
  1843. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--unidecode-before.log.gz +0 -0
  1844. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--unidecode-environment.log.gz +0 -0
  1845. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--unidecode-refactor.log.gz +0 -0
  1846. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--uritemplate-before.log.gz +0 -0
  1847. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--uritemplate-environment.log.gz +0 -0
  1848. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--uritemplate-refactor.log.gz +0 -0
  1849. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--virtualenv-before.log.gz +0 -0
  1850. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--virtualenv-environment.log.gz +0 -0
  1851. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--virtualenv-refactor.log.gz +0 -0
  1852. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--voluptuous-after.log.gz +0 -0
  1853. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--voluptuous-before.log.gz +0 -0
  1854. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--voluptuous-environment.log.gz +0 -0
  1855. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--voluptuous-refactor.log.gz +0 -0
  1856. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--waitress-after.log.gz +0 -0
  1857. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--waitress-before.log.gz +0 -0
  1858. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--waitress-environment.log.gz +0 -0
  1859. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--waitress-refactor.log.gz +0 -0
  1860. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--wcwidth-after.log.gz +0 -0
  1861. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--wcwidth-before.log.gz +0 -0
  1862. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--wcwidth-environment.log.gz +0 -0
  1863. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--wcwidth-refactor.log.gz +0 -0
  1864. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--webargs-after.log.gz +0 -0
  1865. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--webargs-before.log.gz +0 -0
  1866. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--webargs-environment.log.gz +0 -0
  1867. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--webargs-refactor.log.gz +0 -0
  1868. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--werkzeug-after.log.gz +0 -0
  1869. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--werkzeug-before.log.gz +0 -0
  1870. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--werkzeug-environment.log.gz +0 -0
  1871. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--werkzeug-refactor.log.gz +0 -0
  1872. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--wheel-before.log.gz +0 -0
  1873. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--wheel-environment.log.gz +0 -0
  1874. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--wheel-refactor.log.gz +0 -0
  1875. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--wrapt-after.log.gz +0 -0
  1876. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--wrapt-before.log.gz +0 -0
  1877. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--wrapt-environment.log.gz +0 -0
  1878. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--wrapt-refactor.log.gz +0 -0
  1879. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--wsproto-after.log.gz +0 -0
  1880. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--wsproto-before.log.gz +0 -0
  1881. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--wsproto-environment.log.gz +0 -0
  1882. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--wsproto-refactor.log.gz +0 -0
  1883. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--xmltodict-before.log.gz +0 -0
  1884. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--xmltodict-environment.log.gz +0 -0
  1885. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--xmltodict-refactor.log.gz +0 -0
  1886. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--yapf-after.log.gz +0 -0
  1887. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--yapf-before.log.gz +0 -0
  1888. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--yapf-environment.log.gz +0 -0
  1889. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--yapf-refactor.log.gz +0 -0
  1890. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-reconciliation.json.gz +0 -0
  1891. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--anyio.json.gz +0 -0
  1892. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--apispec.json.gz +0 -0
  1893. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--arrow.json.gz +0 -0
  1894. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--astroid.json.gz +0 -0
  1895. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--attrs.json.gz +0 -0
  1896. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--backoff.json.gz +0 -0
  1897. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--beautifulsoup4.json.gz +0 -0
  1898. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--bidict.json.gz +0 -0
  1899. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--black.json.gz +0 -0
  1900. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--bleach.json.gz +0 -0
  1901. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--blinker.json.gz +0 -0
  1902. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--boltons.json.gz +0 -0
  1903. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--bottle.json.gz +0 -0
  1904. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--cachetools.json.gz +0 -0
  1905. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--cattrs.json.gz +0 -0
  1906. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--cerberus.json.gz +0 -0
  1907. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--chardet.json.gz +0 -0
  1908. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--cheroot.json.gz +0 -0
  1909. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--click.json.gz +0 -0
  1910. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--colorama.json.gz +0 -0
  1911. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--croniter.json.gz +0 -0
  1912. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--decorator.json.gz +0 -0
  1913. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--deepdiff.json.gz +0 -0
  1914. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--django-forms.json.gz +0 -0
  1915. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--django-utils.json.gz +0 -0
  1916. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--docopt-ng.json.gz +0 -0
  1917. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--dpath.json.gz +0 -0
  1918. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--ecdsa.json.gz +0 -0
  1919. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--environs.json.gz +0 -0
  1920. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--feedparser.json.gz +0 -0
  1921. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--filelock.json.gz +0 -0
  1922. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--flake8.json.gz +0 -0
  1923. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--flask.json.gz +0 -0
  1924. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--funcy.json.gz +0 -0
  1925. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--glom.json.gz +0 -0
  1926. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--gunicorn.json.gz +0 -0
  1927. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--h11.json.gz +0 -0
  1928. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--h2.json.gz +0 -0
  1929. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--hpack.json.gz +0 -0
  1930. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--html5lib.json.gz +0 -0
  1931. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--httpx.json.gz +0 -0
  1932. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--humanize.json.gz +0 -0
  1933. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--hyperframe.json.gz +0 -0
  1934. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--idna.json.gz +0 -0
  1935. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--inflect.json.gz +0 -0
  1936. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--inflection.json.gz +0 -0
  1937. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--installer.json.gz +0 -0
  1938. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--invoke.json.gz +0 -0
  1939. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--isort.json.gz +0 -0
  1940. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--itsdangerous.json.gz +0 -0
  1941. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--jinja2.json.gz +0 -0
  1942. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--jmespath.json.gz +0 -0
  1943. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--jsonpatch.json.gz +0 -0
  1944. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--jsonpointer.json.gz +0 -0
  1945. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--jsonschema.json.gz +0 -0
  1946. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--lark.json.gz +0 -0
  1947. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--loguru.json.gz +0 -0
  1948. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--mako.json.gz +0 -0
  1949. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--markdown-it-py.json.gz +0 -0
  1950. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--markdown.json.gz +0 -0
  1951. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--markupsafe.json.gz +0 -0
  1952. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--marshmallow.json.gz +0 -0
  1953. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--mccabe.json.gz +0 -0
  1954. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--mistune.json.gz +0 -0
  1955. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--mkdocs.json.gz +0 -0
  1956. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--more-itertools.json.gz +0 -0
  1957. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--natsort.json.gz +0 -0
  1958. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--networkx.json.gz +0 -0
  1959. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--nox.json.gz +0 -0
  1960. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--oauthlib.json.gz +0 -0
  1961. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--outcome.json.gz +0 -0
  1962. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--packaging.json.gz +0 -0
  1963. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--parsimonious.json.gz +0 -0
  1964. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--parso.json.gz +0 -0
  1965. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--pathspec.json.gz +0 -0
  1966. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--peewee.json.gz +0 -0
  1967. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--platformdirs.json.gz +0 -0
  1968. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--pluggy.json.gz +0 -0
  1969. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--ply.json.gz +0 -0
  1970. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--prettytable.json.gz +0 -0
  1971. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--pyasn1.json.gz +0 -0
  1972. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--pycodestyle.json.gz +0 -0
  1973. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--pycparser.json.gz +0 -0
  1974. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--pyflakes.json.gz +0 -0
  1975. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--pygments.json.gz +0 -0
  1976. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--pyjwt.json.gz +0 -0
  1977. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--pyparsing.json.gz +0 -0
  1978. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--pyproject-hooks.json.gz +0 -0
  1979. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--pyrsistent.json.gz +0 -0
  1980. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--pytest.json.gz +0 -0
  1981. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--python-dateutil.json.gz +0 -0
  1982. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--python-dotenv.json.gz +0 -0
  1983. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--python-fire.json.gz +0 -0
  1984. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--python-prompt-toolkit.json.gz +0 -0
  1985. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--python-slugify.json.gz +0 -0
  1986. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--pyupgrade.json.gz +0 -0
  1987. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--rfc3986.json.gz +0 -0
  1988. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--rich.json.gz +0 -0
  1989. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--rsa.json.gz +0 -0
  1990. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--schedule.json.gz +0 -0
  1991. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--schema.json.gz +0 -0
  1992. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--simpy.json.gz +0 -0
  1993. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--six.json.gz +0 -0
  1994. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--sly.json.gz +0 -0
  1995. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--sniffio.json.gz +0 -0
  1996. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--sortedcontainers.json.gz +0 -0
  1997. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--soupsieve.json.gz +0 -0
  1998. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--sphinx.json.gz +0 -0
  1999. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--sqlparse.json.gz +0 -0
  2000. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--starlette.json.gz +0 -0
  2001. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--structlog.json.gz +0 -0
  2002. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--summary.json.gz +0 -0
  2003. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--summary.md.gz +0 -0
  2004. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--tabulate.json.gz +0 -0
  2005. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--tenacity.json.gz +0 -0
  2006. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--termcolor.json.gz +0 -0
  2007. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--texttable.json.gz +0 -0
  2008. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--tomli-w.json.gz +0 -0
  2009. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--tomli.json.gz +0 -0
  2010. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--tomlkit.json.gz +0 -0
  2011. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--toolz.json.gz +0 -0
  2012. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--tornado.json.gz +0 -0
  2013. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--towel-main.json.gz +0 -0
  2014. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--towel-v1.414.json.gz +0 -0
  2015. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--towel-v1.618.json.gz +0 -0
  2016. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--tqdm.json.gz +0 -0
  2017. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--traitlets.json.gz +0 -0
  2018. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--trio.json.gz +0 -0
  2019. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--typer.json.gz +0 -0
  2020. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--typing_extensions.json.gz +0 -0
  2021. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--unidecode.json.gz +0 -0
  2022. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--uritemplate.json.gz +0 -0
  2023. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--virtualenv.json.gz +0 -0
  2024. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--voluptuous.json.gz +0 -0
  2025. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--waitress.json.gz +0 -0
  2026. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--wcwidth.json.gz +0 -0
  2027. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--webargs.json.gz +0 -0
  2028. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--werkzeug.json.gz +0 -0
  2029. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--wheel.json.gz +0 -0
  2030. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--wrapt.json.gz +0 -0
  2031. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--wsproto.json.gz +0 -0
  2032. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--xmltodict.json.gz +0 -0
  2033. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-report--yapf.json.gz +0 -0
  2034. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-resources.jsonl.gz +0 -0
  2035. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--blinker--assessment.json.gz +0 -0
  2036. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--blinker--before.log.gz +0 -0
  2037. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--blinker--refactor.log.gz +0 -0
  2038. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--blinker--result.json.gz +0 -0
  2039. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--chardet--after.log.gz +0 -0
  2040. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--chardet--assessment.json.gz +0 -0
  2041. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--chardet--before.log.gz +0 -0
  2042. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--chardet--refactor.log.gz +0 -0
  2043. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--chardet--result.json.gz +0 -0
  2044. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--cheroot--after.log.gz +0 -0
  2045. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--cheroot--assessment.json.gz +0 -0
  2046. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--cheroot--before.log.gz +0 -0
  2047. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--cheroot--predecessor-cause--.mypy.ini.gz +0 -0
  2048. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--cheroot--predecessor-cause--.pre-commit-config.yaml.gz +0 -0
  2049. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--cheroot--predecessor-cause--assessment.json.gz +0 -0
  2050. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--cheroot--predecessor-cause--own-mypy.json.gz +0 -0
  2051. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--cheroot--predecessor-cause--own-mypy.log.gz +0 -0
  2052. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--cheroot--predecessor-cause--pyproject.toml.gz +0 -0
  2053. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--cheroot--predecessor-cause--tox.ini.gz +0 -0
  2054. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--cheroot--refactor-no-types.log.gz +0 -0
  2055. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--cheroot--refactor.log.gz +0 -0
  2056. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--cheroot--result.json.gz +0 -0
  2057. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--invoke--assessment.json.gz +0 -0
  2058. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--invoke--before.log.gz +0 -0
  2059. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--invoke--facts.json.gz +0 -0
  2060. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--invoke--probe-command.json.gz +0 -0
  2061. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--invoke--probe.py.gz +0 -0
  2062. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--invoke--refactor.log.gz +0 -0
  2063. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--invoke--result.json.gz +0 -0
  2064. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--isort--assessment.json.gz +0 -0
  2065. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--isort--before.log.gz +0 -0
  2066. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--isort--facts.json.gz +0 -0
  2067. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--isort--probe-command.json.gz +0 -0
  2068. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--isort--probe.py.gz +0 -0
  2069. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--isort--refactor.log.gz +0 -0
  2070. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--isort--result.json.gz +0 -0
  2071. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--pyparsing--after.log.gz +0 -0
  2072. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--pyparsing--assessment.json.gz +0 -0
  2073. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--pyparsing--before.log.gz +0 -0
  2074. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--pyparsing--refactor.log.gz +0 -0
  2075. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--pyparsing--result.json.gz +0 -0
  2076. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--sphinx--after.log.gz +0 -0
  2077. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--sphinx--assessment.json.gz +0 -0
  2078. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--sphinx--before.log.gz +0 -0
  2079. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--sphinx--refactor.log.gz +0 -0
  2080. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--sphinx--result.json.gz +0 -0
  2081. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--tornado--after.log.gz +0 -0
  2082. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--tornado--assessment.json.gz +0 -0
  2083. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--tornado--before.log.gz +0 -0
  2084. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--tornado--refactor.log.gz +0 -0
  2085. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--tornado--result.json.gz +0 -0
  2086. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--towel-main--assessment.json.gz +0 -0
  2087. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--towel-main--before.log.gz +0 -0
  2088. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--towel-main--refactor.log.gz +0 -0
  2089. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--towel-main--result.json.gz +0 -0
  2090. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--towel-v1.414--assessment.json.gz +0 -0
  2091. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--towel-v1.414--before.log.gz +0 -0
  2092. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--towel-v1.414--refactor.log.gz +0 -0
  2093. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--towel-v1.414--result.json.gz +0 -0
  2094. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--towel-v1.618--assessment.json.gz +0 -0
  2095. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--towel-v1.618--before.log.gz +0 -0
  2096. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--towel-v1.618--refactor.log.gz +0 -0
  2097. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--towel-v1.618--result.json.gz +0 -0
  2098. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--trio--after.log.gz +0 -0
  2099. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--trio--assessment.json.gz +0 -0
  2100. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--trio--before.log.gz +0 -0
  2101. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--trio--current-checker-environment.json.gz +0 -0
  2102. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--trio--predecessor-cause--assessment.json.gz +0 -0
  2103. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--trio--predecessor-cause--checker-environment.json.gz +0 -0
  2104. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--trio--predecessor-cause--own-mypy-linux.json.gz +0 -0
  2105. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--trio--predecessor-cause--own-mypy-linux.log.gz +0 -0
  2106. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--trio--predecessor-cause--pyproject.toml.gz +0 -0
  2107. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--trio--predecessor-cause--test-requirements.txt.gz +0 -0
  2108. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--trio--predecessor-cause--tox.ini.gz +0 -0
  2109. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--trio--refactor-no-types.log.gz +0 -0
  2110. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--trio--refactor.log.gz +0 -0
  2111. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--trio--result.json.gz +0 -0
  2112. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--typing_extensions--after.log.gz +0 -0
  2113. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--typing_extensions--assessment.json.gz +0 -0
  2114. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--typing_extensions--before.log.gz +0 -0
  2115. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--typing_extensions--predecessor-cause--.pre-commit-config.yaml.gz +0 -0
  2116. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--typing_extensions--predecessor-cause--assessment.json.gz +0 -0
  2117. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--typing_extensions--predecessor-cause--own-mypy.json.gz +0 -0
  2118. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--typing_extensions--predecessor-cause--own-mypy.log.gz +0 -0
  2119. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--typing_extensions--predecessor-cause--pyproject.toml.gz +0 -0
  2120. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--typing_extensions--predecessor-cause--tox.ini.gz +0 -0
  2121. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--typing_extensions--refactor-no-types.log.gz +0 -0
  2122. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--typing_extensions--refactor.log.gz +0 -0
  2123. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus-review--typing_extensions--result.json.gz +0 -0
  2124. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/corpus.log.gz +0 -0
  2125. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/coverage-3.11.xml.gz +0 -0
  2126. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/coverage-3.12.xml.gz +0 -0
  2127. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/coverage-3.13.xml.gz +0 -0
  2128. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/dependencies-audit-command.json.gz +0 -0
  2129. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/dependencies-dev-audit.log.gz +0 -0
  2130. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/dependencies-dev.txt.gz +0 -0
  2131. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/diagrams-command.json.gz +0 -0
  2132. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/diagrams-writable-cache.log.gz +0 -0
  2133. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/distribution-contents.json.gz +0 -0
  2134. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/fallback-config-probe-command.json.gz +0 -0
  2135. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/fallback-config-probe-result.json.gz +0 -0
  2136. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/fallback-config-probe.py.gz +0 -0
  2137. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/fuzz-grammar.log.gz +0 -0
  2138. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/fuzz-results.json.gz +0 -0
  2139. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/fuzz-scope.log.gz +0 -0
  2140. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/input-preflight-command.json.gz +0 -0
  2141. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/input-preflight.json.gz +0 -0
  2142. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/inspect_artifacts.py.gz +0 -0
  2143. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/matrix-3.11-container.json.gz +0 -0
  2144. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/matrix-3.11-launch.json.gz +0 -0
  2145. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/matrix-3.11-resources.jsonl.gz +0 -0
  2146. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/matrix-3.11-result.json.gz +0 -0
  2147. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/matrix-3.11.log.gz +0 -0
  2148. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/matrix-3.12-container.json.gz +0 -0
  2149. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/matrix-3.12-launch.json.gz +0 -0
  2150. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/matrix-3.12-resources.jsonl.gz +0 -0
  2151. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/matrix-3.12-result.json.gz +0 -0
  2152. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/matrix-3.12.log.gz +0 -0
  2153. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/matrix-3.13-container.json.gz +0 -0
  2154. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/matrix-3.13-launch.json.gz +0 -0
  2155. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/matrix-3.13-resources.jsonl.gz +0 -0
  2156. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/matrix-3.13-result.json.gz +0 -0
  2157. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/matrix-3.13.log.gz +0 -0
  2158. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/matrix-driver.log.gz +0 -0
  2159. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/matrix-resumption-preflight.json.gz +0 -0
  2160. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/mechanical-corpus-review.json.gz +0 -0
  2161. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/observe_cold_cli.py.gz +0 -0
  2162. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/predecessor-oom--assessment.json.gz +0 -0
  2163. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/predecessor-oom--before.log.gz +0 -0
  2164. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/predecessor-oom--corpus-entry.py.gz +0 -0
  2165. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/predecessor-oom--resource-failure.json.gz +0 -0
  2166. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/predecessor-oom--result.json.gz +0 -0
  2167. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/predecessor-review.json.gz +0 -0
  2168. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/provenance.json +0 -0
  2169. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/quality-313.log.gz +0 -0
  2170. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/refusal-integrity-command.json.gz +0 -0
  2171. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/refusal-integrity.json.gz +0 -0
  2172. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/refusal-integrity.py.gz +0 -0
  2173. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/resume-final-gates.py.gz +0 -0
  2174. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/run-corpus.py.gz +0 -0
  2175. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/run-fuzz.py.gz +0 -0
  2176. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/run-matrix.py.gz +0 -0
  2177. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/run-matrix.sh.gz +0 -0
  2178. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/run-self-complete.py.gz +0 -0
  2179. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/run-self-project.py.gz +0 -0
  2180. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/sdist-docs-result.json.gz +0 -0
  2181. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/sdist-docs-source.log.gz +0 -0
  2182. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/sdist-docs-tests.log.gz +0 -0
  2183. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/self-generation-result.json.gz +0 -0
  2184. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/selfdogfood--imported-source.log.gz +0 -0
  2185. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/selfdogfood--post-test-integrity.json.gz +0 -0
  2186. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/selfdogfood--results.json.gz +0 -0
  2187. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/selfdogfood--source.json.gz +0 -0
  2188. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/selfdogfood--tests.log.gz +0 -0
  2189. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/selfdogfood--typecheck.log.gz +0 -0
  2190. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/selfdogfood.log.gz +0 -0
  2191. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/smoke_wheels.py.gz +0 -0
  2192. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/source.json.gz +0 -0
  2193. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/twine-313.log.gz +0 -0
  2194. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/validate-corpus-records.py.gz +0 -0
  2195. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/verify_distribution_contents.py.gz +0 -0
  2196. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/wheel-smoke--3.11-bare--commands.json.gz +0 -0
  2197. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/wheel-smoke--3.11-extras--cold-check.json.gz +0 -0
  2198. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/wheel-smoke--3.11-extras--commands.json.gz +0 -0
  2199. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/wheel-smoke--3.12-bare--commands.json.gz +0 -0
  2200. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/wheel-smoke--3.12-extras--cold-check.json.gz +0 -0
  2201. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/wheel-smoke--3.12-extras--commands.json.gz +0 -0
  2202. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/wheel-smoke--3.13-bare--commands.json.gz +0 -0
  2203. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/wheel-smoke--3.13-extras--cold-check.json.gz +0 -0
  2204. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/wheel-smoke--3.13-extras--commands.json.gz +0 -0
  2205. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-corrected-validation/wheel-smoke--results.json.gz +0 -0
  2206. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-performance/README.md +0 -0
  2207. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-performance/after-commit.txt.gz +0 -0
  2208. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-performance/after-fixed_point.py.gz +0 -0
  2209. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-performance/before-fixed_point.py.gz +0 -0
  2210. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-performance/operator-record.md.gz +0 -0
  2211. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-performance/packaging-after-1-boundary.json.gz +0 -0
  2212. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-performance/packaging-after-1-events.jsonl.gz +0 -0
  2213. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-performance/packaging-after-1-run.log.gz +0 -0
  2214. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-performance/packaging-after-2-boundary.json.gz +0 -0
  2215. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-performance/packaging-after-2-events.jsonl.gz +0 -0
  2216. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-performance/packaging-after-2-run.log.gz +0 -0
  2217. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-performance/packaging-after-source.json.gz +0 -0
  2218. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-performance/packaging-baseline-1-boundary.json.gz +0 -0
  2219. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-performance/packaging-baseline-1-events.jsonl.gz +0 -0
  2220. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-performance/packaging-baseline-1-run.log.gz +0 -0
  2221. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-performance/packaging-baseline-2-boundary.json.gz +0 -0
  2222. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-performance/packaging-baseline-2-events.jsonl.gz +0 -0
  2223. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-performance/packaging-baseline-2-run.log.gz +0 -0
  2224. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-performance/packaging-before-source.json.gz +0 -0
  2225. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-performance/packaging-comparison.json.gz +0 -0
  2226. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-performance/packaging-comparison.log.gz +0 -0
  2227. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-performance/packaging-config.toml.gz +0 -0
  2228. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-performance/packaging-measure.py.gz +0 -0
  2229. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-performance/provenance.json +0 -0
  2230. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-performance/sphinx-after-inputs.json.gz +0 -0
  2231. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-performance/sphinx-after-profile.py.gz +0 -0
  2232. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-performance/sphinx-after-spans.jsonl.gz +0 -0
  2233. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-performance/sphinx-after-summary.json.gz +0 -0
  2234. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-performance/sphinx-after.log.gz +0 -0
  2235. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-performance/sphinx-before-inputs.json.gz +0 -0
  2236. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-performance/sphinx-before-profile.py.gz +0 -0
  2237. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-performance/sphinx-before-spans.jsonl.gz +0 -0
  2238. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-performance/sphinx-before-summary.json.gz +0 -0
  2239. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-performance/sphinx-before.log.gz +0 -0
  2240. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-performance/sphinx-comparison.json.gz +0 -0
  2241. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/README.md +0 -0
  2242. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/benchmark-driver-stopped-20260928.log.gz +0 -0
  2243. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/benchmark-driver.log.gz +0 -0
  2244. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/benchmark-result-stopped-20260928.json.gz +0 -0
  2245. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/benchmark-result.json.gz +0 -0
  2246. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/candidate-environment.json.gz +0 -0
  2247. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/idle-preflight.json.gz +0 -0
  2248. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/input-provenance.json.gz +0 -0
  2249. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/packaging-1-published--cli.log.gz +0 -0
  2250. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/packaging-1-published--command-result.json.gz +0 -0
  2251. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/packaging-1-published--imported-source.json.gz +0 -0
  2252. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/packaging-1-published--processes-before.txt.gz +0 -0
  2253. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/packaging-1-published--runtime-identity.json.gz +0 -0
  2254. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/packaging-2-candidate--cli.log.gz +0 -0
  2255. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/packaging-2-candidate--command-result.json.gz +0 -0
  2256. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/packaging-2-candidate--imported-source.json.gz +0 -0
  2257. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/packaging-2-candidate--processes-before.txt.gz +0 -0
  2258. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/packaging-2-candidate--runtime-identity.json.gz +0 -0
  2259. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/packaging-3-candidate--cli.log.gz +0 -0
  2260. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/packaging-3-candidate--command-result.json.gz +0 -0
  2261. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/packaging-3-candidate--imported-source.json.gz +0 -0
  2262. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/packaging-3-candidate--processes-before.txt.gz +0 -0
  2263. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/packaging-3-candidate--runtime-identity.json.gz +0 -0
  2264. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/packaging-4-published--cli.log.gz +0 -0
  2265. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/packaging-4-published--command-result.json.gz +0 -0
  2266. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/packaging-4-published--imported-source.json.gz +0 -0
  2267. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/packaging-4-published--processes-before.txt.gz +0 -0
  2268. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/packaging-4-published--runtime-identity.json.gz +0 -0
  2269. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/packaging-comparison.json.gz +0 -0
  2270. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/packaging-driver.log.gz +0 -0
  2271. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/packaging-results.json.gz +0 -0
  2272. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/prerequisites--completed-document-quality.log.gz +0 -0
  2273. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/prerequisites--completed-document-tests.log.gz +0 -0
  2274. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/prerequisites--continuation-result.json.gz +0 -0
  2275. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/prerequisites--corpus-exit.json.gz +0 -0
  2276. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/prerequisites--matrix-3.11-result.json.gz +0 -0
  2277. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/prerequisites--matrix-3.12-result.json.gz +0 -0
  2278. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/prerequisites--matrix-3.13-result.json.gz +0 -0
  2279. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/prerequisites--prebenchmark-checks.json.gz +0 -0
  2280. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/processes-before-timing.txt.gz +0 -0
  2281. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/profile-sphinx.py.gz +0 -0
  2282. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/provenance.json +0 -0
  2283. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/published-environment.json.gz +0 -0
  2284. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/published-provenance.json.gz +0 -0
  2285. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/pypi-1.772.json.gz +0 -0
  2286. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/ready-for-timing.json.gz +0 -0
  2287. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/retain-and-document.py.gz +0 -0
  2288. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/run-after-validation.py.gz +0 -0
  2289. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/run-packaging.py.gz +0 -0
  2290. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/run-sphinx-container.py.gz +0 -0
  2291. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/sphinx-1-command.json.gz +0 -0
  2292. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/sphinx-1-install.json.gz +0 -0
  2293. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/sphinx-1-published--answers.json.gz +0 -0
  2294. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/sphinx-1-published--environment.json.gz +0 -0
  2295. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/sphinx-1-published--request-fingerprints.json.gz +0 -0
  2296. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/sphinx-1-published--result.json.gz +0 -0
  2297. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/sphinx-1-published.log.gz +0 -0
  2298. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/sphinx-1-source.json.gz +0 -0
  2299. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/sphinx-2-candidate--answers.json.gz +0 -0
  2300. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/sphinx-2-candidate--environment.json.gz +0 -0
  2301. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/sphinx-2-candidate--request-fingerprints.json.gz +0 -0
  2302. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/sphinx-2-candidate--result.json.gz +0 -0
  2303. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/sphinx-2-candidate.log.gz +0 -0
  2304. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/sphinx-2-command.json.gz +0 -0
  2305. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/sphinx-2-install.json.gz +0 -0
  2306. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/sphinx-2-source.json.gz +0 -0
  2307. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/sphinx-3-candidate--answers.json.gz +0 -0
  2308. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/sphinx-3-candidate--environment.json.gz +0 -0
  2309. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/sphinx-3-candidate--request-fingerprints.json.gz +0 -0
  2310. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/sphinx-3-candidate--result.json.gz +0 -0
  2311. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/sphinx-3-candidate.log.gz +0 -0
  2312. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/sphinx-3-command.json.gz +0 -0
  2313. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/sphinx-3-install.json.gz +0 -0
  2314. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/sphinx-3-source.json.gz +0 -0
  2315. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/sphinx-4-command.json.gz +0 -0
  2316. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/sphinx-4-install.json.gz +0 -0
  2317. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/sphinx-4-published--answers.json.gz +0 -0
  2318. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/sphinx-4-published--environment.json.gz +0 -0
  2319. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/sphinx-4-published--request-fingerprints.json.gz +0 -0
  2320. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/sphinx-4-published--result.json.gz +0 -0
  2321. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/sphinx-4-published.log.gz +0 -0
  2322. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/sphinx-4-source.json.gz +0 -0
  2323. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/sphinx-comparison.json.gz +0 -0
  2324. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/sphinx-container-command.json.gz +0 -0
  2325. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/sphinx-container-final.json.gz +0 -0
  2326. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/sphinx-driver.log.gz +0 -0
  2327. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/sphinx-input-sha256.json.gz +0 -0
  2328. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/sphinx-resources.jsonl.gz +0 -0
  2329. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/sphinx-results.json.gz +0 -0
  2330. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/timing-prerequisites.json.gz +0 -0
  2331. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/tool-pins.txt.gz +0 -0
  2332. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-published-comparison/wheel-source-identity.json.gz +0 -0
  2333. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-typed-cli/README.md +0 -0
  2334. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-typed-cli/measurements.json +0 -0
  2335. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-validation/README.md +0 -0
  2336. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-validation/artifacts.json.gz +0 -0
  2337. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-validation/candidate--pyproject.toml.gz +0 -0
  2338. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-validation/coverage-3.11.xml.gz +0 -0
  2339. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-validation/coverage-3.12.xml.gz +0 -0
  2340. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-validation/coverage-3.13.xml.gz +0 -0
  2341. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-validation/dependencies-dev-audit.log.gz +0 -0
  2342. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-validation/dependencies-dev.txt.gz +0 -0
  2343. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-validation/diagrams-writable-cache.log.gz +0 -0
  2344. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-validation/distribution-contents.json.gz +0 -0
  2345. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-validation/fuzz-grammar.log.gz +0 -0
  2346. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-validation/fuzz-scope.log.gz +0 -0
  2347. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-validation/inspect_artifacts.py.gz +0 -0
  2348. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-validation/matrix-3.11-launch.json.gz +0 -0
  2349. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-validation/matrix-3.11-result.json.gz +0 -0
  2350. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-validation/matrix-3.11.log.gz +0 -0
  2351. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-validation/matrix-3.12-launch.json.gz +0 -0
  2352. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-validation/matrix-3.12-result.json.gz +0 -0
  2353. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-validation/matrix-3.12.log.gz +0 -0
  2354. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-validation/matrix-3.13-launch.json.gz +0 -0
  2355. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-validation/matrix-3.13-result.json.gz +0 -0
  2356. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-validation/matrix-3.13.log.gz +0 -0
  2357. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-validation/matrix-driver.log.gz +0 -0
  2358. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-validation/observe_cold_cli.py.gz +0 -0
  2359. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-validation/provenance.json +0 -0
  2360. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-validation/quality-313.log.gz +0 -0
  2361. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-validation/run-matrix.py.gz +0 -0
  2362. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-validation/run-matrix.sh.gz +0 -0
  2363. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-validation/run-self-project.py.gz +0 -0
  2364. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-validation/selfdogfood--imported-source.log.gz +0 -0
  2365. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-validation/selfdogfood--post-test-integrity.json.gz +0 -0
  2366. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-validation/selfdogfood--results.json.gz +0 -0
  2367. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-validation/selfdogfood--source.json.gz +0 -0
  2368. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-validation/selfdogfood--tests.log.gz +0 -0
  2369. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-validation/selfdogfood--typecheck.log.gz +0 -0
  2370. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-validation/selfdogfood.log.gz +0 -0
  2371. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-validation/smoke_wheels.py.gz +0 -0
  2372. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-validation/source.json.gz +0 -0
  2373. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-validation/twine-313.log.gz +0 -0
  2374. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-validation/verify_distribution_contents.py.gz +0 -0
  2375. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-validation/wheel-smoke--3.11-bare--commands.json.gz +0 -0
  2376. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-validation/wheel-smoke--3.11-extras--cold-check.json.gz +0 -0
  2377. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-validation/wheel-smoke--3.11-extras--commands.json.gz +0 -0
  2378. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-validation/wheel-smoke--3.12-bare--commands.json.gz +0 -0
  2379. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-validation/wheel-smoke--3.12-extras--cold-check.json.gz +0 -0
  2380. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-validation/wheel-smoke--3.12-extras--commands.json.gz +0 -0
  2381. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-validation/wheel-smoke--3.13-bare--commands.json.gz +0 -0
  2382. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-validation/wheel-smoke--3.13-extras--cold-check.json.gz +0 -0
  2383. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-validation/wheel-smoke--3.13-extras--commands.json.gz +0 -0
  2384. {code_towel-1.792 → code_towel-1.946}/tests/release_evidence/post-1772-validation/wheel-smoke--results.json.gz +0 -0
  2385. {code_towel-1.792 → code_towel-1.946}/tests/run_tests.py +0 -0
  2386. {code_towel-1.792 → code_towel-1.946}/tests/stdlib_bases.py +0 -0
  2387. {code_towel-1.792 → code_towel-1.946}/tests/test_adversarial_renaming.py +0 -0
  2388. {code_towel-1.792 → code_towel-1.946}/tests/test_adversarial_semantics.py +0 -0
  2389. {code_towel-1.792 → code_towel-1.946}/tests/test_analysis_edge_paths.py +0 -0
  2390. {code_towel-1.792 → code_towel-1.946}/tests/test_analysis_sessions.py +0 -0
  2391. {code_towel-1.792 → code_towel-1.946}/tests/test_analysis_source_diagnostics.py +0 -0
  2392. {code_towel-1.792 → code_towel-1.946}/tests/test_analysis_sources.py +0 -0
  2393. {code_towel-1.792 → code_towel-1.946}/tests/test_annotation_guard_runtime.py +0 -0
  2394. {code_towel-1.792 → code_towel-1.946}/tests/test_annotation_imports.py +0 -0
  2395. {code_towel-1.792 → code_towel-1.946}/tests/test_annotation_ladder.py +0 -0
  2396. {code_towel-1.792 → code_towel-1.946}/tests/test_annotation_ladder_early_refusal.py +0 -0
  2397. {code_towel-1.792 → code_towel-1.946}/tests/test_annotation_runtime_effects.py +0 -0
  2398. {code_towel-1.792 → code_towel-1.946}/tests/test_annotations_for_the_oldest_python.py +0 -0
  2399. {code_towel-1.792 → code_towel-1.946}/tests/test_argument_ownership.py +0 -0
  2400. {code_towel-1.792 → code_towel-1.946}/tests/test_assignment_analyzer_comprehensive.py +0 -0
  2401. {code_towel-1.792 → code_towel-1.946}/tests/test_attribute_declaration_order.py +0 -0
  2402. {code_towel-1.792 → code_towel-1.946}/tests/test_audit_io_safety.py +0 -0
  2403. {code_towel-1.792 → code_towel-1.946}/tests/test_baseline_shapes.py +0 -0
  2404. {code_towel-1.792 → code_towel-1.946}/tests/test_binding_and_read_collectors.py +0 -0
  2405. {code_towel-1.792 → code_towel-1.946}/tests/test_binding_collectors_match_cpython.py +0 -0
  2406. {code_towel-1.792 → code_towel-1.946}/tests/test_binding_context_memo.py +0 -0
  2407. {code_towel-1.792 → code_towel-1.946}/tests/test_binding_detector.py +0 -0
  2408. {code_towel-1.792 → code_towel-1.946}/tests/test_binding_detector_edge_cases.py +0 -0
  2409. {code_towel-1.792 → code_towel-1.946}/tests/test_bindings.py +0 -0
  2410. {code_towel-1.792 → code_towel-1.946}/tests/test_bindings_additional.py +0 -0
  2411. {code_towel-1.792 → code_towel-1.946}/tests/test_block_comments.py +0 -0
  2412. {code_towel-1.792 → code_towel-1.946}/tests/test_block_site_caches.py +0 -0
  2413. {code_towel-1.792 → code_towel-1.946}/tests/test_breakers.py +0 -0
  2414. {code_towel-1.792 → code_towel-1.946}/tests/test_builtins_across_modules.py +0 -0
  2415. {code_towel-1.792 → code_towel-1.946}/tests/test_builtins_comprehensive.py +0 -0
  2416. {code_towel-1.792 → code_towel-1.946}/tests/test_cache_lifetimes.py +0 -0
  2417. {code_towel-1.792 → code_towel-1.946}/tests/test_cache_run_boundaries.py +0 -0
  2418. {code_towel-1.792 → code_towel-1.946}/tests/test_candidate_index.py +0 -0
  2419. {code_towel-1.792 → code_towel-1.946}/tests/test_candidate_recovery.py +0 -0
  2420. {code_towel-1.792 → code_towel-1.946}/tests/test_change_transactions.py +0 -0
  2421. {code_towel-1.792 → code_towel-1.946}/tests/test_checker_failure_reporting.py +0 -0
  2422. {code_towel-1.792 → code_towel-1.946}/tests/test_checker_reports.py +0 -0
  2423. {code_towel-1.792 → code_towel-1.946}/tests/test_checker_snapshot_follows_project.py +0 -0
  2424. {code_towel-1.792 → code_towel-1.946}/tests/test_class_object_annotations.py +0 -0
  2425. {code_towel-1.792 → code_towel-1.946}/tests/test_class_private_helpers.py +0 -0
  2426. {code_towel-1.792 → code_towel-1.946}/tests/test_class_private_positions.py +0 -0
  2427. {code_towel-1.792 → code_towel-1.946}/tests/test_cli_complete_preview.py +0 -0
  2428. {code_towel-1.792 → code_towel-1.946}/tests/test_cli_dispatch_paths.py +0 -0
  2429. {code_towel-1.792 → code_towel-1.946}/tests/test_cli_input_errors.py +0 -0
  2430. {code_towel-1.792 → code_towel-1.946}/tests/test_cli_integration.py +0 -0
  2431. {code_towel-1.792 → code_towel-1.946}/tests/test_cli_oracle_lifecycle.py +0 -0
  2432. {code_towel-1.792 → code_towel-1.946}/tests/test_cli_output_safety.py +0 -0
  2433. {code_towel-1.792 → code_towel-1.946}/tests/test_cli_sidecar_publication.py +0 -0
  2434. {code_towel-1.792 → code_towel-1.946}/tests/test_cold_confirmation.py +0 -0
  2435. {code_towel-1.792 → code_towel-1.946}/tests/test_complete_check_scope.py +0 -0
  2436. {code_towel-1.792 → code_towel-1.946}/tests/test_completed_validation_documentation.py +0 -0
  2437. {code_towel-1.792 → code_towel-1.946}/tests/test_comprehensive_coverage.py +0 -0
  2438. {code_towel-1.792 → code_towel-1.946}/tests/test_configured_checker_must_run.py +0 -0
  2439. {code_towel-1.792 → code_towel-1.946}/tests/test_configured_ruff_lint.py +0 -0
  2440. {code_towel-1.792 → code_towel-1.946}/tests/test_consumer_reach.py +0 -0
  2441. {code_towel-1.792 → code_towel-1.946}/tests/test_copy_preservation.py +0 -0
  2442. {code_towel-1.792 → code_towel-1.946}/tests/test_coverage_config.py +0 -0
  2443. {code_towel-1.792 → code_towel-1.946}/tests/test_created_object_escapes.py +0 -0
  2444. {code_towel-1.792 → code_towel-1.946}/tests/test_cross_distribution.py +0 -0
  2445. {code_towel-1.792 → code_towel-1.946}/tests/test_cross_module_opt_in.py +0 -0
  2446. {code_towel-1.792 → code_towel-1.946}/tests/test_crossfile_observational_equivalence.py +0 -0
  2447. {code_towel-1.792 → code_towel-1.946}/tests/test_decline_traces.py +0 -0
  2448. {code_towel-1.792 → code_towel-1.946}/tests/test_declined_run_reports.py +0 -0
  2449. {code_towel-1.792 → code_towel-1.946}/tests/test_deeply_nested_source.py +0 -0
  2450. {code_towel-1.792 → code_towel-1.946}/tests/test_definite_assignment.py +0 -0
  2451. {code_towel-1.792 → code_towel-1.946}/tests/test_definite_assignment_runtime.py +0 -0
  2452. {code_towel-1.792 → code_towel-1.946}/tests/test_dependency_audit_export.py +0 -0
  2453. {code_towel-1.792 → code_towel-1.946}/tests/test_differential_baseline.py +0 -0
  2454. {code_towel-1.792 → code_towel-1.946}/tests/test_differential_scope_family.py +0 -0
  2455. {code_towel-1.792 → code_towel-1.946}/tests/test_distinct_proposals.py +0 -0
  2456. {code_towel-1.792 → code_towel-1.946}/tests/test_documentation_navigation.py +0 -0
  2457. {code_towel-1.792 → code_towel-1.946}/tests/test_early_shared_helpers.py +0 -0
  2458. {code_towel-1.792 → code_towel-1.946}/tests/test_ecosystem_checker_contexts.py +0 -0
  2459. {code_towel-1.792 → code_towel-1.946}/tests/test_ecosystem_colour_environment.py +0 -0
  2460. {code_towel-1.792 → code_towel-1.946}/tests/test_ecosystem_environment.py +0 -0
  2461. {code_towel-1.792 → code_towel-1.946}/tests/test_ecosystem_failure_context.py +0 -0
  2462. {code_towel-1.792 → code_towel-1.946}/tests/test_ecosystem_manifest_regressions.py +0 -0
  2463. {code_towel-1.792 → code_towel-1.946}/tests/test_ecosystem_post_install.py +0 -0
  2464. {code_towel-1.792 → code_towel-1.946}/tests/test_ecosystem_pytest_cache.py +0 -0
  2465. {code_towel-1.792 → code_towel-1.946}/tests/test_ecosystem_tool_pins.py +0 -0
  2466. {code_towel-1.792 → code_towel-1.946}/tests/test_ecosystem_typing_deps.py +0 -0
  2467. {code_towel-1.792 → code_towel-1.946}/tests/test_ecosystem_uv_default_groups.py +0 -0
  2468. {code_towel-1.792 → code_towel-1.946}/tests/test_ecosystem_verdicts.py +0 -0
  2469. {code_towel-1.792 → code_towel-1.946}/tests/test_ecosystem_work_isolation.py +0 -0
  2470. {code_towel-1.792 → code_towel-1.946}/tests/test_ecosystem_workflow_checkers.py +0 -0
  2471. {code_towel-1.792 → code_towel-1.946}/tests/test_effect_free.py +0 -0
  2472. {code_towel-1.792 → code_towel-1.946}/tests/test_engine_failure_visibility.py +0 -0
  2473. {code_towel-1.792 → code_towel-1.946}/tests/test_environment_independence.py +0 -0
  2474. {code_towel-1.792 → code_towel-1.946}/tests/test_environment_inside_the_root.py +0 -0
  2475. {code_towel-1.792 → code_towel-1.946}/tests/test_equivalence_harness_regressions.py +0 -0
  2476. {code_towel-1.792 → code_towel-1.946}/tests/test_equivalence_target_selection.py +0 -0
  2477. {code_towel-1.792 → code_towel-1.946}/tests/test_error_paths.py +0 -0
  2478. {code_towel-1.792 → code_towel-1.946}/tests/test_exceptions.py +0 -0
  2479. {code_towel-1.792 → code_towel-1.946}/tests/test_extractor_additional_branches.py +0 -0
  2480. {code_towel-1.792 → code_towel-1.946}/tests/test_extractor_augassign_and_fstrings.py +0 -0
  2481. {code_towel-1.792 → code_towel-1.946}/tests/test_extractor_callee_and_multi_return.py +0 -0
  2482. {code_towel-1.792 → code_towel-1.946}/tests/test_extractor_comprehensive.py +0 -0
  2483. {code_towel-1.792 → code_towel-1.946}/tests/test_extractor_edge_cases.py +0 -0
  2484. {code_towel-1.792 → code_towel-1.946}/tests/test_extractor_final_lines.py +0 -0
  2485. {code_towel-1.792 → code_towel-1.946}/tests/test_extractor_generate_call_variants.py +0 -0
  2486. {code_towel-1.792 → code_towel-1.946}/tests/test_extractor_more_paths.py +0 -0
  2487. {code_towel-1.792 → code_towel-1.946}/tests/test_extractor_preamble_and_call_mapping.py +0 -0
  2488. {code_towel-1.792 → code_towel-1.946}/tests/test_extractor_remaining_branches.py +0 -0
  2489. {code_towel-1.792 → code_towel-1.946}/tests/test_extractor_return_statements.py +0 -0
  2490. {code_towel-1.792 → code_towel-1.946}/tests/test_extractor_substituter_and_helpers.py +0 -0
  2491. {code_towel-1.792 → code_towel-1.946}/tests/test_file_under_two_names.py +0 -0
  2492. {code_towel-1.792 → code_towel-1.946}/tests/test_filesystem_guards.py +0 -0
  2493. {code_towel-1.792 → code_towel-1.946}/tests/test_final_coverage_push.py +0 -0
  2494. {code_towel-1.792 → code_towel-1.946}/tests/test_fixed_point_refusals.py +0 -0
  2495. {code_towel-1.792 → code_towel-1.946}/tests/test_formatting_protocol_boundary.py +0 -0
  2496. {code_towel-1.792 → code_towel-1.946}/tests/test_formatting_repeatability.py +0 -0
  2497. {code_towel-1.792 → code_towel-1.946}/tests/test_forwarder_chains.py +0 -0
  2498. {code_towel-1.792 → code_towel-1.946}/tests/test_frame_ownership.py +0 -0
  2499. {code_towel-1.792 → code_towel-1.946}/tests/test_frame_ownership_engine.py +0 -0
  2500. {code_towel-1.792 → code_towel-1.946}/tests/test_frame_sensitivity_scan.py +0 -0
  2501. {code_towel-1.792 → code_towel-1.946}/tests/test_free_variable_correspondence.py +0 -0
  2502. {code_towel-1.792 → code_towel-1.946}/tests/test_fstrings.py +0 -0
  2503. {code_towel-1.792 → code_towel-1.946}/tests/test_fully_annotated_modules.py +0 -0
  2504. {code_towel-1.792 → code_towel-1.946}/tests/test_function_facts_equivalence.py +0 -0
  2505. {code_towel-1.792 → code_towel-1.946}/tests/test_function_index.py +0 -0
  2506. {code_towel-1.792 → code_towel-1.946}/tests/test_functions_keep_their_own_bodies.py +0 -0
  2507. {code_towel-1.792 → code_towel-1.946}/tests/test_generated_code_formatting.py +0 -0
  2508. {code_towel-1.792 → code_towel-1.946}/tests/test_generated_helper_aliases.py +0 -0
  2509. {code_towel-1.792 → code_towel-1.946}/tests/test_generated_helper_parameters.py +0 -0
  2510. {code_towel-1.792 → code_towel-1.946}/tests/test_generated_helper_reuse.py +0 -0
  2511. {code_towel-1.792 → code_towel-1.946}/tests/test_generic_body_annotations.py +0 -0
  2512. {code_towel-1.792 → code_towel-1.946}/tests/test_generic_expression_types.py +0 -0
  2513. {code_towel-1.792 → code_towel-1.946}/tests/test_generic_extraction.py +0 -0
  2514. {code_towel-1.792 → code_towel-1.946}/tests/test_generic_method_boundaries.py +0 -0
  2515. {code_towel-1.792 → code_towel-1.946}/tests/test_generic_methods.py +0 -0
  2516. {code_towel-1.792 → code_towel-1.946}/tests/test_generic_probe_positions.py +0 -0
  2517. {code_towel-1.792 → code_towel-1.946}/tests/test_generic_verification.py +0 -0
  2518. {code_towel-1.792 → code_towel-1.946}/tests/test_helper_hosts.py +0 -0
  2519. {code_towel-1.792 → code_towel-1.946}/tests/test_helper_inventory.py +0 -0
  2520. {code_towel-1.792 → code_towel-1.946}/tests/test_helper_profitability.py +0 -0
  2521. {code_towel-1.792 → code_towel-1.946}/tests/test_helpers.py +0 -0
  2522. {code_towel-1.792 → code_towel-1.946}/tests/test_helpers_that_compute_nothing.py +0 -0
  2523. {code_towel-1.792 → code_towel-1.946}/tests/test_host_left_out_of_the_build.py +0 -0
  2524. {code_towel-1.792 → code_towel-1.946}/tests/test_host_ships_with_borrower.py +0 -0
  2525. {code_towel-1.792 → code_towel-1.946}/tests/test_hosting_rationale.py +0 -0
  2526. {code_towel-1.792 → code_towel-1.946}/tests/test_import_attribute_contexts.py +0 -0
  2527. {code_towel-1.792 → code_towel-1.946}/tests/test_import_attribute_reads.py +0 -0
  2528. {code_towel-1.792 → code_towel-1.946}/tests/test_import_binding_ownership.py +0 -0
  2529. {code_towel-1.792 → code_towel-1.946}/tests/test_import_bindings.py +0 -0
  2530. {code_towel-1.792 → code_towel-1.946}/tests/test_import_cycle_package_init.py +0 -0
  2531. {code_towel-1.792 → code_towel-1.946}/tests/test_import_cycles_by_the_program.py +0 -0
  2532. {code_towel-1.792 → code_towel-1.946}/tests/test_import_graph_cache_context.py +0 -0
  2533. {code_towel-1.792 → code_towel-1.946}/tests/test_import_model.py +0 -0
  2534. {code_towel-1.792 → code_towel-1.946}/tests/test_import_name_corroboration.py +0 -0
  2535. {code_towel-1.792 → code_towel-1.946}/tests/test_import_probe_scope_contexts.py +0 -0
  2536. {code_towel-1.792 → code_towel-1.946}/tests/test_import_problem_refusal.py +0 -0
  2537. {code_towel-1.792 → code_towel-1.946}/tests/test_import_resolution.py +0 -0
  2538. {code_towel-1.792 → code_towel-1.946}/tests/test_import_sorting_scope.py +0 -0
  2539. {code_towel-1.792 → code_towel-1.946}/tests/test_import_time_code.py +0 -0
  2540. {code_towel-1.792 → code_towel-1.946}/tests/test_import_verdicts_hold_at_run_time.py +0 -0
  2541. {code_towel-1.792 → code_towel-1.946}/tests/test_in_place_stage.py +0 -0
  2542. {code_towel-1.792 → code_towel-1.946}/tests/test_incremental_global_passes.py +0 -0
  2543. {code_towel-1.792 → code_towel-1.946}/tests/test_inert_import_order.py +0 -0
  2544. {code_towel-1.792 → code_towel-1.946}/tests/test_inference_subtype_cache.py +0 -0
  2545. {code_towel-1.792 → code_towel-1.946}/tests/test_inline_except_probes.py +0 -0
  2546. {code_towel-1.792 → code_towel-1.946}/tests/test_inline_match_probes.py +0 -0
  2547. {code_towel-1.792 → code_towel-1.946}/tests/test_instantiation_by_binding.py +0 -0
  2548. {code_towel-1.792 → code_towel-1.946}/tests/test_instantiation_check.py +0 -0
  2549. {code_towel-1.792 → code_towel-1.946}/tests/test_known_bases.py +0 -0
  2550. {code_towel-1.792 → code_towel-1.946}/tests/test_known_platforms.py +0 -0
  2551. {code_towel-1.792 → code_towel-1.946}/tests/test_ladder_hygiene.py +0 -0
  2552. {code_towel-1.792 → code_towel-1.946}/tests/test_late_helper_imports.py +0 -0
  2553. {code_towel-1.792 → code_towel-1.946}/tests/test_lazy_engine_import.py +0 -0
  2554. {code_towel-1.792 → code_towel-1.946}/tests/test_lexical_binding_regressions.py +0 -0
  2555. {code_towel-1.792 → code_towel-1.946}/tests/test_licence_headers.py +0 -0
  2556. {code_towel-1.792 → code_towel-1.946}/tests/test_lifetime_memoization.py +0 -0
  2557. {code_towel-1.792 → code_towel-1.946}/tests/test_memoization_is_invisible.py +0 -0
  2558. {code_towel-1.792 → code_towel-1.946}/tests/test_method_helper_hosting.py +0 -0
  2559. {code_towel-1.792 → code_towel-1.946}/tests/test_method_host_machinery.py +0 -0
  2560. {code_towel-1.792 → code_towel-1.946}/tests/test_method_level_and_attributes.py +0 -0
  2561. {code_towel-1.792 → code_towel-1.946}/tests/test_method_receiver_arguments.py +0 -0
  2562. {code_towel-1.792 → code_towel-1.946}/tests/test_missing_submodules.py +0 -0
  2563. {code_towel-1.792 → code_towel-1.946}/tests/test_module_attribute_write_paths.py +0 -0
  2564. {code_towel-1.792 → code_towel-1.946}/tests/test_module_names_stay_free.py +0 -0
  2565. {code_towel-1.792 → code_towel-1.946}/tests/test_moved_comments.py +0 -0
  2566. {code_towel-1.792 → code_towel-1.946}/tests/test_mypy_ci_policy.py +0 -0
  2567. {code_towel-1.792 → code_towel-1.946}/tests/test_mypy_judged_as_configured.py +0 -0
  2568. {code_towel-1.792 → code_towel-1.946}/tests/test_mypy_matches_its_own_run.py +0 -0
  2569. {code_towel-1.792 → code_towel-1.946}/tests/test_mypy_plugins.py +0 -0
  2570. {code_towel-1.792 → code_towel-1.946}/tests/test_mypy_source_overlays.py +0 -0
  2571. {code_towel-1.792 → code_towel-1.946}/tests/test_mypy_worker_isolation.py +0 -0
  2572. {code_towel-1.792 → code_towel-1.946}/tests/test_names_typed_any.py +0 -0
  2573. {code_towel-1.792 → code_towel-1.946}/tests/test_narrowing_boundaries.py +0 -0
  2574. {code_towel-1.792 → code_towel-1.946}/tests/test_narrowing_refusal.py +0 -0
  2575. {code_towel-1.792 → code_towel-1.946}/tests/test_narrowing_statement_facts.py +0 -0
  2576. {code_towel-1.792 → code_towel-1.946}/tests/test_native_analysis_diagnostics.py +0 -0
  2577. {code_towel-1.792 → code_towel-1.946}/tests/test_next_validation_documentation.py +0 -0
  2578. {code_towel-1.792 → code_towel-1.946}/tests/test_no_builtin_arguments.py +0 -0
  2579. {code_towel-1.792 → code_towel-1.946}/tests/test_no_extract.py +0 -0
  2580. {code_towel-1.792 → code_towel-1.946}/tests/test_no_quoted_none.py +0 -0
  2581. {code_towel-1.792 → code_towel-1.946}/tests/test_noop_application.py +0 -0
  2582. {code_towel-1.792 → code_towel-1.946}/tests/test_observational_equivalence.py +0 -0
  2583. {code_towel-1.792 → code_towel-1.946}/tests/test_only_binding_moves.py +0 -0
  2584. {code_towel-1.792 → code_towel-1.946}/tests/test_orphan_detection.py +0 -0
  2585. {code_towel-1.792 → code_towel-1.946}/tests/test_orphan_detector_comprehensive.py +0 -0
  2586. {code_towel-1.792 → code_towel-1.946}/tests/test_out_of_place_cycle_regression.py +0 -0
  2587. {code_towel-1.792 → code_towel-1.946}/tests/test_out_of_place_stage.py +0 -0
  2588. {code_towel-1.792 → code_towel-1.946}/tests/test_out_of_place_whole_project.py +0 -0
  2589. {code_towel-1.792 → code_towel-1.946}/tests/test_output_import_names.py +0 -0
  2590. {code_towel-1.792 → code_towel-1.946}/tests/test_overlap_filtering.py +0 -0
  2591. {code_towel-1.792 → code_towel-1.946}/tests/test_pair_budget.py +0 -0
  2592. {code_towel-1.792 → code_towel-1.946}/tests/test_parallel_evaluation.py +0 -0
  2593. {code_towel-1.792 → code_towel-1.946}/tests/test_parameterize_builtins.py +0 -0
  2594. {code_towel-1.792 → code_towel-1.946}/tests/test_parameters.py +0 -0
  2595. {code_towel-1.792 → code_towel-1.946}/tests/test_parameters_stand_alone.py +0 -0
  2596. {code_towel-1.792 → code_towel-1.946}/tests/test_parent_watchdog.py +0 -0
  2597. {code_towel-1.792 → code_towel-1.946}/tests/test_parsing_warning_cache.py +0 -0
  2598. {code_towel-1.792 → code_towel-1.946}/tests/test_pending_journal_rule.py +0 -0
  2599. {code_towel-1.792 → code_towel-1.946}/tests/test_perf_memos.py +0 -0
  2600. {code_towel-1.792 → code_towel-1.946}/tests/test_pipeline_api.py +0 -0
  2601. {code_towel-1.792 → code_towel-1.946}/tests/test_placement_memoization.py +0 -0
  2602. {code_towel-1.792 → code_towel-1.946}/tests/test_progress_heartbeat.py +0 -0
  2603. {code_towel-1.792 → code_towel-1.946}/tests/test_progress_modes.py +0 -0
  2604. {code_towel-1.792 → code_towel-1.946}/tests/test_project_helper_names.py +0 -0
  2605. {code_towel-1.792 → code_towel-1.946}/tests/test_project_layout_and_imports.py +0 -0
  2606. {code_towel-1.792 → code_towel-1.946}/tests/test_project_layout_behavior.py +0 -0
  2607. {code_towel-1.792 → code_towel-1.946}/tests/test_project_layout_shim.py +0 -0
  2608. {code_towel-1.792 → code_towel-1.946}/tests/test_promotion_and_mangling.py +0 -0
  2609. {code_towel-1.792 → code_towel-1.946}/tests/test_properties.py +0 -0
  2610. {code_towel-1.792 → code_towel-1.946}/tests/test_protocol_base_aliases.py +0 -0
  2611. {code_towel-1.792 → code_towel-1.946}/tests/test_protocol_lifetime_regressions.py +0 -0
  2612. {code_towel-1.792 → code_towel-1.946}/tests/test_published_performance_documentation.py +0 -0
  2613. {code_towel-1.792 → code_towel-1.946}/tests/test_pyright_configuration_grammar.py +0 -0
  2614. {code_towel-1.792 → code_towel-1.946}/tests/test_pyright_diagnostic_boundary.py +0 -0
  2615. {code_towel-1.792 → code_towel-1.946}/tests/test_pyright_editable_installs.py +0 -0
  2616. {code_towel-1.792 → code_towel-1.946}/tests/test_pyright_probes_stay_private.py +0 -0
  2617. {code_towel-1.792 → code_towel-1.946}/tests/test_pyright_reveal_batches.py +0 -0
  2618. {code_towel-1.792 → code_towel-1.946}/tests/test_pyright_scope.py +0 -0
  2619. {code_towel-1.792 → code_towel-1.946}/tests/test_pyright_server_configuration.py +0 -0
  2620. {code_towel-1.792 → code_towel-1.946}/tests/test_pyright_session.py +0 -0
  2621. {code_towel-1.792 → code_towel-1.946}/tests/test_qualified_annotation_runtime.py +0 -0
  2622. {code_towel-1.792 → code_towel-1.946}/tests/test_r9my_check_fails_unchanged.py +0 -0
  2623. {code_towel-1.792 → code_towel-1.946}/tests/test_r9my_check_scope.py +0 -0
  2624. {code_towel-1.792 → code_towel-1.946}/tests/test_r9my_environment_by_content.py +0 -0
  2625. {code_towel-1.792 → code_towel-1.946}/tests/test_r9my_mypy_config_groups.py +0 -0
  2626. {code_towel-1.792 → code_towel-1.946}/tests/test_r9my_mypy_jurisdiction.py +0 -0
  2627. {code_towel-1.792 → code_towel-1.946}/tests/test_r9py_pyright_config_groups.py +0 -0
  2628. {code_towel-1.792 → code_towel-1.946}/tests/test_r9py_pyright_config_venv.py +0 -0
  2629. {code_towel-1.792 → code_towel-1.946}/tests/test_r9py_pyright_copy_inputs.py +0 -0
  2630. {code_towel-1.792 → code_towel-1.946}/tests/test_r9py_pyright_fork_guard.py +0 -0
  2631. {code_towel-1.792 → code_towel-1.946}/tests/test_r9py_pyright_marker_outside_include.py +0 -0
  2632. {code_towel-1.792 → code_towel-1.946}/tests/test_r9py_pyright_message_paths.py +0 -0
  2633. {code_towel-1.792 → code_towel-1.946}/tests/test_readme_links.py +0 -0
  2634. {code_towel-1.792 → code_towel-1.946}/tests/test_receiver_binding_memoization.py +0 -0
  2635. {code_towel-1.792 → code_towel-1.946}/tests/test_recovery_command_quoting.py +0 -0
  2636. {code_towel-1.792 → code_towel-1.946}/tests/test_recovery_journal.py +0 -0
  2637. {code_towel-1.792 → code_towel-1.946}/tests/test_refactor_engine_comprehensive.py +0 -0
  2638. {code_towel-1.792 → code_towel-1.946}/tests/test_refactor_engine_edge_cases.py +0 -0
  2639. {code_towel-1.792 → code_towel-1.946}/tests/test_refactor_engine_more.py +0 -0
  2640. {code_towel-1.792 → code_towel-1.946}/tests/test_refactor_engine_targeted_branches.py +0 -0
  2641. {code_towel-1.792 → code_towel-1.946}/tests/test_refactoring_engine.py +0 -0
  2642. {code_towel-1.792 → code_towel-1.946}/tests/test_reflection_contract.py +0 -0
  2643. {code_towel-1.792 → code_towel-1.946}/tests/test_refusal_checker_context.py +0 -0
  2644. {code_towel-1.792 → code_towel-1.946}/tests/test_regression.py +0 -0
  2645. {code_towel-1.792 → code_towel-1.946}/tests/test_regressions_broader.py +0 -0
  2646. {code_towel-1.792 → code_towel-1.946}/tests/test_rehearing_revision.py +0 -0
  2647. {code_towel-1.792 → code_towel-1.946}/tests/test_rejected_proposal_memory.py +0 -0
  2648. {code_towel-1.792 → code_towel-1.946}/tests/test_relative_future_imports.py +0 -0
  2649. {code_towel-1.792 → code_towel-1.946}/tests/test_release_audit_regressions.py +0 -0
  2650. {code_towel-1.792 → code_towel-1.946}/tests/test_release_documentation.py +0 -0
  2651. {code_towel-1.792 → code_towel-1.946}/tests/test_release_evidence_gate.py +0 -0
  2652. {code_towel-1.792 → code_towel-1.946}/tests/test_release_regressions.py +0 -0
  2653. {code_towel-1.792 → code_towel-1.946}/tests/test_rename_audit_regressions.py +0 -0
  2654. {code_towel-1.792 → code_towel-1.946}/tests/test_rename_by_the_programs_names.py +0 -0
  2655. {code_towel-1.792 → code_towel-1.946}/tests/test_rename_class_private_helpers.py +0 -0
  2656. {code_towel-1.792 → code_towel-1.946}/tests/test_rename_discovery_regressions.py +0 -0
  2657. {code_towel-1.792 → code_towel-1.946}/tests/test_rename_parameters_and_methods.py +0 -0
  2658. {code_towel-1.792 → code_towel-1.946}/tests/test_renamed_binder_observability_runtime.py +0 -0
  2659. {code_towel-1.792 → code_towel-1.946}/tests/test_required_namesakes.py +0 -0
  2660. {code_towel-1.792 → code_towel-1.946}/tests/test_retained_bindings.py +0 -0
  2661. {code_towel-1.792 → code_towel-1.946}/tests/test_return_alignment.py +0 -0
  2662. {code_towel-1.792 → code_towel-1.946}/tests/test_return_values.py +0 -0
  2663. {code_towel-1.792 → code_towel-1.946}/tests/test_returned_variables_not_orphaned.py +0 -0
  2664. {code_towel-1.792 → code_towel-1.946}/tests/test_reuse_existing_function.py +0 -0
  2665. {code_towel-1.792 → code_towel-1.946}/tests/test_reuse_type_checks.py +0 -0
  2666. {code_towel-1.792 → code_towel-1.946}/tests/test_revealed_spellings.py +0 -0
  2667. {code_towel-1.792 → code_towel-1.946}/tests/test_robustness_paths.py +0 -0
  2668. {code_towel-1.792 → code_towel-1.946}/tests/test_run_by_path.py +0 -0
  2669. {code_towel-1.792 → code_towel-1.946}/tests/test_run_lookups.py +0 -0
  2670. {code_towel-1.792 → code_towel-1.946}/tests/test_scope_analyzer.py +0 -0
  2671. {code_towel-1.792 → code_towel-1.946}/tests/test_scope_analyzer_comprehensive.py +0 -0
  2672. {code_towel-1.792 → code_towel-1.946}/tests/test_scope_declaration_memoization.py +0 -0
  2673. {code_towel-1.792 → code_towel-1.946}/tests/test_scope_guard_boundaries.py +0 -0
  2674. {code_towel-1.792 → code_towel-1.946}/tests/test_sdist_manifest.py +0 -0
  2675. {code_towel-1.792 → code_towel-1.946}/tests/test_self_import_probes.py +0 -0
  2676. {code_towel-1.792 → code_towel-1.946}/tests/test_self_outside_its_class.py +0 -0
  2677. {code_towel-1.792 → code_towel-1.946}/tests/test_semantic_guard_traces.py +0 -0
  2678. {code_towel-1.792 → code_towel-1.946}/tests/test_semantic_guards_extended.py +0 -0
  2679. {code_towel-1.792 → code_towel-1.946}/tests/test_semantic_safety_regressions.py +0 -0
  2680. {code_towel-1.792 → code_towel-1.946}/tests/test_shared_line_directives.py +0 -0
  2681. {code_towel-1.792 → code_towel-1.946}/tests/test_shipped_files_recorded.py +0 -0
  2682. {code_towel-1.792 → code_towel-1.946}/tests/test_sidecar_records_applied_helpers.py +0 -0
  2683. {code_towel-1.792 → code_towel-1.946}/tests/test_signature_construction.py +0 -0
  2684. {code_towel-1.792 → code_towel-1.946}/tests/test_signature_prefilter.py +0 -0
  2685. {code_towel-1.792 → code_towel-1.946}/tests/test_speculative_cache_isolation.py +0 -0
  2686. {code_towel-1.792 → code_towel-1.946}/tests/test_splicing.py +0 -0
  2687. {code_towel-1.792 → code_towel-1.946}/tests/test_stale_proposal_recovery.py +0 -0
  2688. {code_towel-1.792 → code_towel-1.946}/tests/test_statement_facts.py +0 -0
  2689. {code_towel-1.792 → code_towel-1.946}/tests/test_statically_read_literals.py +0 -0
  2690. {code_towel-1.792 → code_towel-1.946}/tests/test_structural_memo.py +0 -0
  2691. {code_towel-1.792 → code_towel-1.946}/tests/test_stub_resolution.py +0 -0
  2692. {code_towel-1.792 → code_towel-1.946}/tests/test_stubbed_host.py +0 -0
  2693. {code_towel-1.792 → code_towel-1.946}/tests/test_substitution_follows_bindings.py +0 -0
  2694. {code_towel-1.792 → code_towel-1.946}/tests/test_substitution_keys.py +0 -0
  2695. {code_towel-1.792 → code_towel-1.946}/tests/test_super_in_method_helpers.py +0 -0
  2696. {code_towel-1.792 → code_towel-1.946}/tests/test_symlinked_input_directory.py +0 -0
  2697. {code_towel-1.792 → code_towel-1.946}/tests/test_symlinked_project_paths.py +0 -0
  2698. {code_towel-1.792 → code_towel-1.946}/tests/test_synthetic_positional_only.py +0 -0
  2699. {code_towel-1.792 → code_towel-1.946}/tests/test_targeted_rung.py +0 -0
  2700. {code_towel-1.792 → code_towel-1.946}/tests/test_thunks_meet_inlined_comprehensions.py +0 -0
  2701. {code_towel-1.792 → code_towel-1.946}/tests/test_top_level_module_inside_package.py +0 -0
  2702. {code_towel-1.792 → code_towel-1.946}/tests/test_trivial_helper_filter.py +0 -0
  2703. {code_towel-1.792 → code_towel-1.946}/tests/test_type_bindings.py +0 -0
  2704. {code_towel-1.792 → code_towel-1.946}/tests/test_type_checking_import_cycles.py +0 -0
  2705. {code_towel-1.792 → code_towel-1.946}/tests/test_type_checking_imports.py +0 -0
  2706. {code_towel-1.792 → code_towel-1.946}/tests/test_type_declaration_materialization.py +0 -0
  2707. {code_towel-1.792 → code_towel-1.946}/tests/test_type_generalization.py +0 -0
  2708. {code_towel-1.792 → code_towel-1.946}/tests/test_type_only_imports.py +0 -0
  2709. {code_towel-1.792 → code_towel-1.946}/tests/test_type_oracle_projects.py +0 -0
  2710. {code_towel-1.792 → code_towel-1.946}/tests/test_type_run_policy.py +0 -0
  2711. {code_towel-1.792 → code_towel-1.946}/tests/test_typed_performance_documentation.py +0 -0
  2712. {code_towel-1.792 → code_towel-1.946}/tests/test_typing_form_resolution.py +0 -0
  2713. {code_towel-1.792 → code_towel-1.946}/tests/test_typing_forms_cost.py +0 -0
  2714. {code_towel-1.792 → code_towel-1.946}/tests/test_typing_forms_resolved.py +0 -0
  2715. {code_towel-1.792 → code_towel-1.946}/tests/test_unchecked_code.py +0 -0
  2716. {code_towel-1.792 → code_towel-1.946}/tests/test_unchecked_import_probes.py +0 -0
  2717. {code_towel-1.792 → code_towel-1.946}/tests/test_unifier_additional_branches.py +0 -0
  2718. {code_towel-1.792 → code_towel-1.946}/tests/test_unifier_batch2.py +0 -0
  2719. {code_towel-1.792 → code_towel-1.946}/tests/test_unifier_batch4.py +0 -0
  2720. {code_towel-1.792 → code_towel-1.946}/tests/test_unifier_block_cache.py +0 -0
  2721. {code_towel-1.792 → code_towel-1.946}/tests/test_unifier_bound_variables.py +0 -0
  2722. {code_towel-1.792 → code_towel-1.946}/tests/test_unifier_comprehensions.py +0 -0
  2723. {code_towel-1.792 → code_towel-1.946}/tests/test_unifier_comprehensive.py +0 -0
  2724. {code_towel-1.792 → code_towel-1.946}/tests/test_unifier_state_reset.py +0 -0
  2725. {code_towel-1.792 → code_towel-1.946}/tests/test_unparsed_program.py +0 -0
  2726. {code_towel-1.792 → code_towel-1.946}/tests/test_unreadable_and_revealed.py +0 -0
  2727. {code_towel-1.792 → code_towel-1.946}/tests/test_unsupported_layout.py +0 -0
  2728. {code_towel-1.792 → code_towel-1.946}/tests/test_validation_partial_lifetime.py +0 -0
  2729. {code_towel-1.792 → code_towel-1.946}/tests/test_variable_capture_bug.py +0 -0
  2730. {code_towel-1.792 → code_towel-1.946}/tests/test_visitors.py +0 -0
  2731. {code_towel-1.792 → code_towel-1.946}/tests/test_workers_fork_alone.py +0 -0
  2732. {code_towel-1.792 → code_towel-1.946}/tests/typed_fixtures.py +0 -0
@@ -0,0 +1,2529 @@
1
+ # Changelog
2
+
3
+ All notable changes to Towel are recorded here. This file summarizes releases;
4
+ [docs/RELEASE_LOG.md](docs/RELEASE_LOG.md) keeps the detailed engineering log,
5
+ and [docs/PRODUCTION_READINESS.md](docs/PRODUCTION_READINESS.md) records the
6
+ ecosystem evidence behind each claim. The format follows
7
+ [Keep a Changelog](https://keepachangelog.com/). Versions use mathematical
8
+ mnemonics with PEP 440 ordering; see the
9
+ [version convention](docs/RELEASING.md#version-number-convention).
10
+
11
+ ## [Unreleased]
12
+
13
+ No further changes beyond the prepared 1.946 version are recorded here.
14
+
15
+ ## [1.946]
16
+
17
+ Named for ln 7, approximately 1.945910149. Publication requested; upload not
18
+ verified. The maintainer subsequently requested scoped source-proof reuse and
19
+ fresh supported-interpreter suites and cache-on/off output comparisons. See the
20
+ [publication checkpoint](docs/RELEASING.md#1946-publication-checkpoint-october-18-2026).
21
+ Changes since released 1.792 are described together in the
22
+ [1.946 overview](docs/RELEASE_1_946.md).
23
+
24
+ The completed development audit at `9d57b0d` passed 10,583 tests and 45
25
+ subtests, with 32 skips and 93.478% coverage. Six consumer original-command
26
+ pairs and their 531 generated Python outputs matched the retained references.
27
+ The versioned 1.946 source and artifacts still need their own release gates.
28
+ The latest completed versioned cohorts use `a6dc6ed` (1.946) versus published
29
+ `44d7795` (1.792): Voluptuous means were 90.984 → 87.569 seconds (−3.75%),
30
+ and Click means were 47.165 → 58.195 seconds (+23.39%), with two shared-host
31
+ samples per source per workload. Rich has zero actual samples in this new
32
+ campaign; its measurements and fresh full release gates remain pending.
33
+ The [current eight-sample record](tests/release_evidence/1.946-warning-guard/README.md)
34
+ retains original pairs, repeated outputs and closure. Profiling `0b3494c`
35
+ on 2026-10-18 (shared native host, interleaved samples) measured Rich at
36
+ +7.6% and attributed it to the fresh source-correspondence proof for `if`
37
+ outputs, which the 2026-10-10 decision keeps uncached. Click's larger
38
+ difference mostly pays for its fifth extraction. The regression ships
39
+ documented; see [where the remaining time goes](docs/RELEASE_1_946.md#where-the-remaining-time-goes-profiled-on-0b3494c).
40
+
41
+ On the earlier `9d57b0d` eight-sample shared-host comparison, complete cold CLI
42
+ means were 46.53 → 56.69 seconds for Click (+21.85%) and 99.77 → 177.70
43
+ seconds for Rich (+78.10%) versus released 1.792. These are two samples per
44
+ version per workload, not an isolated-host or general speed claim. See the
45
+ [performance evidence](docs/PERFORMANCE.md) and
46
+ [readiness report](docs/PRODUCTION_READINESS.md).
47
+
48
+ ### Improvements and repairs
49
+
50
+ - Reuse successful whole-module source-correspondence proofs only for explicitly
51
+ owned immutable trees during one analysis. Keys retain source and parser-limit
52
+ identity. Caller trees, warning-capable sources, disabled memoization and
53
+ materialization keep fresh proofs. Optional AST immutability checking detects
54
+ changes to a warmed owner. Each analysis releases its proof entries.
55
+
56
+ - Account for every candidate pair with `--stats` (`dry` and the complete
57
+ `preview`). Each pair of the run's last whole analysis is counted once:
58
+ declined, a duplicate of an earlier pair's proposal, dropped for overlapping
59
+ a kept proposal, or emitted. The run's helper signatures are counted as
60
+ verified or refused by the type checker. `RunReport` carries the same counts.
61
+ The flag only reports, so output files are identical with and without it.
62
+ This completes the user-facing part of the post-1.772 loss statistics.
63
+
64
+ - Admit ordinary raw-regex brace escapes to the existing typing-fact cache
65
+ when they precede every possible formatted-string start. Repeated queries
66
+ reuse immutable module facts; warning-capable formatted strings still take
67
+ the fresh native parsing path. This repairs a reproduced performance defect
68
+ without changing warning filters, cache bounds or parser-limit keys.
69
+
70
+ - Distinguish complete even backslash runs from unmatched odd escapes before
71
+ formatted-string braces. Paired literal backslashes no longer cause this
72
+ warning-guard refusal; potentially warning-capable odd escapes keep the
73
+ native diagnostic path and all existing token checks. Repeated eligible
74
+ queries reuse the existing immutable facts without new caches or bounds.
75
+ The seven-file focused battery passed 479 tests with 221 version skips;
76
+ 3,719 external controls per native Python 3.11–3.14 passed. These are scoped
77
+ correctness/cost controls, not timing or full-release evidence. Fresh final
78
+ gates remain pending; the earlier numeric measurements retain their sources.
79
+
80
+ - Share warning-free raw f-string literal analyses on Python 3.12. Distinguish
81
+ literal text from replacement fields while retaining native warning checks
82
+ for raw format specifications and nonraw nested strings.
83
+
84
+ - Limit source-cache keys to native strings/bytes so subclass methods cannot
85
+ change cache behavior. Include parser limits in typing-form and namespace
86
+ syntax cache keys, and keep warning-capable parses on the native path.
87
+
88
+ - Reuse immutable lexical warning classifications while scheduling IF proofs
89
+ within one owned analysis, including sources larger than the process cache's
90
+ character limit. Bound retained source storage and keep every ownership
91
+ check, native diagnostic fallback, and admission proof fresh.
92
+
93
+ - Snapshot bounded-cache keys during iteration so standard mapping item and
94
+ value views tolerate reads that promote entries in the LRU order. Keep
95
+ ordinary lookups, eviction and explicit ownership release unchanged.
96
+
97
+ - Postpone fresh IF source proofs until binding, shape and unification checks
98
+ pass within an engine-owned analysis of ordinary original source. Keep
99
+ both the initial admission and aligned-output proofs before helper construction,
100
+ with the existing early order for direct and warning-capable calls.
101
+
102
+ - Release bounded-cache entries and weight bookkeeping on explicit cleanup
103
+ even while memoization is disabled, so analysis scopes can always drop owners.
104
+
105
+ - Reuse immutable later-read statement facts within one engine source-analysis
106
+ scope. Preserve traversal and diagnostic records, calculate lifetime outputs
107
+ on every call and return fresh sets; keep direct, disabled and mismatched-owner
108
+ queries lazy and release the bounded function cache at scope exit.
109
+
110
+ - Consult the bounded lexical eligibility cache before searching repeated
111
+ warning-free source text; preserve native diagnostics, disabled and oversized
112
+ bypasses, source storage limits and fork-safe bookkeeping.
113
+
114
+ - Reuse IF binding and flow facts from private original-source syntax within
115
+ one bounded analysis context. Keep every accepted current-module comparison,
116
+ function identity and selected-suite ownership check fresh; preserve native
117
+ warning behavior and the uncached path when memoization is disabled.
118
+ - Reuse immutable instability and runtime byte-value facts per original source
119
+ statement during analysis. Release the summaries with that context, recompute
120
+ direct library calls and keep generated-helper literal checks fresh.
121
+
122
+ - Reject impossible IF binding transfers from local syntax, binding and flow
123
+ facts before parsing, comparing or mapping the whole module. Keep graph
124
+ checks cycle-safe and require fresh exact module identity and ownership
125
+ for every admitted certificate and aligned-output reproof.
126
+ - Keep captured comprehension targets that share an outer free binding at
127
+ their original sites. Moving the comprehension can change compiler cell
128
+ restoration on Python 3.12 and 3.13, altering later reads and exceptions.
129
+ Preserve ordinary uncaptured and independently bound comprehension cases.
130
+ - Recover fresh local outputs from contiguous blocks inside IF-only suites.
131
+ Certify the original source, branch location and definite initialization;
132
+ return every later-read or lifetime-required value in the existing cleanup
133
+ order. Reprove the aligned outputs without caching the verdict. Keep
134
+ unsupported ancestry, rebinding, captures and existing ownership guards
135
+ restrictive, and reject ineligible sites before whole-module validation.
136
+ - Order eligible leading thunk parameters by their certified evaluation sequence
137
+ before eager inlining. Reorder only contiguous eligible slots within each
138
+ positional signature segment; preserve other parameters, the positional-only
139
+ boundary and every caller's immutable-result proof. Pair and cluster
140
+ reconstruction use the same pass.
141
+ - Preserve narrowing obligations when generated predicates stay deferred;
142
+ decline helpers whose separate values or thunks lose those proofs before
143
+ annotation fallback. Keep proven return types when an unannotated caller
144
+ adds no declared constraint.
145
+ - Keep Optional-aware result thunks eligible. A read of a tested subject does
146
+ not itself require narrowing; use the checker's rejected operand and original
147
+ caller correspondence before weakening helper annotations. Cover named
148
+ arguments, reflected comparisons and Pyright Optional-operand and receiver
149
+ diagnostics while leaving ambiguous operands unresolved.
150
+ - Preserve declared return and assignment refinements, including fixed tuple
151
+ components, before helper annotations can widen to `Any`. Require the original
152
+ caller's matching obligation; a provisional helper signature must not reject
153
+ valid nullable returns.
154
+ - Match those declared obligations across early returns, repeated branch returns,
155
+ nested annotated assignments and fixed tuple assignments. Preserve exact
156
+ getter correspondence and unchanged local aliases before refusing `Any`
157
+ fallback; unrelated returns do not erase a matching declaration.
158
+ - Keep thunks deferred when their result lifetime is unknown. Eager evaluation
159
+ requires an immutable result proof from every caller as well as the existing
160
+ evaluation-order proof; preserve temporary release and exception cleanup.
161
+ - Unify differing constant occurrences without changing equal literals at other
162
+ positions. Reuse a parameter only when its complete typed column agrees across
163
+ callers; preserve caller literal pools, syntax pins and the existing budget.
164
+ - Preserve useful shared f-string helpers by passing common exact-string
165
+ fragments from their original callers; retain formatting effects, literal
166
+ identities and the complete helper argument budget.
167
+ - Preserve compiler-pooled literal identities: pass complete literal expressions
168
+ when replacing their parts would rebuild objects, and pass shared non-global
169
+ literals from their original callers within the existing interface budget.
170
+ Keep unproved folded floating arithmetic and lexically private single-byte
171
+ literals at their original sites; retain safe shared helpers.
172
+ - Reuse whole-body ownership certificates and immutable source/compiler facts
173
+ under exact source, syntax, location and parser-context keys; preserve runtime
174
+ guards and independently reprove each certificate during materialization.
175
+ - Handle malformed non-table Poetry configuration during cross-module import
176
+ analysis without losing valid PEP 621 dependency restrictions.
177
+ - Certify readonly lookup suppliers in the independent scope oracle without
178
+ exempting generated names or unrelated caller bindings; retain the exact
179
+ grammar/binding regressions and adversarial negative controls.
180
+ - Review the proposal backlog against the released implementation and separate
181
+ remaining research from completed, superseded and retired ideas.
182
+ - Clarify completed 1.792 release validation separately from its historical
183
+ preparation records.
184
+
185
+ ## [1.792]
186
+
187
+ Named for ln 6, approximately 1.791759469. Changes since 1.772.
188
+ The measurements below retain their original development-source identities;
189
+ release verification binds the final versioned source to its own evidence.
190
+
191
+ - Explain why independently mutable class aliases keep lookup suppliers, and
192
+ why an unread ownership holder preserves original argument lifetimes.
193
+ Distinguish shared spellings from shared bindings and document equal
194
+ higher-order literal promotion as an explicit API opt-in.
195
+ - Decline tiny straight-line helpers whose complete interface and call wrappers
196
+ outweigh their shared work under the documented initial calibration.
197
+ - Place a helper according to its completed runtime receiver/class-frame needs
198
+ and account for the actual receiver and lifetime holder in its budget.
199
+ - Reuse immutable block free-variable facts only within one unification, copy
200
+ mutable results for callers and clear the facts on reset or release.
201
+ - Remove the inner rendered-variant checker-refusal memo. Every variant submitted
202
+ to project checking is checked again; configuration and known-error matches
203
+ cannot certify changed, absent or external stub providers. The outer exact
204
+ completed-proposal rehearing cache remains separately qualified by its
205
+ candidate, revision and recognized context requirements.
206
+ - Refresh CLI defaults, scoped opt-out boundaries and release status. The latest
207
+ development audit follow-ups passed 9,697 native tests and the 93% coverage gate.
208
+ Matrix, corpus and final release gates were pending at that checkpoint; earlier results retain their
209
+ original identities. The block memo halves repeated work in its bounded
210
+ control, with no measured complete-command wall benefit.
211
+ - Add `# towel: no-extract` immediately after a function signature's final
212
+ colon to protect that definition and its nested bodies on every pass.
213
+ Unmarked code remains eligible. This protects the definition, not its
214
+ absolute line position, module namespace or unmarked callers and callees;
215
+ see [the scoped opt-out](docs/CLI_GUIDE.md#protect-a-function).
216
+ - The soundness requirement is to preserve the behavior of programs that do
217
+ not use reflection or self-instrumentation, including through their callees.
218
+ Violations within that scope must be fixed or the transformation refused.
219
+ Reflection and self-instrumentation are outside the preservation guarantee,
220
+ including source/AST/bytecode/frame/namespace observations and body or class
221
+ transformations applied by decorators, ordinary calls or hooks. Towel no
222
+ longer scans or refuses code to protect those behaviors. Ordinary
223
+ nonreflective semantics remain covered. The October 2 decision supersedes
224
+ the recognized-instrumentation and source-reader protections recorded in
225
+ historical development and release records; their validation facts retain
226
+ their original source and policy scope.
227
+ - Preview now runs the same checked, formatted fixed-point pipeline as dry in
228
+ private output and shows its final diff and helper inventory. Use explicit
229
+ `--quick` for a partial structural listing. Input files remain unchanged.
230
+ - Reuse equivalent helpers introduced earlier in the current run where the
231
+ call and host are proved compatible, avoiding redundant forwarding chains
232
+ while preserving existing functions' independent bindings.
233
+ - Generated helper signatures omit free names used only inside caller-side
234
+ thunks; differing attribute lookups no longer spend unused child parameters.
235
+
236
+
237
+ ### Fixed
238
+
239
+ - Retain block-bound results of ordinary factories and other calls across
240
+ helper return, preserving observable resource and finalizer lifetimes,
241
+ including aliases and the relative cleanup order of multiple results.
242
+ - Preserve caller ownership of opaque values returned by properties,
243
+ subscription, operators, iterators and context-manager enter protocols.
244
+ Count nested bindings at their actual source positions and refuse unsafe
245
+ exceptional ownership transfers to an outer handler or context manager.
246
+ - Preserve cleanup relative to caller-held values on normal and exceptional
247
+ exits. Refuse unsafe partial frame splits; certify whole-body argument
248
+ transfer on CPython only when original bindings and cleanup order are proved.
249
+ - Spell lifetime-only caller bindings with hygienic underscore names when no
250
+ outside code reads, rebinds or deletes them, preserving configured lint checks.
251
+ - Discover Ruff without importing project-owned modules; run Black and isort in
252
+ persistent isolated workers with bounded replies and parent-exit cleanup.
253
+ - Reject malformed Pyright diagnostics before changing stored checker errors;
254
+ abandon the warm session and require the normal cold-check fallback.
255
+ - Quote executable recovery remedies, including paths with spaces and shell
256
+ metacharacters, and use portable permission-command option ordering.
257
+ - Preserve known tuple-element types when another retained result is `Any`.
258
+ - Treat all context managers as potentially suppressing exceptions, keeping
259
+ conditional reads of possibly unbound locals at their original sites.
260
+ - Report optional naming-sidecar write failures as warnings after successful
261
+ source publication, with a successful command exit and preserved collisions.
262
+
263
+ ### Changed
264
+
265
+ - Generated annotation imports use the immutable guard `if 0 > 1:`. They stay
266
+ inert when ordinary code changes `typing.TYPE_CHECKING`; existing guards
267
+ retain their behavior. Both mypy and Pyright still validate the imported types.
268
+ - Cross-module bare builtin reads now decline by default, except `__debug__`.
269
+ `--parameterize-builtins` preserves caller-side lookup timing with thunks;
270
+ their inferred annotations retain the callable result type. Other callable
271
+ module bindings also retain their original lookup timing.
272
+
273
+ - The README is a short introduction, with a documentation index and separate
274
+ guides for CLI use, typing, generated code, naming, cross-module extraction,
275
+ resources and performance. Long references have contents lists. Navigation
276
+ regressions check guide discovery and local links; moved measurement claims
277
+ retain their evidence checks.
278
+ - The supported local release command requires completed, reviewed evidence
279
+ for the exact source and prebuilt distributions. Missing phases, interrupted
280
+ baselines, changed failure identities and stale artifacts refuse verification.
281
+ Validation-only artifacts remain explicitly nonpublishable.
282
+ - Completed corrected-source validation has immutable evidence and documentary
283
+ regressions for actual platform coverage, resources, elapsed time and scoped
284
+ exceptions; see [the report](docs/proposals/next-validation-final.md).
285
+
286
+ - Extraction discovery now includes match-case bodies and except-star
287
+ handlers/finally. List-valued AST fields can unify differing expression
288
+ values while retaining restrictions on bindings and control flow.
289
+ - Scope guards examine the moving block: unrelated nonlocal declarations
290
+ and private names elsewhere in a method no longer hide a safe extraction.
291
+ Names used only in local-variable annotations no longer become runtime
292
+ helper arguments or prevent cross-module extraction.
293
+ - Release documentation has offline regression checks against retained 1.772
294
+ evidence and current CI configuration. They protect platform coverage,
295
+ test and corpus counts, typed fallbacks, measurement units and resource
296
+ context. The Windows support implication and the concurrency attributed
297
+ to the Sphinx-only timing are corrected.
298
+ - Class-private extractions no longer require approved base classes or
299
+ class machinery. Hygienic private names protect against accidental
300
+ overrides; namespace scans and lookup hooks observing the new helper fall
301
+ under the documented reflection limitation. The same-class, receiver,
302
+ `Protocol` and import-time checks remain. This admits
303
+ valid extractions previously declined solely for a metaclass, class hook,
304
+ subscripted project base or unlisted library base.
305
+
306
+ ### Fixed
307
+
308
+ - Shared helpers carrying comments are checked against their adapted helper
309
+ tree, so safely quoted cross-module annotations no longer cause a false
310
+ rendering refusal. AST and tool-directive preservation checks remain intact.
311
+ - Generated calls and helpers are formatted at their destination indentation,
312
+ so inserting them into methods does not exceed the configured line width.
313
+ - Reachability and import-type probes follow each checker's configured file
314
+ scope before building probes. Excluded consumer tests no longer make a clean
315
+ project check fail through imports outside that scope.
316
+ - Corpus log-formatting controls now apply only to Towel. Consumer tests can
317
+ enable color themselves without a harness override changing their behavior.
318
+ - Corpus pytest commands retain the cache fixture and clear cached state before
319
+ each test phase and retry. This avoids missing-fixture errors and prevents
320
+ baseline cache values from hiding changes in the transformed program.
321
+ - Corpus setup considers a project's versioned typing requirements before
322
+ defaulting to Towel's checker requirements. Existing project, lock-file and
323
+ hook selections retain their precedence; alternative typing environments
324
+ remain separate. Cached environments record and verify the selected context
325
+ so a stale checker cannot silently survive a configuration change. Literal CI
326
+ workflow pins and explicitly selected uv groups containing a checker are
327
+ included among the declared contexts.
328
+ - Typed import probes distinguish a shadowing parameter from an imported module
329
+ and query a companion submodule through its original binding. This avoids
330
+ false refusals seen in Cachetools and Werkzeug. Unrelated local bindings no
331
+ longer disable that evidence, and an alias replaced within one module import
332
+ block is not queried for attributes read from its replacement afterward.
333
+ Attribute assignments and deletions no longer ask for a previous value that
334
+ the program never reads; augmented assignments and intermediate reads still
335
+ receive type questions. An immutable read inventory is shared across imports.
336
+ A write to an unrelated attribute no longer disables evidence for an imported
337
+ submodule; writes overlapping its path and module rebinding remain restrictive.
338
+ - Reachability probes preserve the indentation of one-line `match` case and
339
+ exception handlers, including cases with multiline patterns or guards.
340
+ Inline `except` and `except*` bodies use their handler's enclosing indentation.
341
+ Semicolon-separated statements receive separate probes so an early exit cannot
342
+ make an unreachable sibling appear checked; probes also stay outside multiline
343
+ strings.
344
+ - Typed runs recognize imported `Self`, including aliases
345
+ and qualified spellings such as `typing.Self`. Pyright's `Unknown` answer
346
+ outside a class no longer makes those valid imports appear untyped; the
347
+ checker must identify the same import as `Self` in a class context.
348
+ - A known import inside an unchecked mypy function no longer prevents typed
349
+ extraction elsewhere in its file. Towel distinguishes an unchecked expression
350
+ from an unresolved module without changing the project's checker settings.
351
+ - Cross-module helpers exist before ordinary imports can reenter their host.
352
+ Package initializers' later imports are no longer assumed complete, reused
353
+ functions retain their definition order, and wildcard imports cannot
354
+ overwrite generated helper bindings. Relative `__future__` imports retain
355
+ ordinary runtime annotation semantics.
356
+ - The development lock now uses virtualenv 21.14.1. Fresh dependency auditing
357
+ found four advisories against the previous 21.7.9 pin; the update also includes
358
+ the maintainer's later activation-script fixes. Runtime dependencies remain
359
+ unchanged.
360
+ - Generated compound annotations remain wholly quoted, including tuple returns
361
+ assembled late in signature construction. Precise checker types no longer add
362
+ attribute lookups, subscriptions or union operations while a module imports.
363
+ - Star-import resolution treats the imported target as a module. Cyclic
364
+ reexports no longer invent ever-longer attribute paths in Protocol analysis.
365
+
366
+ ### Performance
367
+
368
+ The October 5 comparison of the repaired runtime at `00b4f4f` averaged
369
+ 43.43 seconds versus 38.80 seconds for published 1.772 on the complete typed,
370
+ formatted Packaging command: **11.9% slower**. Four fresh-process samples per
371
+ arm produced consistent results in two balanced blocks. The candidate applied
372
+ 20 refactorings versus 18; these are full requested paths with different
373
+ transformations, not identical-work timings. No whole-corpus speedup is
374
+ established. See the [final comparison](docs/PERFORMANCE.md#october-5-repaired-candidate-comparison).
375
+ The earlier improvements below belong to their development checkpoints and
376
+ are not final-release performance claims.
377
+
378
+ The October 6 audit repairs supersede that runtime. Three separate paired
379
+ complete CLI comparisons measured immutable ownership memoization, witnessed
380
+ fixed-Any retry pruning, and exact unchanged-context refusal retention. Each
381
+ produced byte-identical output; none established a complete-command speedup.
382
+ Those timings predate removal of the inner rendered-variant refusal memo and
383
+ do not measure that removal. See [the optimization measurements](docs/PERFORMANCE.md#october-6-optimization-experiments).
384
+
385
+ - Cache pure ownership facts weakly by immutable AST identity, returning fresh
386
+ mutable result sets to callers.
387
+ - Skip parameter-only annotation erasure only when a plugin-free checker
388
+ diagnostic proves the unchanged helper's fixed-Any result still fails.
389
+ - Retain definitive completed type refusals only for the exact candidate,
390
+ current whole-project revision and complete built-in checker/rendering
391
+ context; retry unknown answers and invalidate after source changes.
392
+
393
+ - Keep sharing immutable analysis for warning-free source containing comments,
394
+ raw strings and valid numeric literals. A bounded lexical cache distinguishes
395
+ those cases from syntax that needs native parser diagnostics. Its source-byte
396
+ budget retains many small modules across repeated project scans. Import
397
+ discovery also avoids collecting scope bindings that its literal guards cannot use.
398
+ - Reuse definite subtype verdicts within one helper's annotation inference
399
+ and immutable narrowing facts across overlapping source windows. Complete
400
+ typed, formatted Packaging runs at runtime commit `000d751` on October 2
401
+ averaged 36.24 seconds versus 41.59 seconds
402
+ for published 1.772, about 13% faster, while applying one more refactoring.
403
+ Generated Python is unchanged from the preceding candidate. See the
404
+ [measurement conditions and samples](docs/PERFORMANCE.md#october-2-complete-cli-comparison).
405
+
406
+ An earlier comparison at development commit `3af8c4b` against the actual
407
+ published 1.772 wheel found no meaningful Packaging whole-command speedup
408
+ (39.98 versus 39.77 seconds; the
409
+ candidate performed one more extraction). Sphinx's first Pyright reveal fell
410
+ from 931.07 to 8.63 seconds, about 108 times faster, with identical requests
411
+ and answers. This measures the reveal phase only; it establishes no full-run
412
+ or whole-corpus speedup. See the [measurements and limitations](docs/proposals/published-1772-comparison.md).
413
+
414
+ The typed timings below compare intermediate commits `35035a7` and `1b97196`;
415
+ later changes are outside these measurements.
416
+
417
+ - Typed signatures preserve argument/result correlations before validation
418
+ and retain mypy's return-context treatment of `NotImplemented`. A known
419
+ erased-None-predicate construction stays at its caller instead of falling
420
+ back to an Any parameter. In a controlled packaging comparison, rejected
421
+ signatures fell from eight to zero and mean elapsed time fell about 16%;
422
+ the run intentionally applied 18 extractions instead of 19.
423
+ - Pyright reveal probes share one checker exchange per project. On a frozen
424
+ Sphinx startup workload, 218 exchanges became one, with identical requests
425
+ and reported types; initial reveal time fell from 980.7 to 8.65 seconds.
426
+ This is a phase measurement, not a full-run timing. See the
427
+ [comparison details](docs/proposals/next-release.md#typed-performance-comparisons).
428
+ - An earlier development snapshot indexed immutable module/class definitions
429
+ once per module tree for instrumentation resolution. A packaging scan made
430
+ 558 identity queries instead of 36,741, retaining the exact same application
431
+ index. The index was released with its AST and did not cache
432
+ project-dependent decisions. That analyzer
433
+ was removed under the October 2 contract; this measurement describes the
434
+ earlier implementation only.
435
+ - Non-None assertions and guarded attribute initialization whose refinements
436
+ are needed by remaining caller operations stay at the call site during block discovery.
437
+ Filtering before maximal-block pairing keeps smaller valid extractions
438
+ available and avoids signature checks for the recognized invalid shapes.
439
+ Strict-mypy regressions cover both refusal and successful extraction inside
440
+ a retained guard and assignment.
441
+ - Repeated method-placement questions share a method's receiver analysis.
442
+ The receiver facts live only as long as their AST. On two analysis passes
443
+ over packaging 26.3, receiver walks fell from 17,405 to 245. The follow-up
444
+ above removes the repeated class-machinery analysis altogether.
445
+ - Function-scope `global` and `nonlocal` declarations are computed once per
446
+ immutable function tree. Two analysis passes over the same packaging
447
+ fixture needed 226 walks instead of 2,666 with this memo alone; all 23
448
+ proposals rendered byte-identically and compiled. The combined policy
449
+ change and memo also preserved those outputs. See the
450
+ [measurement and regression checks](docs/proposals/performance-roadmap.md#method-placement-after-1772).
451
+ - Resolving a receiver annotation now shares the module's binding scan for
452
+ that name. An eight-method `Self` fixture makes 336 queries but scans once,
453
+ producing the same proposal. Cached statement tuples preserve order and
454
+ are released with their module tree.
455
+
456
+ ## [1.772] - 2026-09-26
457
+
458
+ Changes since 1.732.
459
+
460
+ A typed run over a large project did not finish. Sphinx, 243 modules with mypy
461
+ and Pyright both strict, ran 3 h 21 min without reaching a fixed point where
462
+ the same run without types takes 11 minutes. Nearly all of that was the mypy
463
+ worker getting slower with every request it served, and most of the rest was
464
+ asking the checkers questions whose answers were already known. On
465
+ September 21 it reached a fixed point in 46 minutes, applying 380 refactorings
466
+ across 105 files, after which Sphinx's own test suite reported exactly what it
467
+ reported before: 2385 passed, 34 skipped, and the same six failures that
468
+ checkout already had. The audit rounds that followed made Towel decline more.
469
+ The Sphinx-only rerun at `29454ab` took 5,660 s (about 94 minutes) and changed
470
+ 55 files. It ran alone in a Docker Linux VM with 18 cores and 8 GB of memory,
471
+ using Python 3.12, `TOWEL_WORKERS=1`, `--cross-module`, and default typing
472
+ (mypy and Pyright both strict). These are measured conditions, not minimum
473
+ resource requirements or time guarantees. Its suite was again unchanged.
474
+
475
+ Every figure in this file was measured on an Apple M5 Max with 18 cores and
476
+ 128 GiB. This entry's were taken on macOS 26.5.1 with Python 3.12.13, the
477
+ machine otherwise idle, except where a figure says otherwise: the release
478
+ full corpus ran in a Docker Linux VM on the same M5 Max given all 18 cores
479
+ and 8 GB of memory, running four projects at a time; the Sphinx-only rerun
480
+ ran alone. The Sphinx figures are Sphinx 9.1.1 at `e44a40e`, 243 modules with
481
+ mypy and Pyright both strict, checked by that project's own venv: **mypy
482
+ 1.19.1 and pyright 1.1.407**. The mypy behaviour described below belongs to
483
+ that version; Towel's own checks run against a newer mypy and do not show it.
484
+
485
+ ### Fixed
486
+ - Resolving which typing form a name denotes grew exponentially with the
487
+ number of functions that alias a name to itself (`tok = tok.next_token`,
488
+ `node = node.parent`), a common way to walk a linked structure. Twelve such
489
+ functions cost 469 million calls and 371 s, and yapf's `--cross-module`
490
+ fixed point took 2,083 s (macOS, one worker, `--no-types --no-format`, the
491
+ run sharing the machine with one other). The resolution is now computed once
492
+ per name and depth, and the same run takes 5 s with byte-identical output. The release
493
+ corpus's yapf and sphinx runs had timed out on it.
494
+ - inline-snapshot tests that differ only in their literal were extracted
495
+ into one helper, so `snapshot()` read a helper parameter at its call site
496
+ and passing tests failed: 68 of rich-click's 151. inline-snapshot's
497
+ readers (`snapshot`, `external`, `snapshot_arg`) are now recognized by
498
+ binding and their calls stay where they stand. Other callees that read
499
+ their caller's frame are reflection, a documented limitation.
500
+ - Region directives opened before a block and closed after it declined it
501
+ only for pylint and coverage.py. Every tool's region directive now does,
502
+ as that tool reads it (ruff, fmt, yapf, isort), and a block holding
503
+ `fmt: off` or `fmt: skip` carries its protected layout into the helper as
504
+ written.
505
+ - A file of the program that does not parse on the Python Towel runs on now
506
+ refuses the run in every mode, before anything is written. It used to be
507
+ skipped, so on 3.11 a 3.12 project's hand-applied decorator, or a test's
508
+ patch of `len` in 3.12 syntax, went unseen. The refusal names each file,
509
+ the newest Python the project declares, and an `--exclude` that clears
510
+ it. `--exclude` takes a file name as well as a directory name; an excluded
511
+ file that parses is still read as evidence, and one that does not parse
512
+ is taken as no part of the program. Fixtures in syntax newer than a
513
+ supported Python are stored as `.pynew`.
514
+ - mypy was taken to look at every file it was handed, so a file its own run
515
+ never checks, one outside `files` or under `ignore_errors`, got annotations
516
+ nothing verified, and typed runs declined whole projects under
517
+ `ignore_errors`. Such a file is now treated as one no checker covers. Each
518
+ mypy configuration group is checked in its own cache over the whole
519
+ candidate; candidate checks honour `--exclude` and the project's mypy
520
+ `exclude` as the baseline does; and a project package named `env` is no
521
+ longer taken for an environment. A check that fails for the project as it
522
+ stands now stops the run at once, naming the cause: sqlmodel ran 15
523
+ minutes and exited 1 with every proposal "not judged".
524
+ - A project decorator that is a plain wrapper was trusted although another
525
+ module rebinds it, as `app.checks.checked = typeguard.typechecked` before
526
+ the decorated module imports it, and code moved out of the instrumented
527
+ function. A decorator is now known only when nothing in the program may
528
+ rebind it, at every module its name passes through. A stacked decoration
529
+ by hand, `f = typechecked(register(f))`, is judged for every call along
530
+ the chain.
531
+ - A star import made every decorator of its module unknown; it now makes
532
+ unknown only the names it may bind, read as it may run (a literal
533
+ `__all__` with the module's public names, since an import cycle can run
534
+ the star import first).
535
+ - A lambda, comprehension or nested function whose parameter is spelled
536
+ like a name that becomes a helper parameter read the helper's parameter
537
+ instead of its own, and silently computed the wrong result:
538
+ `max(orders, key=lambda order: order["total"])` beside a parameter
539
+ `order`. A name in an f-string's format spec (`f"{v:>{width}}"`), and the
540
+ attribute and subscript loads in a `for`, `with` or comprehension target
541
+ (`for box.v in items`), kept the template's spelling and raised NameError.
542
+ Substitution now follows Python's scopes, and the instantiation check,
543
+ which passed all three because it compared names by spelling, compares by
544
+ binding.
545
+ - A call is declined where its thunk would read a closure variable that an
546
+ inlined comprehension in the same function rebinds; Python 3.12 and later
547
+ raise NameError there.
548
+ - A block holding its function's only binding of a name that the function
549
+ reads elsewhere is declined (`moves_only_binding`), unless the call binds
550
+ the name again. Moving it made the name stop being local, so the other
551
+ reads found a module name or builtin where the original raised
552
+ UnboundLocalError. A helper now declares `global` or `nonlocal` every name
553
+ its blocks bind by any construct, and sites whose functions declare a name
554
+ differently share no helper (`scope_declarations_differ`).
555
+ - A new import was written above a `#!` line or an encoding declaration, so
556
+ a script lost its shebang or a Latin-1 module was read as UTF-8, and it
557
+ could land ahead of a borrower's statement that runs at import. Imports
558
+ now go below the shebang, the encoding line, a file-wide `# type: ignore`
559
+ and the leading comments, and after the borrower's leading statements that
560
+ run code. A write that would change how Python decodes a file is refused.
561
+ - `--cross-module` hosted a helper in a module some platform cannot import,
562
+ such as one that imports `msvcrt`, or in one the program imports only
563
+ under a condition. It now requires what CPython's documentation marks as
564
+ platform-only, what a supported Python removed, and what a marker limits,
565
+ and hosts in a conditionally imported module only for a borrower that
566
+ already loads it.
567
+ - Build selections are read for every setting of each listed backend, in
568
+ each distribution's own configuration: Poetry `packages` and `include`,
569
+ PDM `includes`, `source-includes` and `package-dir`, hatch `only-packages`
570
+ and its default, setuptools `py-modules`, uv `module-name` and
571
+ `module-root`, flit's module and scikit-build-core `wheel.packages`. A
572
+ helper was hosted in a module the wheel left out.
573
+ - `--cross-module` no longer makes a module of one distribution import a
574
+ helper from another (`other_distribution`), which failed when the borrower
575
+ was installed against the other's released version.
576
+ - A typed run checked a change to a member with its own pyright
577
+ configuration only from that member's root, so a consumer in the outer
578
+ project was judged against the original text, and a helper that broke it
579
+ was accepted. A change is now checked from every configured root that
580
+ encloses it, and each copy shows the whole change.
581
+ - pyright's configured `venvPath`/`venv` was dropped from Towel's copy, so
582
+ the check silently used Towel's own interpreter: a helper typed `-> int`
583
+ was accepted where the project's library returns `str`. pyright now
584
+ resolves imports in the configured environment, and an environment it
585
+ cannot use refuses the typed run. Search paths that lead into an
586
+ environment name the original.
587
+ - A pyright-typed run was refused whenever any data file was not UTF-8 or a
588
+ directory was linked from outside. Only the files pyright reads as
589
+ configuration are now held to UTF-8, and links are reproduced as links, so
590
+ an import through an alias inside the project sees the candidate.
591
+ - pyright's messages could carry the private copy's paths, so a
592
+ pre-existing import cycle declined every change. The command line's
593
+ errors without a range are accepted. A forked child can no longer disable
594
+ a `PyrightOracle` or delete its copy. A target outside pyright's `include`
595
+ no longer waits 60 s for the language server.
596
+ - Under `--cross-module`, a directory named like a library, such as
597
+ `third_party/click/` holding `utils.py`, was taken for the library when
598
+ Towel's interpreter lacked it, and Towel wrote `from click.utils import`.
599
+ A directory lacking a module that an import from outside it names is now
600
+ in doubt, unless the project's metadata gives the project that name.
601
+ Requirements declared in `[tool.uv]` and `[tool.pdm]` dev dependencies,
602
+ hatch environments, a Pipfile and `*-requirements.txt` files are read
603
+ too.
604
+ - A file that a symbolic or hard link gives a second module name is now in
605
+ doubt, and the report names the link. Before, its import-time code could
606
+ run twice.
607
+ - An import that attests nothing, because it is guarded, type-only, or in a
608
+ file that changes `sys.path`, no longer locates a name or puts one in
609
+ doubt; graphene's `setup.py` refused every `--cross-module` run. An
610
+ import of a module the tree lacks no longer makes a stray
611
+ `src/__init__.py` a used package, and a type-only one no longer leaves its
612
+ file unchanged.
613
+ - A formatter that changed or failed on the code it was given ended a
614
+ directory run with exit 1 and nothing written: Black normalizing a
615
+ docstring, Black unable to parse a snippet, ruff exiting nonzero or timing
616
+ out. The proposal is now declined as "the formatter changed its code or
617
+ failed", and the run goes on.
618
+ - A differing value holding a slice outside its own subscript, such as
619
+ numbagg's `data[0, :50]`, became the argument `lambda: (0, :50)`, which is
620
+ not Python. Such a value is no longer made a parameter.
621
+ - An out-of-place run copied a pending journal into its stage and refused
622
+ its own write there; a journal inside the target was published into the
623
+ output. Journals are left out of both, and the run warns, naming the
624
+ project's journal and `towel recover`.
625
+ - A refusal over a pending journal named `towel recover` even where recovery
626
+ would then fail. The remedy now runs recovery's own checks and names what
627
+ works.
628
+ - One hard-linked file failed a whole in-place run at publication, losing
629
+ every other file's refactoring. Proposals that would write it are now
630
+ declined up front, and the rest is written.
631
+ - `--no-interactive` still asked "Analyze anyway?" for an input without a
632
+ `.py` suffix. A crash inside mypy or a plugin was reported only as
633
+ "SystemExit: 2"; it now names the exception and mypy's last output.
634
+ - Under forked evaluation the rejection trace counted some pairs twice, and
635
+ which pairs were duplicates depended on the split between workers. The
636
+ trace is now the serial run's, line for line.
637
+ - The sdist left out 33 test fixture configuration files.
638
+ - Code moved out of functions whose decorators rewrite or compile their
639
+ bodies. typeguard's `@typechecked` recompiles a function from its source
640
+ with checks added, and numba's `@njit` compiles it. The moved code went
641
+ unchecked or stopped compiling, and typeguard's own
642
+ `test_unpacking_assign_star_no_annotation_fail[typechecked]` failed after
643
+ a root run.
644
+
645
+ Code now moves out of a function, or a helper into one, only when
646
+ everything that can reach that code is known to leave bodies alone:
647
+ - decorators on the function and on every enclosing function and class;
648
+ - decorators applied by hand (`fast = numba.njit(kernel)`,
649
+ `f = typechecked(f)`, `njit(cache=True)(kernel)`);
650
+ - the machinery of every enclosing class: its metaclass,
651
+ `__init_subclass__` and `__getattribute__`.
652
+
653
+ "Known" means one of two things. The decorator or base is on a verified
654
+ list, each entry recording the source it was read in: the standard
655
+ library's decorators, pytest's and click's, `rich.repr.auto`, and about
656
+ forty standard-library bases such as `unittest.TestCase`,
657
+ `asyncio.Protocol` and `logging.Handler`, which the suite re-checks by
658
+ introspection on every interpreter. Or it is a project decorator shown to
659
+ return, register or plainly wrap the function.
660
+
661
+ Anything else declines the pair as `decorator_may_transform_body[...]` or
662
+ `class_machinery_may_transform_methods[...]`, naming the culprit. Across
663
+ ten projects, 672 of 721 refactorings remain.
664
+ - With `--cross-module`, a block holding an `assert` is shared only between
665
+ modules pytest rewrites alike, following pytest's own rules and the
666
+ project's pytest configuration. Otherwise a failing assert would lose the
667
+ explanation pytest adds to its message.
668
+ - A `TestCase` subclass can now take a class-private method helper, which
669
+ neither unittest nor pytest collects as a test.
670
+ - An in-place `dry` refused whenever any `.towel-transaction-*` path
671
+ existed under its target. That included an empty directory, one inside
672
+ `.git`, and a journal naming only untouched files, and for the empty
673
+ directory the suggested `towel recover` failed too.
674
+
675
+ A run now stops only for a pending journal that may name a file it would
676
+ change: one whose manifest names such a file, or which has no readable
677
+ manifest. The refusal names the `towel recover` command, or says why
678
+ recovery would not read the journal and what to do instead. `preview`
679
+ and `rename-helpers` warn by the same rule.
680
+ - `towel recover` accepts a journal named through a symbolic link, such as
681
+ one under macOS's `/tmp`, and each refusal says why.
682
+ - A file's project root, coverage exclusions, builtin evidence and
683
+ declared dependencies were looked up at every call site: 12,205 times
684
+ for one input on a benchmark of 50 functions. They are now looked up
685
+ once per input for the run, and so are a function's own locals, keyed by
686
+ block site. CPU time against 1.732 went from 1.71 to 1.27 times on that
687
+ benchmark, and from 1.37 to 1.08 times on rich.
688
+ - A project's own package named `env` or `venv` is refactored. An
689
+ environment is now recognised by `pyvenv.cfg` or `conda-meta`, whatever
690
+ it is called.
691
+ - The rejection trace names each block's file:
692
+ `REJECT[reason]: path::function@(start, end) <-> ...`. A pair the
693
+ extractor cannot render is traced as `unsupported_extraction`, and one
694
+ found while clustering no longer ends the analysis.
695
+ `return_versus_variables` replaces the mislabelled
696
+ `incomplete_return_coverage_block2`.
697
+ - The tests and scripts shipped in the sdist carry the Apache licence
698
+ header, and `scripts/add_copyright_headers.py --check` enforces it.
699
+ - A typed run on a project reached through a symbolic link now verifies its
700
+ changes. On macOS that includes every temporary directory, since `/var`
701
+ is `/private/var`. mypy prints each file by its resolved path, and Towel
702
+ had matched its answers against the path it was asked about. So every
703
+ probe went unanswered, with three consequences:
704
+ - every proposal was declined as code the checker does not look at;
705
+ - every subtype question read yes;
706
+ - the check for names typed as `Any` saw no answers, so a missing module
707
+ could go unnoticed.
708
+
709
+ File identities now compare one resolved path throughout. The test suite
710
+ fails any typed test whose checker declined everything as unlooked and
711
+ verified nothing, unless that decline is what the test is about.
712
+ - A parallel run could hang for ever. Pair-evaluation workers were forked
713
+ while other threads ran:
714
+ - tqdm's monitor, in every run with the default progress bars;
715
+ - the progress heartbeat, from a directory run's second pass;
716
+ - each warm pyright session's reader.
717
+
718
+ A forked child keeps every lock as it stood. So a worker forked while one
719
+ of those threads was writing to stderr waited on stderr's lock when it
720
+ flushed at exit, and the run waited on the worker. Towel now ends its
721
+ threads for the moment of the fork and starts them again after, so
722
+ workers fork from a process with one thread. A thread Towel does not run,
723
+ or one that does not end within 2 s, keeps evaluation in the process, and
724
+ the run says so once, naming it. Python 3.12 and 3.13 no longer warn that
725
+ a multi-threaded process is forking.
726
+ - A block that rebinds a name bound before it is now declined, whatever
727
+ construct rebinds it: a `for` or `with` target, a `match` capture, a
728
+ nested `def` or `class`, an import, or a walrus. So
729
+ `i = -1; for i in xs: ...; i * 2` keeps its `-1` when `xs` is empty. It
730
+ had raised `UnboundLocalError` in the helper.
731
+ - `count += 1` and `del count` after a block now count as reads of `count`.
732
+ The helper returns it, or the block is declined, instead of the later
733
+ statement raising `UnboundLocalError`.
734
+ - A block that reads a local before binding it, such as
735
+ `scale = scale(n)`, is declined where the call site may not have the name
736
+ bound. The call had succeeded there, using the module's `scale`.
737
+ - Blocks equal up to their binders' names now share a helper only where no
738
+ read can find a renamed binder unbound. So an `UnboundLocalError` still
739
+ names each site's own variable.
740
+ - Definite assignment now unbinds a deleted name for everything the
741
+ deletion may precede: the next loop iteration, a handler or `finally`, a
742
+ `with`, `case` or `else` body, and an `except*` clause. Such a name had
743
+ been passed eagerly, and raised before an effect the original ran first.
744
+ - A block that started at the second statement of a `;` line, or ended at
745
+ the first, was spliced by whole lines, which deleted the other statement.
746
+ `a = n + 1; b = a * 2`, with the block at `b`, lost `a = n + 1`, and a
747
+ trailing `; log.append(...)` was lost the same way. The call now replaces
748
+ exactly the block's text. It keeps the rest of the first and last lines,
749
+ including a one-line compound body's header and a backslash continuation.
750
+ - A thunk was passed eagerly although the helper evaluated something first
751
+ that could run code or raise, so its effect moved ahead of that
752
+ something. The cases were:
753
+ - a lambda's default arguments;
754
+ - a set or dict display hashing its keys;
755
+ - `*` and `**` unpacking;
756
+ - a read of a global that raises `NameError`;
757
+ - dead code after `return` or `raise`.
758
+
759
+ A thunk now goes eagerly only after steps on an allowlist of forms, in
760
+ CPython's evaluation order, that can neither run code nor raise.
761
+ - A pair is declined as `directive_on_shared_line` when its block shares a
762
+ physical line with code that stays at the call site, and that line
763
+ carries a tool directive or is excluded from coverage. The directive
764
+ governs the whole line, and splicing in the call would part it from some
765
+ of that code.
766
+ - The import sorter could reorder a file's own imports, and so the order
767
+ their modules run in. With ruff excluding `pkg/app.py`, Towel rewrote
768
+ `from pkg import zeta` / `from pkg import alpha` as
769
+ `from pkg import alpha, zeta`, and a plugin registry's order flipped.
770
+ httpcore's byte-compared `_sync` twins were re-sorted the same way.
771
+
772
+ Sorting now respects each tool's own file selection, judged for the
773
+ project's file rather than the run's staged copy:
774
+ - ruff: `exclude`, `extend-exclude`, `lint.exclude` and
775
+ `per-file-ignores`;
776
+ - isort: `skip`, `extend_skip`, `skip_glob`, `extend_skip_glob` and
777
+ `skip_gitignore`, skipped directories included.
778
+
779
+ A file is sorted only if its original imports are already in the
780
+ sorter's order, and a result is kept only if the file's own imports keep
781
+ their order. So only the imports Towel added can move, and a file left
782
+ unsorted is reported once. `ruff format` and Black respect their
783
+ exclusions too.
784
+ - `# ty: ignore[...]` and `# pyrefly: ignore` were read as plain comments.
785
+ Towel moved the code they silenced into call-site lambdas and left the
786
+ ignores behind. On griffe, its own `ty check` went from 2 to 23
787
+ diagnostics. These are now directives, as are:
788
+ - `# zuban: ignore` and `# nosemgrep`;
789
+ - Fixit's `# lint-ignore` and `# lint-fixme`;
790
+ - ruff's `file-ignore`, `disable` and `enable`;
791
+ - pyrefly's `ignore-errors`.
792
+
793
+ An ignore on a line of its own governs the next line of code, as those
794
+ tools read it.
795
+ - With `--cross-module`, Towel took a project directory named like a
796
+ library it requires for that library, when its own interpreter lacked
797
+ the library. For example, `click/` sharing one module with click, while
798
+ the project depends on `click>=8`. The import it wrote then failed once
799
+ the package was installed. A requirement declared in any of these now
800
+ puts the name in doubt: pyproject.toml, setup.cfg, a uv, Poetry, PDM or
801
+ Pipenv lockfile, or requirements*.txt.
802
+ - With `--cross-module`, a library installed in an environment inside the
803
+ project root, such as the project's own `.venv`, was taken for the
804
+ project's own code. It now counts as installed outside the project.
805
+ - With `--cross-module`, Towel could host a helper in a module the build
806
+ leaves out of the wheel, so the installed package failed to import. It
807
+ now reads the declared exclusions of hatch, setuptools, MANIFEST.in,
808
+ Poetry, PDM, uv, flit and scikit-build-core, and every `.gitignore`. It
809
+ uses them only to put a host in doubt, never to name a module. An import
810
+ inside a function no longer shows that a directory ships.
811
+ - With `--cross-module`, a top-level module inside a package, imported by
812
+ its bare name from beside it, went unrefused. The borrower was given a
813
+ relative import that fails where the original works. It now refuses.
814
+ `from . import x` and `from pkg import x` of a missing submodule are now
815
+ reported, and their file is left unchanged.
816
+ - Each import problem's remedy now fits its kind:
817
+ - `--exclude` for a stray copy in the tree;
818
+ - an environment where the name is this tree, or one without it, for an
819
+ installed copy;
820
+ - a rename, `--exclude` or a dropped requirement, for a required
821
+ distribution.
822
+ - Typed mode now reads per-module `follow_imports` as mypy does. An error
823
+ in a module its own section follows was dropped, and a helper the
824
+ project's mypy rejects was let through.
825
+ - A typed run over part of a project (`towel dry tests tests`) found the
826
+ project's own packages in a stale installed copy, and wrote annotations
827
+ for the installed API. It now finds them in the tree.
828
+ - Probes now name modules as mypy does under `explicit_package_bases`,
829
+ `mypy_path` and namespace packages. A probe build that fails is now a
830
+ checker failure. It had been read as unreachable code, which ended PEP
831
+ 420 projects at a false fixed point with exit status 0.
832
+ - A changed file outside the configured `files` is named as its importer
833
+ names it, so mypy no longer refuses the build with "found twice".
834
+ - A mypy configuration that mypy only warns about no longer refuses the
835
+ typed run, and the warning is passed on. Examples are an unknown option,
836
+ a global option in an override, or a dropped Python version.
837
+ - A typed run accounted for errors on the lines a change wrote by message
838
+ alone. Merging two copies of a block then freed the second copy's errors
839
+ to hide a new error with the same message. A helper typed `int | str`,
840
+ whose `p + p` repeated two pre-existing messages, was accepted, and the
841
+ project's mypy rejected it.
842
+
843
+ Each error is now accounted for by an error of the original that stood
844
+ where it stands:
845
+ - in the helper, the same message at the same statement of one copy of
846
+ the block, each error once;
847
+ - at a call site, its own copy's.
848
+ - A file whose imports the checker cannot resolve is now left alone even
849
+ when the configuration silences that report. Examples are
850
+ `ignore_missing_imports` and pyright's `reportMissingImports = "none"`.
851
+ Every checker is asked what each import binds. A subtype question about
852
+ a type the checker sees as `Any` answers unknown, so it no longer folds a
853
+ union.
854
+ - A file that cannot be decoded is left out of a typed run and left
855
+ unchanged, as without types, instead of refusing the run.
856
+ - Files that pyright's configuration excludes or ignores are known before
857
+ the run, and pyright is not asked about them. That removes a minute-long
858
+ stall. Another checker that checks them settles them, rather than their
859
+ being declined as unreachable. Where no checker covers a file, its helper
860
+ takes only the annotations its sites declare.
861
+ - A class the checker names by its whole path, which the helper's module
862
+ does not import, is now imported under `TYPE_CHECKING` and named
863
+ directly, as documented. It had been written `Any`.
864
+ - A verdict that nothing rebinds a name a block reads was memoized under the
865
+ structure of the block and its function. It then answered for identical
866
+ code whose enclosing function rebinds that name with `nonlocal`, in the
867
+ same module or in another. The name was passed to the helper as an
868
+ argument, and so read before the rebinding.
869
+
870
+ The same key let a top-level copy of a block lend its bindings and escape
871
+ verdict to an identical copy inside a loop. That copy was then extracted
872
+ without returning the variable the loop reads next.
873
+
874
+ Block guards and per-block analyses are now memoized per block site: the
875
+ module's source, and the positions of the function and the block. On
876
+ rich, one core, analysis takes about 6% longer, and the output is
877
+ unchanged. A test runs the analysis with every memo disabled and requires
878
+ the same verdicts, so a cache key that leaves out a dependency fails the
879
+ suite.
880
+ - A block that spells a class-private name only as a parameter, or in an
881
+ import's module or member, was moved out of its class. There the name is
882
+ not mangled:
883
+ - `(lambda __p=0: 7)(__p=y)` raised `TypeError` in a method and returned 7
884
+ in a module-level helper;
885
+ - `import __tool` inside `class A` imports `_A__tool`, but `__tool` in a
886
+ helper.
887
+
888
+ Every position CPython mangles now counts. This is checked against the
889
+ interpreter's own symbol tables for all 37 identifier positions in its
890
+ grammar. A call's keywords are compared with the parameters as the class
891
+ stores them, so the same call is declined even when the helper stays in
892
+ the class, where its `TypeError` would name the helper.
893
+ - A typing name that a helper's annotation needed was imported publicly
894
+ (`from typing import Callable`). That replaced a same-named binding in
895
+ every module that star-imports the host. It also replaced one in the host
896
+ itself, where a star import, a `try` or an assignment had bound the name.
897
+ `case Callable():` then raised `TypeError`, and a package's own `Any`
898
+ became `typing.Any`. On click, rich and packaging, 13 modules gained a
899
+ public name.
900
+
901
+ Typing names are now reached through a private `import typing as
902
+ _typing`, or through the module's own sole `import typing [as t]`.
903
+ - The `from typing import TYPE_CHECKING` written for a new guard rebound a
904
+ module's own `TYPE_CHECKING`, for example
905
+ `from pkg.flags import DEBUG as TYPE_CHECKING`, and turned its flag from
906
+ True to False. A new guard now reads `if _typing.TYPE_CHECKING:`, which
907
+ mypy and pyright both recognise, unless the module's sole binding of that
908
+ name is typing's own.
909
+ - A class imported for the checker is bound under a private alias
910
+ (`from pkg.models import Item as _Item`, spelled `"_Item"`), since
911
+ checkers carry that import into every star-importer.
912
+ - A new guard carries `# pragma: no cover` only where the project's
913
+ coverage exclusions would not otherwise match it, so coverage is
914
+ unchanged.
915
+ - A typing import was skipped when the same line appeared anywhere in the
916
+ file, even inside a function, and the helper's annotation then raised
917
+ `NameError` at import.
918
+ - On Python 3.11 and 3.12, Towel compared the syntax trees it builds with
919
+ parsed ones by `ast.dump`. Before 3.13, `ast.dump` spells a field the
920
+ constructor was not given differently from one set empty. On 3.12 the
921
+ helper's `FunctionDef` has no `type_params`, so nearly every helper was
922
+ declined as "could not be rendered". Other comparisons could also miss:
923
+ - the subtype relation that needs no checker;
924
+ - union normalisation;
925
+ - the instantiation check;
926
+ - structural keys and proposal identities.
927
+
928
+ Each miss cost a refactoring or precision, never soundness. Every such
929
+ comparison now uses one spelling on every supported Python, the one
930
+ 3.13's `ast.dump` writes. On 3.12 this recovers 5 typed refactorings in
931
+ the corpus: packaging 2, mistune 2 and nox 1.
932
+ - The test suite passes on Python 3.11, 3.12 and 3.13. Fixtures in PEP 695
933
+ syntax, and tests of `typing.override`, are skipped where the running
934
+ Python lacks them.
935
+ - The fallback annotations of a typed run are built from the checker's
936
+ answer. Under strict mypy, the rung that made every annotation `Any` had
937
+ verified 4 times in 46, and 32 of its refusals were "Returning Any". Now
938
+ `Any` goes only where the errors point:
939
+ - a parameter read on a failing line;
940
+ - `Callable[[...], Any]` for a thunk whose result is at fault;
941
+ - the parameter an "Argument N" error names.
942
+
943
+ A return is loosened least, to `<declared> | Any`, which is also how a
944
+ helper returning `NotImplemented` is typed. Under mypy's
945
+ `warn_return_any`, the every-`Any` rung is not tried. The unannotated
946
+ helper is not tried under `disallow_untyped_defs`, or in a module whose
947
+ every function is annotated. Such a proposal is declined saying so;
948
+ before, idna's output failed its `mypy --strict` CI with 4 errors.
949
+ - An extraction that no helper signature can type is declined early, under
950
+ a named reason in the run's summary:
951
+ - it narrows what its caller reads after the call;
952
+ - it narrows what a call-site lambda reads;
953
+ - it declares its class's attributes;
954
+ - it completes its caller's partial type.
955
+
956
+ Two of these are decided from the proposal alone, without asking the
957
+ checker.
958
+ - A declined proposal is replayed at a rehearing, rather than checked
959
+ again, only while nothing it could depend on has changed: its rendered
960
+ files, the files its errors lie in and what they import, and the
961
+ baseline's record of known errors. On packaging, checks that exactly
962
+ repeated an earlier one went from 16 to 0.
963
+ - A number of annotation fixes:
964
+ - outside a class, a `Self` the sites revealed becomes a type variable
965
+ bound to their classes;
966
+ - no annotation is written as the string `"None"`, which mypy 2 rejects
967
+ under `native_parser`;
968
+ - a site revealed as `Any` no longer erases another site's type in a
969
+ join;
970
+ - a copied declaration gives way to the narrower type the block saw;
971
+ - a method helper is placed where the attributes it assigns keep their
972
+ declarations;
973
+ - every rung writes only the type-only imports its own annotations use.
974
+ - A class name shortened inside a subscripted annotation (`dict[Item, int]`)
975
+ was left unquoted while `Item` was imported only under `TYPE_CHECKING`.
976
+ mypy accepted it, but the module raised `NameError` on import.
977
+ - Coverage exclusions set in a project's configuration now count the way a
978
+ `# pragma: no cover` comment does. Examples are `if __name__ ==
979
+ .__main__.:`, `raise NotImplementedError` and `@overload` in
980
+ `exclude_lines` or `exclude_also`. Before, only the comment counted, so
981
+ such an entry could move excluded code into a helper that coverage
982
+ measures. Towel reads the configuration as coverage.py 7.16 does: from
983
+ `COVERAGE_RCFILE`, `.coveragerc`, `.coveragerc.toml`, `setup.cfg` or
984
+ `tox.ini` `[coverage:report]`, or `pyproject.toml`
985
+ `[tool.coverage.report]`. Its three default patterns count as well. Where
986
+ `exclude_lines` leaves the pragma out, a `# pragma: no cover` comment
987
+ excludes nothing, so it no longer declines a pair.
988
+ - A type-only import now joins the module's existing `TYPE_CHECKING` guard,
989
+ recognised by binding as the import graph recognises it. Towel had found
990
+ the guard by its exact text, and indented the new import four spaces:
991
+ - packaging's `if TYPE_CHECKING: # pragma: no cover` got a second guard;
992
+ - a guard body indented two spaces or with a tab raised `IndentationError`;
993
+ - in a module that rebinds `TYPE_CHECKING = True`, the import was joined
994
+ to a block that runs.
995
+
996
+ The import now takes the indentation of the guard's own body.
997
+ - A `--cross-module` run refuses only for a problem that leaves a name of the
998
+ code being refactored in doubt. Such problems are:
999
+ - an ambiguous name, such as a stale `build/lib` copy of the package, which
1000
+ `--exclude build` still clears;
1001
+ - a file reachable under two names;
1002
+ - a top-level name found inside a package;
1003
+ - a relative import that climbs out of its package.
1004
+
1005
+ An import of a module the tree lacks refuses nothing, whether the run is
1006
+ from the root, on a package or on a sub-package. Such imports had stopped
1007
+ every run on sphinx, astroid and prompt-toolkit, and on seven packages
1008
+ whose modules import the `_version.py` their build generates, which a
1009
+ fresh clone lacks. With the refusal set aside, the package's name was
1010
+ flagged, so every helper its modules could share was declined: 3,858 of
1011
+ the 3,860 cross-module pairs on sphinx.
1012
+
1013
+ Over 140 corpus projects, runs on the package refused 14 before and 4
1014
+ after. Runs from the root, measured only after the first of these changes,
1015
+ refused 24 and now refuse 18. Every remaining refusal is for a name in
1016
+ doubt, such as the four module names sphinx's `tests/roots` each defines
1017
+ more than once.
1018
+ - In a `--cross-module` run, a file making such an import is left exactly as
1019
+ it was. It hosts no helper, borrows none, and none of its own duplicates
1020
+ are extracted. The run names each such file, with a remedy that fits:
1021
+ test data or an example can be left out with `--exclude`, and a package's
1022
+ generated module appears once the project is installed. When the file is
1023
+ a package's `__init__.py`, that package's modules still share helpers
1024
+ among themselves, and the run says in one line that they host none for
1025
+ modules outside the package.
1026
+ - A run on a sub-package now refuses, instead of going on with every helper
1027
+ declined, when a relative import elsewhere in the package climbs out of
1028
+ it.
1029
+ - An import below a module file names the module it lacks: `util.gone`, not
1030
+ `util`, when `util.py` exists. A module file that registers submodules at
1031
+ run time, as `six.py` registers `six.moves`, is not reported as missing
1032
+ them, wherever it sits.
1033
+ - A typed run no longer changes code that the type checker does not look
1034
+ at. That is code the checker takes to be unreachable on the platform and
1035
+ Python version it checks for, and there it reports nothing. On darwin,
1036
+ mypy skips a module guarded by `assert sys.platform == "win32"`, so
1037
+ Towel's check of changes there was vacuous. trio's CI, which checks linux,
1038
+ darwin and win32, found 14 errors in output Towel had accepted.
1039
+
1040
+ Every configured checker is now asked, by a `reveal_type` probe, whether
1041
+ it looks at the lines a change writes. A change it does not look at is
1042
+ declined as not verifiable. The regions are named before the run. trio's
1043
+ CI now passes on all three platforms.
1044
+ - An import under `if TYPE_CHECKING:` never runs, and the cycle guard no
1045
+ longer follows it. Modules that name each other's classes only for the
1046
+ checker can now share a helper. A type-only import that Towel writes no
1047
+ longer refuses later pairs between the same two modules; on mistune it
1048
+ had cost two typed refactorings.
1049
+
1050
+ The guard is recognised by resolving the name: typing's or
1051
+ typing_extensions' `TYPE_CHECKING`, however imported or aliased, or the
1052
+ module's own `TYPE_CHECKING = False`. Its `else` branch still counts as
1053
+ an import that runs, as do `if not TYPE_CHECKING:` and a shadowed or
1054
+ unresolvable name. A module's requirements now include the imports in the
1055
+ guard's `else`, which had been dropped.
1056
+ - A type variable over classes from two modules now imports the one its host
1057
+ lacks, under `TYPE_CHECKING`, spelled as the program's own imports spell
1058
+ it. packaging's validation and required-key errors, and mistune's
1059
+ renderer `__call__`, are now typed without `Any`.
1060
+ - Comments inside a moved block were lost with it, because the helper was
1061
+ rendered from its syntax tree. That included tool directives, such as
1062
+ asyncstdlib's and mashumaro's `# type: ignore`, as well as
1063
+ `# pyright: ignore`, `# noqa` and `# pragma: no cover`, and every
1064
+ explanatory comment. A lost directive changes what a checker, linter or
1065
+ coverage tool reports.
1066
+
1067
+ The helper now carries each comment beside the code it was written for,
1068
+ in order. It also keeps the grouping parentheses and trailing commas that
1069
+ held a list split across lines, so Black and ruff reproduce the source
1070
+ layout. Where a formatter would move a directive off its code's line,
1071
+ that helper is written unformatted. Comments above or below a moved block
1072
+ stay with its call, and `preview` shows the helper's comments.
1073
+ - A typed run no longer refuses a project whose type check already reports
1074
+ errors. It reports them first, and rejects a change only for an error they
1075
+ do not account for:
1076
+ - In a file no change touched, an error must match one at the same line.
1077
+ - In a file a change touched, the two texts are aligned by a line diff. An
1078
+ error on a line the change left alone must match the original's error
1079
+ on that line. An error on a line the change wrote must match the
1080
+ original's error where that code stood, as described above.
1081
+ - A message that names a line fails closed.
1082
+ - Each written change's check becomes the reference for the next.
1083
+ - The cold confirmation compares the same way.
1084
+
1085
+ In a study of 20 corpus projects in their own environments, the old rule
1086
+ let 5 through. 19 are now refactored with types, for 125 refactorings, 77
1087
+ of them in the 14 newly admitted projects.
1088
+ - With mypy and pyright both configured, the combined check stopped at the
1089
+ first checker that reported anything. Against pre-existing mypy errors,
1090
+ pyright was then never asked about any candidate. Every checker is now
1091
+ asked until one reports a new error.
1092
+ - A file where the original check leaves a name the checker cannot type is
1093
+ not changed. Such names come from an unresolved or untyped import, a
1094
+ missing stub, an untyped decorator or an `Any` base class. A change there
1095
+ would be checked against `Any`, and could not fail. The run names these
1096
+ files up front and counts their proposals as not verifiable.
1097
+ - The cold confirmation checks the original cold before it treats as new an
1098
+ error that only it reports. On trio, pyright's language server and command
1099
+ line disagreed about files no change touched, so every typed run failed at
1100
+ the end.
1101
+ - Only a checker that cannot run still refuses a typed run. The corpus
1102
+ harness reruns a project without types only in that case, and records
1103
+ every other project's pre-existing errors.
1104
+ - Typed runs read every type spelling that mypy 1.x, mypy 2.x and pyright
1105
+ print. A regular expression took the last `) -> ` as the end of a
1106
+ parameter list, so `lambda: parse_extras` in packaging's `_parser` was
1107
+ annotated as the function the lambda returns. Now read correctly:
1108
+ - a function returning `None` (`def (builtins.int)`), a function
1109
+ returning a function, and a generic function;
1110
+ - a named tuple or typed dict, and its constructor;
1111
+ - `Union` and `Optional` beside `|`, and a literal whose text holds `<`.
1112
+
1113
+ Only a literal type the checker inferred is widened, and a declared one is
1114
+ kept. `Union`, `Optional` and `Literal` are imported where they are
1115
+ written.
1116
+ - The type-variable rung recognises the program's own classes. It had
1117
+ identified a class by where its import points or where it is defined,
1118
+ which never matches the checker's `packaging.version.Version`. So the
1119
+ row, and every type variable in it, was lost: rows formed in 13 of 81
1120
+ attempts across packaging, rich, mistune and nox.
1121
+
1122
+ A class is now named by the absolute name the import model gives its
1123
+ module. Where the program's imports name no module, the rung uses mypy's
1124
+ `__init__` chain instead. Rows now form in 58 of 66 attempts. Along with
1125
+ that:
1126
+ - a type only a call site can name may stand inside a type variable;
1127
+ - `Any` nested in a type is kept;
1128
+ - the signature brings its typing imports;
1129
+ - a parameter the body never reads is `object`;
1130
+ - union members line up by structure;
1131
+ - a class passed directly or through a thunk (`lambda: Row`) is
1132
+ `type[Row]`, and a returned variable bound to a parameter takes that
1133
+ argument's type.
1134
+ - Sites in different modules that agree on every type get their common
1135
+ signature, naming the host's classes. Before, the ordinary signature wrote
1136
+ only builtins and fell back to `Any`, and mistune's block quote and spoiler
1137
+ helpers were declined.
1138
+
1139
+ Together with the ladder and baseline changes above, typed refactorings
1140
+ rise as follows, measured on Python 3.12.13 with `--cross-module` from
1141
+ `eaa3882` to `336c890`:
1142
+
1143
+ | Project | Typed refactorings | Project checks per run |
1144
+ |---|---|---|
1145
+ | packaging | 10 to 20 | 68 to 36 |
1146
+ | rich | 18 to 22 | 45 to 30 |
1147
+ | mistune | 15 to 19 | 31 to 19 |
1148
+ | nox | 5 to 5 | 9 to 7 |
1149
+ | idna | 3 to 1 | 5 to 5 |
1150
+
1151
+ idna's output now passes its CI's `mypy --strict idna`. Every output
1152
+ passes its project's own mypy and test suite exactly as the unchanged
1153
+ project does, and every module imports as it did.
1154
+ - Pyright's language server checks a project as `pyright` itself does. Towel
1155
+ sent it a `python.analysis` section without `autoSearchPaths`, which the
1156
+ server then leaves off and the command line always sets, so a src
1157
+ layout's package was analysed as `src.<pkg>` and consumers outside `src`
1158
+ imported the installed copy, which for an editable install is the user's
1159
+ own tree. A candidate that removed `edit` from click's exports broke six
1160
+ lines of its typing tests and was reported clean, and trio reported 1989
1161
+ errors where its own pyright reports 1870. The server's settings are now
1162
+ stated in full and match the command line's in every configuration
1163
+ tested; on click, trio, jinja2, markupsafe, attrs and structlog the two
1164
+ report identical errors. A consumer that imports its package through an
1165
+ editable install is judged against the candidate wherever the package
1166
+ lives (`python/`, `lib/`, `packages/<name>/src`, or configured
1167
+ `extraPaths`), and pyright's command line is told the project it checks,
1168
+ so its answers no longer depend on where the temporary directory lives.
1169
+ - `s = super; s()` shared by sibling classes was moved into a module
1170
+ function, where it raised `RuntimeError: super(): __class__ cell not
1171
+ found`; `super()` reached through another name now stays where it is.
1172
+ - A frame handle taken earlier in the loop body or branch that holds a
1173
+ duplicated block (`frame = sys._getframe()`, read later as
1174
+ `frame.f_locals`) no longer lets the block move; the check had stopped
1175
+ walking at the block and never saw the handle.
1176
+ - A directory run ends when a proposal renders exactly the bytes its files
1177
+ already hold. The directory driver had counted such a proposal as applied,
1178
+ so the next analysis found it again and, with no iteration bound, the loop
1179
+ never stopped; the single-file driver has always had this guard. The
1180
+ proposal is now declined and remembered until the project changes.
1181
+ - Type probes at adjacent extraction sites retain their lexical scope even when
1182
+ they share a source line. Conflicting mypy specialization notes for one probe
1183
+ are treated as ambiguous evidence instead of silently retaining the last type.
1184
+ - An extraction no longer gives a method a receiver it never needed. A method
1185
+ reached through its class is an ordinary call with nothing bound, so
1186
+ `Formatter.as_dollars(None, 1.5)` runs for as long as the body reads no
1187
+ attribute of `self`, and routing the block it shares through
1188
+ `self._extracted_func_0(...)` made that an `AttributeError` while every
1189
+ genuine instance kept its answer and no checker said a word. Such a helper,
1190
+ and one shared by static methods or by classmethods that never read `cls`,
1191
+ is now a module-level function. An intermediate candidate made it a
1192
+ `staticmethod` reached as `ClassName._extracted_func_0`, and the class's
1193
+ name does not always reach the class: a parameter of that name, `del`,
1194
+ `global` rebinding, a mangled `class __C`, a decorator returning something
1195
+ else, or a call while the class body still runs each broke it. `__class__`
1196
+ would reach it, but mypy does not accept it. Over packaging, click and rich
1197
+ nothing is declined; click goes from 11 helpers to 10, one module function
1198
+ serving a third class.
1199
+ - An import Towel writes names a module the installed project has, because
1200
+ its name is taken from the program's own imports instead of computed from
1201
+ packaging metadata. Checked against built wheels, the old layout readers
1202
+ named 102 files of seven corpus projects wrongly (a `setup.cfg` or
1203
+ `setup.py` src layout, never read, became `src.foo.a`), 937 more when a
1204
+ project directory shares its package's name (`foo.src.foo.a`), and
1205
+ waitress' `src/waitress/task.py` as `src.waitress.task`. Without a project
1206
+ mypy configuration the checker named modules from the same root, so it
1207
+ accepted those imports, and the adopted output failed with
1208
+ `ModuleNotFoundError`. Within a package Towel writes the spelling the
1209
+ importing module already uses for its neighbours, or a relative import.
1210
+ Across top-level packages it writes an import only where the importing
1211
+ package already imports the other one, spelled as it spells it. It enters
1212
+ a directory only where its own side already imports from it, so a library
1213
+ never borrows from a test package its wheel leaves out. A relative import
1214
+ never climbs above the importer's top package. What an import runs, for the
1215
+ cycle guard and the import-time checks, is read the same way; the old
1216
+ graph had matched filenames case-insensitively (`pygments/Lexer.py`) and
1217
+ let eight pygments lexers import others at load time. An import into an
1218
+ excluded directory, such as pip's `_vendor`, is treated as unknown rather
1219
+ than empty. `rename-helpers` names modules the same way, so it works on src
1220
+ layouts. The packaging readers are gone; `--prefer-absolute-imports`,
1221
+ `--pep420` and their engine keywords are accepted as deprecated no-ops, and
1222
+ `ProjectLayout` is removed. The new reject reason `unproven_import`
1223
+ replaces `unknown_layout`.
1224
+ - `towel dry TARGET OUT` refactors TARGET inside a private copy of its whole
1225
+ project and writes only TARGET to OUT, when the run succeeds. It refactored a
1226
+ copy of TARGET alone, so everything read during the run saw a directory with
1227
+ no packaging metadata and no rest-of-project: the layout readers were never
1228
+ reached (every import came out relative, which hid the defects above), and
1229
+ an import cycle or an import-time effect through a module outside TARGET was
1230
+ invisible, leaving the adopted package unimportable where the same run in
1231
+ place was correct. Out-of-place and in-place runs now make the same
1232
+ decisions; staging click, rich and pygments (460 files) takes 0.07 s. A
1233
+ project root holding more than 20,000 Python files is refused with a
1234
+ message. A failed or interrupted run leaves no OUT behind.
1235
+ - The complete mypy check no longer calls a broken consumer clean. The
1236
+ consumer scan cached an answer computed with the baseline's packages left
1237
+ out and reused it for later sparse requests, so after the first check of
1238
+ `towel dry . .` a sibling analysed package went unchecked; it never noticed a
1239
+ file an applied refactoring had made into a consumer; it named a PEP 420
1240
+ module `lib` where its importers say `nsp.lib`; it read `from app import
1241
+ helpers` as an import of `app` alone; and it resolved an `__init__`'s
1242
+ relative imports against the package's parent. It now keeps the whole import
1243
+ graph, re-reads only files whose stamp changed, and applies exclusions per
1244
+ request; at its file limit it fails the check instead of returning a partial
1245
+ list. A mypy run that applied anything ends with one complete check from an
1246
+ empty cache and a fresh scan, as a pyright run already did (0.6 s on click).
1247
+ An error mypy reports without a line is counted, and a crashed worker's
1248
+ standard error is quoted.
1249
+ - A helper is placed only where it stays a plain member. Never in a
1250
+ `Protocol`, where it became a protocol member and turned runtime-checkable
1251
+ `isinstance` checks false; never in a class written on one line
1252
+ (`class E(Exception): pass`), where it was written at column zero; and only
1253
+ in a class, or through a base, whose every decorator is known to keep the
1254
+ namespace (`dataclass`, `total_ordering`, `final`, `enum.unique`), since a
1255
+ decorator that rebuilds or wraps it dropped or wrapped the helper. A module
1256
+ helper is no longer placed after an assignment, decorator or class body that
1257
+ could call it at import.
1258
+ - A borrower is never made to import a host that requires a module the
1259
+ borrower does not: `import tornado` is inert as a statement, but a helper
1260
+ hosted in gunicorn's tornado worker made the sync worker unimportable
1261
+ wherever tornado was absent. The standard library, declared dependencies,
1262
+ and imports inside `try` require nothing. Over rich, click, packaging and
1263
+ pygments the output is byte-identical.
1264
+ - A call site whose generated thunk would read a local that may be unbound is
1265
+ declined: the thunk raised `NameError` where the original raised
1266
+ `UnboundLocalError`, and `except UnboundLocalError` stopped matching.
1267
+ - Generated helper names avoid every name another source under the project
1268
+ root defines as a class member or attribute, so a subclass outside the
1269
+ target can no longer override a new helper.
1270
+ - An escape in a string literal survives extraction into a file whose
1271
+ encoding cannot hold the character it denotes. Rendering spells a constant
1272
+ by value, so `"\u20ac"` in a Latin-1 file came back as `€`, which the file
1273
+ cannot hold, and the run aborted. The escape is now written back, inside
1274
+ the literal only and kept only when the syntax tree is unchanged by it; a
1275
+ character no escape can spell is declined instead. A file nested too deeply
1276
+ to analyze is skipped with a warning instead of ending directory mode with
1277
+ `RecursionError`.
1278
+ - A run whose every candidate the type checker could not judge (timeout or
1279
+ crash) exits non-zero and says so, instead of printing "No refactorings
1280
+ found!"; a run that applied some reports how many went unjudged. The summary
1281
+ shows the run's actual termination reason.
1282
+ - `rename-helpers` refuses a batch that would leave an import of the old name
1283
+ behind, as it did on an out-of-place output whose imports name the package
1284
+ rather than the output directory. Rename after adopting.
1285
+ - A project whose own mypy configuration excludes files (`exclude`, or `files`
1286
+ not naming them) is no longer refused for errors in files its own mypy run
1287
+ never checks; an excluded file that checked code imports is still checked.
1288
+ - A block passes the caller's names that only a definition inside it reads
1289
+ where it stands: defaults and keyword-only defaults, decorators and
1290
+ annotations, class bases, keywords and bodies. The helper raised
1291
+ `NameError` before its first call. A bare `x: int` no longer counts as
1292
+ binding `x`, which raised `UnboundLocalError`.
1293
+ - A `match` pattern's class, dotted value and mapping keys are read from the
1294
+ caller, and nothing in a pattern becomes a parameter except a class
1295
+ pattern's class or the root of a dotted name. `case [1, x]` against
1296
+ `case [2, x]` had become a capture that matched every pair, and
1297
+ `case Color.RED` a class pattern that raised `TypeError`.
1298
+ - A `type` statement's value and a type parameter's bound are closures
1299
+ evaluated when first read, and are declined wherever the caller or the
1300
+ block rebinds what they read, as lambdas are.
1301
+ - A block is declined when a function, lambda, generator or class it creates
1302
+ could be observed other than by calling it. Such an object would carry the
1303
+ helper's `__qualname__`, and a unified lambda the template's parameter
1304
+ names. It may still be called in the block, be the `key=` of `sorted`,
1305
+ `min` or `max`, or be the function of a `map` or `filter` consumed there.
1306
+ Rich makes 27 helpers instead of 28; packaging, click and pygments are
1307
+ unchanged.
1308
+ - Constants that compare equal but differ in type (`0`, `0.0` and `False`;
1309
+ `1` and `True`) are different constants, extracted as arguments where the
1310
+ instantiation check used to decline them. Pygments makes 74 helpers
1311
+ instead of 72, and its lexers and formatters produce identical output over
1312
+ 12,679 observations.
1313
+ - An integer literal too wide for decimal conversion no longer ends the run;
1314
+ a block holding one of more than 640 digits is declined.
1315
+ - A checker the project configures that is not installed refuses the typed
1316
+ run before anything is written, naming the checker and its configuration.
1317
+ It had been replaced by the other checker, or by none after a one-line
1318
+ note, so a pyright-only project was refactored unverified with exit
1319
+ status 0.
1320
+ - mypy checks with the project's configured plugins, loaded as its own mypy
1321
+ loads them; a plugin that cannot load refuses the run, quoting mypy's
1322
+ error. Without them Towel accepted a helper the project's own mypy
1323
+ rejected.
1324
+ - A module that ships its own stub is checked through the stub, as mypy
1325
+ checks it, so an importer of a name the implementation gained and the stub
1326
+ lacks is refused rather than accepted.
1327
+ - An in-place run refactors a private copy of the project and writes the
1328
+ result once, as one journaled change, after its final confirmation
1329
+ succeeds. A refused confirmation or an interruption leaves the project
1330
+ unchanged, and a file edited during the run refuses the write instead of
1331
+ losing the edit. Over click the output is byte-identical and 1.4% slower.
1332
+ - A pyright configuration is read with pyright's own grammar, so a file
1333
+ pyright rejects refuses the run before anything is written, naming the
1334
+ file and position; the language server would otherwise have checked with
1335
+ default settings. pyright's failures quote its standard error, and its
1336
+ command-line probes are written only into Towel's private copy.
1337
+ - A generated annotation that uses syntax newer than the project's oldest
1338
+ Python (`int | None` before 3.10, `list[int]` before 3.9) is written as a
1339
+ string in a module that does not postpone annotations. The oldest Python
1340
+ comes from `requires-python`, else mypy's `python_version` or pyright's
1341
+ `pythonVersion`. A project declaring `>=3.9` got a helper that raised
1342
+ `TypeError` at import under 3.9.
1343
+ - `dry` reports what it declined, counted by reason, instead of "No
1344
+ refactorings found!" alone; a type-check refusal is no longer reported as
1345
+ "could not be rendered"; and the `.towel-helpers.json` sidecar lists only
1346
+ helpers present in the output.
1347
+ - A cross-module helper no longer reads a builtin that one of its modules may
1348
+ hold differently. The helper had read builtins in its host, so `len`
1349
+ shadowed only in the borrower was read as the builtin, and a test patching
1350
+ `open` into the borrower (`mock.patch("pkg.mod.open", ..., create=True)`,
1351
+ the documented idiom) stopped reaching the moved code. The pair is now
1352
+ declined when a participating module binds the name, may bind it through a
1353
+ star import, rebinds `__builtins__` or writes its own namespace at run
1354
+ time, or when the project's code or tests patch the name into one of them
1355
+ (`mock.patch`, `patch.object`, `monkeypatch.setattr`, and targets they
1356
+ compute). No helper takes a builtin as a parameter. A patch applied from
1357
+ outside the project is not seen. A relative import inside an extracted
1358
+ block stays within its own package.
1359
+ - No helper takes a builtin as a parameter within one module either. Where
1360
+ one function binds `len` (`second(rows, name, len=...)`) and its duplicate
1361
+ reads the builtin, the helper had taken `len`, and the first function
1362
+ passed it the builtin; a block reading the builtin had also joined a
1363
+ helper whose other sites passed their own `len`, and `__import__` or a
1364
+ tuple of builtins could be passed as a value. Each is declined
1365
+ (`builtin_argument`); where both functions bind the name, each still
1366
+ passes its own.
1367
+ - One predicate now decides what importing a module runs, for choosing a
1368
+ host and for placing a helper. Decorators, defaults, annotations,
1369
+ metaclasses and `__init_subclass__` count as code; a `TYPE_CHECKING` block
1370
+ and a short list of callables verified at run time do not. A registration
1371
+ decorator in the host had run when the borrower was imported.
1372
+ - A helper is hosted only in a module that ships with the module importing
1373
+ it, never in `tests/` or `examples/` for the package to import. A module
1374
+ with a stub (`.pyi`, `typings/`, `<pkg>-stubs`) never hosts a cross-module
1375
+ helper, and a module that can run as a script (`__main__.py`, a main guard
1376
+ in any form, a `#!` line) stays runnable by its path. Dependencies
1377
+ declared by Poetry or in setup.cfg `install_requires` count as declared.
1378
+ - One existing function is never rewritten to call another. When duplicates
1379
+ are whole function bodies, every site calls one new helper, so patching
1380
+ `mod.f1` in a test no longer changes `f2`. `reuse_existing_functions` no
1381
+ longer has any effect.
1382
+ - A class keeps a method helper only when its receivers are unannotated or
1383
+ annotated as the class, `Self` or a type variable bound to it, and its
1384
+ metaclass and every `__init_subclass__` it runs are known to leave an
1385
+ added function alone. Otherwise the helper is a module-level function
1386
+ taking the receiver.
1387
+ - A helper goes into a class only when every duplicate it replaces is a
1388
+ method of that class; blocks shared by different classes become
1389
+ module-level functions taking the receiver. Towel had hoisted method
1390
+ helpers into ancestors that held none of the code, among them click's
1391
+ `UsageError`, rich's `JupyterMixin`, packaging's `BaseSpecifier` and
1392
+ pygments' `Formatter` and `Lexer`. These are public bases that other code
1393
+ subclasses, where any subclass could take the helper's place
1394
+ (`docs/DECISIONS.md` gives the count measured when the rule was chosen).
1395
+ Whether such a function belongs in a class is left to whoever reviews the
1396
+ output (see `docs/DECISIONS.md`). pygments makes 71 refactorings instead
1397
+ of 77 and rich 30 instead of 33; click and packaging are unchanged, and
1398
+ all four behave identically on smoke programs.
1399
+ - A method helper is class-private (`__extracted_func_N`, stored as
1400
+ `_Cls__extracted_func_N`), so no subclass in or outside the project can
1401
+ override it; a class that answers unknown attribute names through
1402
+ `__getattr__`, as tinydb's `Query` does, keeps answering the helper's old
1403
+ name. A class whose hierarchy defines `__getattribute__` gets a
1404
+ module-level helper instead, since it intercepts every lookup.
1405
+ - `rename-helpers` renames a class-private helper by its class
1406
+ (`path.py:Class.__extracted_func_N`) to another class-private name; a
1407
+ non-private new name, or the stored name spelled elsewhere, refuses the
1408
+ batch. `reuse_existing_functions` is still accepted, as a documented
1409
+ no-op.
1410
+ - A project that configures no mypy is checked as its own `mypy` would check
1411
+ the same files, with mypy's defaults. Towel had forced
1412
+ `check_untyped_defs`, `ignore_missing_imports` and `explicit_package_bases`
1413
+ on it, and each changed the verdict: dacite, clean under `mypy .`, was
1414
+ refused for 53 errors inside unannotated tests, and a root-relative
1415
+ `src.foo.a` import was accepted. Probes that infer a helper's types still
1416
+ check unannotated bodies, in a cache of their own. Such a project is now
1417
+ refused a typed run wherever its own `mypy` fails; configure mypy or pass
1418
+ `--no-types`.
1419
+ - A check resolves a module's imports where the project's own mypy does. The
1420
+ project root had been searched first, so a test's `import helpers` was
1421
+ checked against a root `helpers.py` instead of the one beside it.
1422
+ - A literal that a tool reads without running the program stays where the
1423
+ tool reads it. python-statemachine's `_("There should be exactly one
1424
+ initial state: {!r}")` had become `_(__param_1)`, and pybabel extracted
1425
+ neither message; click had lost four of its 71 the same way. The message
1426
+ and context arguments of Babel's, Django's and Flask-Babel's markers, and
1427
+ of keywords a project configures, are never parameters; nor are the names,
1428
+ fields and types of the functional typing forms, `Literal[...]`, or the
1429
+ type argument of typing's `cast` and `assert_type`, where no annotation
1430
+ makes a parameter acceptable to mypy or pyright. A typing form is
1431
+ recognized by what its callee is bound to, however it is spelled
1432
+ (`from typing import TypeVar as TV`, `typing.cast`, `typing_extensions`,
1433
+ a project module that re-exports it), so a project's own `cast`, such as
1434
+ sqlglot's `exp.cast(column, to)` or SQLAlchemy's, stays an ordinary call.
1435
+ Only click changes over the four reference packages: 10 refactorings
1436
+ instead of 11, with every message still extracted.
1437
+ - A helper that computes nothing is no longer extracted, whatever
1438
+ `skip_trivial_helpers` says: two unrelated `return` statements had become
1439
+ `def _extracted_func_24(__param_0, self): return __param_0`, which rich's
1440
+ `Tag.markup` and `MofNCompleteColumn.render` called across two modules;
1441
+ packaging and pygments had one each, and those are exactly what is gone.
1442
+ - The fixed point ends for a stated reason rather than an incidental one. On
1443
+ sqlglot it once extracted 597 helpers, each forwarding to the previous one
1444
+ with its tuple permuted, until ordinary SQL raised `RecursionError`. A
1445
+ helper that only calls generated helpers and repacks their results is now
1446
+ declined in every configuration, forwarding is recognized whatever order
1447
+ results come back in, and a lambda handed on whole is passed through
1448
+ rather than wrapped again. With the escape guard switched off, sqlglot's
1449
+ DuckDB generator went from no fixed point in 900 s to one in 18 s.
1450
+ - A base-class name is resolved as the binding in effect where the class
1451
+ statement runs, not by finding a class of that qualname anywhere in the
1452
+ file. Python binds globals as a module executes, so `Base = object`
1453
+ written between two subclasses gives them different bases. The checks on
1454
+ a host class's bases (its metaclass, `__init_subclass__` and
1455
+ `__getattribute__`) therefore read the base the class really has. A
1456
+ binding that cannot be established there counts as unknown, and the
1457
+ helper is a module-level function.
1458
+ - A copied annotation is no longer evaluated a second time. An annotation is an
1459
+ expression, and the copy runs at the helper's own `def`:
1460
+ `Annotated[int, mark('a')]` called `mark` again at import, and an annotation
1461
+ the source had quoted was unquoted into one that called it for the first
1462
+ time. An annotation is written bare only when evaluating it runs none of the
1463
+ program's own code; anything holding a call, a lambda, a comprehension, a
1464
+ conditional or an f-string is written as a string, which a checker reads
1465
+ identically and the interpreter never evaluates.
1466
+ - A complete project check covers the modules that import the change. mypy
1467
+ follows imports out of the files it is given and reaches no caller, so a
1468
+ subclass in another package, unchanged and never imported by the package it
1469
+ extends, was broken by a helper whose name it already used while the check
1470
+ reported clean. Those modules are found by one `ast` pass per project. The
1471
+ project root is not walked in its place: repositories hold files no checker
1472
+ can build, and one of them fails the build and refuses the project.
1473
+ - A rejected candidate no longer answers for the project that follows it.
1474
+ Its text was checked, so mypy cached each of its modules against the real
1475
+ file's mtime and size, which mypy trusts without hashing. Those paths were
1476
+ given text again only when the next request named them, and the next request
1477
+ is sparse, so a provider left speculatively returning `str` went on answering
1478
+ `str` while its file returned `int`. Such a path is now given what its file
1479
+ holds, named or not. On Sphinx this costs 3.5% and changes no output.
1480
+ - Two unrelated files that infer one module name are no longer collapsed into
1481
+ one, which dropped the second file's errors and reported the project clean.
1482
+ Only a stub and the implementation beside it collapse; anything else keeps
1483
+ mypy's duplicate-module refusal.
1484
+ - A project whose checker cannot start at all -- a config naming a Python
1485
+ version mypy has dropped -- is told how to proceed, as a project with
1486
+ pre-existing errors already was.
1487
+ - The mypy worker's cost per request no longer grows over a run. Successive
1488
+ `build.build` calls in one process keep every rechecked module's tree alive
1489
+ (mypy 1.19; about 250,000 objects per build of `sphinx.application`), and
1490
+ each build opens with a full collection over all of it, so requests slowed
1491
+ linearly and a run quadratically: 14 s per request and a 14 GB worker after
1492
+ 80 minutes. Each build now runs in a forked child that exits when it has
1493
+ answered. The same 117 recorded requests take 86.5 s instead of 855 s, at a
1494
+ flat 0.75 s and 60 MB, with identical diagnostics.
1495
+ - A complete project check no longer makes mypy recheck every analyzed module.
1496
+ mypy consults its cache only for a module it reads itself, and every module
1497
+ was supplied as text. Text a file already holds is now withheld. A path that
1498
+ has once been supplied with differing text stays supplied for the life of
1499
+ the cache, because mypy records the file's mtime and size beside the text's
1500
+ hash and would otherwise answer for the file with its verdict on the text.
1501
+ - The Pyright language server's silence is taken as a verdict only after it
1502
+ has answered for the change. A server slow to begin is as silent as one that
1503
+ has finished, and a candidate that broke three consumers read as clean when
1504
+ the server was delayed past the 0.35 s quiet period. Each check now carries a
1505
+ marker the server must publish first.
1506
+ - A candidate is checked against the project as it now stands, which is
1507
+ decided by the content of each checker input rather than by its size and
1508
+ timestamp, so an edit by something other than Towel cannot leave a verdict
1509
+ standing against a project the copy no longer matches. The language
1510
+ server's private copy restored every file a candidate did not supply to the
1511
+ bytes it first saw, so in-place, single-file and library runs lost every
1512
+ refactoring already applied: a valid follow-up was rejected and a breaking
1513
+ candidate accepted. The copy now follows the project and tells the server
1514
+ exactly which files were created, changed or deleted.
1515
+ - A supplied-text record cut short by an interrupted append is repaired instead
1516
+ of failing every later request, and stopping the mypy worker stops the build
1517
+ it was waiting for.
1518
+
1519
+ - An extraction never separates a narrowing test from code that depends on it.
1520
+ A checker narrows a variable along a control-flow region, so moving the test
1521
+ into a helper while an expression that needs it stays at the call site left
1522
+ each half well typed and the pair not. Declined where the proposal is built,
1523
+ before any checker is asked, so the same extractions happen whether or not
1524
+ type checking is on.
1525
+ - A method's receiver is no longer annotated from its call sites. It was the
1526
+ union of the classes that happened to call it, which a checker rejects,
1527
+ since an explicit receiver must be a supertype of its own class, and which
1528
+ understated the method's domain in any case: a helper on a base class is
1529
+ inherited by every subclass. One such annotation was enough to send a whole
1530
+ helper down to the all-`Any` rung, so signatures that had lost every type
1531
+ recover them.
1532
+ - A class passed to a helper is typed `type[C]`. A checker shows a reference
1533
+ to a class as its constructor's signature, which reads as something merely
1534
+ callable and is rejected where a type is wanted, by `isinstance` among
1535
+ others.
1536
+ - An inferred annotation that names a class the module cannot reach imports it
1537
+ under `TYPE_CHECKING`. An ordinary import would often close a cycle, the
1538
+ extraction having just made the other module import this one, and a name
1539
+ wanted only by an annotation need not exist at run time.
1540
+ - An imported helper is named after the project it belongs to, not after the
1541
+ directory a run is staging its output in. A module named after a scratch
1542
+ path cannot be resolved by the checker and breaks as soon as the reviewed
1543
+ output is adopted into the place it was written for.
1544
+
1545
+ ### Changed
1546
+ - The default suite now runs the round-3 semantic auditor's generator of
1547
+ near-duplicate code, seeded: 406 cases in about 45 s. The hostile
1548
+ batteries hold every case that audit reported as a P1, each pinned in the
1549
+ state its fix leaves it, and a sample of the cases it found sound.
1550
+ `just fuzz` runs the generator over thousands of fresh seeds as a
1551
+ release-candidate step, and writes each failure as a hostile fixture
1552
+ ready to commit.
1553
+ - A coverage configuration that coverage.py could not read is reported once
1554
+ per project root, and coverage.py's defaults are used in its place.
1555
+ - A pair whose tool directives cannot move soundly is declined:
1556
+ - directives that differ between its sites (`directives_differ`): the
1557
+ helper has one line where the sites had several, so an ignore only one
1558
+ site needed would either silence the other or be lost;
1559
+ - any tool directive that reaches code, other than a name or a literal,
1560
+ which would become a call argument (`directive_on_argument`). Checker,
1561
+ linter, coverage, bandit and formatter directives all count. The
1562
+ argument would sit outside the directive's reach. jinja2's `as_const`
1563
+ extraction had put two `attr-defined` errors at its call sites this way.
1564
+ No directive is copied onto a call;
1565
+ - a region or file directive that would reach past the moved code
1566
+ (`directive_outlives_block`);
1567
+ - a coverage pragma or pylint `disable` around every site's block that
1568
+ would not reach the helper (`directive_around_block`). A module helper
1569
+ for pygments' `__main__`-only functions took `_lua_builtins.py` from
1570
+ 100% to 40% line coverage;
1571
+ - a block whose first statement coverage excludes, since the call that
1572
+ replaces it would be measured (`excluded_block_start`).
1573
+
1574
+ Explanatory comments from every site are kept, the first site's first.
1575
+ - Helpers are shared across modules only with `--cross-module`
1576
+ (`cross_module_helpers=True` for library use), because a user
1577
+ deduplicating a package may not expect Towel to add imports between its
1578
+ modules. By default duplicates pair only within a module, the pair budget
1579
+ is spent only on pairs a run can form, and Towel writes no import between
1580
+ the project's modules that runs; an annotation that needs another module's
1581
+ type still gets a type-only import under `if TYPE_CHECKING:`. With
1582
+ `--cross-module`, `dry` and `preview` name the import problems they meet,
1583
+ with the `--exclude` remedy, and refuse a run when one concerns the package
1584
+ being refactored, such as a stale `build/lib` copy of it; `preview` accepts
1585
+ `--exclude`. Over click, rich, packaging and pygments, the default drops
1586
+ exactly the cross-module helpers (0, 3, 5 and 13 of them).
1587
+ - Code that calls zero-argument `super()` is extracted into a method helper
1588
+ of the class that holds both duplicates, where it resolves as it did,
1589
+ diamonds and subclass overrides included: the helper has the class's own
1590
+ `__class__` cell and the method's receiver. Where no such helper can be
1591
+ written the pair is declined, never given a module function
1592
+ (`needs_class_body`, `super_in_call`). Output over click, rich, packaging
1593
+ and pygments is unchanged.
1594
+ - A long run says what it is doing. Verifying a proposal the project rejects
1595
+ advances no counter, so the progress bar could stand still for minutes,
1596
+ which is indistinguishable from a hung run; the display is now redrawn while
1597
+ a proposal is being weighed and names the proposal it is weighing.
1598
+ - `towel dry` reports what a typed run involves before asking to proceed: how
1599
+ many files a candidate is verified against, how many third-party packages
1600
+ their import graph pulls in, and that the number of checks depends on how
1601
+ many proposals the project rejects. It states no duration, that being
1602
+ governed by the rejections and so unknown in advance.
1603
+ - Pyright is consulted through one long-lived language server per project and
1604
+ a persistent private copy, instead of a fresh `pyright --outputjson` and a
1605
+ fresh copy per check. The command line remains the fallback and reaches the
1606
+ same verdicts.
1607
+ - Every configured checker must accept a candidate, so the first rejection is
1608
+ the verdict and the remaining checkers are not asked. Verdicts are remembered
1609
+ per candidate and project state.
1610
+ - An unannotated helper is checked only when every error of the all-`Any`
1611
+ rejection lies inside the helper's own definition. To a caller the two are
1612
+ the same function, so an error anywhere else survives the change.
1613
+ - A proposal the project declines is remembered for the whole run instead of
1614
+ until the next analysis. When nothing more applies and something was
1615
+ declined that the project has changed under since, the run holds a
1616
+ rehearing: the memory is cleared and the whole project analysed once more,
1617
+ so every declined proposal is heard against the project as it now stands.
1618
+ Only a rehearing that applies nothing ends the run, which is a stronger
1619
+ guarantee than before, when the terminating analysis was restricted to the
1620
+ files that had changed. Of the 382 extractions an uncapped Sphinx run
1621
+ considers, 24 had every annotation variant refused and not one of those was
1622
+ ever accepted at a later analysis.
1623
+ - A typed run that was checked through a language server is confirmed once
1624
+ more at the end by a pyright started from nothing, sharing none of the
1625
+ session's state. A session that fails part way through a run still earns
1626
+ that confirmation, being exactly when the verdicts already given are worth a
1627
+ second opinion, and a confirmation that cannot run refuses the run rather
1628
+ than reporting success. A language server answers when it has gone quiet, and
1629
+ while a marker it must publish first keeps silence from being read as a
1630
+ verdict before it has begun, one cold check over the finished project turns
1631
+ any residue of that kind from a silent wrong answer into a loud one. About
1632
+ ten seconds on Sphinx, and no flag: a guarantee that holds only when asked
1633
+ for is not one.
1634
+
1635
+ ### Preserving type relationships
1636
+
1637
+ An extracted helper used to lose the relationships among its types. Where two
1638
+ call sites passed `int` and `str`, the shared parameter became `int | str` and
1639
+ so did the return, which says nothing about the two travelling together: the
1640
+ helper could be read as taking an `int` and returning a `str`. Towel now
1641
+ anti-unifies the types alongside the code, so the helper's signature carries
1642
+ the correlation the call sites had.
1643
+
1644
+ ### Added
1645
+ - A library API for errors and reports:
1646
+ - exceptions in `towel.unification.exceptions`, based on `TowelError`:
1647
+ `CheckerUnavailableError`, `UntypeableExtraction` (with `.reason`, an
1648
+ `Untypeable`, and `.detail`), `UnverifiableChangeError` and
1649
+ `UncheckedCodeError`, `AmbiguousImportsError` and
1650
+ `ProjectScanLimitError`; `UnsupportedLayoutError` is kept, though no
1651
+ longer raised;
1652
+ - `engine.run_report`, a frozen `RunReport` whose `declined_pairs` and
1653
+ `declined_proposals` count declines by reason; `engine.declined_pairs`
1654
+ for the latest analysis; and `engine.checker_failures`, how many
1655
+ proposals the last run dropped because the checker could not run.
1656
+ - `--parameterize-builtins` (`parameterize_builtins=True`), off by default:
1657
+ where a builtin that duplicated code reads may differ between its sites (a
1658
+ function's own `len` against the builtin, or with `--cross-module` a module
1659
+ that may hold the name), each site passes its own binding to the helper as
1660
+ a parameter instead of the pair being declined. A builtin every site reads
1661
+ alike is still read directly. In typed code the parameter keeps the
1662
+ checker's signature where it can be written, else `type[C]` for a class
1663
+ (`type[str]`) or `Callable[..., R]` for a callable (`Callable[..., int]`
1664
+ for `len`).
1665
+ - Extracted module-level helpers can preserve relationships among argument and
1666
+ return types through type anti-unification. Nested containers, multiple type
1667
+ parameters, and supported existing generic binders receive fresh helper type
1668
+ parameters. Concrete disagreements can use constrained `TypeVar` declarations
1669
+ when an unrestricted generic body does not type-check.
1670
+ - Generic signatures, their imports, and their declarations are checked with
1671
+ the complete prospective project and committed as one transaction. Failed
1672
+ attempts leave no declarations behind. Generated syntax remains compatible
1673
+ with Python 3.11; existing PEP 695 input requires Python 3.12 or newer.
1674
+ - Generic instance and class helper methods preserve argument/result
1675
+ relationships and retain the host's type parameters. A module-level helper
1676
+ shared by methods that never read their receiver infers fresh parameters
1677
+ from its explicit arguments. Fresh declarations precede the host class at
1678
+ module scope, preserving descriptor behavior and declaration rollback.
1679
+
1680
+ ### Fixed (release harness)
1681
+ - The corpus runs Towel the way a user runs it: as `towel` inside each
1682
+ project's own environment. That environment holds the project installed
1683
+ editable from the tree under test, Towel's `format` and `types` extras,
1684
+ and one candidate wheel, checked against `--towel-src` in every
1685
+ environment. mypy, pyright, Black, ruff and isort are taken at the
1686
+ versions the project pins: its lock file first, then the `rev` of the
1687
+ tool's `.pre-commit-config.yaml` hook, then an exact pin in a requirements
1688
+ file (httpx's `requirements.txt` has `mypy==1.17.1`). The environment also holds whatever the project declares its
1689
+ own type check needs: typing-named dependency groups and extras, the
1690
+ dependencies of tox environments and nox sessions that run a checker, its
1691
+ pre-commit mypy and pyright hooks' `additional_dependencies`, and
1692
+ requirements files named for typing. That install only adds; nothing
1693
+ already there may change. Towel had run in the harness's own interpreter,
1694
+ which held Towel's tools and none of the project's dependencies. mypy
1695
+ therefore reported a project's third-party imports as errors: packaging's
1696
+ 1158 errors are 14 in its own environment and none once its typing
1697
+ dependencies are installed, and its typed run now completes. The import
1698
+ model found the tools' own copies of click and packaging, and called those
1699
+ projects' names ambiguous. Each result records the interpreter, the
1700
+ candidate, every tool's version and what chose it, and what was installed
1701
+ for typing.
1702
+ - The project's editable install follows the tree each test run exercises:
1703
+ the clone for the baseline, the refactored copy for Towel and the run
1704
+ after it, and the original package for a retest of the original. A test
1705
+ that imports the installed copy therefore tests the same code as the rest
1706
+ of its run. The run after refactoring had reached the unrefactored clone
1707
+ that way, so a regression there could pass as flaky.
1708
+ - Every corpus refactor passes `--cross-module`. A manifest entry turns it
1709
+ off only with a `cross_module_reason`, and the summary names each such
1710
+ project.
1711
+ - The sdist no longer ships a built wheel: `recursive-include scripts *`
1712
+ picked up the corpus image's copy whenever one had been built there.
1713
+ - Two runs that failed *different* tests can no longer both count as a PASS. A
1714
+ failure line is `FAILED <node id> - <message>`, and the id was taken by
1715
+ splitting at the first `" - "` -- which a parametrized id may contain, so
1716
+ `test_case[same - before]` and `test_case[same - after]` both truncated to
1717
+ `test_case[same`. The harness compares those sets to award PASS, so a failure
1718
+ Towel introduced could hide behind a pre-existing failure in the same
1719
+ parametrized test. Only a separator outside brackets ends the id now.
1720
+ - A phase that times out takes its descendants with it. Killing the immediate
1721
+ process left a suite's own workers, a server it started or a build it spawned
1722
+ running, writing into the scratch tree that the project's later phases read.
1723
+ Each phase leads a process group ended with it, and the worker watchdog ends
1724
+ those groups too.
1725
+ - The corpus runs the default type policy and reruns without types only the
1726
+ projects Towel declines to verify, naming them and their reason in the
1727
+ report; their verdicts are evidence about the untyped path alone. The refusal
1728
+ is first held to its wording -- the count, a diagnostic naming its file, and
1729
+ the way forward -- and one that fails that is a verdict of its own rather
1730
+ than a project quietly skipped.
1731
+ - The ecosystem check gives each corpus project its own output directory.
1732
+ Towel writes its recovery journal to the common parent of the files a
1733
+ transaction changes and refuses to start beneath a pending journal that may
1734
+ cover its targets. A one-module project's single output file put that journal
1735
+ directly in the shared work directory, an ancestor of every other project, so
1736
+ concurrent projects refused each other at `--workers 4`. The runtime is
1737
+ unchanged; its refusal was correct.
1738
+
1739
+ ### Notes
1740
+ - Towel keeps a precise ordinary signature when one verifies against the whole
1741
+ project, and reaches for a generic signature only when that ordinary
1742
+ signature does not. A generic candidate is therefore an alternative to losing
1743
+ the annotation, not a replacement for an exact one.
1744
+ - Declined by design, with no weakening of the annotations that do ship: a
1745
+ helper hosted inside a function, variadic type parameters, a source method
1746
+ whose `self` or `cls` carries an explicit annotation, and evidence that
1747
+ resolves to `Any` or an unknown name.
1748
+ - A fresh parameter whose bound mentions another helper parameter (`U` bounded
1749
+ by `list[T]`) is declined; an ordinary module `TypeVar` bound cannot depend on
1750
+ another function's binder. Where a constrained generic function makes mypy
1751
+ report several specializations for one probe, the evidence is treated as
1752
+ ambiguous rather than resolved arbitrarily. Both are recorded in
1753
+ [the type-parameter design](docs/proposals/type-parameters.md).
1754
+
1755
+ ## [1.732.post1] - 2026-09-19
1756
+
1757
+ ### Fixed
1758
+ - README documentation links use absolute URLs pinned to the release tag, so
1759
+ they resolve from PyPI as well as GitHub. The Python implementation is
1760
+ unchanged from 1.732.
1761
+ - Regression checks reject repository-relative README links and stale release
1762
+ tags in documentation URLs. The release procedure verifies GitHub source,
1763
+ documentation, and CI before uploading packages to PyPI.
1764
+
1765
+ ## [1.732] - 2026-09-19
1766
+
1767
+ Changes since 1.618.
1768
+
1769
+ ### Added
1770
+ - A duplicate that is the whole body of a plain module-level function now
1771
+ calls that function instead of extracting a helper. Two identical functions
1772
+ no longer become a helper plus two forwarders: the first-defined one is kept
1773
+ and the other calls it, and a matching block inside a larger function calls
1774
+ the existing function directly. Arguments follow the function's parameter
1775
+ order; names the body reads from its own module (functions, classes,
1776
+ absolute imports) are not passed. Across files the call is imported like a
1777
+ helper and refused when it would close an import cycle; a decorated, async,
1778
+ variadic, shadowed, or rebound function falls back to ordinary extraction.
1779
+ A function whose body is the block followed by a plain `return` of the
1780
+ block's live variables is reused too; the other sites unpack its result in
1781
+ its order. Construct the engine with `reuse_existing_functions=False` to
1782
+ restore the old behavior.
1783
+ - A helper that returns live variables now admits every further same-file
1784
+ occurrence whose call assigns them, so twelve identical functions become
1785
+ one helper with twelve calls on the first pass rather than a pair per
1786
+ pass. Repeated passes used to stack such helpers into a chain of
1787
+ forwarders, each returning the next one's result; a proposal that would
1788
+ reduce a helper an earlier pass inserted to a one-line forwarder is now
1789
+ declined instead (part of `skip_trivial_helpers`).
1790
+ - `towel dry` formats the code it inserts with the formatter the project
1791
+ configures (`pip install "code-towel[format]"`): `ruff format` when
1792
+ `[tool.ruff]`, `ruff.toml` or `.ruff.toml` is present and ruff is
1793
+ installed, otherwise Black with the project's own line length and string
1794
+ quoting. Only the
1795
+ generated helper and the rewritten call statements are formatted, never
1796
+ the surrounding file, and each snippet is checked to have the same syntax
1797
+ tree before and after. Inserted imports are sorted the way the project
1798
+ sorts them, with ruff's `I` rules when selected or isort when configured;
1799
+ a sorter may only reorder or merge the import statements, which is
1800
+ verified. Pass `--no-format` to insert the unformatted rendering; without
1801
+ a formatter a note says so. Library callers pass any `snippet_formatter`
1802
+ and `file_finisher` callables to the engine.
1803
+ - Black's line length for generated code is the limit the project declares
1804
+ anywhere: `[tool.black]`, `[tool.ruff]`, `[tool.pycodestyle]`, or a
1805
+ `[flake8]`/`[pycodestyle]` section in `setup.cfg`, `tox.ini` or `.flake8`
1806
+ (pycodestyle's own dog-food test failed on an 86-character generated call
1807
+ under Black's default of 88 against its declared 79).
1808
+ - Extracted helpers carry the type annotations their call sites declare. A
1809
+ parameter is annotated when every site passes an annotated, never-rebound
1810
+ parameter of its enclosing function, or a literal of one builtin type, and
1811
+ the sites agree; the return is annotated from the sites' declared return
1812
+ type, from annotated locals the helper returns, or as `None` for a helper
1813
+ that returns nothing. Nothing is inferred. Annotations are copied unquoted
1814
+ only where they cannot fail to resolve (builtins, deferred annotations, or
1815
+ names bound by a module-level import) and as strings otherwise; across
1816
+ modules only builtin names are used. Code without annotations stays that
1817
+ way. Construct the engine with `annotate_helpers=False` to disable it.
1818
+ - When a type checker is installed (`pip install "code-towel[types]"`), the
1819
+ argument expressions and return values those copied annotations could not
1820
+ name are typed by it. The checker is the one the project configures: mypy
1821
+ for a project with `[tool.mypy]`, `mypy.ini`, `.mypy.ini` or a `[mypy]`
1822
+ section in `setup.cfg`, pyright for one with `[tool.pyright]` or
1823
+ `pyrightconfig.json`; for a project configuring both,
1824
+ mypy infers while both verify the prospective project for new errors.
1825
+ For inference, Pyright probes a temporary sibling copy of the module;
1826
+ mypy reveals expressions in an in-memory copy of the site's module, at
1827
+ the point where the call will stand, using an owned worker with incremental
1828
+ caches. Verification checks the modified files together with unchanged
1829
+ consumers under the project's configured scope. A revealed type is written only
1830
+ when it is not bare `Any` and every name in it resolves where the helper
1831
+ is defined. `--no-types` leaves helpers unannotated; library callers pass
1832
+ a `type_oracle` to the engine.
1833
+ - Sites that disagree on a parameter's type, or on a revealed return type,
1834
+ join into a union (`int | None`, `int | str`); sites that declare
1835
+ different return types take the meet of the declarations, found through
1836
+ the checker's subtype relation. Once a helper carries any annotation,
1837
+ whatever is still bare becomes `Any`, so the signature is complete (a
1838
+ partial one is an error under mypy's `disallow-incomplete-defs`), and
1839
+ `from typing import Any` is added to the host when it lacks it. Code with
1840
+ no annotations stays bare.
1841
+ - With mypy installed the subtype relation is mypy's own, asked through
1842
+ probe functions appended to an in-memory copy of the host module: unions
1843
+ are normalized by it (`int | bool` is `int`, `float | int` is `float`, a
1844
+ subclass under its base disappears), the declared return types' meet is
1845
+ found through it, and the helper's revealed return type is written only
1846
+ when mypy confirms it is a subtype of every site's declared return type,
1847
+ which is what keeps the sites type-checking. Without mypy Towel copies
1848
+ and does not reason: unions are written unreduced and the meet needs
1849
+ identical declarations, since there is no second implementation of the
1850
+ subtype relation.
1851
+ - Thunk and callee arguments get `Callable` annotations from mypy's callable
1852
+ spelling (`Callable[[], int]`, `Callable[[int, str], bool]`,
1853
+ `Callable[..., T]`), with `from typing import Callable` added as needed.
1854
+ - A module-level helper whose annotations name classes or functions defined
1855
+ in the module is placed after the last such definition, so those names are
1856
+ written bare instead of as quoted forward references; it stays at the top,
1857
+ with quotes, when any statement before that point could run code at
1858
+ import time.
1859
+ - A subscripted annotation is written bare only when it evaluates at
1860
+ definition time: a PEP 585 builtin generic, a name from `typing` or
1861
+ `collections.abc`, or a module that defers annotations. Anything else is a
1862
+ string annotation: `memoryview[int]`, copied from tornado's own signatures,
1863
+ raised `TypeError` at import on an interpreter where `memoryview` is not
1864
+ generic.
1865
+ - With a clean original type-checking baseline, helper extractions and existing
1866
+ function reuse check all modified files together in the prospective project,
1867
+ including unchanged consumers. New errors make generated helper annotations
1868
+ fall back to `Any`, then to none; every variant must pass. Reused functions
1869
+ keep their existing signatures, and incompatible calls decline the reuse.
1870
+ Checker failure or remaining new errors decline the proposal. Cross-file
1871
+ helper imports no longer lose valid annotations because their host was stale.
1872
+ - Before oracle inference or verification, the original complete project is
1873
+ checked. If it already has type errors, Towel aborts and asks the user to
1874
+ fix them or explicitly rerun with `--no-types`. That option preserves
1875
+ existing source annotations and generates unannotated helpers. Checker
1876
+ crashes and timeouts remain distinct failures; checking is never silently disabled.
1877
+ A clean baseline keeps verification enabled for subsequent proposals.
1878
+ - A [proposal for type-parameter inference](docs/proposals/type-parameters.md)
1879
+ records how generic helpers could preserve relationships among arguments
1880
+ and return values. This work is deferred beyond 1.732.
1881
+ - Property-based tests (hypothesis, in the `dev` extra) check that alpha-variant
1882
+ blocks unify with a renaming-only substitution, that definite assignment
1883
+ agrees with a path-enumerating reference, and that every generated helper
1884
+ passes the instantiation round trip; `visitors.py` has direct tests; the
1885
+ cross-file hostile battery pins which packages must transform; ten
1886
+ cross-file integration tests fail instead of skipping when a fixture is
1887
+ missing; six assertion-free tests assert what their names claim.
1888
+ - The suite now drives the forked pair-evaluation pool on a small project and
1889
+ checks it against the serial path, including the fallback when a worker
1890
+ raises or dies; corrupts the recovery journal one guard at a time and
1891
+ round-trips interrupted transactions under Hypothesis; drops a proposal
1892
+ that goes stale mid-run and covers the three progress displays; reaches
1893
+ the return-coverage and free-variable-lifetime rejections by name (and
1894
+ pins that the first block's coverage guard is shadowed by block
1895
+ enumeration); and adds idempotence, byte-convention and observational
1896
+ equivalence properties, with `with` in the flow grammar. The cross-file
1897
+ timing test no longer measures the machine, the watchdog test finishes
1898
+ in a fraction of a second, and both hostile batteries execute fixtures
1899
+ the same isolated way. Three hostile fixtures pin the closure, `dir()`
1900
+ and unbound-global cases below, and a forwarder-chain suite pins that
1901
+ twelve identical functions yield one helper.
1902
+ - CI runs `pip-audit --strict` against the locked dependency set, and
1903
+ Dependabot proposes weekly, grouped minor/patch updates for the workflow
1904
+ actions and the `uv`-managed Python dependencies.
1905
+ - The candidate pairs an analysis evaluates are bounded by a configurable
1906
+ candidate-pair budget (`--max-pairs`, default 20,000,000; past it the
1907
+ largest groups of similar blocks are left out with a warning), and the
1908
+ minimum block length (`--min-lines`) and helper parameter limit
1909
+ (`--max-parameters`) are exposed on the command line.
1910
+
1911
+ ### Changed
1912
+ - Boolean options come in `--x/--no-x` pairs with the default on:
1913
+ `--types/--no-types`, `--format/--no-format`, `--interactive/--no-interactive`,
1914
+ and the tri-state `--prefer-absolute-imports/--no-prefer-absolute-imports`
1915
+ and `--pep420/--no-pep420` (unset lets the project decide). `--max-refactorings N`
1916
+ names what `--max-iterations` always did, and `rename-helpers --preview`
1917
+ replaces `--dry-run`, since "dry" already means DRY here.
1918
+ - A helper whose body only binds parameters and literals to names and returns
1919
+ them is not proposed: the call that unpacks the tuple is longer than the
1920
+ assignments it replaces and shares no logic. The trivial-forwarding filter
1921
+ also recognizes `name = call(...)` followed by `return name`, and the tuple
1922
+ form `a, b = call(...)` then `return (a, b)`; without it, once Black
1923
+ wrapped such a body over the three-line minimum, two generated helpers of
1924
+ that shape paired with each other and extracted a third, without end (h2).
1925
+ - In directory mode, a global re-pass after the first re-pairs functions in
1926
+ rewritten files and files with deferred verification refusals. Deferred
1927
+ proposals are retried only after the project changes, since verification can
1928
+ depend on unchanged consumers elsewhere in the project. Other unchanged
1929
+ pairs retain their verdict under the conditions explained in
1930
+ `docs/ARCHITECTURE.md`; `incremental_global_passes=False` restores full
1931
+ re-pairing.
1932
+ - Analysis facts are computed once per function instead of once per candidate
1933
+ block (definite assignment, locally bound names, nested scopes), and the
1934
+ same-file clustering pass applies its constant-time filters before the
1935
+ semantic guards. Together these remove about half of the AST traversal on
1936
+ a 16k-line project with an identical proposal list.
1937
+ - Candidate blocks are bucketed on their whole statement-type sequence,
1938
+ which the unifier requires equal, so far fewer pairs reach the filter; the
1939
+ unifier's bound-variable search caches each node's source text instead of
1940
+ re-rendering it per query; the value-producing check is memoized per
1941
+ block; and five visitor classes that were rebuilt on every call are
1942
+ module-level. On Towel's own source these remove a further 28% of all
1943
+ function calls (about half in total since 1.618) with an identical
1944
+ proposal list.
1945
+ - The engine is assembled from mixins, one module per responsibility
1946
+ (`pair_evaluation`, `placement`, `reuse`, `insertion`,
1947
+ `annotation_wiring`, `materialize`, `clustering`, `parallel`,
1948
+ `fixed_point`), over an `EngineState` that declares the state and
1949
+ operations each may rely on; `refactor_engine.py` went from 5,600 lines
1950
+ to 1,400 and the 871-line pair decision is eleven typed stages. The
1951
+ outputs are byte-identical on the exactness baselines.
1952
+ - A second pass over the same seams: the per-block analyses are a
1953
+ `BlockAnalysis` mixin of their own and the engine core is about 800 lines;
1954
+ the unifier is split the same way (`UnifierState` under constant consistency,
1955
+ parameterization and literal promotion, with `Substitution` and the
1956
+ binding-context finder in leaf modules); every state stub names the class
1957
+ that implements it. The functions of an analysis are indexed once
1958
+ (`FunctionIndex`: by file, by name, by enclosing range) instead of scanned
1959
+ per pair, and the engine's per-function maps are weak. Materialization,
1960
+ the directory driver's progress reporting and the rename planner are
1961
+ each a set of named steps rather than one long function. Blocks are
1962
+ narrowed by checks rather than casts, and the `dry` change sidecar is
1963
+ validated on read.
1964
+ - A third structural pass: the block signatures, clustering guards, cache
1965
+ keys, pair context and stage records are typed; the remaining long
1966
+ functions (materialization, the drivers, layout discovery, the pairing
1967
+ loop, the call generator, the clustering pass, the rename planner, the
1968
+ compound-node unifier, the thunk walker) are named steps or dispatch
1969
+ tables; every function and closure with no caller is removed; mypy runs
1970
+ with `warn_unreachable`, and flake8 checks `tests/` for pyflakes errors.
1971
+ One `BoundedCache` replaces three LRU implementations and the parse cache
1972
+ is the engine's own; `FunctionNode` is the one name for a function
1973
+ definition node; the defaults live in `towel.unification.defaults`;
1974
+ `towel.source_text` decodes and re-encodes sources.
1975
+ - The engine computes what it can once per statement instead of once per
1976
+ block: block signatures, return checks, the frame-sensitivity and
1977
+ name-binding guards, structural digests, the unifier's per-statement
1978
+ facts and the substitution's keys are memoized per AST node and folded
1979
+ over each block, the bound-variable query is memoized per block and
1980
+ target text, a pair's structural ids are resolved once and passed to its
1981
+ guards, and each class's file path is resolved once per run. On the
1982
+ Towel source of that day (`towel dry src/towel`, one worker, 45 applied)
1983
+ a run took 6.4 s instead of 10.9 s with `--no-types --no-format` and
1984
+ 10.4 s instead of 15.0 s with the defaults; the profiled run went from
1985
+ 32.7 s and 293 million calls to 20.3 s and 154 million. The current
1986
+ figures, on a smaller source, are in `docs/KNOWN_LIMITATIONS.md`. Every
1987
+ proposal and rendering is byte-identical on the exactness baselines. The
1988
+ structural-id and source-digest caches, and the definite-assignment
1989
+ facts, no longer keep a re-parsed file's old tree alive; peak memory fell
1990
+ from 186 MB to 179 MB (1.11 GB to 1.06 GB with type checking).
1991
+ - A fourth pass, after an audit that found the same concepts written
1992
+ several ways: the local name an import alias binds, the names a
1993
+ statement binds (`bindings_of`, replacing five collectors that
1994
+ disagreed), the names an expression reads, span containment, the
1995
+ method-kind literal, the helper-home and cluster-context records and
1996
+ package-chain ascent each have one implementation; the unifier's
1997
+ dispatch table holds methods rather than their names; blocks are
1998
+ sequences of statements throughout, so the casts that the wider
1999
+ annotation forced are gone; two typing helpers (`all_instances`,
2000
+ `visit_as`) replace most of the rest; each command reads its arguments
2001
+ once into a typed record; the rename command decodes sources the way
2002
+ the refactoring commands do; and comments that restated the next line
2003
+ are removed. The engine's mixins now inherit the mixins they call, so
2004
+ the forty-nine one-caller stubs on `EngineState` are gone and it declares
2005
+ only the shared attributes and the eleven operations the core provides.
2006
+ The import-graph resolution is its own module (`import_graph.py`);
2007
+ parsing yields a `RawModule` and scope analysis a `ParsedModule` whose
2008
+ analyzer and root scope are required rather than Optional; the
2009
+ `verbose` flag threaded through eleven signatures and read once is gone
2010
+ (the logger's level decides); and the `get_` prefix on a handful of
2011
+ functions is dropped (`free_variables`, `used_names`,
2012
+ `enclosing_names`, `affected_lines`, `bound_variables_in_context`).
2013
+ - The test suite is type-checked with the same strict flags as the source
2014
+ (fifteen `type: ignore` comments ignored nothing; the AST accesses behind
2015
+ the rest are `isinstance` assertions now), coverage traces the forked
2016
+ pair workers (`parallel.py` 85% to 95%), the helpers copied across test
2017
+ modules live in `tests/test_helpers.py`, thirty-odd non-emptiness assertions state
2018
+ the value they are about, the goldens expected to equal their inputs are
2019
+ named and checked exactly, the example3 tests run the cross-file path
2020
+ they describe, a symlinked input directory is pinned, and the engine and
2021
+ command-line branches the suite left untested have tests.
2022
+ - The clustering pass scans a file for the sites that can share a helper
2023
+ once per distinct helper template instead of once per pair, and the
2024
+ reuse redirect finds a function whose body starts at a site through an
2025
+ index instead of scanning the file per replacement: 50 identical
2026
+ functions took 17 s and 100 took 134 s at 1.618, and 6.8 s and 36 s at
2027
+ commit a0596f0 (September 18, 2026, one core of a machine shared with
2028
+ other work); measured with `scripts/bench_similar_blocks.py` at commit
2029
+ 5ff2458 (September 19, 2026, one core), 50 take 4.0 s and 100 take
2030
+ 15.9 s, with identical output. Orphan detection, the instantiation
2031
+ check's normalized block and the class-private-name scan are memoized
2032
+ on structure, so the re-parse after each applied proposal hits too. The
2033
+ analysis session grows to the number of files and the source bytes an
2034
+ analysis covers, so a project above 128 files or 8 MiB of source no
2035
+ longer re-parses everything on every pass (trio's second pass: 144
2036
+ parses and 7.2 s, now none and 5.0 s). Both insertion-position parses
2037
+ go through the engine's parse memo.
2038
+ - The AST visitors are built on three Template Method bases in
2039
+ `visitors.py`: `OwnScopeVisitor` for collectors that read one scope's own
2040
+ code, `DefinitionDepthVisitor` for those that track how deeply a
2041
+ definition sits, and `ScopeVisitor` for the analyses that follow lexical
2042
+ scopes, which now share one visiting order for definitions and
2043
+ comprehensions and override hooks where they deviate on purpose.
2044
+ - `refactor_directory_to_fixed_point` returns a `TerminationReason` literal;
2045
+ `CodeBlockPair` carries every field pairing always gives it (only the
2046
+ class and enclosing-function names are Optional) and answers
2047
+ `is_cross_file`; `RefactoringProposal.replacements` holds `Replacement`
2048
+ values only, the tuple coercion is gone; the unused exception classes are
2049
+ gone and `UnsupportedLayoutError` joins `RefactoringError` under
2050
+ `TowelError` (and is still a `ValueError`); `towel.project_layout` is a
2051
+ top-level module (the old path
2052
+ re-exports it); `is_package_dir` takes only the path, since whether a
2053
+ bare directory is a namespace package is the layout's decision.
2054
+ - Progress modes are a `ProgressMode` literal (`normalize_progress`,
2055
+ `wants_bar`, `DEFAULT_PROGRESS`); `orphaned_variables` returns the set of
2056
+ orphaned names and `bound_names_in_block` the names a block binds; the
2057
+ engine's `type_inferrer` parameter is `type_oracle` and the
2058
+ `TypeInferrer` alias is gone, `TypeOracle` is the name. Module-internal
2059
+ helpers that read as public are private, and the predicates that ask
2060
+ whether a project configures a tool all say `project_configures_*`.
2061
+ - `run_pipeline` takes the engine it drives (`engine=`) and the pipeline no
2062
+ longer imports the engine; the two phase entry points it calls are public
2063
+ (`find_block_pairs`, `process_block_pairs`). `from towel.unification
2064
+ import UnificationRefactorEngine` still works and loads the engine lazily.
2065
+ - `formatter_for_project`, `import_sorter_for_project`, and
2066
+ `type_oracle_for_project` return a `ToolChoice` (`tool`, `note`) instead
2067
+ of a tuple; `TypeOracle.is_subtype` returns `Subtyping` verdicts
2068
+ (`YES`, `NO`, `UNKNOWN`) instead of `Optional[bool]`. Rejection reasons
2069
+ are a `RejectReason` enum, evaluation kinds a `ParameterKind` literal,
2070
+ the rename inventory a `TypedDict`, and the applied-change log is
2071
+ `engine.change_log`, a sequence of `AppliedChange`.
2072
+ - The library prints no diagnostics. Warnings go to the `towel` logger,
2073
+ which reaches stderr even when nothing configures logging, and the
2074
+ rejection, validation, overlap, and type traces go to `towel.rejections`,
2075
+ `towel.validation`, `towel.overlap`, and `towel.types` at DEBUG. The
2076
+ documented environment variables still switch them on; they and
2077
+ `TOWEL_WORKERS` are read once into `Settings` at engine construction
2078
+ (`settings=` overrides them for library callers), and the engine
2079
+ constructor no longer changes logger levels
2080
+ (`Settings.enable_debug_logging` is the library caller's to call).
2081
+ - Helpers other modules imported under leading underscores are public:
2082
+ `find_project_root`, `load_pyproject`, `is_package_dir`,
2083
+ `walk_own_scope`, `body_without_docstring`, `stored_names`, `reindent`,
2084
+ `relative_import_module`. Two implementations of the docstring stripper,
2085
+ the own-scope walker, the `__param_N` minting rule, and the subtype
2086
+ verdict reader became one each, and ten duplications Towel found in its
2087
+ own source are named helpers.
2088
+ - The import-graph tables are an `ImportGraphCache` the engine owns per run,
2089
+ bounded, instead of process-global dictionaries, and a required argument
2090
+ of the cycle and resolution checks; the apply path parses each modified
2091
+ file once per source text and re-reads a file only when its stat changes;
2092
+ the pair loop skips two functions whose blocks share no bucket key before
2093
+ visiting any block.
2094
+ - Two catches that turned bugs into silent defaults (a module-name fallback
2095
+ catching every exception, a call renderer swallowing a `TypeError`) are
2096
+ narrowed or removed; the nine copies of `try/except/pass` around
2097
+ progress-bar calls are one `quietly`; four unjustified `type: ignore`
2098
+ comments and three `pragma: no cover` exclusions are gone.
2099
+ - Pair evaluation keeps one proposal per distinct refactoring (the same
2100
+ helper over the same clustered sites, whichever pair found it first)
2101
+ instead of every pair's copy. A file of sixty near-identical functions
2102
+ under the pair budget peaked at 33.6 GB holding the copies and now peaks
2103
+ at 0.74 GB; the output is the same, since the overlap filter never chose
2104
+ a later copy.
2105
+ - A proposal whose helper, home and call sites repeat an earlier pair's is
2106
+ declined (`duplicate_proposal`) before the reuse redirect, the forwarder
2107
+ filter and annotation run on it; the clustering scan's key no longer
2108
+ carries names the template block never reads, which made it differ per
2109
+ function position; and the function lookup every clustered site makes is
2110
+ memoized. The clustering scan cache is bounded by the sites it holds
2111
+ (200,000) as well as by its entry count, since a scan of a file of a
2112
+ thousand near-identical functions holds a thousand sites. Such a file,
2113
+ which the module-name rule now admits where the module-data rule used to
2114
+ decline every pair in seconds, is evaluated in full: a thousand
2115
+ near-identical five-line functions reading one module global take 33
2116
+ minutes on one core (commit `5ff2458`, September 19, 2026) and yield one
2117
+ helper with 669 sites, peaking at 6.6 GB (8.8 GB before the scan cache
2118
+ was bounded); its pair evaluation is what `--max-pairs` bounds. A
2119
+ per-candidate memo beneath the scan, which no run ever read, is gone.
2120
+ - The verdict of the instantiation check is memoized on the helper, call
2121
+ and block, which it repeated many times over across pair and cluster
2122
+ evaluation: a file of a hundred similar functions took 31 s instead of
2123
+ 43 s when the memo landed (commit 77d18a8); the current figure is in the
2124
+ clustering entry above.
2125
+ - The `format` extra's Black floor is the version the goldens were
2126
+ generated with (`black>=26.3.1`, the same floor as the `dev` extra); it
2127
+ was two majors lower, so a user at the extra's floor could get output the
2128
+ goldens do not show. The sdist no longer ships the `.templates` scratch
2129
+ directory or two debugging scripts.
2130
+ - The help says what the commands do: usage lines read `towel`, each
2131
+ boolean option's help names its default, the retired spellings are left
2132
+ out, and `preview` no longer promises per-phase summaries under
2133
+ `--progress detail`, which only the fixed-point driver emits.
2134
+ - The structural memo is keyed on a block's structure, so equal blocks share
2135
+ one entry wherever they appear.
2136
+
2137
+ ### Deprecated
2138
+ - The `--max-iterations`, `--non-interactive` and `rename-helpers
2139
+ --dry-run` spellings still parse but are left out of the help; use
2140
+ `--max-refactorings`, `--no-interactive` and `--preview`.
2141
+
2142
+ ### Removed
2143
+ - `nominal_unifier.py`, which nothing imported, and the TOML backport for
2144
+ Python 3.10, below the supported floor, with its `tomli` dev dependency.
2145
+ - `ImportGraphCache.clear`, which nothing called: the cache is built per run
2146
+ and dropped with the engine.
2147
+
2148
+ ### Fixed
2149
+ - The ecosystem release gate requires completed, nonempty test runs. Setup
2150
+ failures, incomplete runs, unknown verdicts, changed failing-test identities,
2151
+ and missing tests cannot pass merely because exit codes or totals match.
2152
+ Documented known failures and flaky-test reruns cannot hide a changed test
2153
+ count; matching pre-existing failures remain visible in the report. Pytest
2154
+ commands request complete tallies and failure identities; custom runner
2155
+ failure statuses must be declared, and retests retain their actual statuses.
2156
+ Retests remove broad selectors wherever they occur and require the exact
2157
+ selected test count; ambiguous command options decline the retest. Agreement
2158
+ on isolated tests requires confirmation with the complete original test
2159
+ command, so test-order regressions cannot disappear from the check. Failed
2160
+ Git observations cannot become `NO_CHANGE`, and added, deleted, or renamed
2161
+ paths count as changes. Source provenance names the checkout actually used;
2162
+ archives explicitly require a separately retained source manifest.
2163
+ The corpus manifest supplies Cheroot's declared test plugins and SimPy's
2164
+ benchmark fixture, and runs PLY's test scripts from the project root so each
2165
+ suite imports the source tree under test.
2166
+ The harness records its requested typing mode. Its explicit `--no-types`
2167
+ option supports behavioral validation of projects without a complete typing
2168
+ environment; it never retries a failed typed run by silently opting out.
2169
+ - The worker-cleanup regression fails when process inspection fails, instead
2170
+ of treating an empty result from a failed command as proof that workers exited.
2171
+ - Mypy runs in an owned persistent worker with incremental caches and periodic
2172
+ garbage collection. Its process-global state cannot freeze or unfreeze a
2173
+ library caller's heap, concurrent requests are serialized, and explicit
2174
+ cleanup covers both combined checkers and failed optional-dependency setup.
2175
+ The CLI preserves input-project configuration while checking the copied
2176
+ output under its original module identities, and closes the checker on
2177
+ success and failure. Project type rules are honored while plugins,
2178
+ configured executables and report destinations remain disabled.
2179
+ (1.772 replaced that periodic collection: each build now runs in a forked
2180
+ child of the worker which exits when it has answered.)
2181
+ - Mypy diagnostic presentation is normalized for in-memory sources. A
2182
+ project's `pretty = true` setting no longer crashes when a subtype probe
2183
+ or prospective helper extends beyond the on-disk file; project type rules
2184
+ remain unchanged.
2185
+ - Checker outcomes distinguish infrastructure failure from valid diagnostics.
2186
+ A pyright timeout, malformed output or failure is never evidence of a clean
2187
+ project or a successful subtype relation.
2188
+ - Lexical binding analysis recognizes PEP 695 type parameters and shadowed
2189
+ builtins, preserving generic identity and conditional-name evaluation.
2190
+ - Ruff subprocesses exclude the current project from Python's import path.
2191
+ Import sorting preserves ordered providers of shared bindings and statement
2192
+ boundaries. Permanent filesystem conflicts stop instead of retrying forever.
2193
+ Directory mode also terminates after all proposals in an unchanged project
2194
+ fail rendering or type verification, and retries deferred proposals after
2195
+ another successful change can alter their checking context.
2196
+ - Helper renaming preserves builtin reads, keyword callers, exact selection
2197
+ filters and Python protocol behavior. Static aliases and re-exports are
2198
+ tracked; ambiguous callable/module aliases, visible reflection and dynamic
2199
+ keyword dictionaries are refused before writing. Source discovery prunes
2200
+ environments and excluded directories and reports unreadable consumers.
2201
+ - The eager-argument guard is rebuilt on control flow. Twelve shapes that
2202
+ passed a differing name eagerly where the original read it only on some
2203
+ path are thunked or declined: a failed optional import, a `TYPE_CHECKING`
2204
+ import, a class attribute read bare in a method, a name bound later,
2205
+ deleted, or bound conditionally in the enclosing function, and at module
2206
+ level a name bound by `except ... as`, a `match` capture, a later `def`,
2207
+ or a later import.
2208
+ - A free variable the two blocks share follows the same rule as a differing
2209
+ argument: it is passed eagerly only when the call site resolves it on
2210
+ every path, and as a thunk otherwise. A name bound nowhere, read only on
2211
+ a branch no run takes, used to be hoisted into an eager argument and raise
2212
+ `NameError` at every call (found by the new property test); a helper
2213
+ defined below its callers, called once at import time before its
2214
+ definition, raised the same way. Both are now read where the block read
2215
+ them: a same-module helper reads the name bare (next entry), and a
2216
+ cross-file helper takes it as a thunk.
2217
+ - A free name that both sites resolve at module scope, or nowhere, is no
2218
+ longer a parameter of a same-module helper: the helper reads it bare,
2219
+ which is the lookup the block made, at the moment the block made it. A
2220
+ helper defined below its callers, a class, an import, or module data a
2221
+ callback rebinds between two reads (previously declined as
2222
+ `module_data_lookup` or `rebound_external_binding`) all extract, with
2223
+ fewer parameters and no thunk; hyper-h2 loses seven such parameters and
2224
+ gains three extractions, and its own 1,662 tests pass on the output. A
2225
+ clustered occurrence whose same-spelled name is a local does not join;
2226
+ cross-file helpers still take the name as a parameter, and module data
2227
+ a callback may rebind still declines a cross-file pair. So does a
2228
+ same-file pair whose helper is hosted in a shared ancestor class defined
2229
+ in another module: the pair is decided again with every name a
2230
+ parameter, since the ancestor's module need not import them (the
2231
+ release-candidate ecosystem run found oauthlib's `BearerToken` read bare
2232
+ in `introspect.py`, which raised NameError in 55 tests). `__class__`, the
2233
+ cell zero-argument `super()` reads, names the defining class and stays a
2234
+ parameter of a method helper.
2235
+ - A call to a function or method of the same module whose body reads a
2236
+ frame relative to its caller (`sys._getframe(n)`, `inspect.stack()`, a
2237
+ `stacklevel=`), directly or through other such functions, is a frame read
2238
+ at its call site, and the block stays where it is. The module-name rule
2239
+ had admitted blocks that typing_extensions' `_caller()` reads through,
2240
+ which a reflection guard had declined only by accident, and six
2241
+ `TypeAliasType` pickling tests failed in the release-candidate ecosystem
2242
+ run.
2243
+ - A call site that would pass a callee as
2244
+ `lambda *args, **kwargs: callee(*args, **kwargs)` is declined by name
2245
+ (`forwarded_callee`). It used to be declined by accident, because the
2246
+ lambda's own parameters were counted as names the site could not resolve;
2247
+ that miscount also declined any thunk containing a lambda, such as
2248
+ `lambda: sorted(items, key=lambda x: x)`, which now extracts.
2249
+ - A comprehension's target shadows only its own expressions: `[i for i in
2250
+ xs]` used to become `[__param_0() for i in xs]` while a free read of `i`
2251
+ after the comprehension stayed literal.
2252
+ - The frame-reading builtins, `eval`/`exec`, `sys._getframe` and
2253
+ `inspect.currentframe` anywhere in the enclosing function decline the
2254
+ block, not only inside it, and their aliases, imported or assigned
2255
+ (`e = eval`, `warn = warnings.warn`, `gf = sys._getframe`, an alias of an
2256
+ alias), are resolved through the module's bindings.
2257
+ - `warnings.warn` without `stacklevel`, and a `stacklevel` reached through
2258
+ an alias, decline the block.
2259
+ - An object a class instantiation or a resource factory (`open`,
2260
+ `connect`, `socket`, `mkdtemp`, `Popen`, `urlopen`, ...) binds in the
2261
+ block is returned from the helper rather than dropped when the helper's
2262
+ frame ends, since a later read may observe its lifetime (a temporary
2263
+ file, a weak reference).
2264
+ - A helper import goes after the module's last leading import, before its
2265
+ first definition (after the docstring when there are no imports), so a
2266
+ script that runs a statement before its imports keeps that statement
2267
+ first. A host for a cross-file helper is accepted only when the borrower
2268
+ already imports it or every module the new import would load is
2269
+ definition-only, so a helper import cannot run a module that prints at
2270
+ import time (`xf13_import_time_effects` is declined).
2271
+ - A form feed or a Unicode line separator in a source no longer crashes the
2272
+ splice: lines are counted the way the tokenizer counts them.
2273
+ - Async comprehensions are declined.
2274
+ - A rendering failure in one proposal ends that proposal, not the run.
2275
+ - A relative output path no longer ends the fixed point early.
2276
+ - Type inference no longer switches off when the working directory is
2277
+ above the output.
2278
+ - A pending transaction journal blocks a run only when its manifest names
2279
+ a file the run would change (a journal without a readable manifest
2280
+ blocks everything beneath it), and journals of concurrent runs never
2281
+ share a name.
2282
+ - A killed run's pyright probe cannot be mistaken for source.
2283
+ - The mypy cache and partial-copy directories are cleaned on SIGTERM.
2284
+ - An ASCII locale no longer breaks a run.
2285
+ - The change sidecar is written atomically.
2286
+ - `--interactive` with a closed stdin declines instead of raising.
2287
+ - Settings are read from the environment once per run.
2288
+ - Three ways an extraction could change what a program does, each found by
2289
+ executing crafted inputs before and after refactoring: a closure created
2290
+ inside the block over a name the block binds (a loop target) kept the
2291
+ helper's cell where the original saw the caller's later rebinding; an
2292
+ argument-free `dir()` read the helper's frame; and a differing free name
2293
+ was passed eagerly on the assumption that a name has no failure mode,
2294
+ so a global the module never binds raised `NameError` at the call site
2295
+ where the original read it only in a branch it did not take. The first
2296
+ two are declined; the third follows the shared-free-variable rule above.
2297
+ - Single-file `dry` on a file it cannot decode copied it and then stopped
2298
+ with a codec message naming nothing, and on a file with a syntax error
2299
+ reported success over an unchanged copy; both are an error naming the
2300
+ file (and the line). A negative `--max-refactorings` was accepted and
2301
+ meant "run to a fixed point"; it is refused. `preview` of one file showed
2302
+ a progress bar under `--progress none`, and the banner said helpers go at
2303
+ the end of files.
2304
+ - With `--types`, the variables a helper returns are revealed under each
2305
+ call site's own spelling; a site whose names alpha-renaming spelled
2306
+ differently from the helper's used to probe names that did not exist
2307
+ there, so the helper's return type stayed `Any` and parameter unions the
2308
+ return type would have invalidated went unchecked.
2309
+ - A refactored file keeps its own encoding, byte-order mark and newline
2310
+ convention: a CRLF file used to come back with every line changed, a file
2311
+ with a UTF-8 BOM was skipped, and one latin-1 file with a coding cookie
2312
+ failed a whole directory run. Sources are decoded as the interpreter
2313
+ decodes them and written back in the file's own bytes; `rename-helpers`
2314
+ reads the same way and keeps each file's encoding.
2315
+ - A project whose packaging layout Towel cannot model (a `hatch.toml`, some
2316
+ flit, poetry and pdm forms) no longer aborts the run when it has a
2317
+ cross-file candidate: the pair is declined (`unknown_layout` in the
2318
+ rejection trace) and every same-file extraction proceeds. Layout
2319
+ discovery raises `UnsupportedLayoutError`, and the command line reports
2320
+ any `TowelError` as an error line instead of a traceback.
2321
+ - `--progress none` is silent through the localized and stale re-analyses
2322
+ that follow each applied proposal, the single-file driver takes a
2323
+ progress mode, and `preview` accepts `--progress`. Both drivers run to a
2324
+ fixed point by default, as the CLI always did; they used to stop after
2325
+ ten iterations, and the goldens generated through them were ten-step
2326
+ snapshots rather than fixed points.
2327
+ - An import sorter's result is accepted only if it permutes or merges import
2328
+ statements, at any depth (a sorter also orders the imports under
2329
+ `if TYPE_CHECKING:`); anything else is discarded and the file is left as
2330
+ Towel assembled it, rather than failing the refactoring (trio).
2331
+ - `rename-helpers --list --json` no longer crashes on a symlinked module.
2332
+ - A confirmation prompt at a closed stdin declines instead of raising.
2333
+ - An isort skip setting, a failing or hung ruff, a hung pyright, and pyright
2334
+ output of an unexpected shape each degrade with a warning naming the file
2335
+ instead of aborting or being swallowed.
2336
+ - A non-integer or non-positive `TOWEL_WORKERS` is reported, and a
2337
+ configured worker count never reaches a platform without `fork`.
2338
+ - A corrupt transaction manifest and a concurrent transaction are reported
2339
+ as the journal's own errors.
2340
+ - The engine forgets a rewritten file's cached lines when it invalidates
2341
+ the file.
2342
+ - The parallel fallback no longer hides worker exceptions behind a serial
2343
+ retry.
2344
+ - The command line's stderr handler follows a redirected stderr.
2345
+ - The cross-file fixture package named `lib` was hidden from fresh checkouts
2346
+ by the `lib/` ignore pattern; the pattern exempts the fixtures.
2347
+ - Two blocks that differed only in the spelling of a lambda's parameter
2348
+ (`lambda value: value * 2` against `lambda other: other * 2`), or of an
2349
+ assignment expression's target (`(t := f())` against `(temp := f())`),
2350
+ were declined. Lambda parameters are now renamed within their own lambda
2351
+ by the instantiation check, which leaves a free name spelled the same
2352
+ outside the lambda alone, and walrus targets are block-level binders for
2353
+ the unifier, since an assignment expression binds in the enclosing scope.
2354
+ - A block that binds a variable read after it is extracted again, with the
2355
+ helper returning the variable and the call rebinding it (`total =
2356
+ helper(order)`), as the README has always shown. The orphan guard added for
2357
+ networkx in 1.618 did not know the generated call rebinds a returned
2358
+ variable, so it rejected every such block; only blocks that returned or
2359
+ bound nothing live could be extracted.
2360
+ - The import-cycle guard treats `from . import name` (and `from .. import
2361
+ name`) as an edge to the package's `__init__`, which that import runs
2362
+ whether or not `name` is a submodule. A helper hosted in a submodule that
2363
+ reaches back into its package this way was imported by the package
2364
+ initializer, which the submodule then imported half-initialized
2365
+ (beautifulsoup4's tests package). The initializer, which the submodule
2366
+ already imports, is now the host.
2367
+ - The import-cycle guard resolves a file's own package's absolute imports
2368
+ inside the tree being refactored, by suffix, even when a full-path match
2369
+ exists elsewhere: an out-of-place output beside the original clone
2370
+ (`sphinx-cleaned` next to `sphinx`) had `from sphinx.transforms import X`
2371
+ resolved against the original, where the helper import that closed the
2372
+ cycle did not exist, and sphinx's transforms package broke on import.
2373
+ - A union of forward references is written as one string (`'Left | Right'`),
2374
+ not as `'Left' | 'Right'`, which is a TypeError at definition (Towel's own
2375
+ suite, refactored by Towel).
2376
+ - Definite-assignment analysis now knows that `except E as name` deletes
2377
+ `name` when the handler exits, and that a `del` nested in a branch unbinds
2378
+ its target on that path. The returned-variable check relies on this; without
2379
+ it a helper could return a handler's name and raise `UnboundLocalError`
2380
+ where the original code did not.
2381
+ - With mypy, a union whose members the checker could not all order (some
2382
+ verdicts unanswerable: A under B, B under C, C under A) let every member
2383
+ absorb every other, emptied the union, and the join raised `IndexError`
2384
+ (sphinx, after eighteen minutes of refactoring). A member now absorbs
2385
+ another only on a definite `YES`, a normalization that would keep nothing
2386
+ keeps the union as it was, and a join with no members writes no
2387
+ annotation.
2388
+ - A function preceded by `@overload` stubs is a valid reuse target: the
2389
+ reuse check verifies the last module-level definition of the name, which
2390
+ is the runtime binding the calls resolve to, instead of refusing a name
2391
+ defined more than once (rfc3986's `normalize_query`).
2392
+ - A type mypy reveals with the path of an out-of-place output directory
2393
+ that is not an identifier (`h2-dbg.stream.H2Stream`, which parsed as a
2394
+ subtraction and was written as `self: h2 - H2Stream`) is rewritten with a
2395
+ placeholder for that component, and a revealed type is accepted only when
2396
+ its tree is made of names, attributes, subscripts, tuples, constants and
2397
+ unions.
2398
+ - `rename-helpers` with a rename file it cannot open or parse exits 1 with
2399
+ `Error: ...` on stderr like every other command failure; it used to print
2400
+ the failure to stdout without the prefix.
2401
+ - Invariants the engine enforced with `assert`, which `python -O` removes
2402
+ (a helper without a host name, a node without an end position), are
2403
+ exceptions that survive `-O`; a rendered module that does not parse
2404
+ raises `RefactoringError` naming the parse error instead of being dropped
2405
+ as "no insertion point"; and when applying a change fails, the cleanup's
2406
+ own error no longer hides the failure that triggered it. The cross-file
2407
+ reuse redirect follows the same import-time rule as cross-file helpers: a
2408
+ site is not redirected to a function in another module when the import
2409
+ would make the site's module load one that runs code at import time.
2410
+ - Ctrl-C prints one line instead of a traceback, and a reader that closes
2411
+ the pipe ends the run quietly; `preview` and `rename-helpers` warn about
2412
+ a pending journal and an in-place `dry` refuses before analysing; two
2413
+ source paths that differ only by case are refused before an out-of-place
2414
+ copy would merge them on a case-insensitive volume; a virtual environment
2415
+ inside the input is recognized by its `pyvenv.cfg` whatever it is named;
2416
+ the inline progress bar goes to stderr like tqdm's, so redirected output
2417
+ stays clean, and a run that asked for tqdm without it installed says so
2418
+ once.
2419
+ - A single-file run prints the frame-sensitivity warning that directory
2420
+ runs already printed when a file reads `locals()`, `eval` or the frame.
2421
+ - A `pyproject.toml` that does not parse is reported (and no layout
2422
+ information is taken from it) instead of being read as empty.
2423
+
2424
+ ### Security
2425
+ - The pyright oracle starts `python -I -m pyright`. It runs from the
2426
+ module's directory, and `-m` put that directory first on `sys.path`, so a
2427
+ project package named like a standard module was imported and executed
2428
+ in its place: sphinx's `locale` package ran when pyright's launcher
2429
+ imported `subprocess`, and pyright produced nothing for flask, pytest,
2430
+ structlog, sphinx, trio and werkzeug in the release-candidate ecosystem
2431
+ run.
2432
+ - Pyright runs with Towel's interpreter (`--pythonpath`), so a `venv`
2433
+ setting in the analyzed project's pyright configuration can no longer
2434
+ execute that project's interpreter; SECURITY.md says exactly what each
2435
+ checker does and when to pass `--no-types`. Ruff and pyright are resolved
2436
+ from the current interpreter before PATH. The ecosystem job runs
2437
+ third-party test suites without the checkout token persisted and with a
2438
+ scratch HOME; the workflows pin actions to commits. The rename file is
2439
+ read as UTF-8 and the change sidecar is never written through a symlink.
2440
+ - The pyright probe is created with `mkstemp` in the user's package
2441
+ (exclusive, owner-only, never following a symlink) and removed at
2442
+ interpreter exit if a crash skips the cleanup; it used to be a
2443
+ predictable, world-readable file left behind by a kill.
2444
+ - The ecosystem check (`scripts/ecosystem_check.py`, `just ecosystem`)
2445
+ clones public repositories and runs their setup, dependency installation
2446
+ and test suites with the caller's privileges. It now refuses to run
2447
+ unless the caller passes `--run-untrusted-code` or sets
2448
+ `TOWEL_ECOSYSTEM_RUN_UNTRUSTED=1`, the refusal says what would execute
2449
+ and recommends a disposable machine or container, and each manifest
2450
+ entry's `prepare` command runs without a shell. Every project in the
2451
+ manifest is pinned to the full commit the release-gate run tested rather
2452
+ than `HEAD`, so a hijacked upstream cannot put unreviewed code into the
2453
+ run; `--print-pins` lists the commits a run tested for refreshing the pins.
2454
+ `towel-main` alone still tracks `main`. Its work directory is a fresh
2455
+ private temporary directory unless `--work` names one, so another local
2456
+ user cannot pre-create the tree it clones into and executes from.
2457
+
2458
+ ## [1.618] - 2026-09-17
2459
+
2460
+ ### Changed
2461
+ - Cross-file helpers are imported relatively by default (`from .module import
2462
+ helper`), which stays valid when an out-of-place output is adopted into its
2463
+ real location. An absolute import is used only when a packaging marker
2464
+ (`pyproject.toml`/`setup.*`) anchors the module name, so the previous
2465
+ behavior is preserved for in-place refactoring of a packaged project.
2466
+ - Trivial forwarding helpers are no longer proposed: a block whose helper body
2467
+ would be a single `raise`, a `return` of one call, or a bare call adds
2468
+ indirection without sharing logic. Construct the engine with
2469
+ `skip_trivial_helpers=False` to restore the old behavior.
2470
+ - A cross-file helper is placed in a module that does not close an import cycle.
2471
+ When the shared block spans modules, the helper is hosted in one the others
2472
+ already import rather than adding a back-edge; the extraction is declined only
2473
+ when no placement is safe (a genuine pre-existing cycle). This replaces the
2474
+ earlier behavior of hosting the helper in the first module and declining
2475
+ whenever that would cycle.
2476
+
2477
+ ### Fixed
2478
+ - The rename tool no longer refuses a module merely because it contains a local
2479
+ variable or parameter named `vars`, `globals`, `locals`, `eval`, or `exec`;
2480
+ it flags only a genuine reference to the builtin.
2481
+
2482
+ ## [1.414] - 2026-09-15
2483
+
2484
+ First release prepared under the open-source audit. Beta: the engineering and
2485
+ evidence are strong, but Towel rewrites source code and has documented
2486
+ limitations it cannot always detect, so preview, review the diff, and run the
2487
+ affected project's own tests.
2488
+
2489
+ ### Added
2490
+ - Cross-file refactoring with import-root inference for setuptools, Hatch,
2491
+ Flit, Poetry, and pdm project layouts.
2492
+ - `towel rename-helpers`: a JSON inventory of extracted helpers and an atomic,
2493
+ checked rename batch, intended to be driven by a coding assistant.
2494
+ - `towel dry --exclude DIR` to leave a directory out of directory mode.
2495
+ - A pre-run scan that warns, before refactoring a directory, about modules that
2496
+ inspect frames or tracebacks, attribute warnings by `stacklevel`, or read
2497
+ source through `inspect.getsource`.
2498
+ - A standing ecosystem check over 91 public projects
2499
+ (`scripts/ecosystem_check.py`, `just ecosystem`), run weekly in CI.
2500
+ - Fork-based parallel analysis, enabled by a timed probe and capped by
2501
+ available memory, with a per-worker watchdog so a killed run leaves no
2502
+ workers behind. `TOWEL_WORKERS` controls it.
2503
+
2504
+ ### Changed
2505
+ - Every accepted proposal is verified by instantiating the helper with each
2506
+ call site's arguments and comparing against the block it replaces, up to
2507
+ renamed binders. Arguments that could have observable effects or fresh
2508
+ identity are evaluated inside the helper at their original position.
2509
+ - Analysis is memoized by block structure and shares parsed graphs by
2510
+ reference, checked under `TOWEL_CHECK_AST_IMMUTABLE=1`.
2511
+ - Minimum Python is 3.11; the matrix covers 3.11 through 3.13.
2512
+
2513
+ ### Fixed
2514
+ - A large set of soundness and scope defects found by adversarial batteries and
2515
+ the ecosystem check, each now covered by a fixture and a row in
2516
+ [docs/ADVERSARIAL_REVIEW.md](docs/ADVERSARIAL_REVIEW.md).
2517
+
2518
+ ### Notes
2519
+ - The PyPI releases `1.0.0`–`1.0.4` are yanked for broken import handling and
2520
+ are not a recommended installation target.
2521
+
2522
+ [Unreleased]: https://github.com/ericeallen/towel/compare/v1.946...HEAD
2523
+ [1.946]: https://github.com/ericeallen/towel/compare/v1.792...v1.946
2524
+ [1.792]: https://github.com/ericeallen/towel/compare/v1.772...v1.792
2525
+ [1.772]: https://github.com/ericeallen/towel/compare/v1.732.post1...v1.772
2526
+ [1.732.post1]: https://github.com/ericeallen/towel/compare/v1.732...v1.732.post1
2527
+ [1.732]: https://github.com/ericeallen/towel/compare/v1.618...v1.732
2528
+ [1.618]: https://github.com/ericeallen/towel/compare/v1.414...v1.618
2529
+ [1.414]: https://github.com/ericeallen/towel/releases/tag/v1.414