code-towel 1.792__tar.gz → 1.947__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 (2780) hide show
  1. code_towel-1.947/CHANGELOG.md +2594 -0
  2. code_towel-1.947/CONTRIBUTING.md +383 -0
  3. code_towel-1.947/MANIFEST.in +20 -0
  4. code_towel-1.947/PKG-INFO +290 -0
  5. code_towel-1.947/README.md +245 -0
  6. code_towel-1.947/SECURITY.md +38 -0
  7. code_towel-1.947/docs/ADVERSARIAL_REVIEW.md +230 -0
  8. code_towel-1.947/docs/ARCHITECTURE.md +2049 -0
  9. code_towel-1.947/docs/CLI_GUIDE.md +298 -0
  10. code_towel-1.947/docs/DECISIONS.md +1892 -0
  11. code_towel-1.947/docs/GENERATED_CODE.md +421 -0
  12. code_towel-1.947/docs/KNOWN_LIMITATIONS.md +2131 -0
  13. code_towel-1.947/docs/NAMING.md +153 -0
  14. code_towel-1.947/docs/OPEN_SOURCE_AUDIT.md +119 -0
  15. code_towel-1.947/docs/PERFORMANCE.md +587 -0
  16. code_towel-1.947/docs/PRODUCTION_READINESS.md +1501 -0
  17. code_towel-1.947/docs/QUICKSTART.md +116 -0
  18. code_towel-1.947/docs/README.md +61 -0
  19. code_towel-1.947/docs/RELEASE_1_946.md +298 -0
  20. code_towel-1.947/docs/RELEASE_1_947.md +147 -0
  21. code_towel-1.947/docs/RELEASE_LOG.md +1018 -0
  22. code_towel-1.947/docs/RELEASING.md +806 -0
  23. code_towel-1.947/docs/REQUIREMENTS.md +53 -0
  24. code_towel-1.947/docs/TYPING.md +234 -0
  25. code_towel-1.947/docs/USAGE_GUIDE.md +811 -0
  26. code_towel-1.947/docs/agent_log.md +126 -0
  27. code_towel-1.947/docs/proposals/README.md +121 -0
  28. code_towel-1.947/docs/proposals/REVIEW_2026-10-08.md +281 -0
  29. code_towel-1.947/docs/proposals/decline-capabilities.md +148 -0
  30. code_towel-1.947/docs/proposals/dethunking.md +131 -0
  31. code_towel-1.947/docs/proposals/next-release.md +337 -0
  32. code_towel-1.947/docs/proposals/next-validation-final.md +167 -0
  33. code_towel-1.947/docs/proposals/next-validation.md +140 -0
  34. code_towel-1.947/docs/proposals/performance-roadmap.md +308 -0
  35. code_towel-1.947/docs/proposals/project-own-check.md +138 -0
  36. code_towel-1.947/docs/proposals/published-1772-comparison.md +105 -0
  37. code_towel-1.947/docs/proposals/shared-helper-module.md +182 -0
  38. code_towel-1.947/docs/proposals/template-method.md +171 -0
  39. code_towel-1.947/docs/proposals/type-parameters.md +395 -0
  40. code_towel-1.947/justfile +198 -0
  41. code_towel-1.947/pyproject.toml +134 -0
  42. code_towel-1.947/scripts/ecosystem/Dockerfile +43 -0
  43. code_towel-1.947/scripts/ecosystem/manifest.toml +2612 -0
  44. code_towel-1.947/scripts/ecosystem_check.py +4066 -0
  45. code_towel-1.947/src/code_towel.egg-info/PKG-INFO +290 -0
  46. code_towel-1.947/src/code_towel.egg-info/SOURCES.txt +2641 -0
  47. code_towel-1.947/src/towel/analysis_sources.py +231 -0
  48. code_towel-1.947/src/towel/canonical_ast.py +128 -0
  49. code_towel-1.947/src/towel/cli.py +2405 -0
  50. code_towel-1.947/src/towel/formatting.py +1249 -0
  51. code_towel-1.947/src/towel/parsing_warnings.py +296 -0
  52. code_towel-1.947/src/towel/program_files.py +429 -0
  53. code_towel-1.947/src/towel/renaming.py +1647 -0
  54. code_towel-1.947/src/towel/unification/annotation_ladder.py +2343 -0
  55. code_towel-1.947/src/towel/unification/annotation_wiring.py +1974 -0
  56. code_towel-1.947/src/towel/unification/annotations.py +1667 -0
  57. code_towel-1.947/src/towel/unification/argument_ownership.py +629 -0
  58. code_towel-1.947/src/towel/unification/ast_paths.py +72 -0
  59. code_towel-1.947/src/towel/unification/block_analysis.py +1363 -0
  60. code_towel-1.947/src/towel/unification/block_signature.py +219 -0
  61. code_towel-1.947/src/towel/unification/bounded_cache.py +144 -0
  62. code_towel-1.947/src/towel/unification/builtin_mapping_writes.py +84 -0
  63. code_towel-1.947/src/towel/unification/clustering.py +689 -0
  64. code_towel-1.947/src/towel/unification/compiler_literals.py +476 -0
  65. code_towel-1.947/src/towel/unification/constant_consistency.py +43 -0
  66. code_towel-1.947/src/towel/unification/engine_state.py +524 -0
  67. code_towel-1.947/src/towel/unification/extractor.py +1137 -0
  68. code_towel-1.947/src/towel/unification/fixed_point.py +1300 -0
  69. code_towel-1.947/src/towel/unification/hof_promotion.py +233 -0
  70. code_towel-1.947/src/towel/unification/if_binding_transfer.py +666 -0
  71. code_towel-1.947/src/towel/unification/import_graph.py +2125 -0
  72. code_towel-1.947/src/towel/unification/insertion.py +384 -0
  73. code_towel-1.947/src/towel/unification/instantiation.py +1225 -0
  74. code_towel-1.947/src/towel/unification/materialize.py +1382 -0
  75. code_towel-1.947/src/towel/unification/models.py +516 -0
  76. code_towel-1.947/src/towel/unification/module_bindings.py +517 -0
  77. code_towel-1.947/src/towel/unification/namespace_writes.py +648 -0
  78. code_towel-1.947/src/towel/unification/narrowing.py +880 -0
  79. code_towel-1.947/src/towel/unification/pair_evaluation.py +2031 -0
  80. code_towel-1.947/src/towel/unification/parameterization.py +410 -0
  81. code_towel-1.947/src/towel/unification/pipeline.py +493 -0
  82. code_towel-1.947/src/towel/unification/refactor_engine.py +1225 -0
  83. code_towel-1.947/src/towel/unification/rehearing.py +373 -0
  84. code_towel-1.947/src/towel/unification/return_source_uses.py +78 -0
  85. code_towel-1.947/src/towel/unification/semantic_safety.py +1905 -0
  86. code_towel-1.947/src/towel/unification/structural_memo.py +185 -0
  87. code_towel-1.947/src/towel/unification/substitution.py +202 -0
  88. code_towel-1.947/src/towel/unification/thunk_inlining.py +660 -0
  89. code_towel-1.947/src/towel/unification/typing_forms.py +329 -0
  90. code_towel-1.947/src/towel/unification/unifier.py +1316 -0
  91. code_towel-1.947/src/towel/unification/unifier_state.py +102 -0
  92. code_towel-1.947/test_examples/README.md +463 -0
  93. code_towel-1.947/test_examples_crossfile/README.md +233 -0
  94. code_towel-1.947/tests/README.md +376 -0
  95. code_towel-1.947/tests/differential/export.py +274 -0
  96. code_towel-1.947/tests/differential/observer.py +464 -0
  97. code_towel-1.947/tests/differential/runner.py +403 -0
  98. code_towel-1.947/tests/fixtures/comprehension_captured_cell_original.py.txt +66 -0
  99. code_towel-1.947/tests/fixtures/scope_retained_comprehension_shadow_after.py.txt +67 -0
  100. code_towel-1.947/tests/fixtures/scope_retained_comprehension_shadow_before.py.txt +66 -0
  101. code_towel-1.947/tests/fixtures/scope_retained_match_after.py.txt +108 -0
  102. code_towel-1.947/tests/fixtures/scope_retained_match_before.py.txt +106 -0
  103. code_towel-1.947/tests/fixtures/scope_retained_single_pass_after.py.txt +69 -0
  104. code_towel-1.947/tests/fixtures/scope_retained_single_pass_before.py.txt +66 -0
  105. code_towel-1.947/tests/hostile_cases/r1946_builtin_definition_mapping.py +35 -0
  106. code_towel-1.947/tests/hostile_execution.py +1187 -0
  107. code_towel-1.947/tests/release_evidence/1.946-preparation/README.md +55 -0
  108. code_towel-1.947/tests/release_evidence/1.946-preparation/measurements.json +439 -0
  109. code_towel-1.947/tests/release_evidence/1.946-warning-guard/README.md +66 -0
  110. code_towel-1.947/tests/release_evidence/1.946-warning-guard/measurements.json +669 -0
  111. code_towel-1.947/tests/test_annotation_ladder_rules.py +1254 -0
  112. code_towel-1.947/tests/test_argument_ownership_memo.py +487 -0
  113. code_towel-1.947/tests/test_audit_io_safety.py +390 -0
  114. code_towel-1.947/tests/test_bounded_cache.py +53 -0
  115. code_towel-1.947/tests/test_bounded_cache_views.py +124 -0
  116. code_towel-1.947/tests/test_builtin_mapping_memo.py +326 -0
  117. code_towel-1.947/tests/test_builtin_mapping_operations.py +378 -0
  118. code_towel-1.947/tests/test_builtin_mapping_project_writes.py +309 -0
  119. code_towel-1.947/tests/test_builtins_across_modules.py +682 -0
  120. code_towel-1.947/tests/test_canonical_ast.py +380 -0
  121. code_towel-1.947/tests/test_captured_comprehension_cells.py +246 -0
  122. code_towel-1.947/tests/test_cli_integration.py +318 -0
  123. code_towel-1.947/tests/test_compiler_literal_guard_memo.py +336 -0
  124. code_towel-1.947/tests/test_compiler_literal_pools.py +643 -0
  125. code_towel-1.947/tests/test_comprehension_cell_capture_cli.py +188 -0
  126. code_towel-1.947/tests/test_crossfile_integration.py +500 -0
  127. code_towel-1.947/tests/test_current_release_documentation.py +218 -0
  128. code_towel-1.947/tests/test_definition_time_builtins.py +468 -0
  129. code_towel-1.947/tests/test_differential_grammar.py +242 -0
  130. code_towel-1.947/tests/test_differential_resources.py +190 -0
  131. code_towel-1.947/tests/test_ecosystem_manifest_regressions.py +287 -0
  132. code_towel-1.947/tests/test_ecosystem_verdicts.py +1618 -0
  133. code_towel-1.947/tests/test_engine_adversarial.py +1528 -0
  134. code_towel-1.947/tests/test_error_paths.py +301 -0
  135. code_towel-1.947/tests/test_formatter_file_context.py +182 -0
  136. code_towel-1.947/tests/test_formatting_repeatability.py +110 -0
  137. code_towel-1.947/tests/test_formatting_worker_sharing.py +189 -0
  138. code_towel-1.947/tests/test_fresh_top_level_imports.py +132 -0
  139. code_towel-1.947/tests/test_fstring_literal_pools.py +280 -0
  140. code_towel-1.947/tests/test_helper_annotations.py +551 -0
  141. code_towel-1.947/tests/test_helper_inventory.py +233 -0
  142. code_towel-1.947/tests/test_hostile_battery.py +638 -0
  143. code_towel-1.947/tests/test_hostile_crossfile_battery.py +581 -0
  144. code_towel-1.947/tests/test_hostile_scope_oracle.py +487 -0
  145. code_towel-1.947/tests/test_if_binding_transfer.py +451 -0
  146. code_towel-1.947/tests/test_if_fresh_bindings_cli.py +722 -0
  147. code_towel-1.947/tests/test_if_transfer_source_facts.py +441 -0
  148. code_towel-1.947/tests/test_import_position.py +346 -0
  149. code_towel-1.947/tests/test_incremental_global_passes.py +191 -0
  150. code_towel-1.947/tests/test_interval_prefix_facts.py +86 -0
  151. code_towel-1.947/tests/test_isolated_format_tools.py +249 -0
  152. code_towel-1.947/tests/test_lexical_fast_path_memo.py +205 -0
  153. code_towel-1.947/tests/test_literal_byte_provenance.py +273 -0
  154. code_towel-1.947/tests/test_module_header_bindings.py +113 -0
  155. code_towel-1.947/tests/test_nested_retained_scope_oracle.py +462 -0
  156. code_towel-1.947/tests/test_occurrence_constant_cli.py +456 -0
  157. code_towel-1.947/tests/test_occurrence_constants.py +315 -0
  158. code_towel-1.947/tests/test_optional_converter_narrowing.py +1559 -0
  159. code_towel-1.947/tests/test_ordinary_module_writes.py +361 -0
  160. code_towel-1.947/tests/test_pair_if_proof_order.py +614 -0
  161. code_towel-1.947/tests/test_pair_partner_eligibility.py +107 -0
  162. code_towel-1.947/tests/test_parameterize_builtins.py +718 -0
  163. code_towel-1.947/tests/test_parameterized_narrowing.py +442 -0
  164. code_towel-1.947/tests/test_parsing_warnings.py +731 -0
  165. code_towel-1.947/tests/test_pipeline_phases.py +395 -0
  166. code_towel-1.947/tests/test_platform_only_hosts.py +332 -0
  167. code_towel-1.947/tests/test_program_imports.py +225 -0
  168. code_towel-1.947/tests/test_program_type_names.py +1094 -0
  169. code_towel-1.947/tests/test_protocol_base_aliases.py +330 -0
  170. code_towel-1.947/tests/test_receiver_dependency.py +181 -0
  171. code_towel-1.947/tests/test_region_directives.py +687 -0
  172. code_towel-1.947/tests/test_rename_audit_regressions.py +442 -0
  173. code_towel-1.947/tests/test_rename_class_private_helpers.py +375 -0
  174. code_towel-1.947/tests/test_rename_consumer_scope.py +210 -0
  175. code_towel-1.947/tests/test_rename_discovery_regressions.py +192 -0
  176. code_towel-1.947/tests/test_rename_unicode_identifiers.py +110 -0
  177. code_towel-1.947/tests/test_return_source_uses.py +333 -0
  178. code_towel-1.947/tests/test_ruff_effective_configuration.py +168 -0
  179. code_towel-1.947/tests/test_run_statistics.py +227 -0
  180. code_towel-1.947/tests/test_source_encoding.py +204 -0
  181. code_towel-1.947/tests/test_thunk_inlining.py +212 -0
  182. code_towel-1.947/tests/test_thunk_ordering_cli.py +427 -0
  183. code_towel-1.947/tests/test_thunk_parameter_ordering.py +241 -0
  184. code_towel-1.947/tests/test_thunk_result_lifetimes.py +236 -0
  185. code_towel-1.947/tests/test_type_inference.py +874 -0
  186. code_towel-1.947/tests/test_type_oracle_projects.py +583 -0
  187. code_towel-1.947/tests/test_unconfigured_mypy.py +550 -0
  188. code_towel-1.947/tests/test_unifier_batch3.py +198 -0
  189. code_towel-1.947/tests/test_unifier_batch5.py +119 -0
  190. code_towel-1.947/tests/test_unifier_core.py +338 -0
  191. code_towel-1.947/tests/test_unifier_edge_cases.py +214 -0
  192. code_towel-1.947/tests/test_unifier_more_branches.py +230 -0
  193. code_towel-1.947/tests/test_untypeable_extractions.py +343 -0
  194. code_towel-1.947/uv.lock +1555 -0
  195. code_towel-1.792/CHANGELOG.md +0 -2354
  196. code_towel-1.792/CONTRIBUTING.md +0 -374
  197. code_towel-1.792/MANIFEST.in +0 -19
  198. code_towel-1.792/PKG-INFO +0 -233
  199. code_towel-1.792/README.md +0 -188
  200. code_towel-1.792/SECURITY.md +0 -31
  201. code_towel-1.792/docs/ADVERSARIAL_REVIEW.md +0 -202
  202. code_towel-1.792/docs/ARCHITECTURE.md +0 -1766
  203. code_towel-1.792/docs/CLI_GUIDE.md +0 -257
  204. code_towel-1.792/docs/DECISIONS.md +0 -1697
  205. code_towel-1.792/docs/GENERATED_CODE.md +0 -348
  206. code_towel-1.792/docs/KNOWN_LIMITATIONS.md +0 -2007
  207. code_towel-1.792/docs/NAMING.md +0 -105
  208. code_towel-1.792/docs/OPEN_SOURCE_AUDIT.md +0 -91
  209. code_towel-1.792/docs/PERFORMANCE.md +0 -238
  210. code_towel-1.792/docs/PRODUCTION_READINESS.md +0 -1136
  211. code_towel-1.792/docs/QUICKSTART.md +0 -110
  212. code_towel-1.792/docs/README.md +0 -51
  213. code_towel-1.792/docs/RELEASE_LOG.md +0 -789
  214. code_towel-1.792/docs/RELEASING.md +0 -552
  215. code_towel-1.792/docs/REQUIREMENTS.md +0 -40
  216. code_towel-1.792/docs/TYPING.md +0 -215
  217. code_towel-1.792/docs/USAGE_GUIDE.md +0 -811
  218. code_towel-1.792/docs/agent_log.md +0 -48
  219. code_towel-1.792/docs/proposals/README.md +0 -41
  220. code_towel-1.792/docs/proposals/decline-capabilities.md +0 -130
  221. code_towel-1.792/docs/proposals/dethunking.md +0 -107
  222. code_towel-1.792/docs/proposals/next-release.md +0 -327
  223. code_towel-1.792/docs/proposals/next-validation-final.md +0 -163
  224. code_towel-1.792/docs/proposals/next-validation.md +0 -136
  225. code_towel-1.792/docs/proposals/performance-roadmap.md +0 -248
  226. code_towel-1.792/docs/proposals/project-own-check.md +0 -132
  227. code_towel-1.792/docs/proposals/published-1772-comparison.md +0 -100
  228. code_towel-1.792/docs/proposals/shared-helper-module.md +0 -176
  229. code_towel-1.792/docs/proposals/template-method.md +0 -164
  230. code_towel-1.792/docs/proposals/type-parameters.md +0 -384
  231. code_towel-1.792/justfile +0 -198
  232. code_towel-1.792/pyproject.toml +0 -134
  233. code_towel-1.792/scripts/ecosystem/Dockerfile +0 -42
  234. code_towel-1.792/scripts/ecosystem/manifest.toml +0 -2610
  235. code_towel-1.792/scripts/ecosystem_check.py +0 -4054
  236. code_towel-1.792/src/code_towel.egg-info/PKG-INFO +0 -233
  237. code_towel-1.792/src/code_towel.egg-info/SOURCES.txt +0 -2585
  238. code_towel-1.792/src/towel/analysis_sources.py +0 -231
  239. code_towel-1.792/src/towel/canonical_ast.py +0 -115
  240. code_towel-1.792/src/towel/cli.py +0 -2318
  241. code_towel-1.792/src/towel/formatting.py +0 -1065
  242. code_towel-1.792/src/towel/parsing_warnings.py +0 -204
  243. code_towel-1.792/src/towel/program_files.py +0 -417
  244. code_towel-1.792/src/towel/renaming.py +0 -1561
  245. code_towel-1.792/src/towel/unification/annotation_ladder.py +0 -1586
  246. code_towel-1.792/src/towel/unification/annotation_wiring.py +0 -1965
  247. code_towel-1.792/src/towel/unification/annotations.py +0 -1666
  248. code_towel-1.792/src/towel/unification/argument_ownership.py +0 -413
  249. code_towel-1.792/src/towel/unification/block_analysis.py +0 -1261
  250. code_towel-1.792/src/towel/unification/block_signature.py +0 -123
  251. code_towel-1.792/src/towel/unification/bounded_cache.py +0 -137
  252. code_towel-1.792/src/towel/unification/clustering.py +0 -649
  253. code_towel-1.792/src/towel/unification/constant_consistency.py +0 -174
  254. code_towel-1.792/src/towel/unification/engine_state.py +0 -500
  255. code_towel-1.792/src/towel/unification/extractor.py +0 -1068
  256. code_towel-1.792/src/towel/unification/fixed_point.py +0 -1267
  257. code_towel-1.792/src/towel/unification/hof_promotion.py +0 -223
  258. code_towel-1.792/src/towel/unification/import_graph.py +0 -2123
  259. code_towel-1.792/src/towel/unification/insertion.py +0 -374
  260. code_towel-1.792/src/towel/unification/instantiation.py +0 -1174
  261. code_towel-1.792/src/towel/unification/materialize.py +0 -1353
  262. code_towel-1.792/src/towel/unification/models.py +0 -500
  263. code_towel-1.792/src/towel/unification/module_bindings.py +0 -477
  264. code_towel-1.792/src/towel/unification/namespace_writes.py +0 -641
  265. code_towel-1.792/src/towel/unification/narrowing.py +0 -845
  266. code_towel-1.792/src/towel/unification/pair_evaluation.py +0 -1819
  267. code_towel-1.792/src/towel/unification/parameterization.py +0 -360
  268. code_towel-1.792/src/towel/unification/pipeline.py +0 -480
  269. code_towel-1.792/src/towel/unification/refactor_engine.py +0 -1145
  270. code_towel-1.792/src/towel/unification/rehearing.py +0 -371
  271. code_towel-1.792/src/towel/unification/semantic_safety.py +0 -1657
  272. code_towel-1.792/src/towel/unification/structural_memo.py +0 -161
  273. code_towel-1.792/src/towel/unification/substitution.py +0 -134
  274. code_towel-1.792/src/towel/unification/thunk_inlining.py +0 -567
  275. code_towel-1.792/src/towel/unification/typing_forms.py +0 -325
  276. code_towel-1.792/src/towel/unification/unifier.py +0 -1206
  277. code_towel-1.792/src/towel/unification/unifier_state.py +0 -98
  278. code_towel-1.792/test_examples/README.md +0 -455
  279. code_towel-1.792/test_examples_crossfile/README.md +0 -244
  280. code_towel-1.792/tests/README.md +0 -351
  281. code_towel-1.792/tests/differential/export.py +0 -264
  282. code_towel-1.792/tests/differential/observer.py +0 -416
  283. code_towel-1.792/tests/differential/runner.py +0 -320
  284. code_towel-1.792/tests/hostile_execution.py +0 -910
  285. code_towel-1.792/tests/test_annotation_ladder_rules.py +0 -418
  286. code_towel-1.792/tests/test_audit_io_safety.py +0 -386
  287. code_towel-1.792/tests/test_builtins_across_modules.py +0 -680
  288. code_towel-1.792/tests/test_canonical_ast.py +0 -354
  289. code_towel-1.792/tests/test_cli_integration.py +0 -316
  290. code_towel-1.792/tests/test_crossfile_integration.py +0 -474
  291. code_towel-1.792/tests/test_current_release_documentation.py +0 -183
  292. code_towel-1.792/tests/test_differential_grammar.py +0 -207
  293. code_towel-1.792/tests/test_ecosystem_manifest_regressions.py +0 -281
  294. code_towel-1.792/tests/test_ecosystem_verdicts.py +0 -1559
  295. code_towel-1.792/tests/test_engine_adversarial.py +0 -1459
  296. code_towel-1.792/tests/test_error_paths.py +0 -292
  297. code_towel-1.792/tests/test_formatting_repeatability.py +0 -105
  298. code_towel-1.792/tests/test_fresh_top_level_imports.py +0 -88
  299. code_towel-1.792/tests/test_helper_annotations.py +0 -518
  300. code_towel-1.792/tests/test_helper_inventory.py +0 -232
  301. code_towel-1.792/tests/test_hostile_battery.py +0 -637
  302. code_towel-1.792/tests/test_hostile_crossfile_battery.py +0 -582
  303. code_towel-1.792/tests/test_hostile_scope_oracle.py +0 -341
  304. code_towel-1.792/tests/test_import_position.py +0 -227
  305. code_towel-1.792/tests/test_incremental_global_passes.py +0 -157
  306. code_towel-1.792/tests/test_isolated_format_tools.py +0 -246
  307. code_towel-1.792/tests/test_ordinary_module_writes.py +0 -260
  308. code_towel-1.792/tests/test_parameterize_builtins.py +0 -691
  309. code_towel-1.792/tests/test_parameterized_narrowing.py +0 -335
  310. code_towel-1.792/tests/test_parsing_warnings.py +0 -189
  311. code_towel-1.792/tests/test_pipeline_phases.py +0 -359
  312. code_towel-1.792/tests/test_platform_only_hosts.py +0 -283
  313. code_towel-1.792/tests/test_program_imports.py +0 -171
  314. code_towel-1.792/tests/test_program_type_names.py +0 -1092
  315. code_towel-1.792/tests/test_protocol_base_aliases.py +0 -297
  316. code_towel-1.792/tests/test_receiver_dependency.py +0 -158
  317. code_towel-1.792/tests/test_region_directives.py +0 -673
  318. code_towel-1.792/tests/test_rename_audit_regressions.py +0 -286
  319. code_towel-1.792/tests/test_rename_class_private_helpers.py +0 -374
  320. code_towel-1.792/tests/test_rename_discovery_regressions.py +0 -189
  321. code_towel-1.792/tests/test_source_encoding.py +0 -178
  322. code_towel-1.792/tests/test_thunk_inlining.py +0 -190
  323. code_towel-1.792/tests/test_type_inference.py +0 -847
  324. code_towel-1.792/tests/test_type_oracle_projects.py +0 -573
  325. code_towel-1.792/tests/test_unconfigured_mypy.py +0 -541
  326. code_towel-1.792/tests/test_unifier_batch3.py +0 -183
  327. code_towel-1.792/tests/test_unifier_batch5.py +0 -119
  328. code_towel-1.792/tests/test_unifier_core.py +0 -309
  329. code_towel-1.792/tests/test_unifier_edge_cases.py +0 -205
  330. code_towel-1.792/tests/test_unifier_more_branches.py +0 -222
  331. code_towel-1.792/tests/test_untypeable_extractions.py +0 -190
  332. code_towel-1.792/uv.lock +0 -1555
  333. {code_towel-1.792 → code_towel-1.947}/.flake8 +0 -0
  334. {code_towel-1.792 → code_towel-1.947}/.github/workflows/ci.yml +0 -0
  335. {code_towel-1.792 → code_towel-1.947}/.github/workflows/ecosystem.yml +0 -0
  336. {code_towel-1.792 → code_towel-1.947}/.pre-commit-config.yaml +0 -0
  337. {code_towel-1.792 → code_towel-1.947}/CODE_OF_CONDUCT.md +0 -0
  338. {code_towel-1.792 → code_towel-1.947}/LICENSE +0 -0
  339. {code_towel-1.792 → code_towel-1.947}/docs/CROSS_MODULE.md +0 -0
  340. {code_towel-1.792 → code_towel-1.947}/docs/proposals/preview-what-dry-would-do.md +0 -0
  341. {code_towel-1.792 → code_towel-1.947}/docs/proposals/reuse-existing-function.md +0 -0
  342. {code_towel-1.792 → code_towel-1.947}/docs/proposals/trusted-decorators.md +0 -0
  343. {code_towel-1.792 → code_towel-1.947}/scripts/add_copyright_headers.py +0 -0
  344. {code_towel-1.792 → code_towel-1.947}/scripts/audit_dependencies.py +0 -0
  345. {code_towel-1.792 → code_towel-1.947}/scripts/bench_refactor.py +0 -0
  346. {code_towel-1.792 → code_towel-1.947}/scripts/bench_similar_blocks.py +0 -0
  347. {code_towel-1.792 → code_towel-1.947}/scripts/check_mermaid.mjs +0 -0
  348. {code_towel-1.792 → code_towel-1.947}/scripts/promote_dry_helpers.py +0 -0
  349. {code_towel-1.792 → code_towel-1.947}/scripts/report_net_benefit_diff.py +0 -0
  350. {code_towel-1.792 → code_towel-1.947}/scripts/run_crossfile_coverage.py +0 -0
  351. {code_towel-1.792 → code_towel-1.947}/scripts/set_version.py +0 -0
  352. {code_towel-1.792 → code_towel-1.947}/scripts/trace_proposals.py +0 -0
  353. {code_towel-1.792 → code_towel-1.947}/scripts/verify-examples +0 -0
  354. {code_towel-1.792 → code_towel-1.947}/scripts/verify_release_evidence.py +0 -0
  355. {code_towel-1.792 → code_towel-1.947}/setup.cfg +0 -0
  356. {code_towel-1.792 → code_towel-1.947}/src/code_towel.egg-info/dependency_links.txt +0 -0
  357. {code_towel-1.792 → code_towel-1.947}/src/code_towel.egg-info/entry_points.txt +0 -0
  358. {code_towel-1.792 → code_towel-1.947}/src/code_towel.egg-info/requires.txt +0 -0
  359. {code_towel-1.792 → code_towel-1.947}/src/code_towel.egg-info/top_level.txt +0 -0
  360. {code_towel-1.792 → code_towel-1.947}/src/towel/__init__.py +0 -0
  361. {code_towel-1.792 → code_towel-1.947}/src/towel/_formatting_repeatability.py +0 -0
  362. {code_towel-1.792 → code_towel-1.947}/src/towel/_formatting_worker.py +0 -0
  363. {code_towel-1.792 → code_towel-1.947}/src/towel/_mypy_worker.py +0 -0
  364. {code_towel-1.792 → code_towel-1.947}/src/towel/changes.py +0 -0
  365. {code_towel-1.792 → code_towel-1.947}/src/towel/checker_project.py +0 -0
  366. {code_towel-1.792 → code_towel-1.947}/src/towel/consumers.py +0 -0
  367. {code_towel-1.792 → code_towel-1.947}/src/towel/coverage_config.py +0 -0
  368. {code_towel-1.792 → code_towel-1.947}/src/towel/declared_python.py +0 -0
  369. {code_towel-1.792 → code_towel-1.947}/src/towel/declared_requirements.py +0 -0
  370. {code_towel-1.792 → code_towel-1.947}/src/towel/diagnostics.py +0 -0
  371. {code_towel-1.792 → code_towel-1.947}/src/towel/filesystem.py +0 -0
  372. {code_towel-1.792 → code_towel-1.947}/src/towel/import_model.py +0 -0
  373. {code_towel-1.792 → code_towel-1.947}/src/towel/mypy_ci_policy.py +0 -0
  374. {code_towel-1.792 → code_towel-1.947}/src/towel/project_layout.py +0 -0
  375. {code_towel-1.792 → code_towel-1.947}/src/towel/project_tools.py +0 -0
  376. {code_towel-1.792 → code_towel-1.947}/src/towel/py.typed +0 -0
  377. {code_towel-1.792 → code_towel-1.947}/src/towel/pyright_session.py +0 -0
  378. {code_towel-1.792 → code_towel-1.947}/src/towel/reachability.py +0 -0
  379. {code_towel-1.792 → code_towel-1.947}/src/towel/runtime_guards.py +0 -0
  380. {code_towel-1.792 → code_towel-1.947}/src/towel/shipped_files.py +0 -0
  381. {code_towel-1.792 → code_towel-1.947}/src/towel/source_files.py +0 -0
  382. {code_towel-1.792 → code_towel-1.947}/src/towel/source_text.py +0 -0
  383. {code_towel-1.792 → code_towel-1.947}/src/towel/type_baseline.py +0 -0
  384. {code_towel-1.792 → code_towel-1.947}/src/towel/type_inference.py +0 -0
  385. {code_towel-1.792 → code_towel-1.947}/src/towel/unification/__init__.py +0 -0
  386. {code_towel-1.792 → code_towel-1.947}/src/towel/unification/annotation_imports.py +0 -0
  387. {code_towel-1.792 → code_towel-1.947}/src/towel/unification/assignment_analyzer.py +0 -0
  388. {code_towel-1.792 → code_towel-1.947}/src/towel/unification/binding_context.py +0 -0
  389. {code_towel-1.792 → code_towel-1.947}/src/towel/unification/binding_detector.py +0 -0
  390. {code_towel-1.792 → code_towel-1.947}/src/towel/unification/block_comments.py +0 -0
  391. {code_towel-1.792 → code_towel-1.947}/src/towel/unification/builtins.py +0 -0
  392. {code_towel-1.792 → code_towel-1.947}/src/towel/unification/class_private.py +0 -0
  393. {code_towel-1.792 → code_towel-1.947}/src/towel/unification/defaults.py +0 -0
  394. {code_towel-1.792 → code_towel-1.947}/src/towel/unification/definite_assignment.py +0 -0
  395. {code_towel-1.792 → code_towel-1.947}/src/towel/unification/exceptions.py +0 -0
  396. {code_towel-1.792 → code_towel-1.947}/src/towel/unification/extraction_policy.py +0 -0
  397. {code_towel-1.792 → code_towel-1.947}/src/towel/unification/frame_ownership.py +0 -0
  398. {code_towel-1.792 → code_towel-1.947}/src/towel/unification/function_index.py +0 -0
  399. {code_towel-1.792 → code_towel-1.947}/src/towel/unification/function_scope.py +0 -0
  400. {code_towel-1.792 → code_towel-1.947}/src/towel/unification/generic_annotations.py +0 -0
  401. {code_towel-1.792 → code_towel-1.947}/src/towel/unification/known_platforms.py +0 -0
  402. {code_towel-1.792 → code_towel-1.947}/src/towel/unification/lexical_scopes.py +0 -0
  403. {code_towel-1.792 → code_towel-1.947}/src/towel/unification/orphan_detector.py +0 -0
  404. {code_towel-1.792 → code_towel-1.947}/src/towel/unification/overlap.py +0 -0
  405. {code_towel-1.792 → code_towel-1.947}/src/towel/unification/parallel.py +0 -0
  406. {code_towel-1.792 → code_towel-1.947}/src/towel/unification/parameters.py +0 -0
  407. {code_towel-1.792 → code_towel-1.947}/src/towel/unification/placement.py +0 -0
  408. {code_towel-1.792 → code_towel-1.947}/src/towel/unification/profitability.py +0 -0
  409. {code_towel-1.792 → code_towel-1.947}/src/towel/unification/program_imports.py +0 -0
  410. {code_towel-1.792 → code_towel-1.947}/src/towel/unification/progress.py +0 -0
  411. {code_towel-1.792 → code_towel-1.947}/src/towel/unification/project_layout.py +0 -0
  412. {code_towel-1.792 → code_towel-1.947}/src/towel/unification/protocol_bases.py +0 -0
  413. {code_towel-1.792 → code_towel-1.947}/src/towel/unification/retained_bindings.py +0 -0
  414. {code_towel-1.792 → code_towel-1.947}/src/towel/unification/reuse.py +0 -0
  415. {code_towel-1.792 → code_towel-1.947}/src/towel/unification/revealed_types.py +0 -0
  416. {code_towel-1.792 → code_towel-1.947}/src/towel/unification/scope_analyzer.py +0 -0
  417. {code_towel-1.792 → code_towel-1.947}/src/towel/unification/splicing.py +0 -0
  418. {code_towel-1.792 → code_towel-1.947}/src/towel/unification/statement_facts.py +0 -0
  419. {code_towel-1.792 → code_towel-1.947}/src/towel/unification/static_positions.py +0 -0
  420. {code_towel-1.792 → code_towel-1.947}/src/towel/unification/type_bindings.py +0 -0
  421. {code_towel-1.792 → code_towel-1.947}/src/towel/unification/type_generalization.py +0 -0
  422. {code_towel-1.792 → code_towel-1.947}/src/towel/unification/visitors.py +0 -0
  423. {code_towel-1.792 → code_towel-1.947}/test_examples/annotated_module.py +0 -0
  424. {code_towel-1.792 → code_towel-1.947}/test_examples/binding_constructs_comprehensive.py +0 -0
  425. {code_towel-1.792 → code_towel-1.947}/test_examples/bindings_comprehensions.py +0 -0
  426. {code_towel-1.792 → code_towel-1.947}/test_examples/bindings_for_loops.py +0 -0
  427. {code_towel-1.792 → code_towel-1.947}/test_examples/closure_adversarial.py +0 -0
  428. {code_towel-1.792 → code_towel-1.947}/test_examples/complex_expressions.py +0 -0
  429. {code_towel-1.792 → code_towel-1.947}/test_examples/control_flow_adversarial.py +0 -0
  430. {code_towel-1.792 → code_towel-1.947}/test_examples/edge_cases_stress_test.py +0 -0
  431. {code_towel-1.792 → code_towel-1.947}/test_examples/example1_simple.py +0 -0
  432. {code_towel-1.792 → code_towel-1.947}/test_examples/example2_classes.py +0 -0
  433. {code_towel-1.792 → code_towel-1.947}/test_examples/example3_file1.py +0 -0
  434. {code_towel-1.792 → code_towel-1.947}/test_examples/example3_file2.py +0 -0
  435. {code_towel-1.792 → code_towel-1.947}/test_examples/example4_complex.py +0 -0
  436. {code_towel-1.792 → code_towel-1.947}/test_examples/exception_adversarial.py +0 -0
  437. {code_towel-1.792 → code_towel-1.947}/test_examples/fstrings_constants.py +0 -0
  438. {code_towel-1.792 → code_towel-1.947}/test_examples/functional_patterns.py +0 -0
  439. {code_towel-1.792 → code_towel-1.947}/test_examples/generators_async.py +0 -0
  440. {code_towel-1.792 → code_towel-1.947}/test_examples/global_nonlocal_examples.py +0 -0
  441. {code_towel-1.792 → code_towel-1.947}/test_examples/hygienic_naming.py +0 -0
  442. {code_towel-1.792 → code_towel-1.947}/test_examples/method_chains.py +0 -0
  443. {code_towel-1.792 → code_towel-1.947}/test_examples/nested_structures.py +0 -0
  444. {code_towel-1.792 → code_towel-1.947}/test_examples/real_world_patterns.py +0 -0
  445. {code_towel-1.792 → code_towel-1.947}/test_examples/referential_transparency.py +0 -0
  446. {code_towel-1.792 → code_towel-1.947}/test_examples/return_values.py +0 -0
  447. {code_towel-1.792 → code_towel-1.947}/test_examples/scoping_edge_cases.py +0 -0
  448. {code_towel-1.792 → code_towel-1.947}/test_examples/side_effects_adversarial.py +0 -0
  449. {code_towel-1.792 → code_towel-1.947}/test_examples/syntactic_coverage_comprehensive.py +0 -0
  450. {code_towel-1.792 → code_towel-1.947}/test_examples/tricky_edge_cases_adversarial.py +0 -0
  451. {code_towel-1.792 → code_towel-1.947}/test_examples_crossfile/class_hierarchy/base_record.py +0 -0
  452. {code_towel-1.792 → code_towel-1.947}/test_examples_crossfile/class_hierarchy/scored_record.py +0 -0
  453. {code_towel-1.792 → code_towel-1.947}/test_examples_crossfile/multi_level/api/checkout.py +0 -0
  454. {code_towel-1.792 → code_towel-1.947}/test_examples_crossfile/multi_level/core/services/payment.py +0 -0
  455. {code_towel-1.792 → code_towel-1.947}/test_examples_crossfile/multi_level/utils/validators.py +0 -0
  456. {code_towel-1.792 → code_towel-1.947}/test_examples_crossfile/nested_structure/lib/report_generator.py +0 -0
  457. {code_towel-1.792 → code_towel-1.947}/test_examples_crossfile/nested_structure/src/data_processor.py +0 -0
  458. {code_towel-1.792 → code_towel-1.947}/test_examples_crossfile/simple_crossfile/admin_service.py +0 -0
  459. {code_towel-1.792 → code_towel-1.947}/test_examples_crossfile/simple_crossfile/user_service.py +0 -0
  460. {code_towel-1.792 → code_towel-1.947}/test_examples_crossfile_expected_output/class_hierarchy/base_record.py +0 -0
  461. {code_towel-1.792 → code_towel-1.947}/test_examples_crossfile_expected_output/class_hierarchy/scored_record.py +0 -0
  462. {code_towel-1.792 → code_towel-1.947}/test_examples_crossfile_expected_output/multi_level/api/checkout.py +0 -0
  463. {code_towel-1.792 → code_towel-1.947}/test_examples_crossfile_expected_output/multi_level/core/services/payment.py +0 -0
  464. {code_towel-1.792 → code_towel-1.947}/test_examples_crossfile_expected_output/multi_level/utils/validators.py +0 -0
  465. {code_towel-1.792 → code_towel-1.947}/test_examples_crossfile_expected_output/nested_structure/lib/report_generator.py +0 -0
  466. {code_towel-1.792 → code_towel-1.947}/test_examples_crossfile_expected_output/nested_structure/src/data_processor.py +0 -0
  467. {code_towel-1.792 → code_towel-1.947}/test_examples_crossfile_expected_output/simple_crossfile/admin_service.py +0 -0
  468. {code_towel-1.792 → code_towel-1.947}/test_examples_crossfile_expected_output/simple_crossfile/user_service.py +0 -0
  469. {code_towel-1.792 → code_towel-1.947}/test_examples_expected_output/annotated_module.py +0 -0
  470. {code_towel-1.792 → code_towel-1.947}/test_examples_expected_output/binding_constructs_comprehensive.py +0 -0
  471. {code_towel-1.792 → code_towel-1.947}/test_examples_expected_output/bindings_comprehensions.py +0 -0
  472. {code_towel-1.792 → code_towel-1.947}/test_examples_expected_output/bindings_for_loops.py +0 -0
  473. {code_towel-1.792 → code_towel-1.947}/test_examples_expected_output/closure_adversarial.py +0 -0
  474. {code_towel-1.792 → code_towel-1.947}/test_examples_expected_output/complex_expressions.py +0 -0
  475. {code_towel-1.792 → code_towel-1.947}/test_examples_expected_output/control_flow_adversarial.py +0 -0
  476. {code_towel-1.792 → code_towel-1.947}/test_examples_expected_output/edge_cases_stress_test.py +0 -0
  477. {code_towel-1.792 → code_towel-1.947}/test_examples_expected_output/example1_simple.py +0 -0
  478. {code_towel-1.792 → code_towel-1.947}/test_examples_expected_output/example2_classes.py +0 -0
  479. {code_towel-1.792 → code_towel-1.947}/test_examples_expected_output/example3_file1.py +0 -0
  480. {code_towel-1.792 → code_towel-1.947}/test_examples_expected_output/example3_file2.py +0 -0
  481. {code_towel-1.792 → code_towel-1.947}/test_examples_expected_output/example4_complex.py +0 -0
  482. {code_towel-1.792 → code_towel-1.947}/test_examples_expected_output/exception_adversarial.py +0 -0
  483. {code_towel-1.792 → code_towel-1.947}/test_examples_expected_output/fstrings_constants.py +0 -0
  484. {code_towel-1.792 → code_towel-1.947}/test_examples_expected_output/functional_patterns.py +0 -0
  485. {code_towel-1.792 → code_towel-1.947}/test_examples_expected_output/generators_async.py +0 -0
  486. {code_towel-1.792 → code_towel-1.947}/test_examples_expected_output/global_nonlocal_examples.py +0 -0
  487. {code_towel-1.792 → code_towel-1.947}/test_examples_expected_output/hygienic_naming.py +0 -0
  488. {code_towel-1.792 → code_towel-1.947}/test_examples_expected_output/method_chains.py +0 -0
  489. {code_towel-1.792 → code_towel-1.947}/test_examples_expected_output/nested_structures.py +0 -0
  490. {code_towel-1.792 → code_towel-1.947}/test_examples_expected_output/parameter_cells/edge_cases_stress_test.py +0 -0
  491. {code_towel-1.792 → code_towel-1.947}/test_examples_expected_output/parameter_cells/method_chains.py +0 -0
  492. {code_towel-1.792 → code_towel-1.947}/test_examples_expected_output/parameter_cells/nested_structures.py +0 -0
  493. {code_towel-1.792 → code_towel-1.947}/test_examples_expected_output/parameter_cells/syntactic_coverage_comprehensive.py +0 -0
  494. {code_towel-1.792 → code_towel-1.947}/test_examples_expected_output/real_world_patterns.py +0 -0
  495. {code_towel-1.792 → code_towel-1.947}/test_examples_expected_output/referential_transparency.py +0 -0
  496. {code_towel-1.792 → code_towel-1.947}/test_examples_expected_output/return_values.py +0 -0
  497. {code_towel-1.792 → code_towel-1.947}/test_examples_expected_output/scoping_edge_cases.py +0 -0
  498. {code_towel-1.792 → code_towel-1.947}/test_examples_expected_output/side_effects_adversarial.py +0 -0
  499. {code_towel-1.792 → code_towel-1.947}/test_examples_expected_output/syntactic_coverage_comprehensive.py +0 -0
  500. {code_towel-1.792 → code_towel-1.947}/test_examples_expected_output/tricky_edge_cases_adversarial.py +0 -0
  501. {code_towel-1.792 → code_towel-1.947}/tests/OBSERVATIONAL_EQUIVALENCE.md +0 -0
  502. {code_towel-1.792 → code_towel-1.947}/tests/__init__.py +0 -0
  503. {code_towel-1.792 → code_towel-1.947}/tests/audit_defects.py +0 -0
  504. {code_towel-1.792 → code_towel-1.947}/tests/automatic_equivalence_tester.py +0 -0
  505. {code_towel-1.792 → code_towel-1.947}/tests/compiler_golden_profiles.py +0 -0
  506. {code_towel-1.792 → code_towel-1.947}/tests/conftest.py +0 -0
  507. {code_towel-1.792 → code_towel-1.947}/tests/crossfile_equivalence_tester.py +0 -0
  508. {code_towel-1.792 → code_towel-1.947}/tests/differential/__init__.py +0 -0
  509. {code_towel-1.792 → code_towel-1.947}/tests/differential/cases.py +0 -0
  510. {code_towel-1.792 → code_towel-1.947}/tests/differential/comparison.py +0 -0
  511. {code_towel-1.792 → code_towel-1.947}/tests/differential/fuzz.py +0 -0
  512. {code_towel-1.792 → code_towel-1.947}/tests/differential/grammar.py +0 -0
  513. {code_towel-1.792 → code_towel-1.947}/tests/differential/scope_grammar.py +0 -0
  514. {code_towel-1.792 → code_towel-1.947}/tests/ecosystem_context_sources/bottle/pyproject.toml +0 -0
  515. {code_towel-1.792 → code_towel-1.947}/tests/ecosystem_context_sources/httpx/pyproject.toml +0 -0
  516. {code_towel-1.792 → code_towel-1.947}/tests/ecosystem_context_sources/index.json +0 -0
  517. {code_towel-1.792 → code_towel-1.947}/tests/ecosystem_context_sources/jinja2/.pre-commit-config.yaml +0 -0
  518. {code_towel-1.792 → code_towel-1.947}/tests/ecosystem_context_sources/jinja2/pyproject.toml +0 -0
  519. {code_towel-1.792 → code_towel-1.947}/tests/ecosystem_context_sources/jinja2/uv.lock +0 -0
  520. {code_towel-1.792 → code_towel-1.947}/tests/ecosystem_context_sources/markdown-it-py/.pre-commit-config.yaml +0 -0
  521. {code_towel-1.792 → code_towel-1.947}/tests/ecosystem_context_sources/markdown-it-py/pyproject.toml +0 -0
  522. {code_towel-1.792 → code_towel-1.947}/tests/ecosystem_context_sources/networkx/.pre-commit-config.yaml +0 -0
  523. {code_towel-1.792 → code_towel-1.947}/tests/ecosystem_context_sources/networkx/pyproject.toml +0 -0
  524. {code_towel-1.792 → code_towel-1.947}/tests/ecosystem_context_sources/rich/.pre-commit-config.yaml +0 -0
  525. {code_towel-1.792 → code_towel-1.947}/tests/ecosystem_context_sources/rich/poetry.lock +0 -0
  526. {code_towel-1.792 → code_towel-1.947}/tests/ecosystem_context_sources/rich/pyproject.toml +0 -0
  527. {code_towel-1.792 → code_towel-1.947}/tests/ecosystem_context_sources/soupsieve/pyproject.toml +0 -0
  528. {code_towel-1.792 → code_towel-1.947}/tests/ecosystem_context_sources/starlette/pyproject.toml +0 -0
  529. {code_towel-1.792 → code_towel-1.947}/tests/ecosystem_context_sources/starlette/uv.lock +0 -0
  530. {code_towel-1.792 → code_towel-1.947}/tests/ecosystem_context_sources/tenacity/pyproject.toml +0 -0
  531. {code_towel-1.792 → code_towel-1.947}/tests/ecosystem_context_sources/towel-main/.pre-commit-config.yaml +0 -0
  532. {code_towel-1.792 → code_towel-1.947}/tests/ecosystem_context_sources/towel-main/pyproject.toml +0 -0
  533. {code_towel-1.792 → code_towel-1.947}/tests/ecosystem_context_sources/towel-main/uv.lock +0 -0
  534. {code_towel-1.792 → code_towel-1.947}/tests/ecosystem_fixtures.py +0 -0
  535. {code_towel-1.792 → code_towel-1.947}/tests/edge_case_values.py +0 -0
  536. {code_towel-1.792 → code_towel-1.947}/tests/equivalence_targets.py +0 -0
  537. {code_towel-1.792 → code_towel-1.947}/tests/generate_baseline.py +0 -0
  538. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/h01_side_effect_order.py +0 -0
  539. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/h02_conditional_eval.py +0 -0
  540. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/h03_loop_reeval.py +0 -0
  541. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/h04_closure_freevar.py +0 -0
  542. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/h05_cond_return_plus_retvar.py +0 -0
  543. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/h06_del_in_block.py +0 -0
  544. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/h07_except_unbind.py +0 -0
  545. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/h08_late_binding_closure.py +0 -0
  546. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/h10_short_circuit.py +0 -0
  547. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/h13_dunder_file.py +0 -0
  548. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/h26_match_capture.py +0 -0
  549. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/h38_closure_after_block.py +0 -0
  550. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/h39_augassign_after_block.py +0 -0
  551. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/h51_semicolons.py +0 -0
  552. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/h52_del_after_block.py +0 -0
  553. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/h53_nested_func_reads_retvar.py +0 -0
  554. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/h54_attr_param_property.py +0 -0
  555. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/h55_walrus_used_after.py +0 -0
  556. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/h56_global_write.py +0 -0
  557. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/h57_exception_in_param.py +0 -0
  558. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/h58_nested_def_freevar_reassigned.py +0 -0
  559. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/h59_retvar_conditional_unbound.py +0 -0
  560. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/h60_finally_return.py +0 -0
  561. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/h61_str_method_param.py +0 -0
  562. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/p01_static_helper_class_name_shadowed_by_parameter.py +0 -0
  563. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/p02_static_helper_class_deleted.py +0 -0
  564. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/p03_static_helper_mangled_class_name.py +0 -0
  565. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/p04_static_helper_class_decorator_returns_factory.py +0 -0
  566. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/p05_static_helper_class_global_rebound.py +0 -0
  567. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/p06_static_helper_called_while_class_body_runs.py +0 -0
  568. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/p07_static_methods_called_while_class_body_runs.py +0 -0
  569. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/p08_classmethod_never_using_cls.py +0 -0
  570. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/p09_static_helper_metaclass_hides_attribute.py +0 -0
  571. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/p10_one_line_exception_base.py +0 -0
  572. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/p11_one_line_base_docstring_and_assignment.py +0 -0
  573. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/p12_one_line_body_after_a_split_header.py +0 -0
  574. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/p13_protocol_default_methods.py +0 -0
  575. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/p14_protocol_common_ancestor.py +0 -0
  576. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/p15_class_decorator_rebuilds_namespace.py +0 -0
  577. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/p16_class_decorator_wraps_every_function.py +0 -0
  578. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/p17_decorated_base_rebuilds_namespace.py +0 -0
  579. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/p18_known_class_decorators_keep_the_helper.py +0 -0
  580. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/p19_thunk_of_possibly_unbound_local.py +0 -0
  581. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/p20_thunk_of_loop_variable.py +0 -0
  582. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/p21_helper_placed_after_an_assignment_that_calls_it.py +0 -0
  583. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r01_property_thunk_order.py +0 -0
  584. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r02_cluster_attrs.py +0 -0
  585. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r07_attr_two_positions.py +0 -0
  586. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r100_clustered_site_with_live_binding.py +0 -0
  587. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r101_same_named_method_forces_module_helper.py +0 -0
  588. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r102_whole_body_reuse.py +0 -0
  589. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r103_lambda_parameter_spelling.py +0 -0
  590. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r104_walrus_target_spelling.py +0 -0
  591. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r105_closure_over_block_bound_name_rebound_after.py +0 -0
  592. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r106_dir_reads_the_frame.py +0 -0
  593. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r107_unbound_global_argument.py +0 -0
  594. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r108_clustered_sites_assign_the_returned_name.py +0 -0
  595. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r109_eager_optional_import_failed.py +0 -0
  596. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r110_eager_type_checking_import.py +0 -0
  597. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r111_eager_module_except_as_name.py +0 -0
  598. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r112_eager_module_match_capture_unmatched.py +0 -0
  599. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r113_eager_class_attr_in_method.py +0 -0
  600. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r114_eager_nested_class_attr.py +0 -0
  601. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r115_eager_class_in_function_attr.py +0 -0
  602. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r116_eager_enclosing_bound_after_inner_call.py +0 -0
  603. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r117_eager_enclosing_deleted_before_inner_call.py +0 -0
  604. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r118_eager_enclosing_conditionally_bound.py +0 -0
  605. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r119_eager_module_def_and_class_after_call.py +0 -0
  606. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r11_same_function_pair.py +0 -0
  607. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r120_eager_module_import_after_call.py +0 -0
  608. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r121_eager_comprehension_variable.py +0 -0
  609. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r122_eager_lambda_parameter.py +0 -0
  610. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r123_direct_eval_after_block.py +0 -0
  611. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r124_eval_alias_reads_preblock_name.py +0 -0
  612. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r125_locals_dir_after_block.py +0 -0
  613. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r126_locals_in_nested_scope.py +0 -0
  614. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r127_eval_alias_partial_block.py +0 -0
  615. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r128_warn_stacklevel_via_alias.py +0 -0
  616. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r129_warning_registry_dedup.py +0 -0
  617. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r130_resource_observed_after_block_differs.py +0 -0
  618. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r131_weakref_and_id_identity.py +0 -0
  619. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r132_async_comprehension_in_block.py +0 -0
  620. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r133_formfeed.py +0 -0
  621. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r134_u2028_in_comment_shifts_splice.py +0 -0
  622. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r135_formfeed_line_shifts_splice.py +0 -0
  623. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r136_u2028_in_string_literal.py +0 -0
  624. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r137_x1c_x85_in_comment.py +0 -0
  625. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r138_u2028_comment_same_indent_neighbours.py +0 -0
  626. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r139_literal_roundtrip.py +0 -0
  627. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r140_unbound_name_on_untaken_branch.py +0 -0
  628. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r141_module_name_bound_after_an_early_call.py +0 -0
  629. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r142_module_data_rebound_by_callback.py +0 -0
  630. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r143_module_name_shadowed_by_a_local_elsewhere.py +0 -0
  631. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r144_class_cell_in_a_method_helper.py +0 -0
  632. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r145_getframe_assigned_alias.py +0 -0
  633. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r146_module_function_reads_caller_frame.py +0 -0
  634. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r147_wide_int_literal.py +0 -0
  635. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r148_equal_constants_of_different_types.py +0 -0
  636. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r149_match_pattern_reads_caller_names.py +0 -0
  637. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r14_starred_param.py +0 -0
  638. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r150_pattern_parts_that_differ.py +0 -0
  639. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r151_pattern_names_that_may_differ.py +0 -0
  640. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r152_definition_time_reads.py +0 -0
  641. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r153_class_definition_reads.py +0 -0
  642. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r154_bare_annotation_reads_the_caller.py +0 -0
  643. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r155_lazy_type_values_close_over_caller_names.pynew +0 -0
  644. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r156_created_objects_that_escape.py +0 -0
  645. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r157_created_objects_only_called.py +0 -0
  646. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r158_getattr_serves_unknown_names_from_data.py +0 -0
  647. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r159_frame_handle_before_a_nested_block.py +0 -0
  648. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r160_host_binds_any_before_its_last_import.py +0 -0
  649. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r161_module_with_all_gains_no_public_name.py +0 -0
  650. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r162_host_star_imports_callable.py +0 -0
  651. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r1792_aliased_suppress_conditional_read.py +0 -0
  652. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r1792_external_exception_partial.py +0 -0
  653. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r1792_factory_finalizer_continuation.py +0 -0
  654. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r1792_factory_finalizer_order.py +0 -0
  655. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r1792_formatting_destination_indentation.py +0 -0
  656. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r1792_protocol_caught_exception.py +0 -0
  657. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r1792_protocol_context_target.py +0 -0
  658. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r1792_protocol_explicit_call_control.py +0 -0
  659. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r1792_protocol_iteration_target.py +0 -0
  660. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r1792_protocol_nested_if.py +0 -0
  661. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r1792_protocol_operator.py +0 -0
  662. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r1792_protocol_property.py +0 -0
  663. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r1792_protocol_subscript.py +0 -0
  664. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r1792_value_return_owner.py +0 -0
  665. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r22_fstring_attr.py +0 -0
  666. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r26_attr_store_param.py +0 -0
  667. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r27_del_subscript.py +0 -0
  668. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r32_method_callee.py +0 -0
  669. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r38_name_two_positions.py +0 -0
  670. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r39_cluster_alpha.py +0 -0
  671. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r40_class_hierarchy.py +0 -0
  672. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r41_conditional_call_param.py +0 -0
  673. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r42_loop_call_param.py +0 -0
  674. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r43_opaque_decorator_receiver.py +0 -0
  675. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r44_cluster_nested_overlap.py +0 -0
  676. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r45_async_no_await.py +0 -0
  677. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r46_nonlocal_counter.py +0 -0
  678. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r47_lru_cache_method.py +0 -0
  679. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r50_helper_name_collision.py +0 -0
  680. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r53_try_else_binding.py +0 -0
  681. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r54_with_binding_used_after.py +0 -0
  682. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r55_chained_assign.py +0 -0
  683. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r57_star_unpack.py +0 -0
  684. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r58_escaping_closure.py +0 -0
  685. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r60_local_import.py +0 -0
  686. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r61_same_function_clean.py +0 -0
  687. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r62_recursion.py +0 -0
  688. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r63_except_var_used_in_handler.py +0 -0
  689. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r66_conditional_callee.py +0 -0
  690. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r69_annassign.py +0 -0
  691. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r72_global_promoted.py +0 -0
  692. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r73_slice_vs_index.py +0 -0
  693. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r74_starred_vs_plain.py +0 -0
  694. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r75_prior_helper_param_names.py +0 -0
  695. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r76_return_order.py +0 -0
  696. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r77_mixed_return_and_variables.py +0 -0
  697. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r78_walrus_in_parameter.py +0 -0
  698. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r79_list_display_in_loop.py +0 -0
  699. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7bi_augassign_and_del_after_block.py +0 -0
  700. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7bi_except_name_in_nested_block.py +0 -0
  701. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7bi_loop_capture_def_rebind_prebound.py +0 -0
  702. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7bi_loop_del_before_eager_read.py +0 -0
  703. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7bi_read_before_own_binding.py +0 -0
  704. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7bi_renamed_binder_named_by_unbound_error.py +0 -0
  705. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7c_loop_copy_beside_a_top_level_twin.py +0 -0
  706. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7c_mangled_import_names.py +0 -0
  707. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7c_mangled_parameter_passed_by_keyword.py +0 -0
  708. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7c_mangled_parameter_passed_by_keyword_in_a_method_helper.py +0 -0
  709. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7c_rebinding_enclosing_function_beside_a_benign_twin.py +0 -0
  710. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7c_top_level_copy_beside_a_loop_copy.py +0 -0
  711. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7c_unmangled_parameter_passed_by_keyword.py +0 -0
  712. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7d_instrumenting_call_applied_by_hand.py +0 -0
  713. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7d_instrumenting_class_decorator.py +0 -0
  714. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7d_instrumenting_enclosing_function.py +0 -0
  715. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7d_instrumenting_function_decorator.py +0 -0
  716. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7d_metaclass_recompiles_methods.py +0 -0
  717. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7d_method_helper_in_a_testcase.py +0 -0
  718. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7d_plain_wrapper_applied_by_hand.py +0 -0
  719. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7d_plain_wrapper_decorator.py +0 -0
  720. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_binding_builtin_rebound_mid_module.py +0 -0
  721. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_binding_cell_filled_late.py +0 -0
  722. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_binding_cell_read_before_fill.py +0 -0
  723. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_binding_class_attr_vs_local.py +0 -0
  724. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_binding_dunder_name_file_samemodule.py +0 -0
  725. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_binding_global_rebound_by_callee.py +0 -0
  726. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_binding_global_vs_local.py +0 -0
  727. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_binding_loop_var_leak.py +0 -0
  728. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_binding_module_getattr.py +0 -0
  729. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_binding_unbound_local_handler.py +0 -0
  730. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_builtins_differ_in_builtin.py +0 -0
  731. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_builtins_mock_patch_module.py +0 -0
  732. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_builtins_module_shadows_len.py +0 -0
  733. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_builtins_param_named_len.py +0 -0
  734. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_builtins_print_shadowed_local.py +0 -0
  735. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_classhost_dataclass_slots_super.py +0 -0
  736. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_classhost_dunder_class_same_class.py +0 -0
  737. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_classhost_enum_methods.py +0 -0
  738. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_classhost_getattr_fallback.py +0 -0
  739. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_classhost_init_subclass_wraps.py +0 -0
  740. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_classhost_metaclass_registry.py +0 -0
  741. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_classhost_private_same_class.py +0 -0
  742. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_classhost_siblings_plain.py +0 -0
  743. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_classhost_underscore_class_names.py +0 -0
  744. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_classhost_zero_arg_super.py +0 -0
  745. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_cluster_K_cell.py +0 -0
  746. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_cluster_generator_site.py +0 -0
  747. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_cluster_local_K.py +0 -0
  748. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_cluster_method_site.py +0 -0
  749. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_ctrl_break_in_try_finally.py +0 -0
  750. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_ctrl_match_class_pattern.py +0 -0
  751. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_ctrl_nested_try.py +0 -0
  752. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_ctrl_suppress_context.py +0 -0
  753. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_ctrl_walrus_while.py +0 -0
  754. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_directives_fmt_off_region.py +0 -0
  755. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_directives_noqa_on_argument.py +0 -0
  756. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_directives_pragma_branch.py +0 -0
  757. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_directives_type_ignore_line.py +0 -0
  758. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_extra_pragma_with_header.py +0 -0
  759. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_grammar_t11254_read_before_bind.py +0 -0
  760. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_grammar_u0217_read_before_bind.py +0 -0
  761. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_grammar_u0417_augassign_after_block.py +0 -0
  762. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_grammar_u0898_for_target_prebound.py +0 -0
  763. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_late_after_block_augassign.py +0 -0
  764. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_late_after_block_del.py +0 -0
  765. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_literals_cast_literal.py +0 -0
  766. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_literals_enum_functional.py +0 -0
  767. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_literals_gettext_differ.py +0 -0
  768. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_literals_typevar_name.py +0 -0
  769. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_misc_async_no_await.py +0 -0
  770. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_misc_binder_renamed_del_message.py +0 -0
  771. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_misc_binder_renamed_unbound_message_inner.py +0 -0
  772. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_misc_block_raises_in_handler_context.py +0 -0
  773. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_misc_decorated_lru_cache.py +0 -0
  774. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_misc_except_star_reraise.py +0 -0
  775. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_misc_generator_return_block.py +0 -0
  776. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_misc_mutable_default_host.py +0 -0
  777. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_misc_nested_host_called_early.py +0 -0
  778. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_misc_super_inside_block.py +0 -0
  779. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_prebound_class_conditional_rebind.py +0 -0
  780. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_prebound_def_conditional_rebind.py +0 -0
  781. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_prebound_for_else_prebound.py +0 -0
  782. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_prebound_for_read_in_block.py +0 -0
  783. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_prebound_for_target_attr_prebound.py +0 -0
  784. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_prebound_for_tuple_target.py +0 -0
  785. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_prebound_match_capture_prebound.py +0 -0
  786. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_prebound_try_except_else_bind.py +0 -0
  787. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_prebound_while_walrus_prebound.py +0 -0
  788. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_prebound_with_enter_raises_caught.py +0 -0
  789. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_srctext_bom.py +0 -0
  790. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_srctext_cp1252_quotes.py +0 -0
  791. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_srctext_crlf.py +0 -0
  792. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_srctext_form_feed.py +0 -0
  793. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_srctext_fstring_nested_quotes.py +0 -0
  794. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_srctext_latin1_literals.py +0 -0
  795. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_srctext_named_escape.py +0 -0
  796. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_srctext_semicolons_continuations.py +0 -0
  797. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_srctext_tabs_indent.py +0 -0
  798. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_thunks2_dict_unhashable.py +0 -0
  799. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_thunks2_dict_unpack.py +0 -0
  800. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_thunks2_lambda_default.py +0 -0
  801. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_thunks2_lambda_kwdefault.py +0 -0
  802. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_thunks2_list_starred.py +0 -0
  803. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_thunks2_plain_first.py +0 -0
  804. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_thunks2_property_first.py +0 -0
  805. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_thunks2_set_hash_effect.py +0 -0
  806. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_thunks2_set_unhashable.py +0 -0
  807. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_thunks2_tuple_starred.py +0 -0
  808. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_thunks2_two_thunks_order.py +0 -0
  809. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_thunks2_undefined_global.py +0 -0
  810. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_thunks_call_arg_order.py +0 -0
  811. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_thunks_conditional.py +0 -0
  812. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_thunks_dict_order.py +0 -0
  813. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_thunks_lambda_default_first.py +0 -0
  814. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_thunks_match_guard.py +0 -0
  815. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7fz_thunks_short_circuit_and.py +0 -0
  816. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7sp_block_ends_before_a_semicolon.py +0 -0
  817. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7sp_block_starts_after_a_semicolon.py +0 -0
  818. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7sp_directive_on_a_shared_line.py +0 -0
  819. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7sp_thunk_after_a_lambda_default.py +0 -0
  820. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7sp_thunk_after_a_raise.py +0 -0
  821. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7sp_thunk_after_a_set_display.py +0 -0
  822. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7sp_thunk_after_a_starred_display.py +0 -0
  823. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r7sp_thunk_after_an_unbound_global_read.py +0 -0
  824. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r80_inlined_leading_thunk.py +0 -0
  825. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r81_conditionally_bound_free_variable.py +0 -0
  826. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r82_local_classes_same_name.py +0 -0
  827. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r83_tab_indented_class.py +0 -0
  828. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r84_warn_stacklevel.py +0 -0
  829. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r85_conditionally_bound_parameter.py +0 -0
  830. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r86_annotated_assignment_live.py +0 -0
  831. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r87_nested_function_in_method.py +0 -0
  832. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r88_elif_branch.py +0 -0
  833. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r89_conditionally_bound_return.py +0 -0
  834. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r90_cluster_across_classes.py +0 -0
  835. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r91_class_body_helper.py +0 -0
  836. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r92_parameterless_class_body_helper.py +0 -0
  837. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r93_import_name_differs.py +0 -0
  838. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r94_import_binds_live_name.py +0 -0
  839. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r95_type_checking_annotation.py +0 -0
  840. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r96_unpacked_targets_live.py +0 -0
  841. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r97_helper_in_function_with_outside_site.py +0 -0
  842. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r98_same_named_methods_nested_helpers.py +0 -0
  843. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r99_partial_return_branches.py +0 -0
  844. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r9bd_augmented_builtin_read_in_block.py +0 -0
  845. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r9bd_global_bound_by_every_binder.py +0 -0
  846. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r9bd_global_declared_at_one_site.py +0 -0
  847. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r9bd_only_binding_deleted_read_after.py +0 -0
  848. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r9bd_only_binding_every_binder.py +0 -0
  849. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r9bd_only_binding_kept_local.py +0 -0
  850. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r9bd_only_binding_read_before_block.py +0 -0
  851. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r9bd_only_binding_read_by_nested_scopes.py +0 -0
  852. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r9bd_type_alias_only_binding.pynew +0 -0
  853. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r9dc_stacked_decoration_by_hand.py +0 -0
  854. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r9dr_fmt_off_layout_moves_verbatim.py +0 -0
  855. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r9dr_region_directive_around_block.py +0 -0
  856. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r9sb_binding_target_loads.py +0 -0
  857. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r9sb_fstring_format_spec.py +0 -0
  858. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r9sb_lambda_parameter_capture.py +0 -0
  859. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/r9sb_thunk_meets_inlined_comprehension.py +0 -0
  860. {code_towel-1.792 → code_towel-1.947}/tests/hostile_cases/rmypyoverlay_constructor_fields.py +0 -0
  861. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/r9dc_decorator_rebound_by_another_module/enable_checks.py +0 -0
  862. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/r9dc_decorator_rebound_by_another_module/pkg/__init__.py +0 -0
  863. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/r9dc_decorator_rebound_by_another_module/pkg/checks.py +0 -0
  864. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/r9dc_decorator_rebound_by_another_module/pkg/core.py +0 -0
  865. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/r9dc_decorator_rebound_by_another_module/run.py +0 -0
  866. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/r9dc_star_import_binds_an_instrumenting_decorator/pkg/__init__.py +0 -0
  867. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/r9dc_star_import_binds_an_instrumenting_decorator/pkg/common.py +0 -0
  868. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/r9dc_star_import_binds_an_instrumenting_decorator/pkg/shapes.py +0 -0
  869. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/r9dc_star_import_binds_an_instrumenting_decorator/run.py +0 -0
  870. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/r9dc_star_import_of_a_module_part_way_through_a_cycle/pkg/__init__.py +0 -0
  871. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/r9dc_star_import_of_a_module_part_way_through_a_cycle/pkg/common.py +0 -0
  872. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/r9dc_star_import_of_a_module_part_way_through_a_cycle/pkg/shapes.py +0 -0
  873. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/r9dc_star_import_of_a_module_part_way_through_a_cycle/run.py +0 -0
  874. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/r9dc_star_import_that_cannot_bind_a_decorator/pkg/__init__.py +0 -0
  875. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/r9dc_star_import_that_cannot_bind_a_decorator/pkg/common.py +0 -0
  876. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/r9dc_star_import_that_cannot_bind_a_decorator/pkg/shapes.py +0 -0
  877. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/r9dc_star_import_that_cannot_bind_a_decorator/run.py +0 -0
  878. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/r9sb_lambda_capture_across_modules/pkg/__init__.py +0 -0
  879. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/r9sb_lambda_capture_across_modules/pkg/orders.py +0 -0
  880. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/r9sb_lambda_capture_across_modules/pkg/quotes.py +0 -0
  881. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/r9sb_lambda_capture_across_modules/pyproject.toml +0 -0
  882. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/r9sb_lambda_capture_across_modules/run.py +0 -0
  883. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/r9sr_inline_snapshot/inline_snapshot.py +0 -0
  884. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/r9sr_inline_snapshot/pkg/__init__.py +0 -0
  885. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/r9sr_inline_snapshot/pkg/check_render.py +0 -0
  886. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/r9sr_inline_snapshot/pytest.ini +0 -0
  887. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/r9sr_inline_snapshot/run.py +0 -0
  888. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf10_reuse_existing_function/pkg/__init__.py +0 -0
  889. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf10_reuse_existing_function/pkg/a.py +0 -0
  890. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf10_reuse_existing_function/pkg/b.py +0 -0
  891. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf10_reuse_existing_function/run.py +0 -0
  892. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf11_package_init_reaches_back/pkg/__init__.py +0 -0
  893. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf11_package_init_reaches_back/pkg/detail.py +0 -0
  894. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf11_package_init_reaches_back/run.py +0 -0
  895. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf12_cycle_through_package_init/pkg/__init__.py +0 -0
  896. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf12_cycle_through_package_init/pkg/core.py +0 -0
  897. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf12_cycle_through_package_init/pkg/sub/__init__.py +0 -0
  898. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf12_cycle_through_package_init/pkg/sub/leaf.py +0 -0
  899. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf12_cycle_through_package_init/pkg/vendor/__init__.py +0 -0
  900. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf12_cycle_through_package_init/pkg/vendor/tool.py +0 -0
  901. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf12_cycle_through_package_init/run.py +0 -0
  902. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf13_import_time_effects/pkg/__init__.py +0 -0
  903. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf13_import_time_effects/pkg/a.py +0 -0
  904. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf13_import_time_effects/pkg/b.py +0 -0
  905. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf13_import_time_effects/run.py +0 -0
  906. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf14_script_with_leading_statement/pkg/__init__.py +0 -0
  907. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf14_script_with_leading_statement/pkg/app.py +0 -0
  908. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf14_script_with_leading_statement/pkg/util.py +0 -0
  909. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf14_script_with_leading_statement/run.py +0 -0
  910. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf15_ancestor_in_another_module/pkg/__init__.py +0 -0
  911. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf15_ancestor_in_another_module/pkg/base.py +0 -0
  912. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf15_ancestor_in_another_module/pkg/servers.py +0 -0
  913. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf15_ancestor_in_another_module/pkg/tokens.py +0 -0
  914. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf15_ancestor_in_another_module/run.py +0 -0
  915. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf16_consumer_outside_target_owns_helper_name/app/__init__.py +0 -0
  916. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf16_consumer_outside_target_owns_helper_name/app/consumer.py +0 -0
  917. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf16_consumer_outside_target_owns_helper_name/pkg/__init__.py +0 -0
  918. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf16_consumer_outside_target_owns_helper_name/pkg/lib.py +0 -0
  919. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf16_consumer_outside_target_owns_helper_name/run.py +0 -0
  920. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf1792_ci_strict_any/.github/workflows/ci.yml +0 -0
  921. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf1792_ci_strict_any/pkg/__init__.py +0 -0
  922. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf1792_ci_strict_any/pkg/codec.py +0 -0
  923. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf1792_ci_strict_any/pkg/useful.py +0 -0
  924. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf1792_ci_strict_any/pyproject.toml +0 -0
  925. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf1792_ci_strict_any/run.py +0 -0
  926. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf1792_excluded_probe_import/newer_dependency.py +0 -0
  927. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf1792_excluded_probe_import/pkg/__init__.py +0 -0
  928. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf1792_excluded_probe_import/pkg/core.py +0 -0
  929. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf1792_excluded_probe_import/pkg/ignored.py +0 -0
  930. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf1792_excluded_probe_import/pyproject.toml +0 -0
  931. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf1792_excluded_probe_import/run.py +0 -0
  932. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf1792_typed_shared_helper_comments/pkg/__init__.py +0 -0
  933. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf1792_typed_shared_helper_comments/pkg/first.py +0 -0
  934. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf1792_typed_shared_helper_comments/pkg/second.py +0 -0
  935. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf1792_typed_shared_helper_comments/pyproject.toml +0 -0
  936. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf1792_typed_shared_helper_comments/run.py +0 -0
  937. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf17_builtin_shadowed_in_borrower/pkg/__init__.py +0 -0
  938. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf17_builtin_shadowed_in_borrower/pkg/a.py +0 -0
  939. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf17_builtin_shadowed_in_borrower/pkg/b.py +0 -0
  940. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf17_builtin_shadowed_in_borrower/run.py +0 -0
  941. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf18_builtin_shadowed_by_star_import/pkg/__init__.py +0 -0
  942. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf18_builtin_shadowed_by_star_import/pkg/a.py +0 -0
  943. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf18_builtin_shadowed_by_star_import/pkg/b.py +0 -0
  944. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf18_builtin_shadowed_by_star_import/pkg/util.py +0 -0
  945. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf18_builtin_shadowed_by_star_import/run.py +0 -0
  946. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf19_builtin_shadowed_by_borrower_local/pkg/__init__.py +0 -0
  947. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf19_builtin_shadowed_by_borrower_local/pkg/a.py +0 -0
  948. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf19_builtin_shadowed_by_borrower_local/pkg/b.py +0 -0
  949. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf19_builtin_shadowed_by_borrower_local/run.py +0 -0
  950. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf20_builtin_shadowed_in_ancestor_module/pkg/__init__.py +0 -0
  951. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf20_builtin_shadowed_in_ancestor_module/pkg/base.py +0 -0
  952. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf20_builtin_shadowed_in_ancestor_module/pkg/servers.py +0 -0
  953. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf20_builtin_shadowed_in_ancestor_module/run.py +0 -0
  954. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf21_builtin_shadowed_in_third_module/pkg/__init__.py +0 -0
  955. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf21_builtin_shadowed_in_third_module/pkg/a.py +0 -0
  956. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf21_builtin_shadowed_in_third_module/pkg/b.py +0 -0
  957. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf21_builtin_shadowed_in_third_module/pkg/c.py +0 -0
  958. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf21_builtin_shadowed_in_third_module/pkg/util.py +0 -0
  959. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf21_builtin_shadowed_in_third_module/run.py +0 -0
  960. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf22_borrower_rebinds_builtins_namespace/pkg/__init__.py +0 -0
  961. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf22_borrower_rebinds_builtins_namespace/pkg/a.py +0 -0
  962. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf22_borrower_rebinds_builtins_namespace/pkg/b.py +0 -0
  963. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf22_borrower_rebinds_builtins_namespace/run.py +0 -0
  964. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf23_relative_import_in_another_package/pkg/__init__.py +0 -0
  965. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf23_relative_import_in_another_package/pkg/x/__init__.py +0 -0
  966. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf23_relative_import_in_another_package/pkg/x/a.py +0 -0
  967. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf23_relative_import_in_another_package/pkg/x/sub.py +0 -0
  968. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf23_relative_import_in_another_package/pkg/y/__init__.py +0 -0
  969. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf23_relative_import_in_another_package/pkg/y/b.py +0 -0
  970. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf23_relative_import_in_another_package/pkg/y/sub.py +0 -0
  971. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf23_relative_import_in_another_package/run.py +0 -0
  972. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf24_relative_import_climbs_elsewhere/pkg/__init__.py +0 -0
  973. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf24_relative_import_climbs_elsewhere/pkg/b.py +0 -0
  974. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf24_relative_import_climbs_elsewhere/pkg/sub.py +0 -0
  975. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf24_relative_import_climbs_elsewhere/pkg/x/__init__.py +0 -0
  976. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf24_relative_import_climbs_elsewhere/pkg/x/a.py +0 -0
  977. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf24_relative_import_climbs_elsewhere/run.py +0 -0
  978. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf25_relative_import_in_the_same_package/pkg/__init__.py +0 -0
  979. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf25_relative_import_in_the_same_package/pkg/x/__init__.py +0 -0
  980. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf25_relative_import_in_the_same_package/pkg/x/a.py +0 -0
  981. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf25_relative_import_in_the_same_package/pkg/x/b.py +0 -0
  982. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf25_relative_import_in_the_same_package/pkg/x/sub.py +0 -0
  983. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf25_relative_import_in_the_same_package/run.py +0 -0
  984. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf26_relative_import_ancestor_in_another_package/pkg/__init__.py +0 -0
  985. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf26_relative_import_ancestor_in_another_package/pkg/x/__init__.py +0 -0
  986. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf26_relative_import_ancestor_in_another_package/pkg/x/base.py +0 -0
  987. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf26_relative_import_ancestor_in_another_package/pkg/x/settings.py +0 -0
  988. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf26_relative_import_ancestor_in_another_package/pkg/y/__init__.py +0 -0
  989. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf26_relative_import_ancestor_in_another_package/pkg/y/servers.py +0 -0
  990. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf26_relative_import_ancestor_in_another_package/pkg/y/settings.py +0 -0
  991. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf26_relative_import_ancestor_in_another_package/run.py +0 -0
  992. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf27_registration_decorator_in_host/pkg/__init__.py +0 -0
  993. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf27_registration_decorator_in_host/pkg/alpha.py +0 -0
  994. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf27_registration_decorator_in_host/pkg/beta.py +0 -0
  995. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf27_registration_decorator_in_host/pkg/registry.py +0 -0
  996. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf27_registration_decorator_in_host/run.py +0 -0
  997. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf28_registration_decorator_in_reused_module/pkg/__init__.py +0 -0
  998. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf28_registration_decorator_in_reused_module/pkg/alpha.py +0 -0
  999. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf28_registration_decorator_in_reused_module/pkg/beta.py +0 -0
  1000. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf28_registration_decorator_in_reused_module/pkg/registry.py +0 -0
  1001. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf28_registration_decorator_in_reused_module/run.py +0 -0
  1002. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf29_type_checking_block_with_branches/pkg/__init__.py +0 -0
  1003. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf29_type_checking_block_with_branches/pkg/alpha.py +0 -0
  1004. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf29_type_checking_block_with_branches/pkg/beta.py +0 -0
  1005. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf29_type_checking_block_with_branches/run.py +0 -0
  1006. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf30_star_importer_takes_a_typing_name/pkg/__init__.py +0 -0
  1007. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf30_star_importer_takes_a_typing_name/pkg/a.py +0 -0
  1008. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf30_star_importer_takes_a_typing_name/pkg/b.py +0 -0
  1009. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf30_star_importer_takes_a_typing_name/run.py +0 -0
  1010. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf31_package_init_star_imports_a_matcher_named_any/pkg/__init__.py +0 -0
  1011. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf31_package_init_star_imports_a_matcher_named_any/pkg/matchers.py +0 -0
  1012. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf31_package_init_star_imports_a_matcher_named_any/pkg/report.py +0 -0
  1013. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf31_package_init_star_imports_a_matcher_named_any/run.py +0 -0
  1014. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf32_star_importer_outside_the_target/consumer.py +0 -0
  1015. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf32_star_importer_outside_the_target/pkg/__init__.py +0 -0
  1016. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf32_star_importer_outside_the_target/pkg/report.py +0 -0
  1017. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf32_star_importer_outside_the_target/run.py +0 -0
  1018. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf3_same_named_local_function/pkg/__init__.py +0 -0
  1019. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf3_same_named_local_function/pkg/a.py +0 -0
  1020. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf3_same_named_local_function/pkg/b.py +0 -0
  1021. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf3_same_named_local_function/run.py +0 -0
  1022. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf4_same_named_class/pkg/__init__.py +0 -0
  1023. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf4_same_named_class/pkg/a.py +0 -0
  1024. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf4_same_named_class/pkg/b.py +0 -0
  1025. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf4_same_named_class/run.py +0 -0
  1026. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf5_dunder_file/pkg/__init__.py +0 -0
  1027. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf5_dunder_file/pkg/a.py +0 -0
  1028. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf5_dunder_file/pkg/b.py +0 -0
  1029. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf5_dunder_file/run.py +0 -0
  1030. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf6_same_alias_different_import/pkg/__init__.py +0 -0
  1031. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf6_same_alias_different_import/pkg/a.py +0 -0
  1032. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf6_same_alias_different_import/pkg/b.py +0 -0
  1033. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf6_same_alias_different_import/pkg/util1.py +0 -0
  1034. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf6_same_alias_different_import/pkg/util2.py +0 -0
  1035. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf6_same_alias_different_import/run.py +0 -0
  1036. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7_docstring_import/pkg/__init__.py +0 -0
  1037. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7_docstring_import/pkg/a.py +0 -0
  1038. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7_docstring_import/pkg/b.py +0 -0
  1039. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7_docstring_import/run.py +0 -0
  1040. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7c_rebinding_enclosing_function_beside_a_twin_in_another_module/pkg/__init__.py +0 -0
  1041. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7c_rebinding_enclosing_function_beside_a_twin_in_another_module/pkg/a.py +0 -0
  1042. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7c_rebinding_enclosing_function_beside_a_twin_in_another_module/pkg/b.py +0 -0
  1043. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7c_rebinding_enclosing_function_beside_a_twin_in_another_module/run.py +0 -0
  1044. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7d_assert_moves_to_a_module_pytest_does_not_rewrite/pkg/__init__.py +0 -0
  1045. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7d_assert_moves_to_a_module_pytest_does_not_rewrite/pkg/check_values.py +0 -0
  1046. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7d_assert_moves_to_a_module_pytest_does_not_rewrite/pkg/checks.py +0 -0
  1047. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7d_assert_moves_to_a_module_pytest_does_not_rewrite/pytest.ini +0 -0
  1048. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7d_assert_moves_to_a_module_pytest_does_not_rewrite/run.py +0 -0
  1049. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7d_asserts_shared_by_modules_rewritten_alike/pkg/__init__.py +0 -0
  1050. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7d_asserts_shared_by_modules_rewritten_alike/pkg/alpha.py +0 -0
  1051. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7d_asserts_shared_by_modules_rewritten_alike/pkg/beta.py +0 -0
  1052. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7d_asserts_shared_by_modules_rewritten_alike/pkg/check_suite.py +0 -0
  1053. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7d_asserts_shared_by_modules_rewritten_alike/pytest.ini +0 -0
  1054. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7d_asserts_shared_by_modules_rewritten_alike/run.py +0 -0
  1055. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_binding_x_class_level_name/pkg/__init__.py +0 -0
  1056. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_binding_x_class_level_name/pkg/a.py +0 -0
  1057. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_binding_x_class_level_name/pkg/b.py +0 -0
  1058. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_binding_x_class_level_name/pyproject.toml +0 -0
  1059. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_binding_x_class_level_name/run.py +0 -0
  1060. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_binding_x_dunder_file/pkg/__init__.py +0 -0
  1061. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_binding_x_dunder_file/pkg/a.py +0 -0
  1062. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_binding_x_dunder_file/pkg/b.py +0 -0
  1063. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_binding_x_dunder_file/pyproject.toml +0 -0
  1064. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_binding_x_dunder_file/run.py +0 -0
  1065. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_builtins_x_shadow_in_b/pkg/__init__.py +0 -0
  1066. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_builtins_x_shadow_in_b/pkg/a.py +0 -0
  1067. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_builtins_x_shadow_in_b/pkg/b.py +0 -0
  1068. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_builtins_x_shadow_in_b/pyproject.toml +0 -0
  1069. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_builtins_x_shadow_in_b/run.py +0 -0
  1070. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_extra_typed_binder_message_mypy/pkg/__init__.py +0 -0
  1071. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_extra_typed_binder_message_mypy/pkg/m.py +0 -0
  1072. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_extra_typed_binder_message_mypy/pyproject.toml +0 -0
  1073. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_extra_typed_binder_message_mypy/run.py +0 -0
  1074. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_extra_typed_binder_message_pyright/pkg/__init__.py +0 -0
  1075. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_extra_typed_binder_message_pyright/pkg/m.py +0 -0
  1076. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_extra_typed_binder_message_pyright/pyproject.toml +0 -0
  1077. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_extra_typed_binder_message_pyright/run.py +0 -0
  1078. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_extra_typed_read_before_bind_mypy/pkg/__init__.py +0 -0
  1079. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_extra_typed_read_before_bind_mypy/pkg/m.py +0 -0
  1080. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_extra_typed_read_before_bind_mypy/pyproject.toml +0 -0
  1081. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_extra_typed_read_before_bind_mypy/run.py +0 -0
  1082. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_extra_typed_read_before_bind_pyright/pkg/__init__.py +0 -0
  1083. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_extra_typed_read_before_bind_pyright/pkg/m.py +0 -0
  1084. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_extra_typed_read_before_bind_pyright/pyproject.toml +0 -0
  1085. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_extra_typed_read_before_bind_pyright/run.py +0 -0
  1086. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_extra_typed_thunk_lambda_default_mypy/pkg/__init__.py +0 -0
  1087. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_extra_typed_thunk_lambda_default_mypy/pkg/m.py +0 -0
  1088. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_extra_typed_thunk_lambda_default_mypy/pyproject.toml +0 -0
  1089. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_extra_typed_thunk_lambda_default_mypy/run.py +0 -0
  1090. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_extra_typed_thunk_lambda_default_pyright/pkg/__init__.py +0 -0
  1091. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_extra_typed_thunk_lambda_default_pyright/pkg/m.py +0 -0
  1092. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_extra_typed_thunk_lambda_default_pyright/pyproject.toml +0 -0
  1093. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_extra_typed_thunk_lambda_default_pyright/run.py +0 -0
  1094. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_grammar_t11094_semicolon/pkg/__init__.py +0 -0
  1095. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_grammar_t11094_semicolon/pkg/m.py +0 -0
  1096. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_grammar_t11094_semicolon/pyproject.toml +0 -0
  1097. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_grammar_t11094_semicolon/run.py +0 -0
  1098. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_grammar_t11271_semicolon/pkg/__init__.py +0 -0
  1099. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_grammar_t11271_semicolon/pkg/m.py +0 -0
  1100. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_grammar_t11271_semicolon/pyproject.toml +0 -0
  1101. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_grammar_t11271_semicolon/run.py +0 -0
  1102. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_grammar_u0474_for_target_prebound/pkg/__init__.py +0 -0
  1103. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_grammar_u0474_for_target_prebound/pkg/a.py +0 -0
  1104. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_grammar_u0474_for_target_prebound/pkg/b.py +0 -0
  1105. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_grammar_u0474_for_target_prebound/pkg/common.py +0 -0
  1106. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_grammar_u0474_for_target_prebound/pyproject.toml +0 -0
  1107. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_grammar_u0474_for_target_prebound/run.py +0 -0
  1108. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_grammar_u0624_for_target_prebound/pkg/__init__.py +0 -0
  1109. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_grammar_u0624_for_target_prebound/pkg/a.py +0 -0
  1110. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_grammar_u0624_for_target_prebound/pkg/b.py +0 -0
  1111. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_grammar_u0624_for_target_prebound/pkg/common.py +0 -0
  1112. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_grammar_u0624_for_target_prebound/pyproject.toml +0 -0
  1113. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_grammar_u0624_for_target_prebound/run.py +0 -0
  1114. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_grammar_u1209_for_target_prebound/pkg/__init__.py +0 -0
  1115. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_grammar_u1209_for_target_prebound/pkg/a.py +0 -0
  1116. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_grammar_u1209_for_target_prebound/pkg/b.py +0 -0
  1117. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_grammar_u1209_for_target_prebound/pkg/common.py +0 -0
  1118. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_grammar_u1209_for_target_prebound/pyproject.toml +0 -0
  1119. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_grammar_u1209_for_target_prebound/run.py +0 -0
  1120. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_late_toplevel_module_in_package/pkg/__init__.py +0 -0
  1121. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_late_toplevel_module_in_package/pkg/a.py +0 -0
  1122. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_late_toplevel_module_in_package/pkg/c.py +0 -0
  1123. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_late_toplevel_module_in_package/pkg/helpers_top.py +0 -0
  1124. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_late_toplevel_module_in_package/pyproject.toml +0 -0
  1125. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_late_toplevel_module_in_package/run.py +0 -0
  1126. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_late_toplevel_module_in_package/tests/__init__.py +0 -0
  1127. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_late_toplevel_module_in_package/tests/test_x.py +0 -0
  1128. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_misc_typed_for_prebound_mypy/pkg/__init__.py +0 -0
  1129. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_misc_typed_for_prebound_mypy/pkg/m.py +0 -0
  1130. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_misc_typed_for_prebound_mypy/pyproject.toml +0 -0
  1131. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_misc_typed_for_prebound_mypy/run.py +0 -0
  1132. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_modules_b_imports_a/pkg/__init__.py +0 -0
  1133. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_modules_b_imports_a/pkg/a.py +0 -0
  1134. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_modules_b_imports_a/pkg/b.py +0 -0
  1135. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_modules_b_imports_a/pyproject.toml +0 -0
  1136. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_modules_b_imports_a/run.py +0 -0
  1137. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_modules_init_hosts/pkg/__init__.py +0 -0
  1138. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_modules_init_hosts/pkg/a.py +0 -0
  1139. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_modules_init_hosts/pyproject.toml +0 -0
  1140. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_modules_init_hosts/run.py +0 -0
  1141. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_modules_rel_import_in_block/pkg/__init__.py +0 -0
  1142. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_modules_rel_import_in_block/pkg/a.py +0 -0
  1143. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_modules_rel_import_in_block/pkg/b.py +0 -0
  1144. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_modules_rel_import_in_block/pkg/conf.py +0 -0
  1145. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_modules_rel_import_in_block/pyproject.toml +0 -0
  1146. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_modules_rel_import_in_block/run.py +0 -0
  1147. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_modules_script_main_guard/pkg/__init__.py +0 -0
  1148. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_modules_script_main_guard/pkg/a.py +0 -0
  1149. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_modules_script_main_guard/pkg/b.py +0 -0
  1150. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_modules_script_main_guard/pyproject.toml +0 -0
  1151. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_modules_script_main_guard/run.py +0 -0
  1152. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_modules_three_modules_cluster/pkg/__init__.py +0 -0
  1153. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_modules_three_modules_cluster/pkg/a.py +0 -0
  1154. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_modules_three_modules_cluster/pkg/b.py +0 -0
  1155. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_modules_three_modules_cluster/pkg/c.py +0 -0
  1156. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_modules_three_modules_cluster/pyproject.toml +0 -0
  1157. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_modules_three_modules_cluster/run.py +0 -0
  1158. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_both/pkg/__init__.py +0 -0
  1159. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_both/pkg/compat.py +0 -0
  1160. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_both/pkg/compat_false.py +0 -0
  1161. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_both/pkg/f.py +0 -0
  1162. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_both/pkg/m.py +0 -0
  1163. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_both/pkg/w.py +0 -0
  1164. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_both/pyproject.toml +0 -0
  1165. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_both/run.py +0 -0
  1166. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_both/tests/__init__.py +0 -0
  1167. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_both/tests/test_w.py +0 -0
  1168. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_late_use_both/pkg/__init__.py +0 -0
  1169. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_late_use_both/pkg/compat.py +0 -0
  1170. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_late_use_both/pkg/compat_false.py +0 -0
  1171. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_late_use_both/pkg/f.py +0 -0
  1172. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_late_use_both/pkg/m.py +0 -0
  1173. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_late_use_both/pkg/w.py +0 -0
  1174. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_late_use_both/pyproject.toml +0 -0
  1175. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_late_use_both/run.py +0 -0
  1176. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_late_use_both/tests/__init__.py +0 -0
  1177. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_late_use_both/tests/test_w.py +0 -0
  1178. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_late_use_mypy/pkg/__init__.py +0 -0
  1179. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_late_use_mypy/pkg/compat.py +0 -0
  1180. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_late_use_mypy/pkg/compat_false.py +0 -0
  1181. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_late_use_mypy/pkg/f.py +0 -0
  1182. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_late_use_mypy/pkg/m.py +0 -0
  1183. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_late_use_mypy/pkg/w.py +0 -0
  1184. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_late_use_mypy/pyproject.toml +0 -0
  1185. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_late_use_mypy/run.py +0 -0
  1186. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_late_use_mypy/tests/__init__.py +0 -0
  1187. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_late_use_mypy/tests/test_w.py +0 -0
  1188. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_mypy/pkg/__init__.py +0 -0
  1189. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_mypy/pkg/compat.py +0 -0
  1190. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_mypy/pkg/compat_false.py +0 -0
  1191. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_mypy/pkg/f.py +0 -0
  1192. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_mypy/pkg/m.py +0 -0
  1193. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_mypy/pkg/w.py +0 -0
  1194. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_mypy/pyproject.toml +0 -0
  1195. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_mypy/run.py +0 -0
  1196. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_mypy/tests/__init__.py +0 -0
  1197. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_from_compat_true_mypy/tests/test_w.py +0 -0
  1198. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_import_alias_flag_both/pkg/__init__.py +0 -0
  1199. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_import_alias_flag_both/pkg/compat.py +0 -0
  1200. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_import_alias_flag_both/pkg/compat_false.py +0 -0
  1201. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_import_alias_flag_both/pkg/f.py +0 -0
  1202. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_import_alias_flag_both/pkg/m.py +0 -0
  1203. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_import_alias_flag_both/pkg/w.py +0 -0
  1204. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_import_alias_flag_both/pyproject.toml +0 -0
  1205. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_import_alias_flag_both/run.py +0 -0
  1206. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_import_alias_flag_both/tests/__init__.py +0 -0
  1207. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_import_alias_flag_both/tests/test_w.py +0 -0
  1208. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_import_alias_flag_mypy/pkg/__init__.py +0 -0
  1209. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_import_alias_flag_mypy/pkg/compat.py +0 -0
  1210. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_import_alias_flag_mypy/pkg/compat_false.py +0 -0
  1211. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_import_alias_flag_mypy/pkg/f.py +0 -0
  1212. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_import_alias_flag_mypy/pkg/m.py +0 -0
  1213. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_import_alias_flag_mypy/pkg/w.py +0 -0
  1214. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_import_alias_flag_mypy/pyproject.toml +0 -0
  1215. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_import_alias_flag_mypy/run.py +0 -0
  1216. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_import_alias_flag_mypy/tests/__init__.py +0 -0
  1217. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7fz_typeguard2_import_alias_flag_mypy/tests/test_w.py +0 -0
  1218. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7n_host_the_wheel_leaves_out/pkg/pyproject.toml +0 -0
  1219. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7n_host_the_wheel_leaves_out/pkg/src/shop/__init__.py +0 -0
  1220. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7n_host_the_wheel_leaves_out/pkg/src/shop/_devtools.py +0 -0
  1221. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7n_host_the_wheel_leaves_out/pkg/src/shop/stats.py +0 -0
  1222. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7n_host_the_wheel_leaves_out/run.py +0 -0
  1223. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7n_namesake_of_a_required_library/pkg/pyproject.toml +0 -0
  1224. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7n_namesake_of_a_required_library/pkg/zzapp/__init__.py +0 -0
  1225. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7n_namesake_of_a_required_library/pkg/zzapp/core.py +0 -0
  1226. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7n_namesake_of_a_required_library/pkg/zzlib/__init__.py +0 -0
  1227. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7n_namesake_of_a_required_library/pkg/zzlib/utils.py +0 -0
  1228. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7n_namesake_of_a_required_library/run.py +0 -0
  1229. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7n_namesake_of_a_required_library/site-packages/zzlib/__init__.py +0 -0
  1230. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7n_namesake_of_a_required_library/site-packages/zzlib/utils.py +0 -0
  1231. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7n_subpackage_the_wheel_leaves_out/pkg/pyproject.toml +0 -0
  1232. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7n_subpackage_the_wheel_leaves_out/pkg/src/shop/__init__.py +0 -0
  1233. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7n_subpackage_the_wheel_leaves_out/pkg/src/shop/cli.py +0 -0
  1234. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7n_subpackage_the_wheel_leaves_out/pkg/src/shop/devtools/__init__.py +0 -0
  1235. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7n_subpackage_the_wheel_leaves_out/pkg/src/shop/devtools/dump.py +0 -0
  1236. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7n_subpackage_the_wheel_leaves_out/pkg/src/shop/stats.py +0 -0
  1237. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7n_subpackage_the_wheel_leaves_out/run.py +0 -0
  1238. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7t_import_order_is_registration_order/pkg/__init__.py +0 -0
  1239. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7t_import_order_is_registration_order/pkg/alpha.py +0 -0
  1240. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7t_import_order_is_registration_order/pkg/app.py +0 -0
  1241. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7t_import_order_is_registration_order/pkg/beta.py +0 -0
  1242. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7t_import_order_is_registration_order/pkg/gamma.py +0 -0
  1243. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7t_import_order_is_registration_order/pkg/loader.py +0 -0
  1244. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7t_import_order_is_registration_order/pkg/registry.py +0 -0
  1245. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7t_import_order_is_registration_order/pkg/zeta.py +0 -0
  1246. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7t_import_order_is_registration_order/pyproject.toml +0 -0
  1247. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf7t_import_order_is_registration_order/run.py +0 -0
  1248. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf8_helper_name_collision/pkg/__init__.py +0 -0
  1249. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf8_helper_name_collision/pkg/a.py +0 -0
  1250. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf8_helper_name_collision/pkg/b.py +0 -0
  1251. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf8_helper_name_collision/pkg/c.py +0 -0
  1252. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf8_helper_name_collision/pkg/d.py +0 -0
  1253. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf8_helper_name_collision/pkg/e.py +0 -0
  1254. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf8_helper_name_collision/run.py +0 -0
  1255. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf9_same_named_base_class/pkg/__init__.py +0 -0
  1256. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf9_same_named_base_class/pkg/one/__init__.py +0 -0
  1257. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf9_same_named_base_class/pkg/one/base.py +0 -0
  1258. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf9_same_named_base_class/pkg/one/introspect.py +0 -0
  1259. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf9_same_named_base_class/pkg/one/revoke.py +0 -0
  1260. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf9_same_named_base_class/pkg/two/__init__.py +0 -0
  1261. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf9_same_named_base_class/pkg/two/access.py +0 -0
  1262. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf9_same_named_base_class/pkg/two/base.py +0 -0
  1263. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf9_same_named_base_class/pkg/two/request.py +0 -0
  1264. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf9_same_named_base_class/run.py +0 -0
  1265. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf9bd_only_binding_across_modules/pkg/__init__.py +0 -0
  1266. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf9bd_only_binding_across_modules/pkg/a.py +0 -0
  1267. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf9bd_only_binding_across_modules/pkg/b.py +0 -0
  1268. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf9bd_only_binding_across_modules/run.py +0 -0
  1269. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf9up_newer_syntax_hides_hand_decoration/pkg/__init__.py +0 -0
  1270. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf9up_newer_syntax_hides_hand_decoration/pkg/fast.pynew +0 -0
  1271. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf9up_newer_syntax_hides_hand_decoration/pkg/instrument.py +0 -0
  1272. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf9up_newer_syntax_hides_hand_decoration/pkg/kernels.py +0 -0
  1273. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf9up_newer_syntax_hides_hand_decoration/pyproject.toml +0 -0
  1274. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf9up_newer_syntax_hides_hand_decoration/run.py +0 -0
  1275. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf9up_newer_syntax_test_hides_builtin_patch/pkg/__init__.py +0 -0
  1276. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf9up_newer_syntax_test_hides_builtin_patch/pkg/a.py +0 -0
  1277. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf9up_newer_syntax_test_hides_builtin_patch/pkg/b.py +0 -0
  1278. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf9up_newer_syntax_test_hides_builtin_patch/pyproject.toml +0 -0
  1279. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf9up_newer_syntax_test_hides_builtin_patch/run.py +0 -0
  1280. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf9up_newer_syntax_test_hides_builtin_patch/tests/__init__.py +0 -0
  1281. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf9up_newer_syntax_test_hides_builtin_patch/tests/test_b.pynew +0 -0
  1282. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf9xi_namesake_lacking_a_module/pkg/pyproject.toml +0 -0
  1283. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf9xi_namesake_lacking_a_module/pkg/third_party/zzlib/utils.py +0 -0
  1284. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf9xi_namesake_lacking_a_module/pkg/zzapp/__init__.py +0 -0
  1285. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf9xi_namesake_lacking_a_module/pkg/zzapp/cli.py +0 -0
  1286. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf9xi_namesake_lacking_a_module/pkg/zzapp/core.py +0 -0
  1287. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf9xi_namesake_lacking_a_module/run.py +0 -0
  1288. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf9xi_namesake_lacking_a_module/site-packages/zzlib/__init__.py +0 -0
  1289. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf9xi_namesake_lacking_a_module/site-packages/zzlib/core.py +0 -0
  1290. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf9xi_namesake_lacking_a_module/site-packages/zzlib/utils.py +0 -0
  1291. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf9xi_type_only_import_of_a_missing_module/pkg/__init__.py +0 -0
  1292. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf9xi_type_only_import_of_a_missing_module/pkg/a.py +0 -0
  1293. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf9xi_type_only_import_of_a_missing_module/pkg/b.py +0 -0
  1294. {code_towel-1.792 → code_towel-1.947}/tests/hostile_crossfile/xf9xi_type_only_import_of_a_missing_module/run.py +0 -0
  1295. {code_towel-1.792 → code_towel-1.947}/tests/hostile_refactoring.py +0 -0
  1296. {code_towel-1.792 → code_towel-1.947}/tests/probe_answers.py +0 -0
  1297. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.772/README.md +0 -0
  1298. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.772/context.toml +0 -0
  1299. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.772/corpus-full.txt +0 -0
  1300. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.772/corpus-sphinx.txt +0 -0
  1301. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.772/release-record.txt +0 -0
  1302. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-audit-fixes/CAPACITY-ASSESSMENT.json.gz +0 -0
  1303. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-audit-fixes/CAPACITY-EXPERIMENT.json.gz +0 -0
  1304. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-audit-fixes/CORPUS-PREREQUISITES.json.gz +0 -0
  1305. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-audit-fixes/PREPARATION-VERIFIED.json.gz +0 -0
  1306. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-audit-fixes/README.md +0 -0
  1307. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-audit-fixes/artifacts.json.gz +0 -0
  1308. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-audit-fixes/corpus-exit.json.gz +0 -0
  1309. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-audit-fixes/corpus-report--summary.json.gz +0 -0
  1310. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-audit-fixes/corpus-reviewed-dispositions.json.gz +0 -0
  1311. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-audit-fixes/corpus-verified-outcomes.json.gz +0 -0
  1312. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-audit-fixes/fresh-corpus-driver-completion.json.gz +0 -0
  1313. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-audit-fixes/fresh-refusal-integrity.json.gz +0 -0
  1314. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-audit-fixes/performance--1-published--cli.log.gz +0 -0
  1315. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-audit-fixes/performance--10-candidate--cli.log.gz +0 -0
  1316. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-audit-fixes/performance--11-previous--cli.log.gz +0 -0
  1317. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-audit-fixes/performance--12-published--cli.log.gz +0 -0
  1318. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-audit-fixes/performance--2-previous--cli.log.gz +0 -0
  1319. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-audit-fixes/performance--3-candidate--cli.log.gz +0 -0
  1320. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-audit-fixes/performance--4-candidate--cli.log.gz +0 -0
  1321. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-audit-fixes/performance--5-previous--cli.log.gz +0 -0
  1322. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-audit-fixes/performance--6-published--cli.log.gz +0 -0
  1323. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-audit-fixes/performance--7-published--cli.log.gz +0 -0
  1324. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-audit-fixes/performance--8-previous--cli.log.gz +0 -0
  1325. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-audit-fixes/performance--9-candidate--cli.log.gz +0 -0
  1326. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-audit-fixes/performance--attempt.json.gz +0 -0
  1327. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-audit-fixes/performance--completion.json.gz +0 -0
  1328. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-audit-fixes/performance--preflight-runtimes.json.gz +0 -0
  1329. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-audit-fixes/performance--results.json.gz +0 -0
  1330. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-audit-fixes/performance--summary.json.gz +0 -0
  1331. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-audit-fixes/provenance.json +0 -0
  1332. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-audit-fixes/source.json.gz +0 -0
  1333. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-october6-native/README.md +0 -0
  1334. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-october6-native/coverage-combine.log.gz +0 -0
  1335. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-october6-native/coverage-report.log.gz +0 -0
  1336. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-october6-native/pytest.log.gz +0 -0
  1337. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-october6-native/quality-bandit.log.gz +0 -0
  1338. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-october6-native/quality-black.log.gz +0 -0
  1339. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-october6-native/quality-flake8.log.gz +0 -0
  1340. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-october6-native/quality-mypy.log.gz +0 -0
  1341. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-october6-native/quality-results.json +0 -0
  1342. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-october6-native/result.json +0 -0
  1343. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-october6-native/source-after.json.gz +0 -0
  1344. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-october6-native/source-before.json.gz +0 -0
  1345. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-october6-native/validation-source.py.txt +0 -0
  1346. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-parameter-audit-fixes/1-uncached-cli.log.gz +0 -0
  1347. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-parameter-audit-fixes/1-uncached-host.log.gz +0 -0
  1348. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-parameter-audit-fixes/2-cached-cli.log.gz +0 -0
  1349. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-parameter-audit-fixes/2-cached-host.log.gz +0 -0
  1350. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-parameter-audit-fixes/3-cached-cli.log.gz +0 -0
  1351. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-parameter-audit-fixes/3-cached-host.log.gz +0 -0
  1352. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-parameter-audit-fixes/4-uncached-cli.log.gz +0 -0
  1353. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-parameter-audit-fixes/4-uncached-host.log.gz +0 -0
  1354. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-parameter-audit-fixes/README.md +0 -0
  1355. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-parameter-audit-fixes/bandit.log.gz +0 -0
  1356. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-parameter-audit-fixes/black.log.gz +0 -0
  1357. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-parameter-audit-fixes/block-work-driver.py.txt +0 -0
  1358. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-parameter-audit-fixes/block-work.json +0 -0
  1359. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-parameter-audit-fixes/cli-control.py.txt +0 -0
  1360. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-parameter-audit-fixes/cli-driver.py.txt +0 -0
  1361. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-parameter-audit-fixes/cli-results.json +0 -0
  1362. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-parameter-audit-fixes/dependency-audit.log.gz +0 -0
  1363. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-parameter-audit-fixes/dependency-inventory.txt +0 -0
  1364. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-parameter-audit-fixes/flake8.log.gz +0 -0
  1365. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-parameter-audit-fixes/freeze.json +0 -0
  1366. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-parameter-audit-fixes/interrupted-native-result.json +0 -0
  1367. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-parameter-audit-fixes/mypy.log.gz +0 -0
  1368. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-parameter-audit-fixes/native-coverage.log.gz +0 -0
  1369. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-parameter-audit-fixes/native-driver.py.txt +0 -0
  1370. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-parameter-audit-fixes/native-pytest.log.gz +0 -0
  1371. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-parameter-audit-fixes/native-result.json +0 -0
  1372. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-parameter-audit-fixes/preceding-failed-native-result.json +0 -0
  1373. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-parameter-audit-fixes/preceding-failed-pytest.log.gz +0 -0
  1374. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-parameter-audit-fixes/retained-sha256.json +0 -0
  1375. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-parameter-audit-fixes/source-after.json.gz +0 -0
  1376. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-parameter-audit-fixes/source-before.json.gz +0 -0
  1377. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-parameter-audit-fixes/static-result.json +0 -0
  1378. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-parameter-audit-fixes/summary.json +0 -0
  1379. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-performance-optimization/README.md +0 -0
  1380. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-performance-optimization/any-pruning-r04-diagnostic-control.patch.gz +0 -0
  1381. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-performance-optimization/any-pruning-r04-freeze.json +0 -0
  1382. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-performance-optimization/corrected-control-r04-diagnostic-control.patch.gz +0 -0
  1383. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-performance-optimization/corrected-control-r04-freeze.json +0 -0
  1384. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-performance-optimization/measure-any-pruning-r04-results.json +0 -0
  1385. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-performance-optimization/measure-any-pruning-r04-summary.json +0 -0
  1386. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-performance-optimization/measure-ownership-memo-r04-results.json +0 -0
  1387. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-performance-optimization/measure-ownership-memo-r04-summary.json +0 -0
  1388. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-performance-optimization/measure-rehearing-r05-results.json +0 -0
  1389. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-performance-optimization/measure-rehearing-r05-summary.json +0 -0
  1390. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-performance-optimization/measurement-source.py.txt +0 -0
  1391. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-performance-optimization/ownership-cost-1.json.gz +0 -0
  1392. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-performance-optimization/ownership-cost-2.json.gz +0 -0
  1393. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-performance-optimization/ownership-cost-3.json.gz +0 -0
  1394. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-performance-optimization/ownership-cost-4.json.gz +0 -0
  1395. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-performance-optimization/ownership-cost-source.py.txt +0 -0
  1396. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-performance-optimization/ownership-cost-summary.json.gz +0 -0
  1397. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-performance-optimization/ownership-memo-r04-diagnostic-control.patch.gz +0 -0
  1398. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-performance-optimization/ownership-memo-r04-freeze.json +0 -0
  1399. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-performance-optimization/rehearing-control-r05-diagnostic-control.patch.gz +0 -0
  1400. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-performance-optimization/rehearing-control-r05-freeze.json +0 -0
  1401. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-performance-optimization/rehearing-r05-diagnostic-control.patch.gz +0 -0
  1402. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-performance-optimization/rehearing-r05-freeze.json +0 -0
  1403. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-performance-optimization/rehearing-request-counts.json +0 -0
  1404. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-performance-optimization/stage0-corrected-phase-freeze.json +0 -0
  1405. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/1.792-performance-optimization/stage1-ownership-memo-phase-freeze.json +0 -0
  1406. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/README.md +0 -0
  1407. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/artifacts.json.gz +0 -0
  1408. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/assemble-corpus-review.py.gz +0 -0
  1409. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/build-results.json.gz +0 -0
  1410. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/candidate--pyproject.toml.gz +0 -0
  1411. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/candidate--scripts--ecosystem--manifest.toml.gz +0 -0
  1412. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/candidate--scripts--ecosystem_check.py.gz +0 -0
  1413. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/completed-baseline-review.json.gz +0 -0
  1414. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/continuation-driver.log.gz +0 -0
  1415. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/continuation-result.json.gz +0 -0
  1416. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/continuation-resumed-driver.log.gz +0 -0
  1417. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/continuation-stopped-20260928.json.gz +0 -0
  1418. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/continue-final-gates.py.gz +0 -0
  1419. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-assessment.json.gz +0 -0
  1420. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-command.json.gz +0 -0
  1421. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-container-state.json.gz +0 -0
  1422. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-entry.py.gz +0 -0
  1423. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-environment.json.gz +0 -0
  1424. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-exit.json.gz +0 -0
  1425. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--anyio-after.log.gz +0 -0
  1426. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--anyio-before.log.gz +0 -0
  1427. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--anyio-environment.log.gz +0 -0
  1428. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--anyio-refactor.log.gz +0 -0
  1429. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--apispec-after.log.gz +0 -0
  1430. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--apispec-before.log.gz +0 -0
  1431. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--apispec-environment.log.gz +0 -0
  1432. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--apispec-refactor.log.gz +0 -0
  1433. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--arrow-after.log.gz +0 -0
  1434. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--arrow-before.log.gz +0 -0
  1435. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--arrow-environment.log.gz +0 -0
  1436. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--arrow-refactor.log.gz +0 -0
  1437. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--astroid-after.log.gz +0 -0
  1438. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--astroid-before.log.gz +0 -0
  1439. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--astroid-environment.log.gz +0 -0
  1440. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--astroid-refactor.log.gz +0 -0
  1441. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--attrs-after.log.gz +0 -0
  1442. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--attrs-before.log.gz +0 -0
  1443. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--attrs-environment.log.gz +0 -0
  1444. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--attrs-refactor.log.gz +0 -0
  1445. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--backoff-after.log.gz +0 -0
  1446. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--backoff-before.log.gz +0 -0
  1447. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--backoff-environment.log.gz +0 -0
  1448. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--backoff-refactor.log.gz +0 -0
  1449. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--beautifulsoup4-after.log.gz +0 -0
  1450. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--beautifulsoup4-before.log.gz +0 -0
  1451. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--beautifulsoup4-environment.log.gz +0 -0
  1452. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--beautifulsoup4-refactor.log.gz +0 -0
  1453. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--bidict-before.log.gz +0 -0
  1454. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--bidict-environment.log.gz +0 -0
  1455. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--bidict-refactor.log.gz +0 -0
  1456. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--black-after.log.gz +0 -0
  1457. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--black-before.log.gz +0 -0
  1458. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--black-environment.log.gz +0 -0
  1459. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--black-refactor.log.gz +0 -0
  1460. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--bleach-after.log.gz +0 -0
  1461. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--bleach-before.log.gz +0 -0
  1462. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--bleach-environment.log.gz +0 -0
  1463. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--bleach-refactor.log.gz +0 -0
  1464. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--blinker-before.log.gz +0 -0
  1465. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--blinker-environment.log.gz +0 -0
  1466. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--blinker-refactor.log.gz +0 -0
  1467. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--boltons-after.log.gz +0 -0
  1468. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--boltons-before.log.gz +0 -0
  1469. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--boltons-environment.log.gz +0 -0
  1470. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--boltons-refactor.log.gz +0 -0
  1471. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--bottle-before.log.gz +0 -0
  1472. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--bottle-environment.log.gz +0 -0
  1473. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--bottle-refactor.log.gz +0 -0
  1474. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--cachetools-after.log.gz +0 -0
  1475. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--cachetools-before.log.gz +0 -0
  1476. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--cachetools-environment.log.gz +0 -0
  1477. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--cachetools-refactor.log.gz +0 -0
  1478. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--cattrs-after.log.gz +0 -0
  1479. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--cattrs-before.log.gz +0 -0
  1480. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--cattrs-environment.log.gz +0 -0
  1481. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--cattrs-refactor.log.gz +0 -0
  1482. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--cerberus-after.log.gz +0 -0
  1483. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--cerberus-before.log.gz +0 -0
  1484. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--cerberus-environment.log.gz +0 -0
  1485. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--cerberus-refactor.log.gz +0 -0
  1486. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--chardet-after.log.gz +0 -0
  1487. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--chardet-before.log.gz +0 -0
  1488. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--chardet-environment.log.gz +0 -0
  1489. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--chardet-refactor.log.gz +0 -0
  1490. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--cheroot-after.log.gz +0 -0
  1491. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--cheroot-before.log.gz +0 -0
  1492. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--cheroot-environment.log.gz +0 -0
  1493. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--cheroot-refactor-no-types.log.gz +0 -0
  1494. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--cheroot-refactor.log.gz +0 -0
  1495. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--click-after.log.gz +0 -0
  1496. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--click-before.log.gz +0 -0
  1497. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--click-environment.log.gz +0 -0
  1498. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--click-refactor.log.gz +0 -0
  1499. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--colorama-after.log.gz +0 -0
  1500. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--colorama-before.log.gz +0 -0
  1501. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--colorama-environment.log.gz +0 -0
  1502. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--colorama-refactor.log.gz +0 -0
  1503. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--croniter-after.log.gz +0 -0
  1504. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--croniter-before.log.gz +0 -0
  1505. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--croniter-environment.log.gz +0 -0
  1506. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--croniter-refactor.log.gz +0 -0
  1507. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--decorator-before.log.gz +0 -0
  1508. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--decorator-environment.log.gz +0 -0
  1509. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--decorator-refactor.log.gz +0 -0
  1510. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--deepdiff-after.log.gz +0 -0
  1511. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--deepdiff-before.log.gz +0 -0
  1512. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--deepdiff-environment.log.gz +0 -0
  1513. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--deepdiff-refactor.log.gz +0 -0
  1514. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--django-forms-after.log.gz +0 -0
  1515. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--django-forms-before.log.gz +0 -0
  1516. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--django-forms-environment.log.gz +0 -0
  1517. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--django-forms-refactor.log.gz +0 -0
  1518. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--django-utils-after.log.gz +0 -0
  1519. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--django-utils-before.log.gz +0 -0
  1520. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--django-utils-environment.log.gz +0 -0
  1521. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--django-utils-refactor.log.gz +0 -0
  1522. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--docopt-ng-before.log.gz +0 -0
  1523. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--docopt-ng-environment.log.gz +0 -0
  1524. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--docopt-ng-refactor.log.gz +0 -0
  1525. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--dpath-after.log.gz +0 -0
  1526. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--dpath-before.log.gz +0 -0
  1527. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--dpath-environment.log.gz +0 -0
  1528. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--dpath-refactor.log.gz +0 -0
  1529. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--ecdsa-after.log.gz +0 -0
  1530. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--ecdsa-before.log.gz +0 -0
  1531. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--ecdsa-environment.log.gz +0 -0
  1532. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--ecdsa-refactor.log.gz +0 -0
  1533. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--environs-before.log.gz +0 -0
  1534. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--environs-environment.log.gz +0 -0
  1535. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--environs-refactor.log.gz +0 -0
  1536. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--feedparser-after.log.gz +0 -0
  1537. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--feedparser-before.log.gz +0 -0
  1538. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--feedparser-environment.log.gz +0 -0
  1539. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--feedparser-refactor.log.gz +0 -0
  1540. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--filelock-after.log.gz +0 -0
  1541. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--filelock-before.log.gz +0 -0
  1542. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--filelock-environment.log.gz +0 -0
  1543. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--filelock-refactor.log.gz +0 -0
  1544. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--flake8-after.log.gz +0 -0
  1545. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--flake8-before.log.gz +0 -0
  1546. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--flake8-environment.log.gz +0 -0
  1547. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--flake8-refactor.log.gz +0 -0
  1548. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--flask-after.log.gz +0 -0
  1549. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--flask-before.log.gz +0 -0
  1550. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--flask-environment.log.gz +0 -0
  1551. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--flask-refactor.log.gz +0 -0
  1552. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--funcy-after.log.gz +0 -0
  1553. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--funcy-before.log.gz +0 -0
  1554. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--funcy-environment.log.gz +0 -0
  1555. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--funcy-refactor.log.gz +0 -0
  1556. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--glom-after.log.gz +0 -0
  1557. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--glom-before.log.gz +0 -0
  1558. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--glom-environment.log.gz +0 -0
  1559. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--glom-refactor.log.gz +0 -0
  1560. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--gunicorn-after.log.gz +0 -0
  1561. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--gunicorn-before.log.gz +0 -0
  1562. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--gunicorn-environment.log.gz +0 -0
  1563. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--gunicorn-refactor.log.gz +0 -0
  1564. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--h11-after.log.gz +0 -0
  1565. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--h11-before.log.gz +0 -0
  1566. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--h11-environment.log.gz +0 -0
  1567. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--h11-refactor.log.gz +0 -0
  1568. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--h2-after.log.gz +0 -0
  1569. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--h2-before.log.gz +0 -0
  1570. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--h2-environment.log.gz +0 -0
  1571. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--h2-refactor.log.gz +0 -0
  1572. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--hpack-after.log.gz +0 -0
  1573. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--hpack-before.log.gz +0 -0
  1574. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--hpack-environment.log.gz +0 -0
  1575. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--hpack-refactor.log.gz +0 -0
  1576. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--html5lib-after.log.gz +0 -0
  1577. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--html5lib-before.log.gz +0 -0
  1578. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--html5lib-environment.log.gz +0 -0
  1579. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--html5lib-refactor.log.gz +0 -0
  1580. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--httpx-after.log.gz +0 -0
  1581. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--httpx-before.log.gz +0 -0
  1582. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--httpx-environment.log.gz +0 -0
  1583. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--httpx-refactor.log.gz +0 -0
  1584. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--humanize-before.log.gz +0 -0
  1585. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--humanize-environment.log.gz +0 -0
  1586. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--humanize-refactor.log.gz +0 -0
  1587. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--hyperframe-after.log.gz +0 -0
  1588. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--hyperframe-before.log.gz +0 -0
  1589. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--hyperframe-environment.log.gz +0 -0
  1590. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--hyperframe-refactor.log.gz +0 -0
  1591. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--idna-after.log.gz +0 -0
  1592. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--idna-before.log.gz +0 -0
  1593. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--idna-environment.log.gz +0 -0
  1594. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--idna-refactor.log.gz +0 -0
  1595. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--inflect-before.log.gz +0 -0
  1596. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--inflect-environment.log.gz +0 -0
  1597. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--inflect-refactor.log.gz +0 -0
  1598. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--inflection-before.log.gz +0 -0
  1599. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--inflection-environment.log.gz +0 -0
  1600. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--inflection-refactor.log.gz +0 -0
  1601. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--installer-before.log.gz +0 -0
  1602. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--installer-environment.log.gz +0 -0
  1603. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--installer-refactor.log.gz +0 -0
  1604. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--invoke-before.log.gz +0 -0
  1605. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--invoke-environment.log.gz +0 -0
  1606. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--invoke-refactor.log.gz +0 -0
  1607. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--isort-before.log.gz +0 -0
  1608. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--isort-environment.log.gz +0 -0
  1609. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--isort-refactor.log.gz +0 -0
  1610. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--itsdangerous-before.log.gz +0 -0
  1611. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--itsdangerous-environment.log.gz +0 -0
  1612. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--itsdangerous-refactor.log.gz +0 -0
  1613. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--jinja2-after.log.gz +0 -0
  1614. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--jinja2-before.log.gz +0 -0
  1615. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--jinja2-environment.log.gz +0 -0
  1616. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--jinja2-refactor.log.gz +0 -0
  1617. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--jmespath-after.log.gz +0 -0
  1618. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--jmespath-before.log.gz +0 -0
  1619. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--jmespath-environment.log.gz +0 -0
  1620. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--jmespath-refactor.log.gz +0 -0
  1621. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--jsonpatch-before.log.gz +0 -0
  1622. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--jsonpatch-environment.log.gz +0 -0
  1623. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--jsonpatch-refactor.log.gz +0 -0
  1624. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--jsonpointer-before.log.gz +0 -0
  1625. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--jsonpointer-environment.log.gz +0 -0
  1626. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--jsonpointer-refactor.log.gz +0 -0
  1627. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--jsonschema-after.log.gz +0 -0
  1628. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--jsonschema-before.log.gz +0 -0
  1629. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--jsonschema-environment.log.gz +0 -0
  1630. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--jsonschema-refactor.log.gz +0 -0
  1631. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--lark-after.log.gz +0 -0
  1632. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--lark-before.log.gz +0 -0
  1633. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--lark-environment.log.gz +0 -0
  1634. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--lark-refactor.log.gz +0 -0
  1635. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--loguru-after.log.gz +0 -0
  1636. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--loguru-before.log.gz +0 -0
  1637. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--loguru-environment.log.gz +0 -0
  1638. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--loguru-refactor.log.gz +0 -0
  1639. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--mako-after.log.gz +0 -0
  1640. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--mako-before.log.gz +0 -0
  1641. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--mako-environment.log.gz +0 -0
  1642. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--mako-refactor.log.gz +0 -0
  1643. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--markdown-after.log.gz +0 -0
  1644. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--markdown-before.log.gz +0 -0
  1645. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--markdown-environment.log.gz +0 -0
  1646. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--markdown-it-py-after.log.gz +0 -0
  1647. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--markdown-it-py-before.log.gz +0 -0
  1648. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--markdown-it-py-environment.log.gz +0 -0
  1649. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--markdown-it-py-refactor.log.gz +0 -0
  1650. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--markdown-refactor.log.gz +0 -0
  1651. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--markupsafe-before.log.gz +0 -0
  1652. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--markupsafe-environment.log.gz +0 -0
  1653. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--markupsafe-refactor.log.gz +0 -0
  1654. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--marshmallow-after.log.gz +0 -0
  1655. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--marshmallow-before.log.gz +0 -0
  1656. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--marshmallow-environment.log.gz +0 -0
  1657. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--marshmallow-refactor.log.gz +0 -0
  1658. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--mccabe-before.log.gz +0 -0
  1659. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--mccabe-environment.log.gz +0 -0
  1660. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--mccabe-refactor.log.gz +0 -0
  1661. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--mistune-after.log.gz +0 -0
  1662. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--mistune-before.log.gz +0 -0
  1663. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--mistune-environment.log.gz +0 -0
  1664. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--mistune-refactor.log.gz +0 -0
  1665. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--mkdocs-before.log.gz +0 -0
  1666. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--mkdocs-environment.log.gz +0 -0
  1667. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--mkdocs-refactor.log.gz +0 -0
  1668. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--more-itertools-after.log.gz +0 -0
  1669. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--more-itertools-before.log.gz +0 -0
  1670. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--more-itertools-environment.log.gz +0 -0
  1671. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--more-itertools-refactor.log.gz +0 -0
  1672. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--natsort-after.log.gz +0 -0
  1673. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--natsort-before.log.gz +0 -0
  1674. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--natsort-environment.log.gz +0 -0
  1675. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--natsort-refactor.log.gz +0 -0
  1676. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--networkx-after.log.gz +0 -0
  1677. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--networkx-before.log.gz +0 -0
  1678. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--networkx-environment.log.gz +0 -0
  1679. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--networkx-refactor.log.gz +0 -0
  1680. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--nox-after.log.gz +0 -0
  1681. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--nox-before.log.gz +0 -0
  1682. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--nox-environment.log.gz +0 -0
  1683. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--nox-refactor.log.gz +0 -0
  1684. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--oauthlib-after.log.gz +0 -0
  1685. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--oauthlib-before.log.gz +0 -0
  1686. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--oauthlib-environment.log.gz +0 -0
  1687. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--oauthlib-refactor.log.gz +0 -0
  1688. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--outcome-before.log.gz +0 -0
  1689. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--outcome-environment.log.gz +0 -0
  1690. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--outcome-refactor.log.gz +0 -0
  1691. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--packaging-after.log.gz +0 -0
  1692. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--packaging-before.log.gz +0 -0
  1693. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--packaging-environment.log.gz +0 -0
  1694. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--packaging-refactor.log.gz +0 -0
  1695. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--parsimonious-after.log.gz +0 -0
  1696. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--parsimonious-before.log.gz +0 -0
  1697. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--parsimonious-environment.log.gz +0 -0
  1698. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--parsimonious-refactor.log.gz +0 -0
  1699. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--parso-after.log.gz +0 -0
  1700. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--parso-before.log.gz +0 -0
  1701. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--parso-environment.log.gz +0 -0
  1702. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--parso-refactor.log.gz +0 -0
  1703. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pathspec-after.log.gz +0 -0
  1704. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pathspec-before.log.gz +0 -0
  1705. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pathspec-environment.log.gz +0 -0
  1706. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pathspec-refactor.log.gz +0 -0
  1707. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--peewee-before.log.gz +0 -0
  1708. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--peewee-environment.log.gz +0 -0
  1709. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--peewee-refactor.log.gz +0 -0
  1710. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--platformdirs-after.log.gz +0 -0
  1711. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--platformdirs-before.log.gz +0 -0
  1712. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--platformdirs-environment.log.gz +0 -0
  1713. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--platformdirs-refactor.log.gz +0 -0
  1714. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pluggy-after.log.gz +0 -0
  1715. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pluggy-before.log.gz +0 -0
  1716. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pluggy-environment.log.gz +0 -0
  1717. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pluggy-refactor.log.gz +0 -0
  1718. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--ply-after.log.gz +0 -0
  1719. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--ply-before.log.gz +0 -0
  1720. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--ply-environment.log.gz +0 -0
  1721. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--ply-refactor.log.gz +0 -0
  1722. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--prettytable-before.log.gz +0 -0
  1723. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--prettytable-environment.log.gz +0 -0
  1724. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--prettytable-refactor.log.gz +0 -0
  1725. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyasn1-after.log.gz +0 -0
  1726. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyasn1-before.log.gz +0 -0
  1727. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyasn1-environment.log.gz +0 -0
  1728. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyasn1-refactor.log.gz +0 -0
  1729. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pycodestyle-before.log.gz +0 -0
  1730. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pycodestyle-environment.log.gz +0 -0
  1731. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pycodestyle-refactor.log.gz +0 -0
  1732. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pycparser-after.log.gz +0 -0
  1733. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pycparser-before.log.gz +0 -0
  1734. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pycparser-environment.log.gz +0 -0
  1735. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pycparser-refactor.log.gz +0 -0
  1736. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyflakes-after.log.gz +0 -0
  1737. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyflakes-before.log.gz +0 -0
  1738. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyflakes-environment.log.gz +0 -0
  1739. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyflakes-refactor.log.gz +0 -0
  1740. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pygments-after.log.gz +0 -0
  1741. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pygments-before.log.gz +0 -0
  1742. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pygments-environment.log.gz +0 -0
  1743. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pygments-refactor.log.gz +0 -0
  1744. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyjwt-after.log.gz +0 -0
  1745. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyjwt-before.log.gz +0 -0
  1746. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyjwt-environment.log.gz +0 -0
  1747. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyjwt-refactor.log.gz +0 -0
  1748. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyparsing-after.log.gz +0 -0
  1749. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyparsing-before.log.gz +0 -0
  1750. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyparsing-environment.log.gz +0 -0
  1751. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyparsing-refactor.log.gz +0 -0
  1752. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyparsing-retest-after.log.gz +0 -0
  1753. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyparsing-retest-before.log.gz +0 -0
  1754. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyparsing-retest.json.gz +0 -0
  1755. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyproject-hooks-after.log.gz +0 -0
  1756. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyproject-hooks-before.log.gz +0 -0
  1757. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyproject-hooks-environment.log.gz +0 -0
  1758. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyproject-hooks-refactor.log.gz +0 -0
  1759. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyrsistent-after.log.gz +0 -0
  1760. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyrsistent-before.log.gz +0 -0
  1761. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyrsistent-environment.log.gz +0 -0
  1762. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyrsistent-refactor.log.gz +0 -0
  1763. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pytest-after.log.gz +0 -0
  1764. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pytest-before.log.gz +0 -0
  1765. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pytest-environment.log.gz +0 -0
  1766. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pytest-refactor.log.gz +0 -0
  1767. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--python-dateutil-after.log.gz +0 -0
  1768. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--python-dateutil-before.log.gz +0 -0
  1769. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--python-dateutil-environment.log.gz +0 -0
  1770. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--python-dateutil-refactor.log.gz +0 -0
  1771. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--python-dotenv-before.log.gz +0 -0
  1772. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--python-dotenv-environment.log.gz +0 -0
  1773. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--python-dotenv-refactor.log.gz +0 -0
  1774. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--python-fire-after.log.gz +0 -0
  1775. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--python-fire-before.log.gz +0 -0
  1776. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--python-fire-environment.log.gz +0 -0
  1777. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--python-fire-refactor.log.gz +0 -0
  1778. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--python-prompt-toolkit-after.log.gz +0 -0
  1779. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--python-prompt-toolkit-before.log.gz +0 -0
  1780. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--python-prompt-toolkit-environment.log.gz +0 -0
  1781. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--python-prompt-toolkit-refactor.log.gz +0 -0
  1782. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--python-slugify-before.log.gz +0 -0
  1783. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--python-slugify-environment.log.gz +0 -0
  1784. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--python-slugify-refactor.log.gz +0 -0
  1785. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyupgrade-before.log.gz +0 -0
  1786. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyupgrade-environment.log.gz +0 -0
  1787. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--pyupgrade-refactor.log.gz +0 -0
  1788. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--rfc3986-after.log.gz +0 -0
  1789. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--rfc3986-before.log.gz +0 -0
  1790. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--rfc3986-environment.log.gz +0 -0
  1791. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--rfc3986-refactor.log.gz +0 -0
  1792. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--rich-after.log.gz +0 -0
  1793. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--rich-before.log.gz +0 -0
  1794. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--rich-environment.log.gz +0 -0
  1795. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--rich-refactor.log.gz +0 -0
  1796. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--rsa-after.log.gz +0 -0
  1797. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--rsa-before.log.gz +0 -0
  1798. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--rsa-environment.log.gz +0 -0
  1799. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--rsa-refactor.log.gz +0 -0
  1800. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--schedule-after.log.gz +0 -0
  1801. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--schedule-before.log.gz +0 -0
  1802. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--schedule-environment.log.gz +0 -0
  1803. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--schedule-refactor.log.gz +0 -0
  1804. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--schema-before.log.gz +0 -0
  1805. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--schema-environment.log.gz +0 -0
  1806. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--schema-refactor.log.gz +0 -0
  1807. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--simpy-before.log.gz +0 -0
  1808. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--simpy-environment.log.gz +0 -0
  1809. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--simpy-refactor.log.gz +0 -0
  1810. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--six-before.log.gz +0 -0
  1811. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--six-environment.log.gz +0 -0
  1812. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--six-refactor.log.gz +0 -0
  1813. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--sly-after.log.gz +0 -0
  1814. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--sly-before.log.gz +0 -0
  1815. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--sly-environment.log.gz +0 -0
  1816. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--sly-refactor.log.gz +0 -0
  1817. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--sniffio-before.log.gz +0 -0
  1818. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--sniffio-environment.log.gz +0 -0
  1819. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--sniffio-refactor.log.gz +0 -0
  1820. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--sortedcontainers-after.log.gz +0 -0
  1821. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--sortedcontainers-before.log.gz +0 -0
  1822. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--sortedcontainers-environment.log.gz +0 -0
  1823. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--sortedcontainers-refactor.log.gz +0 -0
  1824. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--soupsieve-after.log.gz +0 -0
  1825. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--soupsieve-before.log.gz +0 -0
  1826. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--soupsieve-environment.log.gz +0 -0
  1827. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--soupsieve-refactor.log.gz +0 -0
  1828. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--sphinx-after.log.gz +0 -0
  1829. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--sphinx-before.log.gz +0 -0
  1830. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--sphinx-environment.log.gz +0 -0
  1831. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--sphinx-refactor.log.gz +0 -0
  1832. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--sqlparse-after.log.gz +0 -0
  1833. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--sqlparse-before.log.gz +0 -0
  1834. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--sqlparse-environment.log.gz +0 -0
  1835. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--sqlparse-refactor.log.gz +0 -0
  1836. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--starlette-after.log.gz +0 -0
  1837. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--starlette-before.log.gz +0 -0
  1838. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--starlette-environment.log.gz +0 -0
  1839. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--starlette-refactor.log.gz +0 -0
  1840. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--structlog-after.log.gz +0 -0
  1841. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--structlog-before.log.gz +0 -0
  1842. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--structlog-environment.log.gz +0 -0
  1843. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--structlog-refactor.log.gz +0 -0
  1844. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--tabulate-before.log.gz +0 -0
  1845. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--tabulate-environment.log.gz +0 -0
  1846. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--tabulate-refactor.log.gz +0 -0
  1847. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--tenacity-after.log.gz +0 -0
  1848. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--tenacity-before.log.gz +0 -0
  1849. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--tenacity-environment.log.gz +0 -0
  1850. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--tenacity-refactor.log.gz +0 -0
  1851. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--termcolor-before.log.gz +0 -0
  1852. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--termcolor-environment.log.gz +0 -0
  1853. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--termcolor-refactor.log.gz +0 -0
  1854. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--texttable-before.log.gz +0 -0
  1855. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--texttable-environment.log.gz +0 -0
  1856. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--texttable-refactor.log.gz +0 -0
  1857. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--tomli-after.log.gz +0 -0
  1858. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--tomli-before.log.gz +0 -0
  1859. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--tomli-environment.log.gz +0 -0
  1860. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--tomli-refactor.log.gz +0 -0
  1861. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--tomli-w-before.log.gz +0 -0
  1862. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--tomli-w-environment.log.gz +0 -0
  1863. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--tomli-w-refactor.log.gz +0 -0
  1864. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--tomlkit-after.log.gz +0 -0
  1865. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--tomlkit-before.log.gz +0 -0
  1866. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--tomlkit-environment.log.gz +0 -0
  1867. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--tomlkit-refactor.log.gz +0 -0
  1868. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--toolz-after.log.gz +0 -0
  1869. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--toolz-before.log.gz +0 -0
  1870. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--toolz-environment.log.gz +0 -0
  1871. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--toolz-refactor.log.gz +0 -0
  1872. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--tornado-after.log.gz +0 -0
  1873. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--tornado-before.log.gz +0 -0
  1874. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--tornado-environment.log.gz +0 -0
  1875. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--tornado-refactor.log.gz +0 -0
  1876. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--towel-main-before.log.gz +0 -0
  1877. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--towel-main-environment.log.gz +0 -0
  1878. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--towel-main-refactor.log.gz +0 -0
  1879. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--towel-v1.414-before.log.gz +0 -0
  1880. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--towel-v1.414-environment.log.gz +0 -0
  1881. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--towel-v1.414-refactor.log.gz +0 -0
  1882. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--towel-v1.618-before.log.gz +0 -0
  1883. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--towel-v1.618-environment.log.gz +0 -0
  1884. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--towel-v1.618-refactor.log.gz +0 -0
  1885. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--tqdm-before.log.gz +0 -0
  1886. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--tqdm-environment.log.gz +0 -0
  1887. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--tqdm-refactor.log.gz +0 -0
  1888. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--traitlets-after.log.gz +0 -0
  1889. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--traitlets-before.log.gz +0 -0
  1890. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--traitlets-environment.log.gz +0 -0
  1891. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--traitlets-refactor.log.gz +0 -0
  1892. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--trio-after.log.gz +0 -0
  1893. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--trio-before.log.gz +0 -0
  1894. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--trio-environment.log.gz +0 -0
  1895. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--trio-refactor-no-types.log.gz +0 -0
  1896. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--trio-refactor.log.gz +0 -0
  1897. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--typer-after.log.gz +0 -0
  1898. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--typer-before.log.gz +0 -0
  1899. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--typer-environment.log.gz +0 -0
  1900. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--typer-refactor.log.gz +0 -0
  1901. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--typing_extensions-after.log.gz +0 -0
  1902. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--typing_extensions-before.log.gz +0 -0
  1903. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--typing_extensions-environment.log.gz +0 -0
  1904. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--typing_extensions-refactor-no-types.log.gz +0 -0
  1905. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--typing_extensions-refactor.log.gz +0 -0
  1906. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--unidecode-before.log.gz +0 -0
  1907. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--unidecode-environment.log.gz +0 -0
  1908. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--unidecode-refactor.log.gz +0 -0
  1909. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--uritemplate-before.log.gz +0 -0
  1910. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--uritemplate-environment.log.gz +0 -0
  1911. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--uritemplate-refactor.log.gz +0 -0
  1912. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--virtualenv-before.log.gz +0 -0
  1913. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--virtualenv-environment.log.gz +0 -0
  1914. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--virtualenv-refactor.log.gz +0 -0
  1915. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--voluptuous-after.log.gz +0 -0
  1916. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--voluptuous-before.log.gz +0 -0
  1917. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--voluptuous-environment.log.gz +0 -0
  1918. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--voluptuous-refactor.log.gz +0 -0
  1919. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--waitress-after.log.gz +0 -0
  1920. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--waitress-before.log.gz +0 -0
  1921. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--waitress-environment.log.gz +0 -0
  1922. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--waitress-refactor.log.gz +0 -0
  1923. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--wcwidth-after.log.gz +0 -0
  1924. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--wcwidth-before.log.gz +0 -0
  1925. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--wcwidth-environment.log.gz +0 -0
  1926. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--wcwidth-refactor.log.gz +0 -0
  1927. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--webargs-after.log.gz +0 -0
  1928. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--webargs-before.log.gz +0 -0
  1929. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--webargs-environment.log.gz +0 -0
  1930. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--webargs-refactor.log.gz +0 -0
  1931. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--werkzeug-after.log.gz +0 -0
  1932. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--werkzeug-before.log.gz +0 -0
  1933. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--werkzeug-environment.log.gz +0 -0
  1934. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--werkzeug-refactor.log.gz +0 -0
  1935. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--wheel-before.log.gz +0 -0
  1936. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--wheel-environment.log.gz +0 -0
  1937. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--wheel-refactor.log.gz +0 -0
  1938. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--wrapt-after.log.gz +0 -0
  1939. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--wrapt-before.log.gz +0 -0
  1940. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--wrapt-environment.log.gz +0 -0
  1941. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--wrapt-refactor.log.gz +0 -0
  1942. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--wsproto-after.log.gz +0 -0
  1943. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--wsproto-before.log.gz +0 -0
  1944. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--wsproto-environment.log.gz +0 -0
  1945. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--wsproto-refactor.log.gz +0 -0
  1946. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--xmltodict-before.log.gz +0 -0
  1947. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--xmltodict-environment.log.gz +0 -0
  1948. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--xmltodict-refactor.log.gz +0 -0
  1949. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--yapf-after.log.gz +0 -0
  1950. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--yapf-before.log.gz +0 -0
  1951. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--yapf-environment.log.gz +0 -0
  1952. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-logs--yapf-refactor.log.gz +0 -0
  1953. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-reconciliation.json.gz +0 -0
  1954. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--anyio.json.gz +0 -0
  1955. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--apispec.json.gz +0 -0
  1956. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--arrow.json.gz +0 -0
  1957. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--astroid.json.gz +0 -0
  1958. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--attrs.json.gz +0 -0
  1959. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--backoff.json.gz +0 -0
  1960. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--beautifulsoup4.json.gz +0 -0
  1961. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--bidict.json.gz +0 -0
  1962. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--black.json.gz +0 -0
  1963. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--bleach.json.gz +0 -0
  1964. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--blinker.json.gz +0 -0
  1965. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--boltons.json.gz +0 -0
  1966. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--bottle.json.gz +0 -0
  1967. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--cachetools.json.gz +0 -0
  1968. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--cattrs.json.gz +0 -0
  1969. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--cerberus.json.gz +0 -0
  1970. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--chardet.json.gz +0 -0
  1971. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--cheroot.json.gz +0 -0
  1972. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--click.json.gz +0 -0
  1973. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--colorama.json.gz +0 -0
  1974. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--croniter.json.gz +0 -0
  1975. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--decorator.json.gz +0 -0
  1976. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--deepdiff.json.gz +0 -0
  1977. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--django-forms.json.gz +0 -0
  1978. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--django-utils.json.gz +0 -0
  1979. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--docopt-ng.json.gz +0 -0
  1980. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--dpath.json.gz +0 -0
  1981. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--ecdsa.json.gz +0 -0
  1982. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--environs.json.gz +0 -0
  1983. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--feedparser.json.gz +0 -0
  1984. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--filelock.json.gz +0 -0
  1985. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--flake8.json.gz +0 -0
  1986. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--flask.json.gz +0 -0
  1987. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--funcy.json.gz +0 -0
  1988. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--glom.json.gz +0 -0
  1989. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--gunicorn.json.gz +0 -0
  1990. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--h11.json.gz +0 -0
  1991. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--h2.json.gz +0 -0
  1992. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--hpack.json.gz +0 -0
  1993. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--html5lib.json.gz +0 -0
  1994. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--httpx.json.gz +0 -0
  1995. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--humanize.json.gz +0 -0
  1996. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--hyperframe.json.gz +0 -0
  1997. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--idna.json.gz +0 -0
  1998. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--inflect.json.gz +0 -0
  1999. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--inflection.json.gz +0 -0
  2000. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--installer.json.gz +0 -0
  2001. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--invoke.json.gz +0 -0
  2002. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--isort.json.gz +0 -0
  2003. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--itsdangerous.json.gz +0 -0
  2004. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--jinja2.json.gz +0 -0
  2005. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--jmespath.json.gz +0 -0
  2006. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--jsonpatch.json.gz +0 -0
  2007. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--jsonpointer.json.gz +0 -0
  2008. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--jsonschema.json.gz +0 -0
  2009. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--lark.json.gz +0 -0
  2010. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--loguru.json.gz +0 -0
  2011. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--mako.json.gz +0 -0
  2012. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--markdown-it-py.json.gz +0 -0
  2013. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--markdown.json.gz +0 -0
  2014. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--markupsafe.json.gz +0 -0
  2015. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--marshmallow.json.gz +0 -0
  2016. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--mccabe.json.gz +0 -0
  2017. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--mistune.json.gz +0 -0
  2018. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--mkdocs.json.gz +0 -0
  2019. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--more-itertools.json.gz +0 -0
  2020. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--natsort.json.gz +0 -0
  2021. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--networkx.json.gz +0 -0
  2022. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--nox.json.gz +0 -0
  2023. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--oauthlib.json.gz +0 -0
  2024. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--outcome.json.gz +0 -0
  2025. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--packaging.json.gz +0 -0
  2026. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--parsimonious.json.gz +0 -0
  2027. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--parso.json.gz +0 -0
  2028. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--pathspec.json.gz +0 -0
  2029. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--peewee.json.gz +0 -0
  2030. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--platformdirs.json.gz +0 -0
  2031. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--pluggy.json.gz +0 -0
  2032. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--ply.json.gz +0 -0
  2033. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--prettytable.json.gz +0 -0
  2034. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--pyasn1.json.gz +0 -0
  2035. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--pycodestyle.json.gz +0 -0
  2036. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--pycparser.json.gz +0 -0
  2037. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--pyflakes.json.gz +0 -0
  2038. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--pygments.json.gz +0 -0
  2039. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--pyjwt.json.gz +0 -0
  2040. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--pyparsing.json.gz +0 -0
  2041. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--pyproject-hooks.json.gz +0 -0
  2042. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--pyrsistent.json.gz +0 -0
  2043. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--pytest.json.gz +0 -0
  2044. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--python-dateutil.json.gz +0 -0
  2045. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--python-dotenv.json.gz +0 -0
  2046. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--python-fire.json.gz +0 -0
  2047. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--python-prompt-toolkit.json.gz +0 -0
  2048. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--python-slugify.json.gz +0 -0
  2049. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--pyupgrade.json.gz +0 -0
  2050. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--rfc3986.json.gz +0 -0
  2051. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--rich.json.gz +0 -0
  2052. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--rsa.json.gz +0 -0
  2053. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--schedule.json.gz +0 -0
  2054. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--schema.json.gz +0 -0
  2055. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--simpy.json.gz +0 -0
  2056. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--six.json.gz +0 -0
  2057. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--sly.json.gz +0 -0
  2058. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--sniffio.json.gz +0 -0
  2059. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--sortedcontainers.json.gz +0 -0
  2060. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--soupsieve.json.gz +0 -0
  2061. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--sphinx.json.gz +0 -0
  2062. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--sqlparse.json.gz +0 -0
  2063. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--starlette.json.gz +0 -0
  2064. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--structlog.json.gz +0 -0
  2065. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--summary.json.gz +0 -0
  2066. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--summary.md.gz +0 -0
  2067. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--tabulate.json.gz +0 -0
  2068. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--tenacity.json.gz +0 -0
  2069. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--termcolor.json.gz +0 -0
  2070. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--texttable.json.gz +0 -0
  2071. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--tomli-w.json.gz +0 -0
  2072. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--tomli.json.gz +0 -0
  2073. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--tomlkit.json.gz +0 -0
  2074. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--toolz.json.gz +0 -0
  2075. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--tornado.json.gz +0 -0
  2076. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--towel-main.json.gz +0 -0
  2077. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--towel-v1.414.json.gz +0 -0
  2078. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--towel-v1.618.json.gz +0 -0
  2079. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--tqdm.json.gz +0 -0
  2080. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--traitlets.json.gz +0 -0
  2081. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--trio.json.gz +0 -0
  2082. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--typer.json.gz +0 -0
  2083. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--typing_extensions.json.gz +0 -0
  2084. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--unidecode.json.gz +0 -0
  2085. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--uritemplate.json.gz +0 -0
  2086. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--virtualenv.json.gz +0 -0
  2087. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--voluptuous.json.gz +0 -0
  2088. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--waitress.json.gz +0 -0
  2089. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--wcwidth.json.gz +0 -0
  2090. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--webargs.json.gz +0 -0
  2091. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--werkzeug.json.gz +0 -0
  2092. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--wheel.json.gz +0 -0
  2093. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--wrapt.json.gz +0 -0
  2094. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--wsproto.json.gz +0 -0
  2095. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--xmltodict.json.gz +0 -0
  2096. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-report--yapf.json.gz +0 -0
  2097. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-resources.jsonl.gz +0 -0
  2098. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--blinker--assessment.json.gz +0 -0
  2099. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--blinker--before.log.gz +0 -0
  2100. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--blinker--refactor.log.gz +0 -0
  2101. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--blinker--result.json.gz +0 -0
  2102. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--chardet--after.log.gz +0 -0
  2103. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--chardet--assessment.json.gz +0 -0
  2104. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--chardet--before.log.gz +0 -0
  2105. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--chardet--refactor.log.gz +0 -0
  2106. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--chardet--result.json.gz +0 -0
  2107. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--cheroot--after.log.gz +0 -0
  2108. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--cheroot--assessment.json.gz +0 -0
  2109. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--cheroot--before.log.gz +0 -0
  2110. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--cheroot--predecessor-cause--.mypy.ini.gz +0 -0
  2111. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--cheroot--predecessor-cause--.pre-commit-config.yaml.gz +0 -0
  2112. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--cheroot--predecessor-cause--assessment.json.gz +0 -0
  2113. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--cheroot--predecessor-cause--own-mypy.json.gz +0 -0
  2114. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--cheroot--predecessor-cause--own-mypy.log.gz +0 -0
  2115. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--cheroot--predecessor-cause--pyproject.toml.gz +0 -0
  2116. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--cheroot--predecessor-cause--tox.ini.gz +0 -0
  2117. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--cheroot--refactor-no-types.log.gz +0 -0
  2118. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--cheroot--refactor.log.gz +0 -0
  2119. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--cheroot--result.json.gz +0 -0
  2120. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--invoke--assessment.json.gz +0 -0
  2121. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--invoke--before.log.gz +0 -0
  2122. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--invoke--facts.json.gz +0 -0
  2123. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--invoke--probe-command.json.gz +0 -0
  2124. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--invoke--probe.py.gz +0 -0
  2125. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--invoke--refactor.log.gz +0 -0
  2126. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--invoke--result.json.gz +0 -0
  2127. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--isort--assessment.json.gz +0 -0
  2128. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--isort--before.log.gz +0 -0
  2129. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--isort--facts.json.gz +0 -0
  2130. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--isort--probe-command.json.gz +0 -0
  2131. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--isort--probe.py.gz +0 -0
  2132. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--isort--refactor.log.gz +0 -0
  2133. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--isort--result.json.gz +0 -0
  2134. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--pyparsing--after.log.gz +0 -0
  2135. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--pyparsing--assessment.json.gz +0 -0
  2136. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--pyparsing--before.log.gz +0 -0
  2137. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--pyparsing--refactor.log.gz +0 -0
  2138. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--pyparsing--result.json.gz +0 -0
  2139. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--sphinx--after.log.gz +0 -0
  2140. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--sphinx--assessment.json.gz +0 -0
  2141. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--sphinx--before.log.gz +0 -0
  2142. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--sphinx--refactor.log.gz +0 -0
  2143. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--sphinx--result.json.gz +0 -0
  2144. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--tornado--after.log.gz +0 -0
  2145. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--tornado--assessment.json.gz +0 -0
  2146. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--tornado--before.log.gz +0 -0
  2147. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--tornado--refactor.log.gz +0 -0
  2148. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--tornado--result.json.gz +0 -0
  2149. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--towel-main--assessment.json.gz +0 -0
  2150. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--towel-main--before.log.gz +0 -0
  2151. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--towel-main--refactor.log.gz +0 -0
  2152. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--towel-main--result.json.gz +0 -0
  2153. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--towel-v1.414--assessment.json.gz +0 -0
  2154. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--towel-v1.414--before.log.gz +0 -0
  2155. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--towel-v1.414--refactor.log.gz +0 -0
  2156. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--towel-v1.414--result.json.gz +0 -0
  2157. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--towel-v1.618--assessment.json.gz +0 -0
  2158. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--towel-v1.618--before.log.gz +0 -0
  2159. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--towel-v1.618--refactor.log.gz +0 -0
  2160. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--towel-v1.618--result.json.gz +0 -0
  2161. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--trio--after.log.gz +0 -0
  2162. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--trio--assessment.json.gz +0 -0
  2163. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--trio--before.log.gz +0 -0
  2164. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--trio--current-checker-environment.json.gz +0 -0
  2165. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--trio--predecessor-cause--assessment.json.gz +0 -0
  2166. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--trio--predecessor-cause--checker-environment.json.gz +0 -0
  2167. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--trio--predecessor-cause--own-mypy-linux.json.gz +0 -0
  2168. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--trio--predecessor-cause--own-mypy-linux.log.gz +0 -0
  2169. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--trio--predecessor-cause--pyproject.toml.gz +0 -0
  2170. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--trio--predecessor-cause--test-requirements.txt.gz +0 -0
  2171. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--trio--predecessor-cause--tox.ini.gz +0 -0
  2172. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--trio--refactor-no-types.log.gz +0 -0
  2173. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--trio--refactor.log.gz +0 -0
  2174. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--trio--result.json.gz +0 -0
  2175. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--typing_extensions--after.log.gz +0 -0
  2176. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--typing_extensions--assessment.json.gz +0 -0
  2177. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--typing_extensions--before.log.gz +0 -0
  2178. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--typing_extensions--predecessor-cause--.pre-commit-config.yaml.gz +0 -0
  2179. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--typing_extensions--predecessor-cause--assessment.json.gz +0 -0
  2180. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--typing_extensions--predecessor-cause--own-mypy.json.gz +0 -0
  2181. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--typing_extensions--predecessor-cause--own-mypy.log.gz +0 -0
  2182. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--typing_extensions--predecessor-cause--pyproject.toml.gz +0 -0
  2183. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--typing_extensions--predecessor-cause--tox.ini.gz +0 -0
  2184. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--typing_extensions--refactor-no-types.log.gz +0 -0
  2185. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--typing_extensions--refactor.log.gz +0 -0
  2186. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus-review--typing_extensions--result.json.gz +0 -0
  2187. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/corpus.log.gz +0 -0
  2188. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/coverage-3.11.xml.gz +0 -0
  2189. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/coverage-3.12.xml.gz +0 -0
  2190. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/coverage-3.13.xml.gz +0 -0
  2191. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/dependencies-audit-command.json.gz +0 -0
  2192. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/dependencies-dev-audit.log.gz +0 -0
  2193. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/dependencies-dev.txt.gz +0 -0
  2194. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/diagrams-command.json.gz +0 -0
  2195. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/diagrams-writable-cache.log.gz +0 -0
  2196. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/distribution-contents.json.gz +0 -0
  2197. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/fallback-config-probe-command.json.gz +0 -0
  2198. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/fallback-config-probe-result.json.gz +0 -0
  2199. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/fallback-config-probe.py.gz +0 -0
  2200. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/fuzz-grammar.log.gz +0 -0
  2201. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/fuzz-results.json.gz +0 -0
  2202. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/fuzz-scope.log.gz +0 -0
  2203. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/input-preflight-command.json.gz +0 -0
  2204. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/input-preflight.json.gz +0 -0
  2205. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/inspect_artifacts.py.gz +0 -0
  2206. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/matrix-3.11-container.json.gz +0 -0
  2207. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/matrix-3.11-launch.json.gz +0 -0
  2208. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/matrix-3.11-resources.jsonl.gz +0 -0
  2209. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/matrix-3.11-result.json.gz +0 -0
  2210. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/matrix-3.11.log.gz +0 -0
  2211. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/matrix-3.12-container.json.gz +0 -0
  2212. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/matrix-3.12-launch.json.gz +0 -0
  2213. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/matrix-3.12-resources.jsonl.gz +0 -0
  2214. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/matrix-3.12-result.json.gz +0 -0
  2215. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/matrix-3.12.log.gz +0 -0
  2216. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/matrix-3.13-container.json.gz +0 -0
  2217. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/matrix-3.13-launch.json.gz +0 -0
  2218. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/matrix-3.13-resources.jsonl.gz +0 -0
  2219. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/matrix-3.13-result.json.gz +0 -0
  2220. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/matrix-3.13.log.gz +0 -0
  2221. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/matrix-driver.log.gz +0 -0
  2222. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/matrix-resumption-preflight.json.gz +0 -0
  2223. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/mechanical-corpus-review.json.gz +0 -0
  2224. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/observe_cold_cli.py.gz +0 -0
  2225. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/predecessor-oom--assessment.json.gz +0 -0
  2226. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/predecessor-oom--before.log.gz +0 -0
  2227. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/predecessor-oom--corpus-entry.py.gz +0 -0
  2228. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/predecessor-oom--resource-failure.json.gz +0 -0
  2229. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/predecessor-oom--result.json.gz +0 -0
  2230. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/predecessor-review.json.gz +0 -0
  2231. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/provenance.json +0 -0
  2232. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/quality-313.log.gz +0 -0
  2233. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/refusal-integrity-command.json.gz +0 -0
  2234. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/refusal-integrity.json.gz +0 -0
  2235. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/refusal-integrity.py.gz +0 -0
  2236. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/resume-final-gates.py.gz +0 -0
  2237. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/run-corpus.py.gz +0 -0
  2238. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/run-fuzz.py.gz +0 -0
  2239. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/run-matrix.py.gz +0 -0
  2240. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/run-matrix.sh.gz +0 -0
  2241. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/run-self-complete.py.gz +0 -0
  2242. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/run-self-project.py.gz +0 -0
  2243. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/sdist-docs-result.json.gz +0 -0
  2244. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/sdist-docs-source.log.gz +0 -0
  2245. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/sdist-docs-tests.log.gz +0 -0
  2246. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/self-generation-result.json.gz +0 -0
  2247. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/selfdogfood--imported-source.log.gz +0 -0
  2248. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/selfdogfood--post-test-integrity.json.gz +0 -0
  2249. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/selfdogfood--results.json.gz +0 -0
  2250. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/selfdogfood--source.json.gz +0 -0
  2251. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/selfdogfood--tests.log.gz +0 -0
  2252. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/selfdogfood--typecheck.log.gz +0 -0
  2253. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/selfdogfood.log.gz +0 -0
  2254. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/smoke_wheels.py.gz +0 -0
  2255. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/source.json.gz +0 -0
  2256. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/twine-313.log.gz +0 -0
  2257. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/validate-corpus-records.py.gz +0 -0
  2258. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/verify_distribution_contents.py.gz +0 -0
  2259. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/wheel-smoke--3.11-bare--commands.json.gz +0 -0
  2260. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/wheel-smoke--3.11-extras--cold-check.json.gz +0 -0
  2261. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/wheel-smoke--3.11-extras--commands.json.gz +0 -0
  2262. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/wheel-smoke--3.12-bare--commands.json.gz +0 -0
  2263. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/wheel-smoke--3.12-extras--cold-check.json.gz +0 -0
  2264. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/wheel-smoke--3.12-extras--commands.json.gz +0 -0
  2265. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/wheel-smoke--3.13-bare--commands.json.gz +0 -0
  2266. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/wheel-smoke--3.13-extras--cold-check.json.gz +0 -0
  2267. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/wheel-smoke--3.13-extras--commands.json.gz +0 -0
  2268. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-corrected-validation/wheel-smoke--results.json.gz +0 -0
  2269. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-performance/README.md +0 -0
  2270. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-performance/after-commit.txt.gz +0 -0
  2271. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-performance/after-fixed_point.py.gz +0 -0
  2272. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-performance/before-fixed_point.py.gz +0 -0
  2273. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-performance/operator-record.md.gz +0 -0
  2274. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-performance/packaging-after-1-boundary.json.gz +0 -0
  2275. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-performance/packaging-after-1-events.jsonl.gz +0 -0
  2276. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-performance/packaging-after-1-run.log.gz +0 -0
  2277. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-performance/packaging-after-2-boundary.json.gz +0 -0
  2278. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-performance/packaging-after-2-events.jsonl.gz +0 -0
  2279. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-performance/packaging-after-2-run.log.gz +0 -0
  2280. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-performance/packaging-after-source.json.gz +0 -0
  2281. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-performance/packaging-baseline-1-boundary.json.gz +0 -0
  2282. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-performance/packaging-baseline-1-events.jsonl.gz +0 -0
  2283. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-performance/packaging-baseline-1-run.log.gz +0 -0
  2284. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-performance/packaging-baseline-2-boundary.json.gz +0 -0
  2285. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-performance/packaging-baseline-2-events.jsonl.gz +0 -0
  2286. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-performance/packaging-baseline-2-run.log.gz +0 -0
  2287. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-performance/packaging-before-source.json.gz +0 -0
  2288. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-performance/packaging-comparison.json.gz +0 -0
  2289. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-performance/packaging-comparison.log.gz +0 -0
  2290. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-performance/packaging-config.toml.gz +0 -0
  2291. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-performance/packaging-measure.py.gz +0 -0
  2292. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-performance/provenance.json +0 -0
  2293. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-performance/sphinx-after-inputs.json.gz +0 -0
  2294. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-performance/sphinx-after-profile.py.gz +0 -0
  2295. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-performance/sphinx-after-spans.jsonl.gz +0 -0
  2296. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-performance/sphinx-after-summary.json.gz +0 -0
  2297. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-performance/sphinx-after.log.gz +0 -0
  2298. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-performance/sphinx-before-inputs.json.gz +0 -0
  2299. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-performance/sphinx-before-profile.py.gz +0 -0
  2300. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-performance/sphinx-before-spans.jsonl.gz +0 -0
  2301. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-performance/sphinx-before-summary.json.gz +0 -0
  2302. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-performance/sphinx-before.log.gz +0 -0
  2303. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-performance/sphinx-comparison.json.gz +0 -0
  2304. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/README.md +0 -0
  2305. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/benchmark-driver-stopped-20260928.log.gz +0 -0
  2306. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/benchmark-driver.log.gz +0 -0
  2307. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/benchmark-result-stopped-20260928.json.gz +0 -0
  2308. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/benchmark-result.json.gz +0 -0
  2309. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/candidate-environment.json.gz +0 -0
  2310. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/idle-preflight.json.gz +0 -0
  2311. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/input-provenance.json.gz +0 -0
  2312. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/packaging-1-published--cli.log.gz +0 -0
  2313. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/packaging-1-published--command-result.json.gz +0 -0
  2314. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/packaging-1-published--imported-source.json.gz +0 -0
  2315. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/packaging-1-published--processes-before.txt.gz +0 -0
  2316. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/packaging-1-published--runtime-identity.json.gz +0 -0
  2317. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/packaging-2-candidate--cli.log.gz +0 -0
  2318. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/packaging-2-candidate--command-result.json.gz +0 -0
  2319. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/packaging-2-candidate--imported-source.json.gz +0 -0
  2320. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/packaging-2-candidate--processes-before.txt.gz +0 -0
  2321. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/packaging-2-candidate--runtime-identity.json.gz +0 -0
  2322. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/packaging-3-candidate--cli.log.gz +0 -0
  2323. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/packaging-3-candidate--command-result.json.gz +0 -0
  2324. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/packaging-3-candidate--imported-source.json.gz +0 -0
  2325. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/packaging-3-candidate--processes-before.txt.gz +0 -0
  2326. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/packaging-3-candidate--runtime-identity.json.gz +0 -0
  2327. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/packaging-4-published--cli.log.gz +0 -0
  2328. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/packaging-4-published--command-result.json.gz +0 -0
  2329. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/packaging-4-published--imported-source.json.gz +0 -0
  2330. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/packaging-4-published--processes-before.txt.gz +0 -0
  2331. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/packaging-4-published--runtime-identity.json.gz +0 -0
  2332. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/packaging-comparison.json.gz +0 -0
  2333. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/packaging-driver.log.gz +0 -0
  2334. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/packaging-results.json.gz +0 -0
  2335. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/prerequisites--completed-document-quality.log.gz +0 -0
  2336. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/prerequisites--completed-document-tests.log.gz +0 -0
  2337. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/prerequisites--continuation-result.json.gz +0 -0
  2338. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/prerequisites--corpus-exit.json.gz +0 -0
  2339. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/prerequisites--matrix-3.11-result.json.gz +0 -0
  2340. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/prerequisites--matrix-3.12-result.json.gz +0 -0
  2341. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/prerequisites--matrix-3.13-result.json.gz +0 -0
  2342. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/prerequisites--prebenchmark-checks.json.gz +0 -0
  2343. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/processes-before-timing.txt.gz +0 -0
  2344. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/profile-sphinx.py.gz +0 -0
  2345. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/provenance.json +0 -0
  2346. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/published-environment.json.gz +0 -0
  2347. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/published-provenance.json.gz +0 -0
  2348. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/pypi-1.772.json.gz +0 -0
  2349. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/ready-for-timing.json.gz +0 -0
  2350. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/retain-and-document.py.gz +0 -0
  2351. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/run-after-validation.py.gz +0 -0
  2352. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/run-packaging.py.gz +0 -0
  2353. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/run-sphinx-container.py.gz +0 -0
  2354. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/sphinx-1-command.json.gz +0 -0
  2355. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/sphinx-1-install.json.gz +0 -0
  2356. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/sphinx-1-published--answers.json.gz +0 -0
  2357. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/sphinx-1-published--environment.json.gz +0 -0
  2358. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/sphinx-1-published--request-fingerprints.json.gz +0 -0
  2359. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/sphinx-1-published--result.json.gz +0 -0
  2360. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/sphinx-1-published.log.gz +0 -0
  2361. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/sphinx-1-source.json.gz +0 -0
  2362. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/sphinx-2-candidate--answers.json.gz +0 -0
  2363. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/sphinx-2-candidate--environment.json.gz +0 -0
  2364. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/sphinx-2-candidate--request-fingerprints.json.gz +0 -0
  2365. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/sphinx-2-candidate--result.json.gz +0 -0
  2366. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/sphinx-2-candidate.log.gz +0 -0
  2367. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/sphinx-2-command.json.gz +0 -0
  2368. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/sphinx-2-install.json.gz +0 -0
  2369. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/sphinx-2-source.json.gz +0 -0
  2370. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/sphinx-3-candidate--answers.json.gz +0 -0
  2371. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/sphinx-3-candidate--environment.json.gz +0 -0
  2372. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/sphinx-3-candidate--request-fingerprints.json.gz +0 -0
  2373. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/sphinx-3-candidate--result.json.gz +0 -0
  2374. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/sphinx-3-candidate.log.gz +0 -0
  2375. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/sphinx-3-command.json.gz +0 -0
  2376. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/sphinx-3-install.json.gz +0 -0
  2377. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/sphinx-3-source.json.gz +0 -0
  2378. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/sphinx-4-command.json.gz +0 -0
  2379. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/sphinx-4-install.json.gz +0 -0
  2380. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/sphinx-4-published--answers.json.gz +0 -0
  2381. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/sphinx-4-published--environment.json.gz +0 -0
  2382. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/sphinx-4-published--request-fingerprints.json.gz +0 -0
  2383. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/sphinx-4-published--result.json.gz +0 -0
  2384. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/sphinx-4-published.log.gz +0 -0
  2385. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/sphinx-4-source.json.gz +0 -0
  2386. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/sphinx-comparison.json.gz +0 -0
  2387. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/sphinx-container-command.json.gz +0 -0
  2388. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/sphinx-container-final.json.gz +0 -0
  2389. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/sphinx-driver.log.gz +0 -0
  2390. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/sphinx-input-sha256.json.gz +0 -0
  2391. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/sphinx-resources.jsonl.gz +0 -0
  2392. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/sphinx-results.json.gz +0 -0
  2393. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/timing-prerequisites.json.gz +0 -0
  2394. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/tool-pins.txt.gz +0 -0
  2395. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-published-comparison/wheel-source-identity.json.gz +0 -0
  2396. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-typed-cli/README.md +0 -0
  2397. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-typed-cli/measurements.json +0 -0
  2398. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-validation/README.md +0 -0
  2399. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-validation/artifacts.json.gz +0 -0
  2400. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-validation/candidate--pyproject.toml.gz +0 -0
  2401. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-validation/coverage-3.11.xml.gz +0 -0
  2402. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-validation/coverage-3.12.xml.gz +0 -0
  2403. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-validation/coverage-3.13.xml.gz +0 -0
  2404. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-validation/dependencies-dev-audit.log.gz +0 -0
  2405. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-validation/dependencies-dev.txt.gz +0 -0
  2406. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-validation/diagrams-writable-cache.log.gz +0 -0
  2407. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-validation/distribution-contents.json.gz +0 -0
  2408. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-validation/fuzz-grammar.log.gz +0 -0
  2409. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-validation/fuzz-scope.log.gz +0 -0
  2410. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-validation/inspect_artifacts.py.gz +0 -0
  2411. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-validation/matrix-3.11-launch.json.gz +0 -0
  2412. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-validation/matrix-3.11-result.json.gz +0 -0
  2413. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-validation/matrix-3.11.log.gz +0 -0
  2414. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-validation/matrix-3.12-launch.json.gz +0 -0
  2415. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-validation/matrix-3.12-result.json.gz +0 -0
  2416. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-validation/matrix-3.12.log.gz +0 -0
  2417. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-validation/matrix-3.13-launch.json.gz +0 -0
  2418. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-validation/matrix-3.13-result.json.gz +0 -0
  2419. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-validation/matrix-3.13.log.gz +0 -0
  2420. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-validation/matrix-driver.log.gz +0 -0
  2421. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-validation/observe_cold_cli.py.gz +0 -0
  2422. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-validation/provenance.json +0 -0
  2423. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-validation/quality-313.log.gz +0 -0
  2424. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-validation/run-matrix.py.gz +0 -0
  2425. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-validation/run-matrix.sh.gz +0 -0
  2426. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-validation/run-self-project.py.gz +0 -0
  2427. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-validation/selfdogfood--imported-source.log.gz +0 -0
  2428. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-validation/selfdogfood--post-test-integrity.json.gz +0 -0
  2429. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-validation/selfdogfood--results.json.gz +0 -0
  2430. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-validation/selfdogfood--source.json.gz +0 -0
  2431. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-validation/selfdogfood--tests.log.gz +0 -0
  2432. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-validation/selfdogfood--typecheck.log.gz +0 -0
  2433. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-validation/selfdogfood.log.gz +0 -0
  2434. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-validation/smoke_wheels.py.gz +0 -0
  2435. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-validation/source.json.gz +0 -0
  2436. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-validation/twine-313.log.gz +0 -0
  2437. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-validation/verify_distribution_contents.py.gz +0 -0
  2438. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-validation/wheel-smoke--3.11-bare--commands.json.gz +0 -0
  2439. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-validation/wheel-smoke--3.11-extras--cold-check.json.gz +0 -0
  2440. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-validation/wheel-smoke--3.11-extras--commands.json.gz +0 -0
  2441. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-validation/wheel-smoke--3.12-bare--commands.json.gz +0 -0
  2442. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-validation/wheel-smoke--3.12-extras--cold-check.json.gz +0 -0
  2443. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-validation/wheel-smoke--3.12-extras--commands.json.gz +0 -0
  2444. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-validation/wheel-smoke--3.13-bare--commands.json.gz +0 -0
  2445. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-validation/wheel-smoke--3.13-extras--cold-check.json.gz +0 -0
  2446. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-validation/wheel-smoke--3.13-extras--commands.json.gz +0 -0
  2447. {code_towel-1.792 → code_towel-1.947}/tests/release_evidence/post-1772-validation/wheel-smoke--results.json.gz +0 -0
  2448. {code_towel-1.792 → code_towel-1.947}/tests/run_tests.py +0 -0
  2449. {code_towel-1.792 → code_towel-1.947}/tests/stdlib_bases.py +0 -0
  2450. {code_towel-1.792 → code_towel-1.947}/tests/test_adversarial_renaming.py +0 -0
  2451. {code_towel-1.792 → code_towel-1.947}/tests/test_adversarial_semantics.py +0 -0
  2452. {code_towel-1.792 → code_towel-1.947}/tests/test_analysis_edge_paths.py +0 -0
  2453. {code_towel-1.792 → code_towel-1.947}/tests/test_analysis_sessions.py +0 -0
  2454. {code_towel-1.792 → code_towel-1.947}/tests/test_analysis_source_diagnostics.py +0 -0
  2455. {code_towel-1.792 → code_towel-1.947}/tests/test_analysis_sources.py +0 -0
  2456. {code_towel-1.792 → code_towel-1.947}/tests/test_annotation_guard_runtime.py +0 -0
  2457. {code_towel-1.792 → code_towel-1.947}/tests/test_annotation_imports.py +0 -0
  2458. {code_towel-1.792 → code_towel-1.947}/tests/test_annotation_ladder.py +0 -0
  2459. {code_towel-1.792 → code_towel-1.947}/tests/test_annotation_ladder_early_refusal.py +0 -0
  2460. {code_towel-1.792 → code_towel-1.947}/tests/test_annotation_runtime_effects.py +0 -0
  2461. {code_towel-1.792 → code_towel-1.947}/tests/test_annotations_for_the_oldest_python.py +0 -0
  2462. {code_towel-1.792 → code_towel-1.947}/tests/test_argument_ownership.py +0 -0
  2463. {code_towel-1.792 → code_towel-1.947}/tests/test_assignment_analyzer_comprehensive.py +0 -0
  2464. {code_towel-1.792 → code_towel-1.947}/tests/test_attribute_declaration_order.py +0 -0
  2465. {code_towel-1.792 → code_towel-1.947}/tests/test_baseline_shapes.py +0 -0
  2466. {code_towel-1.792 → code_towel-1.947}/tests/test_binding_and_read_collectors.py +0 -0
  2467. {code_towel-1.792 → code_towel-1.947}/tests/test_binding_collectors_match_cpython.py +0 -0
  2468. {code_towel-1.792 → code_towel-1.947}/tests/test_binding_context_memo.py +0 -0
  2469. {code_towel-1.792 → code_towel-1.947}/tests/test_binding_detector.py +0 -0
  2470. {code_towel-1.792 → code_towel-1.947}/tests/test_binding_detector_edge_cases.py +0 -0
  2471. {code_towel-1.792 → code_towel-1.947}/tests/test_bindings.py +0 -0
  2472. {code_towel-1.792 → code_towel-1.947}/tests/test_bindings_additional.py +0 -0
  2473. {code_towel-1.792 → code_towel-1.947}/tests/test_block_comments.py +0 -0
  2474. {code_towel-1.792 → code_towel-1.947}/tests/test_block_site_caches.py +0 -0
  2475. {code_towel-1.792 → code_towel-1.947}/tests/test_breakers.py +0 -0
  2476. {code_towel-1.792 → code_towel-1.947}/tests/test_builtins_comprehensive.py +0 -0
  2477. {code_towel-1.792 → code_towel-1.947}/tests/test_cache_lifetimes.py +0 -0
  2478. {code_towel-1.792 → code_towel-1.947}/tests/test_cache_run_boundaries.py +0 -0
  2479. {code_towel-1.792 → code_towel-1.947}/tests/test_candidate_index.py +0 -0
  2480. {code_towel-1.792 → code_towel-1.947}/tests/test_candidate_recovery.py +0 -0
  2481. {code_towel-1.792 → code_towel-1.947}/tests/test_change_transactions.py +0 -0
  2482. {code_towel-1.792 → code_towel-1.947}/tests/test_checker_failure_reporting.py +0 -0
  2483. {code_towel-1.792 → code_towel-1.947}/tests/test_checker_reports.py +0 -0
  2484. {code_towel-1.792 → code_towel-1.947}/tests/test_checker_snapshot_follows_project.py +0 -0
  2485. {code_towel-1.792 → code_towel-1.947}/tests/test_class_object_annotations.py +0 -0
  2486. {code_towel-1.792 → code_towel-1.947}/tests/test_class_private_helpers.py +0 -0
  2487. {code_towel-1.792 → code_towel-1.947}/tests/test_class_private_positions.py +0 -0
  2488. {code_towel-1.792 → code_towel-1.947}/tests/test_cli_complete_preview.py +0 -0
  2489. {code_towel-1.792 → code_towel-1.947}/tests/test_cli_dispatch_paths.py +0 -0
  2490. {code_towel-1.792 → code_towel-1.947}/tests/test_cli_input_errors.py +0 -0
  2491. {code_towel-1.792 → code_towel-1.947}/tests/test_cli_oracle_lifecycle.py +0 -0
  2492. {code_towel-1.792 → code_towel-1.947}/tests/test_cli_output_safety.py +0 -0
  2493. {code_towel-1.792 → code_towel-1.947}/tests/test_cli_sidecar_publication.py +0 -0
  2494. {code_towel-1.792 → code_towel-1.947}/tests/test_cold_confirmation.py +0 -0
  2495. {code_towel-1.792 → code_towel-1.947}/tests/test_complete_check_scope.py +0 -0
  2496. {code_towel-1.792 → code_towel-1.947}/tests/test_completed_validation_documentation.py +0 -0
  2497. {code_towel-1.792 → code_towel-1.947}/tests/test_comprehensive_coverage.py +0 -0
  2498. {code_towel-1.792 → code_towel-1.947}/tests/test_configured_checker_must_run.py +0 -0
  2499. {code_towel-1.792 → code_towel-1.947}/tests/test_configured_ruff_lint.py +0 -0
  2500. {code_towel-1.792 → code_towel-1.947}/tests/test_consumer_reach.py +0 -0
  2501. {code_towel-1.792 → code_towel-1.947}/tests/test_copy_preservation.py +0 -0
  2502. {code_towel-1.792 → code_towel-1.947}/tests/test_coverage_config.py +0 -0
  2503. {code_towel-1.792 → code_towel-1.947}/tests/test_created_object_escapes.py +0 -0
  2504. {code_towel-1.792 → code_towel-1.947}/tests/test_cross_distribution.py +0 -0
  2505. {code_towel-1.792 → code_towel-1.947}/tests/test_cross_module_opt_in.py +0 -0
  2506. {code_towel-1.792 → code_towel-1.947}/tests/test_crossfile_observational_equivalence.py +0 -0
  2507. {code_towel-1.792 → code_towel-1.947}/tests/test_decline_traces.py +0 -0
  2508. {code_towel-1.792 → code_towel-1.947}/tests/test_declined_run_reports.py +0 -0
  2509. {code_towel-1.792 → code_towel-1.947}/tests/test_deeply_nested_source.py +0 -0
  2510. {code_towel-1.792 → code_towel-1.947}/tests/test_definite_assignment.py +0 -0
  2511. {code_towel-1.792 → code_towel-1.947}/tests/test_definite_assignment_runtime.py +0 -0
  2512. {code_towel-1.792 → code_towel-1.947}/tests/test_dependency_audit_export.py +0 -0
  2513. {code_towel-1.792 → code_towel-1.947}/tests/test_differential_baseline.py +0 -0
  2514. {code_towel-1.792 → code_towel-1.947}/tests/test_differential_scope_family.py +0 -0
  2515. {code_towel-1.792 → code_towel-1.947}/tests/test_distinct_proposals.py +0 -0
  2516. {code_towel-1.792 → code_towel-1.947}/tests/test_documentation_navigation.py +0 -0
  2517. {code_towel-1.792 → code_towel-1.947}/tests/test_early_shared_helpers.py +0 -0
  2518. {code_towel-1.792 → code_towel-1.947}/tests/test_ecosystem_checker_contexts.py +0 -0
  2519. {code_towel-1.792 → code_towel-1.947}/tests/test_ecosystem_colour_environment.py +0 -0
  2520. {code_towel-1.792 → code_towel-1.947}/tests/test_ecosystem_environment.py +0 -0
  2521. {code_towel-1.792 → code_towel-1.947}/tests/test_ecosystem_failure_context.py +0 -0
  2522. {code_towel-1.792 → code_towel-1.947}/tests/test_ecosystem_post_install.py +0 -0
  2523. {code_towel-1.792 → code_towel-1.947}/tests/test_ecosystem_pytest_cache.py +0 -0
  2524. {code_towel-1.792 → code_towel-1.947}/tests/test_ecosystem_tool_pins.py +0 -0
  2525. {code_towel-1.792 → code_towel-1.947}/tests/test_ecosystem_typing_deps.py +0 -0
  2526. {code_towel-1.792 → code_towel-1.947}/tests/test_ecosystem_uv_default_groups.py +0 -0
  2527. {code_towel-1.792 → code_towel-1.947}/tests/test_ecosystem_work_isolation.py +0 -0
  2528. {code_towel-1.792 → code_towel-1.947}/tests/test_ecosystem_workflow_checkers.py +0 -0
  2529. {code_towel-1.792 → code_towel-1.947}/tests/test_effect_free.py +0 -0
  2530. {code_towel-1.792 → code_towel-1.947}/tests/test_engine_failure_visibility.py +0 -0
  2531. {code_towel-1.792 → code_towel-1.947}/tests/test_environment_independence.py +0 -0
  2532. {code_towel-1.792 → code_towel-1.947}/tests/test_environment_inside_the_root.py +0 -0
  2533. {code_towel-1.792 → code_towel-1.947}/tests/test_equivalence_harness_regressions.py +0 -0
  2534. {code_towel-1.792 → code_towel-1.947}/tests/test_equivalence_target_selection.py +0 -0
  2535. {code_towel-1.792 → code_towel-1.947}/tests/test_exceptions.py +0 -0
  2536. {code_towel-1.792 → code_towel-1.947}/tests/test_extractor_additional_branches.py +0 -0
  2537. {code_towel-1.792 → code_towel-1.947}/tests/test_extractor_augassign_and_fstrings.py +0 -0
  2538. {code_towel-1.792 → code_towel-1.947}/tests/test_extractor_callee_and_multi_return.py +0 -0
  2539. {code_towel-1.792 → code_towel-1.947}/tests/test_extractor_comprehensive.py +0 -0
  2540. {code_towel-1.792 → code_towel-1.947}/tests/test_extractor_edge_cases.py +0 -0
  2541. {code_towel-1.792 → code_towel-1.947}/tests/test_extractor_final_lines.py +0 -0
  2542. {code_towel-1.792 → code_towel-1.947}/tests/test_extractor_generate_call_variants.py +0 -0
  2543. {code_towel-1.792 → code_towel-1.947}/tests/test_extractor_more_paths.py +0 -0
  2544. {code_towel-1.792 → code_towel-1.947}/tests/test_extractor_preamble_and_call_mapping.py +0 -0
  2545. {code_towel-1.792 → code_towel-1.947}/tests/test_extractor_remaining_branches.py +0 -0
  2546. {code_towel-1.792 → code_towel-1.947}/tests/test_extractor_return_statements.py +0 -0
  2547. {code_towel-1.792 → code_towel-1.947}/tests/test_extractor_substituter_and_helpers.py +0 -0
  2548. {code_towel-1.792 → code_towel-1.947}/tests/test_file_under_two_names.py +0 -0
  2549. {code_towel-1.792 → code_towel-1.947}/tests/test_filesystem_guards.py +0 -0
  2550. {code_towel-1.792 → code_towel-1.947}/tests/test_final_coverage_push.py +0 -0
  2551. {code_towel-1.792 → code_towel-1.947}/tests/test_fixed_point_refusals.py +0 -0
  2552. {code_towel-1.792 → code_towel-1.947}/tests/test_formatting_protocol_boundary.py +0 -0
  2553. {code_towel-1.792 → code_towel-1.947}/tests/test_forwarder_chains.py +0 -0
  2554. {code_towel-1.792 → code_towel-1.947}/tests/test_frame_ownership.py +0 -0
  2555. {code_towel-1.792 → code_towel-1.947}/tests/test_frame_ownership_engine.py +0 -0
  2556. {code_towel-1.792 → code_towel-1.947}/tests/test_frame_sensitivity_scan.py +0 -0
  2557. {code_towel-1.792 → code_towel-1.947}/tests/test_free_variable_correspondence.py +0 -0
  2558. {code_towel-1.792 → code_towel-1.947}/tests/test_fstrings.py +0 -0
  2559. {code_towel-1.792 → code_towel-1.947}/tests/test_fully_annotated_modules.py +0 -0
  2560. {code_towel-1.792 → code_towel-1.947}/tests/test_function_facts_equivalence.py +0 -0
  2561. {code_towel-1.792 → code_towel-1.947}/tests/test_function_index.py +0 -0
  2562. {code_towel-1.792 → code_towel-1.947}/tests/test_functions_keep_their_own_bodies.py +0 -0
  2563. {code_towel-1.792 → code_towel-1.947}/tests/test_generated_code_formatting.py +0 -0
  2564. {code_towel-1.792 → code_towel-1.947}/tests/test_generated_helper_aliases.py +0 -0
  2565. {code_towel-1.792 → code_towel-1.947}/tests/test_generated_helper_parameters.py +0 -0
  2566. {code_towel-1.792 → code_towel-1.947}/tests/test_generated_helper_reuse.py +0 -0
  2567. {code_towel-1.792 → code_towel-1.947}/tests/test_generic_body_annotations.py +0 -0
  2568. {code_towel-1.792 → code_towel-1.947}/tests/test_generic_expression_types.py +0 -0
  2569. {code_towel-1.792 → code_towel-1.947}/tests/test_generic_extraction.py +0 -0
  2570. {code_towel-1.792 → code_towel-1.947}/tests/test_generic_method_boundaries.py +0 -0
  2571. {code_towel-1.792 → code_towel-1.947}/tests/test_generic_methods.py +0 -0
  2572. {code_towel-1.792 → code_towel-1.947}/tests/test_generic_probe_positions.py +0 -0
  2573. {code_towel-1.792 → code_towel-1.947}/tests/test_generic_verification.py +0 -0
  2574. {code_towel-1.792 → code_towel-1.947}/tests/test_helper_hosts.py +0 -0
  2575. {code_towel-1.792 → code_towel-1.947}/tests/test_helper_profitability.py +0 -0
  2576. {code_towel-1.792 → code_towel-1.947}/tests/test_helpers.py +0 -0
  2577. {code_towel-1.792 → code_towel-1.947}/tests/test_helpers_that_compute_nothing.py +0 -0
  2578. {code_towel-1.792 → code_towel-1.947}/tests/test_host_left_out_of_the_build.py +0 -0
  2579. {code_towel-1.792 → code_towel-1.947}/tests/test_host_ships_with_borrower.py +0 -0
  2580. {code_towel-1.792 → code_towel-1.947}/tests/test_hosting_rationale.py +0 -0
  2581. {code_towel-1.792 → code_towel-1.947}/tests/test_import_attribute_contexts.py +0 -0
  2582. {code_towel-1.792 → code_towel-1.947}/tests/test_import_attribute_reads.py +0 -0
  2583. {code_towel-1.792 → code_towel-1.947}/tests/test_import_binding_ownership.py +0 -0
  2584. {code_towel-1.792 → code_towel-1.947}/tests/test_import_bindings.py +0 -0
  2585. {code_towel-1.792 → code_towel-1.947}/tests/test_import_cycle_package_init.py +0 -0
  2586. {code_towel-1.792 → code_towel-1.947}/tests/test_import_cycles_by_the_program.py +0 -0
  2587. {code_towel-1.792 → code_towel-1.947}/tests/test_import_graph_cache_context.py +0 -0
  2588. {code_towel-1.792 → code_towel-1.947}/tests/test_import_model.py +0 -0
  2589. {code_towel-1.792 → code_towel-1.947}/tests/test_import_name_corroboration.py +0 -0
  2590. {code_towel-1.792 → code_towel-1.947}/tests/test_import_probe_scope_contexts.py +0 -0
  2591. {code_towel-1.792 → code_towel-1.947}/tests/test_import_problem_refusal.py +0 -0
  2592. {code_towel-1.792 → code_towel-1.947}/tests/test_import_resolution.py +0 -0
  2593. {code_towel-1.792 → code_towel-1.947}/tests/test_import_sorting_scope.py +0 -0
  2594. {code_towel-1.792 → code_towel-1.947}/tests/test_import_time_code.py +0 -0
  2595. {code_towel-1.792 → code_towel-1.947}/tests/test_import_verdicts_hold_at_run_time.py +0 -0
  2596. {code_towel-1.792 → code_towel-1.947}/tests/test_in_place_stage.py +0 -0
  2597. {code_towel-1.792 → code_towel-1.947}/tests/test_inert_import_order.py +0 -0
  2598. {code_towel-1.792 → code_towel-1.947}/tests/test_inference_subtype_cache.py +0 -0
  2599. {code_towel-1.792 → code_towel-1.947}/tests/test_inline_except_probes.py +0 -0
  2600. {code_towel-1.792 → code_towel-1.947}/tests/test_inline_match_probes.py +0 -0
  2601. {code_towel-1.792 → code_towel-1.947}/tests/test_instantiation_by_binding.py +0 -0
  2602. {code_towel-1.792 → code_towel-1.947}/tests/test_instantiation_check.py +0 -0
  2603. {code_towel-1.792 → code_towel-1.947}/tests/test_known_bases.py +0 -0
  2604. {code_towel-1.792 → code_towel-1.947}/tests/test_known_platforms.py +0 -0
  2605. {code_towel-1.792 → code_towel-1.947}/tests/test_ladder_hygiene.py +0 -0
  2606. {code_towel-1.792 → code_towel-1.947}/tests/test_late_helper_imports.py +0 -0
  2607. {code_towel-1.792 → code_towel-1.947}/tests/test_lazy_engine_import.py +0 -0
  2608. {code_towel-1.792 → code_towel-1.947}/tests/test_lexical_binding_regressions.py +0 -0
  2609. {code_towel-1.792 → code_towel-1.947}/tests/test_licence_headers.py +0 -0
  2610. {code_towel-1.792 → code_towel-1.947}/tests/test_lifetime_memoization.py +0 -0
  2611. {code_towel-1.792 → code_towel-1.947}/tests/test_memoization_is_invisible.py +0 -0
  2612. {code_towel-1.792 → code_towel-1.947}/tests/test_method_helper_hosting.py +0 -0
  2613. {code_towel-1.792 → code_towel-1.947}/tests/test_method_host_machinery.py +0 -0
  2614. {code_towel-1.792 → code_towel-1.947}/tests/test_method_level_and_attributes.py +0 -0
  2615. {code_towel-1.792 → code_towel-1.947}/tests/test_method_receiver_arguments.py +0 -0
  2616. {code_towel-1.792 → code_towel-1.947}/tests/test_missing_submodules.py +0 -0
  2617. {code_towel-1.792 → code_towel-1.947}/tests/test_module_attribute_write_paths.py +0 -0
  2618. {code_towel-1.792 → code_towel-1.947}/tests/test_module_names_stay_free.py +0 -0
  2619. {code_towel-1.792 → code_towel-1.947}/tests/test_moved_comments.py +0 -0
  2620. {code_towel-1.792 → code_towel-1.947}/tests/test_mypy_ci_policy.py +0 -0
  2621. {code_towel-1.792 → code_towel-1.947}/tests/test_mypy_judged_as_configured.py +0 -0
  2622. {code_towel-1.792 → code_towel-1.947}/tests/test_mypy_matches_its_own_run.py +0 -0
  2623. {code_towel-1.792 → code_towel-1.947}/tests/test_mypy_plugins.py +0 -0
  2624. {code_towel-1.792 → code_towel-1.947}/tests/test_mypy_source_overlays.py +0 -0
  2625. {code_towel-1.792 → code_towel-1.947}/tests/test_mypy_worker_isolation.py +0 -0
  2626. {code_towel-1.792 → code_towel-1.947}/tests/test_names_typed_any.py +0 -0
  2627. {code_towel-1.792 → code_towel-1.947}/tests/test_narrowing_boundaries.py +0 -0
  2628. {code_towel-1.792 → code_towel-1.947}/tests/test_narrowing_refusal.py +0 -0
  2629. {code_towel-1.792 → code_towel-1.947}/tests/test_narrowing_statement_facts.py +0 -0
  2630. {code_towel-1.792 → code_towel-1.947}/tests/test_native_analysis_diagnostics.py +0 -0
  2631. {code_towel-1.792 → code_towel-1.947}/tests/test_next_validation_documentation.py +0 -0
  2632. {code_towel-1.792 → code_towel-1.947}/tests/test_no_builtin_arguments.py +0 -0
  2633. {code_towel-1.792 → code_towel-1.947}/tests/test_no_extract.py +0 -0
  2634. {code_towel-1.792 → code_towel-1.947}/tests/test_no_quoted_none.py +0 -0
  2635. {code_towel-1.792 → code_towel-1.947}/tests/test_noop_application.py +0 -0
  2636. {code_towel-1.792 → code_towel-1.947}/tests/test_observational_equivalence.py +0 -0
  2637. {code_towel-1.792 → code_towel-1.947}/tests/test_only_binding_moves.py +0 -0
  2638. {code_towel-1.792 → code_towel-1.947}/tests/test_orphan_detection.py +0 -0
  2639. {code_towel-1.792 → code_towel-1.947}/tests/test_orphan_detector_comprehensive.py +0 -0
  2640. {code_towel-1.792 → code_towel-1.947}/tests/test_out_of_place_cycle_regression.py +0 -0
  2641. {code_towel-1.792 → code_towel-1.947}/tests/test_out_of_place_stage.py +0 -0
  2642. {code_towel-1.792 → code_towel-1.947}/tests/test_out_of_place_whole_project.py +0 -0
  2643. {code_towel-1.792 → code_towel-1.947}/tests/test_output_import_names.py +0 -0
  2644. {code_towel-1.792 → code_towel-1.947}/tests/test_overlap_filtering.py +0 -0
  2645. {code_towel-1.792 → code_towel-1.947}/tests/test_pair_budget.py +0 -0
  2646. {code_towel-1.792 → code_towel-1.947}/tests/test_parallel_evaluation.py +0 -0
  2647. {code_towel-1.792 → code_towel-1.947}/tests/test_parameters.py +0 -0
  2648. {code_towel-1.792 → code_towel-1.947}/tests/test_parameters_stand_alone.py +0 -0
  2649. {code_towel-1.792 → code_towel-1.947}/tests/test_parent_watchdog.py +0 -0
  2650. {code_towel-1.792 → code_towel-1.947}/tests/test_parsing_warning_cache.py +0 -0
  2651. {code_towel-1.792 → code_towel-1.947}/tests/test_pending_journal_rule.py +0 -0
  2652. {code_towel-1.792 → code_towel-1.947}/tests/test_perf_memos.py +0 -0
  2653. {code_towel-1.792 → code_towel-1.947}/tests/test_pipeline_api.py +0 -0
  2654. {code_towel-1.792 → code_towel-1.947}/tests/test_placement_memoization.py +0 -0
  2655. {code_towel-1.792 → code_towel-1.947}/tests/test_progress_heartbeat.py +0 -0
  2656. {code_towel-1.792 → code_towel-1.947}/tests/test_progress_modes.py +0 -0
  2657. {code_towel-1.792 → code_towel-1.947}/tests/test_project_helper_names.py +0 -0
  2658. {code_towel-1.792 → code_towel-1.947}/tests/test_project_layout_and_imports.py +0 -0
  2659. {code_towel-1.792 → code_towel-1.947}/tests/test_project_layout_behavior.py +0 -0
  2660. {code_towel-1.792 → code_towel-1.947}/tests/test_project_layout_shim.py +0 -0
  2661. {code_towel-1.792 → code_towel-1.947}/tests/test_promotion_and_mangling.py +0 -0
  2662. {code_towel-1.792 → code_towel-1.947}/tests/test_properties.py +0 -0
  2663. {code_towel-1.792 → code_towel-1.947}/tests/test_protocol_lifetime_regressions.py +0 -0
  2664. {code_towel-1.792 → code_towel-1.947}/tests/test_published_performance_documentation.py +0 -0
  2665. {code_towel-1.792 → code_towel-1.947}/tests/test_pyright_configuration_grammar.py +0 -0
  2666. {code_towel-1.792 → code_towel-1.947}/tests/test_pyright_diagnostic_boundary.py +0 -0
  2667. {code_towel-1.792 → code_towel-1.947}/tests/test_pyright_editable_installs.py +0 -0
  2668. {code_towel-1.792 → code_towel-1.947}/tests/test_pyright_probes_stay_private.py +0 -0
  2669. {code_towel-1.792 → code_towel-1.947}/tests/test_pyright_reveal_batches.py +0 -0
  2670. {code_towel-1.792 → code_towel-1.947}/tests/test_pyright_scope.py +0 -0
  2671. {code_towel-1.792 → code_towel-1.947}/tests/test_pyright_server_configuration.py +0 -0
  2672. {code_towel-1.792 → code_towel-1.947}/tests/test_pyright_session.py +0 -0
  2673. {code_towel-1.792 → code_towel-1.947}/tests/test_qualified_annotation_runtime.py +0 -0
  2674. {code_towel-1.792 → code_towel-1.947}/tests/test_r9my_check_fails_unchanged.py +0 -0
  2675. {code_towel-1.792 → code_towel-1.947}/tests/test_r9my_check_scope.py +0 -0
  2676. {code_towel-1.792 → code_towel-1.947}/tests/test_r9my_environment_by_content.py +0 -0
  2677. {code_towel-1.792 → code_towel-1.947}/tests/test_r9my_mypy_config_groups.py +0 -0
  2678. {code_towel-1.792 → code_towel-1.947}/tests/test_r9my_mypy_jurisdiction.py +0 -0
  2679. {code_towel-1.792 → code_towel-1.947}/tests/test_r9py_pyright_config_groups.py +0 -0
  2680. {code_towel-1.792 → code_towel-1.947}/tests/test_r9py_pyright_config_venv.py +0 -0
  2681. {code_towel-1.792 → code_towel-1.947}/tests/test_r9py_pyright_copy_inputs.py +0 -0
  2682. {code_towel-1.792 → code_towel-1.947}/tests/test_r9py_pyright_fork_guard.py +0 -0
  2683. {code_towel-1.792 → code_towel-1.947}/tests/test_r9py_pyright_marker_outside_include.py +0 -0
  2684. {code_towel-1.792 → code_towel-1.947}/tests/test_r9py_pyright_message_paths.py +0 -0
  2685. {code_towel-1.792 → code_towel-1.947}/tests/test_readme_links.py +0 -0
  2686. {code_towel-1.792 → code_towel-1.947}/tests/test_receiver_binding_memoization.py +0 -0
  2687. {code_towel-1.792 → code_towel-1.947}/tests/test_recovery_command_quoting.py +0 -0
  2688. {code_towel-1.792 → code_towel-1.947}/tests/test_recovery_journal.py +0 -0
  2689. {code_towel-1.792 → code_towel-1.947}/tests/test_refactor_engine_comprehensive.py +0 -0
  2690. {code_towel-1.792 → code_towel-1.947}/tests/test_refactor_engine_edge_cases.py +0 -0
  2691. {code_towel-1.792 → code_towel-1.947}/tests/test_refactor_engine_more.py +0 -0
  2692. {code_towel-1.792 → code_towel-1.947}/tests/test_refactor_engine_targeted_branches.py +0 -0
  2693. {code_towel-1.792 → code_towel-1.947}/tests/test_refactoring_engine.py +0 -0
  2694. {code_towel-1.792 → code_towel-1.947}/tests/test_reflection_contract.py +0 -0
  2695. {code_towel-1.792 → code_towel-1.947}/tests/test_refusal_checker_context.py +0 -0
  2696. {code_towel-1.792 → code_towel-1.947}/tests/test_regression.py +0 -0
  2697. {code_towel-1.792 → code_towel-1.947}/tests/test_regressions_broader.py +0 -0
  2698. {code_towel-1.792 → code_towel-1.947}/tests/test_rehearing_revision.py +0 -0
  2699. {code_towel-1.792 → code_towel-1.947}/tests/test_rejected_proposal_memory.py +0 -0
  2700. {code_towel-1.792 → code_towel-1.947}/tests/test_relative_future_imports.py +0 -0
  2701. {code_towel-1.792 → code_towel-1.947}/tests/test_release_audit_regressions.py +0 -0
  2702. {code_towel-1.792 → code_towel-1.947}/tests/test_release_documentation.py +0 -0
  2703. {code_towel-1.792 → code_towel-1.947}/tests/test_release_evidence_gate.py +0 -0
  2704. {code_towel-1.792 → code_towel-1.947}/tests/test_release_regressions.py +0 -0
  2705. {code_towel-1.792 → code_towel-1.947}/tests/test_rename_by_the_programs_names.py +0 -0
  2706. {code_towel-1.792 → code_towel-1.947}/tests/test_rename_parameters_and_methods.py +0 -0
  2707. {code_towel-1.792 → code_towel-1.947}/tests/test_renamed_binder_observability_runtime.py +0 -0
  2708. {code_towel-1.792 → code_towel-1.947}/tests/test_required_namesakes.py +0 -0
  2709. {code_towel-1.792 → code_towel-1.947}/tests/test_retained_bindings.py +0 -0
  2710. {code_towel-1.792 → code_towel-1.947}/tests/test_return_alignment.py +0 -0
  2711. {code_towel-1.792 → code_towel-1.947}/tests/test_return_values.py +0 -0
  2712. {code_towel-1.792 → code_towel-1.947}/tests/test_returned_variables_not_orphaned.py +0 -0
  2713. {code_towel-1.792 → code_towel-1.947}/tests/test_reuse_existing_function.py +0 -0
  2714. {code_towel-1.792 → code_towel-1.947}/tests/test_reuse_type_checks.py +0 -0
  2715. {code_towel-1.792 → code_towel-1.947}/tests/test_revealed_spellings.py +0 -0
  2716. {code_towel-1.792 → code_towel-1.947}/tests/test_robustness_paths.py +0 -0
  2717. {code_towel-1.792 → code_towel-1.947}/tests/test_run_by_path.py +0 -0
  2718. {code_towel-1.792 → code_towel-1.947}/tests/test_run_lookups.py +0 -0
  2719. {code_towel-1.792 → code_towel-1.947}/tests/test_scope_analyzer.py +0 -0
  2720. {code_towel-1.792 → code_towel-1.947}/tests/test_scope_analyzer_comprehensive.py +0 -0
  2721. {code_towel-1.792 → code_towel-1.947}/tests/test_scope_declaration_memoization.py +0 -0
  2722. {code_towel-1.792 → code_towel-1.947}/tests/test_scope_guard_boundaries.py +0 -0
  2723. {code_towel-1.792 → code_towel-1.947}/tests/test_sdist_manifest.py +0 -0
  2724. {code_towel-1.792 → code_towel-1.947}/tests/test_self_import_probes.py +0 -0
  2725. {code_towel-1.792 → code_towel-1.947}/tests/test_self_outside_its_class.py +0 -0
  2726. {code_towel-1.792 → code_towel-1.947}/tests/test_semantic_guard_traces.py +0 -0
  2727. {code_towel-1.792 → code_towel-1.947}/tests/test_semantic_guards_extended.py +0 -0
  2728. {code_towel-1.792 → code_towel-1.947}/tests/test_semantic_safety_regressions.py +0 -0
  2729. {code_towel-1.792 → code_towel-1.947}/tests/test_shared_line_directives.py +0 -0
  2730. {code_towel-1.792 → code_towel-1.947}/tests/test_shipped_files_recorded.py +0 -0
  2731. {code_towel-1.792 → code_towel-1.947}/tests/test_sidecar_records_applied_helpers.py +0 -0
  2732. {code_towel-1.792 → code_towel-1.947}/tests/test_signature_construction.py +0 -0
  2733. {code_towel-1.792 → code_towel-1.947}/tests/test_signature_prefilter.py +0 -0
  2734. {code_towel-1.792 → code_towel-1.947}/tests/test_speculative_cache_isolation.py +0 -0
  2735. {code_towel-1.792 → code_towel-1.947}/tests/test_splicing.py +0 -0
  2736. {code_towel-1.792 → code_towel-1.947}/tests/test_stale_proposal_recovery.py +0 -0
  2737. {code_towel-1.792 → code_towel-1.947}/tests/test_statement_facts.py +0 -0
  2738. {code_towel-1.792 → code_towel-1.947}/tests/test_statically_read_literals.py +0 -0
  2739. {code_towel-1.792 → code_towel-1.947}/tests/test_structural_memo.py +0 -0
  2740. {code_towel-1.792 → code_towel-1.947}/tests/test_stub_resolution.py +0 -0
  2741. {code_towel-1.792 → code_towel-1.947}/tests/test_stubbed_host.py +0 -0
  2742. {code_towel-1.792 → code_towel-1.947}/tests/test_substitution_follows_bindings.py +0 -0
  2743. {code_towel-1.792 → code_towel-1.947}/tests/test_substitution_keys.py +0 -0
  2744. {code_towel-1.792 → code_towel-1.947}/tests/test_super_in_method_helpers.py +0 -0
  2745. {code_towel-1.792 → code_towel-1.947}/tests/test_symlinked_input_directory.py +0 -0
  2746. {code_towel-1.792 → code_towel-1.947}/tests/test_symlinked_project_paths.py +0 -0
  2747. {code_towel-1.792 → code_towel-1.947}/tests/test_synthetic_positional_only.py +0 -0
  2748. {code_towel-1.792 → code_towel-1.947}/tests/test_targeted_rung.py +0 -0
  2749. {code_towel-1.792 → code_towel-1.947}/tests/test_thunks_meet_inlined_comprehensions.py +0 -0
  2750. {code_towel-1.792 → code_towel-1.947}/tests/test_top_level_module_inside_package.py +0 -0
  2751. {code_towel-1.792 → code_towel-1.947}/tests/test_trivial_helper_filter.py +0 -0
  2752. {code_towel-1.792 → code_towel-1.947}/tests/test_type_bindings.py +0 -0
  2753. {code_towel-1.792 → code_towel-1.947}/tests/test_type_checking_import_cycles.py +0 -0
  2754. {code_towel-1.792 → code_towel-1.947}/tests/test_type_checking_imports.py +0 -0
  2755. {code_towel-1.792 → code_towel-1.947}/tests/test_type_declaration_materialization.py +0 -0
  2756. {code_towel-1.792 → code_towel-1.947}/tests/test_type_generalization.py +0 -0
  2757. {code_towel-1.792 → code_towel-1.947}/tests/test_type_only_imports.py +0 -0
  2758. {code_towel-1.792 → code_towel-1.947}/tests/test_type_run_policy.py +0 -0
  2759. {code_towel-1.792 → code_towel-1.947}/tests/test_typed_performance_documentation.py +0 -0
  2760. {code_towel-1.792 → code_towel-1.947}/tests/test_typing_form_resolution.py +0 -0
  2761. {code_towel-1.792 → code_towel-1.947}/tests/test_typing_forms_cost.py +0 -0
  2762. {code_towel-1.792 → code_towel-1.947}/tests/test_typing_forms_resolved.py +0 -0
  2763. {code_towel-1.792 → code_towel-1.947}/tests/test_unchecked_code.py +0 -0
  2764. {code_towel-1.792 → code_towel-1.947}/tests/test_unchecked_import_probes.py +0 -0
  2765. {code_towel-1.792 → code_towel-1.947}/tests/test_unifier_additional_branches.py +0 -0
  2766. {code_towel-1.792 → code_towel-1.947}/tests/test_unifier_batch2.py +0 -0
  2767. {code_towel-1.792 → code_towel-1.947}/tests/test_unifier_batch4.py +0 -0
  2768. {code_towel-1.792 → code_towel-1.947}/tests/test_unifier_block_cache.py +0 -0
  2769. {code_towel-1.792 → code_towel-1.947}/tests/test_unifier_bound_variables.py +0 -0
  2770. {code_towel-1.792 → code_towel-1.947}/tests/test_unifier_comprehensions.py +0 -0
  2771. {code_towel-1.792 → code_towel-1.947}/tests/test_unifier_comprehensive.py +0 -0
  2772. {code_towel-1.792 → code_towel-1.947}/tests/test_unifier_state_reset.py +0 -0
  2773. {code_towel-1.792 → code_towel-1.947}/tests/test_unparsed_program.py +0 -0
  2774. {code_towel-1.792 → code_towel-1.947}/tests/test_unreadable_and_revealed.py +0 -0
  2775. {code_towel-1.792 → code_towel-1.947}/tests/test_unsupported_layout.py +0 -0
  2776. {code_towel-1.792 → code_towel-1.947}/tests/test_validation_partial_lifetime.py +0 -0
  2777. {code_towel-1.792 → code_towel-1.947}/tests/test_variable_capture_bug.py +0 -0
  2778. {code_towel-1.792 → code_towel-1.947}/tests/test_visitors.py +0 -0
  2779. {code_towel-1.792 → code_towel-1.947}/tests/test_workers_fork_alone.py +0 -0
  2780. {code_towel-1.792 → code_towel-1.947}/tests/typed_fixtures.py +0 -0
@@ -0,0 +1,2594 @@
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
+ ## [1.947]
14
+
15
+ Audit repairs after published 1.946; see the [1.947 overview](docs/RELEASE_1_947.md).
16
+ The October 19, 2026 preparation checkpoint precedes this version's final
17
+ release validation and publication; no publication date is assigned here.
18
+
19
+ - Parameter renaming follows Python's class-private binding identity through
20
+ nested classes, methods and closures, preserving unrelated private references
21
+ and rejecting destinations that would capture a mangled binding.
22
+ - Helper renaming matches Unicode identifiers by Python's normalized identity
23
+ and edits their original token spans, including definitions and keyword calls.
24
+ - Functions without a structural partner skip block enumeration. Eligible
25
+ intervals reuse per-suite prefix facts instead of repeatedly scanning the
26
+ same statements; pair budgets and ordering are preserved. Singleton blocks
27
+ no longer inflate the budget warning's block count.
28
+ - Possible `__builtins__` replacement conservatively declines explicit reads
29
+ that can fall back from globals to the captured mapping, including custom
30
+ names and currently module-bound names, plus implicit import and class-building
31
+ lookups. `--parameterize-builtins` does not bypass this rule. Explicit local,
32
+ parameter and cell reads, compiler-constant `__debug__` and mapping-independent
33
+ blocks retain their ordinary rules. Scope analysis follows evaluated definition
34
+ heads and generator outer iterables, with conservative coverage of inlined
35
+ list/set/dict comprehensions. Wildcard exports and enclosing-scope assignments
36
+ in callable defaults/annotations are included. Any ordinary attribute store
37
+ or deletion of `receiver.__builtins__` in the analyzed program makes every
38
+ module's mapping uncertain, including through unknown receiver aliases and
39
+ excluded runnable files. Warning-free inputs reuse the
40
+ source-only guard verdict within an analysis, avoiding repeated lexical scans
41
+ while preserving native warning replay and parser-limit checks. See the
42
+ [captured-mapping policy](docs/GENERATED_CODE.md#arguments-and-evaluation).
43
+ - Local refreshes preserve incremental candidate pairing when the project root
44
+ and builtin-mapping hazard are unchanged. Changing which files a refresh
45
+ visits no longer triggers a full re-pair; genuine dependency changes and
46
+ missing historical observations still invalidate conservatively.
47
+ - Generated code uses each modified file's formatter and configuration. Ruff
48
+ import sorting recognizes standalone, extended and nested configurations
49
+ through native effective settings and honors disabled/per-file rules.
50
+ Transient configuration-query failures are reported and retried rather than
51
+ cached as disabled sorting. File-specific policies share one Black worker per
52
+ formatter factory and one isort worker per directory import-sorter factory,
53
+ avoiding a retained process for every selected file. Each request retains
54
+ its file's settings and exclusions; separate factories remain independent.
55
+ - Rename definition selection is separate from project-wide consumer analysis.
56
+ Batches needing edits outside the target refuse atomically; unmarked CLI
57
+ projects require an explicit `--complete-scope` declaration.
58
+ - Ordinary raw-regex brace escapes and comments no longer prevent reuse of
59
+ warning-free module facts merely because an earlier source fragment resembles
60
+ a formatted-string prefix. Token checks prove each affected escape belongs to
61
+ an ordinary raw string or comment; uncertain and warning-capable inputs retain
62
+ fresh native parsing. This repairs the repeated parsing behind the PrettyTable
63
+ corpus timeout without changing cache bounds or source-correspondence proofs.
64
+ - On Python 3.12 and later token streams, warning-free raw formatted-string
65
+ literal segments can reuse parsing facts even when a backslash precedes a
66
+ replacement field. Admission follows the innermost string and excludes
67
+ replacement fields and format specifications. Nested nonraw strings and
68
+ warning-capable syntax retain native diagnostics; Python 3.11 remains
69
+ conservative for these escapes.
70
+ - The corpus harness distinguishes an expired deadline from a process killed by
71
+ a signal. A killed refactor remains a hard failure and cannot trigger an
72
+ untyped retry or adoption of partial output. The harness and `just ecosystem`
73
+ default to one project worker so consumer tests and checker processes do not compete
74
+ with another project for the same container memory budget.
75
+
76
+ ## [1.946]
77
+
78
+ Named for ln 7, approximately 1.945910149. PyPI publication was verified on
79
+ October 19, 2026. The historical preparation record below retains its original
80
+ sources, measurements and incomplete candidate gates. The maintainer had
81
+ requested scoped source-proof reuse, fresh supported-interpreter suites and
82
+ cache-on/off output comparisons; see the dated
83
+ [publication checkpoint](docs/RELEASING.md#1946-publication-checkpoint-october-18-2026).
84
+ Changes since released 1.792 are described together in the
85
+ [1.946 overview](docs/RELEASE_1_946.md).
86
+
87
+ The completed development audit at `9d57b0d` passed 10,583 tests and 45
88
+ subtests, with 32 skips and 93.478% coverage. Six consumer original-command
89
+ pairs and their 531 generated Python outputs matched the retained references.
90
+ At that preparation checkpoint, the versioned 1.946 source and artifacts still
91
+ needed their own release gates.
92
+ The latest completed versioned cohorts use `a6dc6ed` (1.946) versus published
93
+ `44d7795` (1.792): Voluptuous means were 90.984 → 87.569 seconds (−3.75%),
94
+ and Click means were 47.165 → 58.195 seconds (+23.39%), with two shared-host
95
+ samples per source per workload. Rich has zero actual samples in this new
96
+ campaign; its measurements and fresh full release gates remain pending.
97
+ The [current eight-sample record](tests/release_evidence/1.946-warning-guard/README.md)
98
+ retains original pairs, repeated outputs and closure. Profiling `0b3494c`
99
+ on 2026-10-18 (shared native host, interleaved samples) measured Rich at
100
+ +7.6% and attributed it to the fresh source-correspondence proof for `if`
101
+ outputs, which the 2026-10-10 decision keeps uncached. Click's larger
102
+ difference mostly pays for its fifth extraction. The regression ships
103
+ documented; see [where the remaining time goes](docs/RELEASE_1_946.md#where-the-remaining-time-goes-profiled-on-0b3494c).
104
+
105
+ On the earlier `9d57b0d` eight-sample shared-host comparison, complete cold CLI
106
+ means were 46.53 → 56.69 seconds for Click (+21.85%) and 99.77 → 177.70
107
+ seconds for Rich (+78.10%) versus released 1.792. These are two samples per
108
+ version per workload, not an isolated-host or general speed claim. See the
109
+ [performance evidence](docs/PERFORMANCE.md) and
110
+ [readiness report](docs/PRODUCTION_READINESS.md).
111
+
112
+ ### Improvements and repairs
113
+
114
+ - Reuse successful whole-module source-correspondence proofs only for explicitly
115
+ owned immutable trees during one analysis. Keys retain source and parser-limit
116
+ identity. Caller trees, warning-capable sources, disabled memoization and
117
+ materialization keep fresh proofs. Optional AST immutability checking detects
118
+ changes to a warmed owner. Each analysis releases its proof entries.
119
+
120
+ - Account for every candidate pair with `--stats` (`dry` and the complete
121
+ `preview`). Each pair of the run's last whole analysis is counted once:
122
+ declined, a duplicate of an earlier pair's proposal, dropped for overlapping
123
+ a kept proposal, or emitted. The run's helper signatures are counted as
124
+ verified or refused by the type checker. `RunReport` carries the same counts.
125
+ The flag only reports, so output files are identical with and without it.
126
+ This completes the user-facing part of the post-1.772 loss statistics.
127
+
128
+ - Admit ordinary raw-regex brace escapes to the existing typing-fact cache
129
+ when they precede every possible formatted-string start. Repeated queries
130
+ reuse immutable module facts; warning-capable formatted strings still take
131
+ the fresh native parsing path. This repairs a reproduced performance defect
132
+ without changing warning filters, cache bounds or parser-limit keys.
133
+
134
+ - Distinguish complete even backslash runs from unmatched odd escapes before
135
+ formatted-string braces. Paired literal backslashes no longer cause this
136
+ warning-guard refusal; potentially warning-capable odd escapes keep the
137
+ native diagnostic path and all existing token checks. Repeated eligible
138
+ queries reuse the existing immutable facts without new caches or bounds.
139
+ The seven-file focused battery passed 479 tests with 221 version skips;
140
+ 3,719 external controls per native Python 3.11–3.14 passed. These are scoped
141
+ correctness/cost controls, not timing or full-release evidence. Fresh final
142
+ gates remain pending; the earlier numeric measurements retain their sources.
143
+
144
+ - Share warning-free raw f-string literal analyses on Python 3.12. Distinguish
145
+ literal text from replacement fields while retaining native warning checks
146
+ for raw format specifications and nonraw nested strings.
147
+
148
+ - Limit source-cache keys to native strings/bytes so subclass methods cannot
149
+ change cache behavior. Include parser limits in typing-form and namespace
150
+ syntax cache keys, and keep warning-capable parses on the native path.
151
+
152
+ - Reuse immutable lexical warning classifications while scheduling IF proofs
153
+ within one owned analysis, including sources larger than the process cache's
154
+ character limit. Bound retained source storage and keep every ownership
155
+ check, native diagnostic fallback, and admission proof fresh.
156
+
157
+ - Snapshot bounded-cache keys during iteration so standard mapping item and
158
+ value views tolerate reads that promote entries in the LRU order. Keep
159
+ ordinary lookups, eviction and explicit ownership release unchanged.
160
+
161
+ - Postpone fresh IF source proofs until binding, shape and unification checks
162
+ pass within an engine-owned analysis of ordinary original source. Keep
163
+ both the initial admission and aligned-output proofs before helper construction,
164
+ with the existing early order for direct and warning-capable calls.
165
+
166
+ - Release bounded-cache entries and weight bookkeeping on explicit cleanup
167
+ even while memoization is disabled, so analysis scopes can always drop owners.
168
+
169
+ - Reuse immutable later-read statement facts within one engine source-analysis
170
+ scope. Preserve traversal and diagnostic records, calculate lifetime outputs
171
+ on every call and return fresh sets; keep direct, disabled and mismatched-owner
172
+ queries lazy and release the bounded function cache at scope exit.
173
+
174
+ - Consult the bounded lexical eligibility cache before searching repeated
175
+ warning-free source text; preserve native diagnostics, disabled and oversized
176
+ bypasses, source storage limits and fork-safe bookkeeping.
177
+
178
+ - Reuse IF binding and flow facts from private original-source syntax within
179
+ one bounded analysis context. Keep every accepted current-module comparison,
180
+ function identity and selected-suite ownership check fresh; preserve native
181
+ warning behavior and the uncached path when memoization is disabled.
182
+ - Reuse immutable instability and runtime byte-value facts per original source
183
+ statement during analysis. Release the summaries with that context, recompute
184
+ direct library calls and keep generated-helper literal checks fresh.
185
+
186
+ - Reject impossible IF binding transfers from local syntax, binding and flow
187
+ facts before parsing, comparing or mapping the whole module. Keep graph
188
+ checks cycle-safe and require fresh exact module identity and ownership
189
+ for every admitted certificate and aligned-output reproof.
190
+ - Keep captured comprehension targets that share an outer free binding at
191
+ their original sites. Moving the comprehension can change compiler cell
192
+ restoration on Python 3.12 and 3.13, altering later reads and exceptions.
193
+ Preserve ordinary uncaptured and independently bound comprehension cases.
194
+ - Recover fresh local outputs from contiguous blocks inside IF-only suites.
195
+ Certify the original source, branch location and definite initialization;
196
+ return every later-read or lifetime-required value in the existing cleanup
197
+ order. Reprove the aligned outputs without caching the verdict. Keep
198
+ unsupported ancestry, rebinding, captures and existing ownership guards
199
+ restrictive, and reject ineligible sites before whole-module validation.
200
+ - Order eligible leading thunk parameters by their certified evaluation sequence
201
+ before eager inlining. Reorder only contiguous eligible slots within each
202
+ positional signature segment; preserve other parameters, the positional-only
203
+ boundary and every caller's immutable-result proof. Pair and cluster
204
+ reconstruction use the same pass.
205
+ - Preserve narrowing obligations when generated predicates stay deferred;
206
+ decline helpers whose separate values or thunks lose those proofs before
207
+ annotation fallback. Keep proven return types when an unannotated caller
208
+ adds no declared constraint.
209
+ - Keep Optional-aware result thunks eligible. A read of a tested subject does
210
+ not itself require narrowing; use the checker's rejected operand and original
211
+ caller correspondence before weakening helper annotations. Cover named
212
+ arguments, reflected comparisons and Pyright Optional-operand and receiver
213
+ diagnostics while leaving ambiguous operands unresolved.
214
+ - Preserve declared return and assignment refinements, including fixed tuple
215
+ components, before helper annotations can widen to `Any`. Require the original
216
+ caller's matching obligation; a provisional helper signature must not reject
217
+ valid nullable returns.
218
+ - Match those declared obligations across early returns, repeated branch returns,
219
+ nested annotated assignments and fixed tuple assignments. Preserve exact
220
+ getter correspondence and unchanged local aliases before refusing `Any`
221
+ fallback; unrelated returns do not erase a matching declaration.
222
+ - Keep thunks deferred when their result lifetime is unknown. Eager evaluation
223
+ requires an immutable result proof from every caller as well as the existing
224
+ evaluation-order proof; preserve temporary release and exception cleanup.
225
+ - Unify differing constant occurrences without changing equal literals at other
226
+ positions. Reuse a parameter only when its complete typed column agrees across
227
+ callers; preserve caller literal pools, syntax pins and the existing budget.
228
+ - Preserve useful shared f-string helpers by passing common exact-string
229
+ fragments from their original callers; retain formatting effects, literal
230
+ identities and the complete helper argument budget.
231
+ - Preserve compiler-pooled literal identities: pass complete literal expressions
232
+ when replacing their parts would rebuild objects, and pass shared non-global
233
+ literals from their original callers within the existing interface budget.
234
+ Keep unproved folded floating arithmetic and lexically private single-byte
235
+ literals at their original sites; retain safe shared helpers.
236
+ - Reuse whole-body ownership certificates and immutable source/compiler facts
237
+ under exact source, syntax, location and parser-context keys; preserve runtime
238
+ guards and independently reprove each certificate during materialization.
239
+ - Handle malformed non-table Poetry configuration during cross-module import
240
+ analysis without losing valid PEP 621 dependency restrictions.
241
+ - Certify readonly lookup suppliers in the independent scope oracle without
242
+ exempting generated names or unrelated caller bindings; retain the exact
243
+ grammar/binding regressions and adversarial negative controls.
244
+ - Review the proposal backlog against the released implementation and separate
245
+ remaining research from completed, superseded and retired ideas.
246
+ - Clarify completed 1.792 release validation separately from its historical
247
+ preparation records.
248
+
249
+ ## [1.792]
250
+
251
+ Named for ln 6, approximately 1.791759469. Changes since 1.772.
252
+ The measurements below retain their original development-source identities;
253
+ release verification binds the final versioned source to its own evidence.
254
+
255
+ - Explain why independently mutable class aliases keep lookup suppliers, and
256
+ why an unread ownership holder preserves original argument lifetimes.
257
+ Distinguish shared spellings from shared bindings and document equal
258
+ higher-order literal promotion as an explicit API opt-in.
259
+ - Decline tiny straight-line helpers whose complete interface and call wrappers
260
+ outweigh their shared work under the documented initial calibration.
261
+ - Place a helper according to its completed runtime receiver/class-frame needs
262
+ and account for the actual receiver and lifetime holder in its budget.
263
+ - Reuse immutable block free-variable facts only within one unification, copy
264
+ mutable results for callers and clear the facts on reset or release.
265
+ - Remove the inner rendered-variant checker-refusal memo. Every variant submitted
266
+ to project checking is checked again; configuration and known-error matches
267
+ cannot certify changed, absent or external stub providers. The outer exact
268
+ completed-proposal rehearing cache remains separately qualified by its
269
+ candidate, revision and recognized context requirements.
270
+ - Refresh CLI defaults, scoped opt-out boundaries and release status. The latest
271
+ development audit follow-ups passed 9,697 native tests and the 93% coverage gate.
272
+ Matrix, corpus and final release gates were pending at that checkpoint; earlier results retain their
273
+ original identities. The block memo halves repeated work in its bounded
274
+ control, with no measured complete-command wall benefit.
275
+ - Add `# towel: no-extract` immediately after a function signature's final
276
+ colon to protect that definition and its nested bodies on every pass.
277
+ Unmarked code remains eligible. This protects the definition, not its
278
+ absolute line position, module namespace or unmarked callers and callees;
279
+ see [the scoped opt-out](docs/CLI_GUIDE.md#protect-a-function).
280
+ - The soundness requirement is to preserve the behavior of programs that do
281
+ not use reflection or self-instrumentation, including through their callees.
282
+ Violations within that scope must be fixed or the transformation refused.
283
+ Reflection and self-instrumentation are outside the preservation guarantee,
284
+ including source/AST/bytecode/frame/namespace observations and body or class
285
+ transformations applied by decorators, ordinary calls or hooks. Towel no
286
+ longer scans or refuses code to protect those behaviors. Ordinary
287
+ nonreflective semantics remain covered. The October 2 decision supersedes
288
+ the recognized-instrumentation and source-reader protections recorded in
289
+ historical development and release records; their validation facts retain
290
+ their original source and policy scope.
291
+ - Preview now runs the same checked, formatted fixed-point pipeline as dry in
292
+ private output and shows its final diff and helper inventory. Use explicit
293
+ `--quick` for a partial structural listing. Input files remain unchanged.
294
+ - Reuse equivalent helpers introduced earlier in the current run where the
295
+ call and host are proved compatible, avoiding redundant forwarding chains
296
+ while preserving existing functions' independent bindings.
297
+ - Generated helper signatures omit free names used only inside caller-side
298
+ thunks; differing attribute lookups no longer spend unused child parameters.
299
+
300
+
301
+ ### Fixed
302
+
303
+ - Retain block-bound results of ordinary factories and other calls across
304
+ helper return, preserving observable resource and finalizer lifetimes,
305
+ including aliases and the relative cleanup order of multiple results.
306
+ - Preserve caller ownership of opaque values returned by properties,
307
+ subscription, operators, iterators and context-manager enter protocols.
308
+ Count nested bindings at their actual source positions and refuse unsafe
309
+ exceptional ownership transfers to an outer handler or context manager.
310
+ - Preserve cleanup relative to caller-held values on normal and exceptional
311
+ exits. Refuse unsafe partial frame splits; certify whole-body argument
312
+ transfer on CPython only when original bindings and cleanup order are proved.
313
+ - Spell lifetime-only caller bindings with hygienic underscore names when no
314
+ outside code reads, rebinds or deletes them, preserving configured lint checks.
315
+ - Discover Ruff without importing project-owned modules; run Black and isort in
316
+ persistent isolated workers with bounded replies and parent-exit cleanup.
317
+ - Reject malformed Pyright diagnostics before changing stored checker errors;
318
+ abandon the warm session and require the normal cold-check fallback.
319
+ - Quote executable recovery remedies, including paths with spaces and shell
320
+ metacharacters, and use portable permission-command option ordering.
321
+ - Preserve known tuple-element types when another retained result is `Any`.
322
+ - Treat all context managers as potentially suppressing exceptions, keeping
323
+ conditional reads of possibly unbound locals at their original sites.
324
+ - Report optional naming-sidecar write failures as warnings after successful
325
+ source publication, with a successful command exit and preserved collisions.
326
+
327
+ ### Changed
328
+
329
+ - Generated annotation imports use the immutable guard `if 0 > 1:`. They stay
330
+ inert when ordinary code changes `typing.TYPE_CHECKING`; existing guards
331
+ retain their behavior. Both mypy and Pyright still validate the imported types.
332
+ - Cross-module bare builtin reads now decline by default, except `__debug__`.
333
+ `--parameterize-builtins` preserves caller-side lookup timing with thunks;
334
+ their inferred annotations retain the callable result type. Other callable
335
+ module bindings also retain their original lookup timing.
336
+
337
+ - The README is a short introduction, with a documentation index and separate
338
+ guides for CLI use, typing, generated code, naming, cross-module extraction,
339
+ resources and performance. Long references have contents lists. Navigation
340
+ regressions check guide discovery and local links; moved measurement claims
341
+ retain their evidence checks.
342
+ - The supported local release command requires completed, reviewed evidence
343
+ for the exact source and prebuilt distributions. Missing phases, interrupted
344
+ baselines, changed failure identities and stale artifacts refuse verification.
345
+ Validation-only artifacts remain explicitly nonpublishable.
346
+ - Completed corrected-source validation has immutable evidence and documentary
347
+ regressions for actual platform coverage, resources, elapsed time and scoped
348
+ exceptions; see [the report](docs/proposals/next-validation-final.md).
349
+
350
+ - Extraction discovery now includes match-case bodies and except-star
351
+ handlers/finally. List-valued AST fields can unify differing expression
352
+ values while retaining restrictions on bindings and control flow.
353
+ - Scope guards examine the moving block: unrelated nonlocal declarations
354
+ and private names elsewhere in a method no longer hide a safe extraction.
355
+ Names used only in local-variable annotations no longer become runtime
356
+ helper arguments or prevent cross-module extraction.
357
+ - Release documentation has offline regression checks against retained 1.772
358
+ evidence and current CI configuration. They protect platform coverage,
359
+ test and corpus counts, typed fallbacks, measurement units and resource
360
+ context. The Windows support implication and the concurrency attributed
361
+ to the Sphinx-only timing are corrected.
362
+ - Class-private extractions no longer require approved base classes or
363
+ class machinery. Hygienic private names protect against accidental
364
+ overrides; namespace scans and lookup hooks observing the new helper fall
365
+ under the documented reflection limitation. The same-class, receiver,
366
+ `Protocol` and import-time checks remain. This admits
367
+ valid extractions previously declined solely for a metaclass, class hook,
368
+ subscripted project base or unlisted library base.
369
+
370
+ ### Fixed
371
+
372
+ - Shared helpers carrying comments are checked against their adapted helper
373
+ tree, so safely quoted cross-module annotations no longer cause a false
374
+ rendering refusal. AST and tool-directive preservation checks remain intact.
375
+ - Generated calls and helpers are formatted at their destination indentation,
376
+ so inserting them into methods does not exceed the configured line width.
377
+ - Reachability and import-type probes follow each checker's configured file
378
+ scope before building probes. Excluded consumer tests no longer make a clean
379
+ project check fail through imports outside that scope.
380
+ - Corpus log-formatting controls now apply only to Towel. Consumer tests can
381
+ enable color themselves without a harness override changing their behavior.
382
+ - Corpus pytest commands retain the cache fixture and clear cached state before
383
+ each test phase and retry. This avoids missing-fixture errors and prevents
384
+ baseline cache values from hiding changes in the transformed program.
385
+ - Corpus setup considers a project's versioned typing requirements before
386
+ defaulting to Towel's checker requirements. Existing project, lock-file and
387
+ hook selections retain their precedence; alternative typing environments
388
+ remain separate. Cached environments record and verify the selected context
389
+ so a stale checker cannot silently survive a configuration change. Literal CI
390
+ workflow pins and explicitly selected uv groups containing a checker are
391
+ included among the declared contexts.
392
+ - Typed import probes distinguish a shadowing parameter from an imported module
393
+ and query a companion submodule through its original binding. This avoids
394
+ false refusals seen in Cachetools and Werkzeug. Unrelated local bindings no
395
+ longer disable that evidence, and an alias replaced within one module import
396
+ block is not queried for attributes read from its replacement afterward.
397
+ Attribute assignments and deletions no longer ask for a previous value that
398
+ the program never reads; augmented assignments and intermediate reads still
399
+ receive type questions. An immutable read inventory is shared across imports.
400
+ A write to an unrelated attribute no longer disables evidence for an imported
401
+ submodule; writes overlapping its path and module rebinding remain restrictive.
402
+ - Reachability probes preserve the indentation of one-line `match` case and
403
+ exception handlers, including cases with multiline patterns or guards.
404
+ Inline `except` and `except*` bodies use their handler's enclosing indentation.
405
+ Semicolon-separated statements receive separate probes so an early exit cannot
406
+ make an unreachable sibling appear checked; probes also stay outside multiline
407
+ strings.
408
+ - Typed runs recognize imported `Self`, including aliases
409
+ and qualified spellings such as `typing.Self`. Pyright's `Unknown` answer
410
+ outside a class no longer makes those valid imports appear untyped; the
411
+ checker must identify the same import as `Self` in a class context.
412
+ - A known import inside an unchecked mypy function no longer prevents typed
413
+ extraction elsewhere in its file. Towel distinguishes an unchecked expression
414
+ from an unresolved module without changing the project's checker settings.
415
+ - Cross-module helpers exist before ordinary imports can reenter their host.
416
+ Package initializers' later imports are no longer assumed complete, reused
417
+ functions retain their definition order, and wildcard imports cannot
418
+ overwrite generated helper bindings. Relative `__future__` imports retain
419
+ ordinary runtime annotation semantics.
420
+ - The development lock now uses virtualenv 21.14.1. Fresh dependency auditing
421
+ found four advisories against the previous 21.7.9 pin; the update also includes
422
+ the maintainer's later activation-script fixes. Runtime dependencies remain
423
+ unchanged.
424
+ - Generated compound annotations remain wholly quoted, including tuple returns
425
+ assembled late in signature construction. Precise checker types no longer add
426
+ attribute lookups, subscriptions or union operations while a module imports.
427
+ - Star-import resolution treats the imported target as a module. Cyclic
428
+ reexports no longer invent ever-longer attribute paths in Protocol analysis.
429
+
430
+ ### Performance
431
+
432
+ The October 5 comparison of the repaired runtime at `00b4f4f` averaged
433
+ 43.43 seconds versus 38.80 seconds for published 1.772 on the complete typed,
434
+ formatted Packaging command: **11.9% slower**. Four fresh-process samples per
435
+ arm produced consistent results in two balanced blocks. The candidate applied
436
+ 20 refactorings versus 18; these are full requested paths with different
437
+ transformations, not identical-work timings. No whole-corpus speedup is
438
+ established. See the [final comparison](docs/PERFORMANCE.md#october-5-repaired-candidate-comparison).
439
+ The earlier improvements below belong to their development checkpoints and
440
+ are not final-release performance claims.
441
+
442
+ The October 6 audit repairs supersede that runtime. Three separate paired
443
+ complete CLI comparisons measured immutable ownership memoization, witnessed
444
+ fixed-Any retry pruning, and exact unchanged-context refusal retention. Each
445
+ produced byte-identical output; none established a complete-command speedup.
446
+ Those timings predate removal of the inner rendered-variant refusal memo and
447
+ do not measure that removal. See [the optimization measurements](docs/PERFORMANCE.md#october-6-optimization-experiments).
448
+
449
+ - Cache pure ownership facts weakly by immutable AST identity, returning fresh
450
+ mutable result sets to callers.
451
+ - Skip parameter-only annotation erasure only when a plugin-free checker
452
+ diagnostic proves the unchanged helper's fixed-Any result still fails.
453
+ - Retain definitive completed type refusals only for the exact candidate,
454
+ current whole-project revision and complete built-in checker/rendering
455
+ context; retry unknown answers and invalidate after source changes.
456
+
457
+ - Keep sharing immutable analysis for warning-free source containing comments,
458
+ raw strings and valid numeric literals. A bounded lexical cache distinguishes
459
+ those cases from syntax that needs native parser diagnostics. Its source-byte
460
+ budget retains many small modules across repeated project scans. Import
461
+ discovery also avoids collecting scope bindings that its literal guards cannot use.
462
+ - Reuse definite subtype verdicts within one helper's annotation inference
463
+ and immutable narrowing facts across overlapping source windows. Complete
464
+ typed, formatted Packaging runs at runtime commit `000d751` on October 2
465
+ averaged 36.24 seconds versus 41.59 seconds
466
+ for published 1.772, about 13% faster, while applying one more refactoring.
467
+ Generated Python is unchanged from the preceding candidate. See the
468
+ [measurement conditions and samples](docs/PERFORMANCE.md#october-2-complete-cli-comparison).
469
+
470
+ An earlier comparison at development commit `3af8c4b` against the actual
471
+ published 1.772 wheel found no meaningful Packaging whole-command speedup
472
+ (39.98 versus 39.77 seconds; the
473
+ candidate performed one more extraction). Sphinx's first Pyright reveal fell
474
+ from 931.07 to 8.63 seconds, about 108 times faster, with identical requests
475
+ and answers. This measures the reveal phase only; it establishes no full-run
476
+ or whole-corpus speedup. See the [measurements and limitations](docs/proposals/published-1772-comparison.md).
477
+
478
+ The typed timings below compare intermediate commits `35035a7` and `1b97196`;
479
+ later changes are outside these measurements.
480
+
481
+ - Typed signatures preserve argument/result correlations before validation
482
+ and retain mypy's return-context treatment of `NotImplemented`. A known
483
+ erased-None-predicate construction stays at its caller instead of falling
484
+ back to an Any parameter. In a controlled packaging comparison, rejected
485
+ signatures fell from eight to zero and mean elapsed time fell about 16%;
486
+ the run intentionally applied 18 extractions instead of 19.
487
+ - Pyright reveal probes share one checker exchange per project. On a frozen
488
+ Sphinx startup workload, 218 exchanges became one, with identical requests
489
+ and reported types; initial reveal time fell from 980.7 to 8.65 seconds.
490
+ This is a phase measurement, not a full-run timing. See the
491
+ [comparison details](docs/proposals/next-release.md#typed-performance-comparisons).
492
+ - An earlier development snapshot indexed immutable module/class definitions
493
+ once per module tree for instrumentation resolution. A packaging scan made
494
+ 558 identity queries instead of 36,741, retaining the exact same application
495
+ index. The index was released with its AST and did not cache
496
+ project-dependent decisions. That analyzer
497
+ was removed under the October 2 contract; this measurement describes the
498
+ earlier implementation only.
499
+ - Non-None assertions and guarded attribute initialization whose refinements
500
+ are needed by remaining caller operations stay at the call site during block discovery.
501
+ Filtering before maximal-block pairing keeps smaller valid extractions
502
+ available and avoids signature checks for the recognized invalid shapes.
503
+ Strict-mypy regressions cover both refusal and successful extraction inside
504
+ a retained guard and assignment.
505
+ - Repeated method-placement questions share a method's receiver analysis.
506
+ The receiver facts live only as long as their AST. On two analysis passes
507
+ over packaging 26.3, receiver walks fell from 17,405 to 245. The follow-up
508
+ above removes the repeated class-machinery analysis altogether.
509
+ - Function-scope `global` and `nonlocal` declarations are computed once per
510
+ immutable function tree. Two analysis passes over the same packaging
511
+ fixture needed 226 walks instead of 2,666 with this memo alone; all 23
512
+ proposals rendered byte-identically and compiled. The combined policy
513
+ change and memo also preserved those outputs. See the
514
+ [measurement and regression checks](docs/proposals/performance-roadmap.md#method-placement-after-1772).
515
+ - Resolving a receiver annotation now shares the module's binding scan for
516
+ that name. An eight-method `Self` fixture makes 336 queries but scans once,
517
+ producing the same proposal. Cached statement tuples preserve order and
518
+ are released with their module tree.
519
+
520
+ ## [1.772] - 2026-09-26
521
+
522
+ Changes since 1.732.
523
+
524
+ A typed run over a large project did not finish. Sphinx, 243 modules with mypy
525
+ and Pyright both strict, ran 3 h 21 min without reaching a fixed point where
526
+ the same run without types takes 11 minutes. Nearly all of that was the mypy
527
+ worker getting slower with every request it served, and most of the rest was
528
+ asking the checkers questions whose answers were already known. On
529
+ September 21 it reached a fixed point in 46 minutes, applying 380 refactorings
530
+ across 105 files, after which Sphinx's own test suite reported exactly what it
531
+ reported before: 2385 passed, 34 skipped, and the same six failures that
532
+ checkout already had. The audit rounds that followed made Towel decline more.
533
+ The Sphinx-only rerun at `29454ab` took 5,660 s (about 94 minutes) and changed
534
+ 55 files. It ran alone in a Docker Linux VM with 18 cores and 8 GB of memory,
535
+ using Python 3.12, `TOWEL_WORKERS=1`, `--cross-module`, and default typing
536
+ (mypy and Pyright both strict). These are measured conditions, not minimum
537
+ resource requirements or time guarantees. Its suite was again unchanged.
538
+
539
+ Every figure in this file was measured on an Apple M5 Max with 18 cores and
540
+ 128 GiB. This entry's were taken on macOS 26.5.1 with Python 3.12.13, the
541
+ machine otherwise idle, except where a figure says otherwise: the release
542
+ full corpus ran in a Docker Linux VM on the same M5 Max given all 18 cores
543
+ and 8 GB of memory, running four projects at a time; the Sphinx-only rerun
544
+ ran alone. The Sphinx figures are Sphinx 9.1.1 at `e44a40e`, 243 modules with
545
+ mypy and Pyright both strict, checked by that project's own venv: **mypy
546
+ 1.19.1 and pyright 1.1.407**. The mypy behaviour described below belongs to
547
+ that version; Towel's own checks run against a newer mypy and do not show it.
548
+
549
+ ### Fixed
550
+ - Resolving which typing form a name denotes grew exponentially with the
551
+ number of functions that alias a name to itself (`tok = tok.next_token`,
552
+ `node = node.parent`), a common way to walk a linked structure. Twelve such
553
+ functions cost 469 million calls and 371 s, and yapf's `--cross-module`
554
+ fixed point took 2,083 s (macOS, one worker, `--no-types --no-format`, the
555
+ run sharing the machine with one other). The resolution is now computed once
556
+ per name and depth, and the same run takes 5 s with byte-identical output. The release
557
+ corpus's yapf and sphinx runs had timed out on it.
558
+ - inline-snapshot tests that differ only in their literal were extracted
559
+ into one helper, so `snapshot()` read a helper parameter at its call site
560
+ and passing tests failed: 68 of rich-click's 151. inline-snapshot's
561
+ readers (`snapshot`, `external`, `snapshot_arg`) are now recognized by
562
+ binding and their calls stay where they stand. Other callees that read
563
+ their caller's frame are reflection, a documented limitation.
564
+ - Region directives opened before a block and closed after it declined it
565
+ only for pylint and coverage.py. Every tool's region directive now does,
566
+ as that tool reads it (ruff, fmt, yapf, isort), and a block holding
567
+ `fmt: off` or `fmt: skip` carries its protected layout into the helper as
568
+ written.
569
+ - A file of the program that does not parse on the Python Towel runs on now
570
+ refuses the run in every mode, before anything is written. It used to be
571
+ skipped, so on 3.11 a 3.12 project's hand-applied decorator, or a test's
572
+ patch of `len` in 3.12 syntax, went unseen. The refusal names each file,
573
+ the newest Python the project declares, and an `--exclude` that clears
574
+ it. `--exclude` takes a file name as well as a directory name; an excluded
575
+ file that parses is still read as evidence, and one that does not parse
576
+ is taken as no part of the program. Fixtures in syntax newer than a
577
+ supported Python are stored as `.pynew`.
578
+ - mypy was taken to look at every file it was handed, so a file its own run
579
+ never checks, one outside `files` or under `ignore_errors`, got annotations
580
+ nothing verified, and typed runs declined whole projects under
581
+ `ignore_errors`. Such a file is now treated as one no checker covers. Each
582
+ mypy configuration group is checked in its own cache over the whole
583
+ candidate; candidate checks honour `--exclude` and the project's mypy
584
+ `exclude` as the baseline does; and a project package named `env` is no
585
+ longer taken for an environment. A check that fails for the project as it
586
+ stands now stops the run at once, naming the cause: sqlmodel ran 15
587
+ minutes and exited 1 with every proposal "not judged".
588
+ - A project decorator that is a plain wrapper was trusted although another
589
+ module rebinds it, as `app.checks.checked = typeguard.typechecked` before
590
+ the decorated module imports it, and code moved out of the instrumented
591
+ function. A decorator is now known only when nothing in the program may
592
+ rebind it, at every module its name passes through. A stacked decoration
593
+ by hand, `f = typechecked(register(f))`, is judged for every call along
594
+ the chain.
595
+ - A star import made every decorator of its module unknown; it now makes
596
+ unknown only the names it may bind, read as it may run (a literal
597
+ `__all__` with the module's public names, since an import cycle can run
598
+ the star import first).
599
+ - A lambda, comprehension or nested function whose parameter is spelled
600
+ like a name that becomes a helper parameter read the helper's parameter
601
+ instead of its own, and silently computed the wrong result:
602
+ `max(orders, key=lambda order: order["total"])` beside a parameter
603
+ `order`. A name in an f-string's format spec (`f"{v:>{width}}"`), and the
604
+ attribute and subscript loads in a `for`, `with` or comprehension target
605
+ (`for box.v in items`), kept the template's spelling and raised NameError.
606
+ Substitution now follows Python's scopes, and the instantiation check,
607
+ which passed all three because it compared names by spelling, compares by
608
+ binding.
609
+ - A call is declined where its thunk would read a closure variable that an
610
+ inlined comprehension in the same function rebinds; Python 3.12 and later
611
+ raise NameError there.
612
+ - A block holding its function's only binding of a name that the function
613
+ reads elsewhere is declined (`moves_only_binding`), unless the call binds
614
+ the name again. Moving it made the name stop being local, so the other
615
+ reads found a module name or builtin where the original raised
616
+ UnboundLocalError. A helper now declares `global` or `nonlocal` every name
617
+ its blocks bind by any construct, and sites whose functions declare a name
618
+ differently share no helper (`scope_declarations_differ`).
619
+ - A new import was written above a `#!` line or an encoding declaration, so
620
+ a script lost its shebang or a Latin-1 module was read as UTF-8, and it
621
+ could land ahead of a borrower's statement that runs at import. Imports
622
+ now go below the shebang, the encoding line, a file-wide `# type: ignore`
623
+ and the leading comments, and after the borrower's leading statements that
624
+ run code. A write that would change how Python decodes a file is refused.
625
+ - `--cross-module` hosted a helper in a module some platform cannot import,
626
+ such as one that imports `msvcrt`, or in one the program imports only
627
+ under a condition. It now requires what CPython's documentation marks as
628
+ platform-only, what a supported Python removed, and what a marker limits,
629
+ and hosts in a conditionally imported module only for a borrower that
630
+ already loads it.
631
+ - Build selections are read for every setting of each listed backend, in
632
+ each distribution's own configuration: Poetry `packages` and `include`,
633
+ PDM `includes`, `source-includes` and `package-dir`, hatch `only-packages`
634
+ and its default, setuptools `py-modules`, uv `module-name` and
635
+ `module-root`, flit's module and scikit-build-core `wheel.packages`. A
636
+ helper was hosted in a module the wheel left out.
637
+ - `--cross-module` no longer makes a module of one distribution import a
638
+ helper from another (`other_distribution`), which failed when the borrower
639
+ was installed against the other's released version.
640
+ - A typed run checked a change to a member with its own pyright
641
+ configuration only from that member's root, so a consumer in the outer
642
+ project was judged against the original text, and a helper that broke it
643
+ was accepted. A change is now checked from every configured root that
644
+ encloses it, and each copy shows the whole change.
645
+ - pyright's configured `venvPath`/`venv` was dropped from Towel's copy, so
646
+ the check silently used Towel's own interpreter: a helper typed `-> int`
647
+ was accepted where the project's library returns `str`. pyright now
648
+ resolves imports in the configured environment, and an environment it
649
+ cannot use refuses the typed run. Search paths that lead into an
650
+ environment name the original.
651
+ - A pyright-typed run was refused whenever any data file was not UTF-8 or a
652
+ directory was linked from outside. Only the files pyright reads as
653
+ configuration are now held to UTF-8, and links are reproduced as links, so
654
+ an import through an alias inside the project sees the candidate.
655
+ - pyright's messages could carry the private copy's paths, so a
656
+ pre-existing import cycle declined every change. The command line's
657
+ errors without a range are accepted. A forked child can no longer disable
658
+ a `PyrightOracle` or delete its copy. A target outside pyright's `include`
659
+ no longer waits 60 s for the language server.
660
+ - Under `--cross-module`, a directory named like a library, such as
661
+ `third_party/click/` holding `utils.py`, was taken for the library when
662
+ Towel's interpreter lacked it, and Towel wrote `from click.utils import`.
663
+ A directory lacking a module that an import from outside it names is now
664
+ in doubt, unless the project's metadata gives the project that name.
665
+ Requirements declared in `[tool.uv]` and `[tool.pdm]` dev dependencies,
666
+ hatch environments, a Pipfile and `*-requirements.txt` files are read
667
+ too.
668
+ - A file that a symbolic or hard link gives a second module name is now in
669
+ doubt, and the report names the link. Before, its import-time code could
670
+ run twice.
671
+ - An import that attests nothing, because it is guarded, type-only, or in a
672
+ file that changes `sys.path`, no longer locates a name or puts one in
673
+ doubt; graphene's `setup.py` refused every `--cross-module` run. An
674
+ import of a module the tree lacks no longer makes a stray
675
+ `src/__init__.py` a used package, and a type-only one no longer leaves its
676
+ file unchanged.
677
+ - A formatter that changed or failed on the code it was given ended a
678
+ directory run with exit 1 and nothing written: Black normalizing a
679
+ docstring, Black unable to parse a snippet, ruff exiting nonzero or timing
680
+ out. The proposal is now declined as "the formatter changed its code or
681
+ failed", and the run goes on.
682
+ - A differing value holding a slice outside its own subscript, such as
683
+ numbagg's `data[0, :50]`, became the argument `lambda: (0, :50)`, which is
684
+ not Python. Such a value is no longer made a parameter.
685
+ - An out-of-place run copied a pending journal into its stage and refused
686
+ its own write there; a journal inside the target was published into the
687
+ output. Journals are left out of both, and the run warns, naming the
688
+ project's journal and `towel recover`.
689
+ - A refusal over a pending journal named `towel recover` even where recovery
690
+ would then fail. The remedy now runs recovery's own checks and names what
691
+ works.
692
+ - One hard-linked file failed a whole in-place run at publication, losing
693
+ every other file's refactoring. Proposals that would write it are now
694
+ declined up front, and the rest is written.
695
+ - `--no-interactive` still asked "Analyze anyway?" for an input without a
696
+ `.py` suffix. A crash inside mypy or a plugin was reported only as
697
+ "SystemExit: 2"; it now names the exception and mypy's last output.
698
+ - Under forked evaluation the rejection trace counted some pairs twice, and
699
+ which pairs were duplicates depended on the split between workers. The
700
+ trace is now the serial run's, line for line.
701
+ - The sdist left out 33 test fixture configuration files.
702
+ - Code moved out of functions whose decorators rewrite or compile their
703
+ bodies. typeguard's `@typechecked` recompiles a function from its source
704
+ with checks added, and numba's `@njit` compiles it. The moved code went
705
+ unchecked or stopped compiling, and typeguard's own
706
+ `test_unpacking_assign_star_no_annotation_fail[typechecked]` failed after
707
+ a root run.
708
+
709
+ Code now moves out of a function, or a helper into one, only when
710
+ everything that can reach that code is known to leave bodies alone:
711
+ - decorators on the function and on every enclosing function and class;
712
+ - decorators applied by hand (`fast = numba.njit(kernel)`,
713
+ `f = typechecked(f)`, `njit(cache=True)(kernel)`);
714
+ - the machinery of every enclosing class: its metaclass,
715
+ `__init_subclass__` and `__getattribute__`.
716
+
717
+ "Known" means one of two things. The decorator or base is on a verified
718
+ list, each entry recording the source it was read in: the standard
719
+ library's decorators, pytest's and click's, `rich.repr.auto`, and about
720
+ forty standard-library bases such as `unittest.TestCase`,
721
+ `asyncio.Protocol` and `logging.Handler`, which the suite re-checks by
722
+ introspection on every interpreter. Or it is a project decorator shown to
723
+ return, register or plainly wrap the function.
724
+
725
+ Anything else declines the pair as `decorator_may_transform_body[...]` or
726
+ `class_machinery_may_transform_methods[...]`, naming the culprit. Across
727
+ ten projects, 672 of 721 refactorings remain.
728
+ - With `--cross-module`, a block holding an `assert` is shared only between
729
+ modules pytest rewrites alike, following pytest's own rules and the
730
+ project's pytest configuration. Otherwise a failing assert would lose the
731
+ explanation pytest adds to its message.
732
+ - A `TestCase` subclass can now take a class-private method helper, which
733
+ neither unittest nor pytest collects as a test.
734
+ - An in-place `dry` refused whenever any `.towel-transaction-*` path
735
+ existed under its target. That included an empty directory, one inside
736
+ `.git`, and a journal naming only untouched files, and for the empty
737
+ directory the suggested `towel recover` failed too.
738
+
739
+ A run now stops only for a pending journal that may name a file it would
740
+ change: one whose manifest names such a file, or which has no readable
741
+ manifest. The refusal names the `towel recover` command, or says why
742
+ recovery would not read the journal and what to do instead. `preview`
743
+ and `rename-helpers` warn by the same rule.
744
+ - `towel recover` accepts a journal named through a symbolic link, such as
745
+ one under macOS's `/tmp`, and each refusal says why.
746
+ - A file's project root, coverage exclusions, builtin evidence and
747
+ declared dependencies were looked up at every call site: 12,205 times
748
+ for one input on a benchmark of 50 functions. They are now looked up
749
+ once per input for the run, and so are a function's own locals, keyed by
750
+ block site. CPU time against 1.732 went from 1.71 to 1.27 times on that
751
+ benchmark, and from 1.37 to 1.08 times on rich.
752
+ - A project's own package named `env` or `venv` is refactored. An
753
+ environment is now recognised by `pyvenv.cfg` or `conda-meta`, whatever
754
+ it is called.
755
+ - The rejection trace names each block's file:
756
+ `REJECT[reason]: path::function@(start, end) <-> ...`. A pair the
757
+ extractor cannot render is traced as `unsupported_extraction`, and one
758
+ found while clustering no longer ends the analysis.
759
+ `return_versus_variables` replaces the mislabelled
760
+ `incomplete_return_coverage_block2`.
761
+ - The tests and scripts shipped in the sdist carry the Apache licence
762
+ header, and `scripts/add_copyright_headers.py --check` enforces it.
763
+ - A typed run on a project reached through a symbolic link now verifies its
764
+ changes. On macOS that includes every temporary directory, since `/var`
765
+ is `/private/var`. mypy prints each file by its resolved path, and Towel
766
+ had matched its answers against the path it was asked about. So every
767
+ probe went unanswered, with three consequences:
768
+ - every proposal was declined as code the checker does not look at;
769
+ - every subtype question read yes;
770
+ - the check for names typed as `Any` saw no answers, so a missing module
771
+ could go unnoticed.
772
+
773
+ File identities now compare one resolved path throughout. The test suite
774
+ fails any typed test whose checker declined everything as unlooked and
775
+ verified nothing, unless that decline is what the test is about.
776
+ - A parallel run could hang for ever. Pair-evaluation workers were forked
777
+ while other threads ran:
778
+ - tqdm's monitor, in every run with the default progress bars;
779
+ - the progress heartbeat, from a directory run's second pass;
780
+ - each warm pyright session's reader.
781
+
782
+ A forked child keeps every lock as it stood. So a worker forked while one
783
+ of those threads was writing to stderr waited on stderr's lock when it
784
+ flushed at exit, and the run waited on the worker. Towel now ends its
785
+ threads for the moment of the fork and starts them again after, so
786
+ workers fork from a process with one thread. A thread Towel does not run,
787
+ or one that does not end within 2 s, keeps evaluation in the process, and
788
+ the run says so once, naming it. Python 3.12 and 3.13 no longer warn that
789
+ a multi-threaded process is forking.
790
+ - A block that rebinds a name bound before it is now declined, whatever
791
+ construct rebinds it: a `for` or `with` target, a `match` capture, a
792
+ nested `def` or `class`, an import, or a walrus. So
793
+ `i = -1; for i in xs: ...; i * 2` keeps its `-1` when `xs` is empty. It
794
+ had raised `UnboundLocalError` in the helper.
795
+ - `count += 1` and `del count` after a block now count as reads of `count`.
796
+ The helper returns it, or the block is declined, instead of the later
797
+ statement raising `UnboundLocalError`.
798
+ - A block that reads a local before binding it, such as
799
+ `scale = scale(n)`, is declined where the call site may not have the name
800
+ bound. The call had succeeded there, using the module's `scale`.
801
+ - Blocks equal up to their binders' names now share a helper only where no
802
+ read can find a renamed binder unbound. So an `UnboundLocalError` still
803
+ names each site's own variable.
804
+ - Definite assignment now unbinds a deleted name for everything the
805
+ deletion may precede: the next loop iteration, a handler or `finally`, a
806
+ `with`, `case` or `else` body, and an `except*` clause. Such a name had
807
+ been passed eagerly, and raised before an effect the original ran first.
808
+ - A block that started at the second statement of a `;` line, or ended at
809
+ the first, was spliced by whole lines, which deleted the other statement.
810
+ `a = n + 1; b = a * 2`, with the block at `b`, lost `a = n + 1`, and a
811
+ trailing `; log.append(...)` was lost the same way. The call now replaces
812
+ exactly the block's text. It keeps the rest of the first and last lines,
813
+ including a one-line compound body's header and a backslash continuation.
814
+ - A thunk was passed eagerly although the helper evaluated something first
815
+ that could run code or raise, so its effect moved ahead of that
816
+ something. The cases were:
817
+ - a lambda's default arguments;
818
+ - a set or dict display hashing its keys;
819
+ - `*` and `**` unpacking;
820
+ - a read of a global that raises `NameError`;
821
+ - dead code after `return` or `raise`.
822
+
823
+ A thunk now goes eagerly only after steps on an allowlist of forms, in
824
+ CPython's evaluation order, that can neither run code nor raise.
825
+ - A pair is declined as `directive_on_shared_line` when its block shares a
826
+ physical line with code that stays at the call site, and that line
827
+ carries a tool directive or is excluded from coverage. The directive
828
+ governs the whole line, and splicing in the call would part it from some
829
+ of that code.
830
+ - The import sorter could reorder a file's own imports, and so the order
831
+ their modules run in. With ruff excluding `pkg/app.py`, Towel rewrote
832
+ `from pkg import zeta` / `from pkg import alpha` as
833
+ `from pkg import alpha, zeta`, and a plugin registry's order flipped.
834
+ httpcore's byte-compared `_sync` twins were re-sorted the same way.
835
+
836
+ Sorting now respects each tool's own file selection, judged for the
837
+ project's file rather than the run's staged copy:
838
+ - ruff: `exclude`, `extend-exclude`, `lint.exclude` and
839
+ `per-file-ignores`;
840
+ - isort: `skip`, `extend_skip`, `skip_glob`, `extend_skip_glob` and
841
+ `skip_gitignore`, skipped directories included.
842
+
843
+ A file is sorted only if its original imports are already in the
844
+ sorter's order, and a result is kept only if the file's own imports keep
845
+ their order. So only the imports Towel added can move, and a file left
846
+ unsorted is reported once. `ruff format` and Black respect their
847
+ exclusions too.
848
+ - `# ty: ignore[...]` and `# pyrefly: ignore` were read as plain comments.
849
+ Towel moved the code they silenced into call-site lambdas and left the
850
+ ignores behind. On griffe, its own `ty check` went from 2 to 23
851
+ diagnostics. These are now directives, as are:
852
+ - `# zuban: ignore` and `# nosemgrep`;
853
+ - Fixit's `# lint-ignore` and `# lint-fixme`;
854
+ - ruff's `file-ignore`, `disable` and `enable`;
855
+ - pyrefly's `ignore-errors`.
856
+
857
+ An ignore on a line of its own governs the next line of code, as those
858
+ tools read it.
859
+ - With `--cross-module`, Towel took a project directory named like a
860
+ library it requires for that library, when its own interpreter lacked
861
+ the library. For example, `click/` sharing one module with click, while
862
+ the project depends on `click>=8`. The import it wrote then failed once
863
+ the package was installed. A requirement declared in any of these now
864
+ puts the name in doubt: pyproject.toml, setup.cfg, a uv, Poetry, PDM or
865
+ Pipenv lockfile, or requirements*.txt.
866
+ - With `--cross-module`, a library installed in an environment inside the
867
+ project root, such as the project's own `.venv`, was taken for the
868
+ project's own code. It now counts as installed outside the project.
869
+ - With `--cross-module`, Towel could host a helper in a module the build
870
+ leaves out of the wheel, so the installed package failed to import. It
871
+ now reads the declared exclusions of hatch, setuptools, MANIFEST.in,
872
+ Poetry, PDM, uv, flit and scikit-build-core, and every `.gitignore`. It
873
+ uses them only to put a host in doubt, never to name a module. An import
874
+ inside a function no longer shows that a directory ships.
875
+ - With `--cross-module`, a top-level module inside a package, imported by
876
+ its bare name from beside it, went unrefused. The borrower was given a
877
+ relative import that fails where the original works. It now refuses.
878
+ `from . import x` and `from pkg import x` of a missing submodule are now
879
+ reported, and their file is left unchanged.
880
+ - Each import problem's remedy now fits its kind:
881
+ - `--exclude` for a stray copy in the tree;
882
+ - an environment where the name is this tree, or one without it, for an
883
+ installed copy;
884
+ - a rename, `--exclude` or a dropped requirement, for a required
885
+ distribution.
886
+ - Typed mode now reads per-module `follow_imports` as mypy does. An error
887
+ in a module its own section follows was dropped, and a helper the
888
+ project's mypy rejects was let through.
889
+ - A typed run over part of a project (`towel dry tests tests`) found the
890
+ project's own packages in a stale installed copy, and wrote annotations
891
+ for the installed API. It now finds them in the tree.
892
+ - Probes now name modules as mypy does under `explicit_package_bases`,
893
+ `mypy_path` and namespace packages. A probe build that fails is now a
894
+ checker failure. It had been read as unreachable code, which ended PEP
895
+ 420 projects at a false fixed point with exit status 0.
896
+ - A changed file outside the configured `files` is named as its importer
897
+ names it, so mypy no longer refuses the build with "found twice".
898
+ - A mypy configuration that mypy only warns about no longer refuses the
899
+ typed run, and the warning is passed on. Examples are an unknown option,
900
+ a global option in an override, or a dropped Python version.
901
+ - A typed run accounted for errors on the lines a change wrote by message
902
+ alone. Merging two copies of a block then freed the second copy's errors
903
+ to hide a new error with the same message. A helper typed `int | str`,
904
+ whose `p + p` repeated two pre-existing messages, was accepted, and the
905
+ project's mypy rejected it.
906
+
907
+ Each error is now accounted for by an error of the original that stood
908
+ where it stands:
909
+ - in the helper, the same message at the same statement of one copy of
910
+ the block, each error once;
911
+ - at a call site, its own copy's.
912
+ - A file whose imports the checker cannot resolve is now left alone even
913
+ when the configuration silences that report. Examples are
914
+ `ignore_missing_imports` and pyright's `reportMissingImports = "none"`.
915
+ Every checker is asked what each import binds. A subtype question about
916
+ a type the checker sees as `Any` answers unknown, so it no longer folds a
917
+ union.
918
+ - A file that cannot be decoded is left out of a typed run and left
919
+ unchanged, as without types, instead of refusing the run.
920
+ - Files that pyright's configuration excludes or ignores are known before
921
+ the run, and pyright is not asked about them. That removes a minute-long
922
+ stall. Another checker that checks them settles them, rather than their
923
+ being declined as unreachable. Where no checker covers a file, its helper
924
+ takes only the annotations its sites declare.
925
+ - A class the checker names by its whole path, which the helper's module
926
+ does not import, is now imported under `TYPE_CHECKING` and named
927
+ directly, as documented. It had been written `Any`.
928
+ - A verdict that nothing rebinds a name a block reads was memoized under the
929
+ structure of the block and its function. It then answered for identical
930
+ code whose enclosing function rebinds that name with `nonlocal`, in the
931
+ same module or in another. The name was passed to the helper as an
932
+ argument, and so read before the rebinding.
933
+
934
+ The same key let a top-level copy of a block lend its bindings and escape
935
+ verdict to an identical copy inside a loop. That copy was then extracted
936
+ without returning the variable the loop reads next.
937
+
938
+ Block guards and per-block analyses are now memoized per block site: the
939
+ module's source, and the positions of the function and the block. On
940
+ rich, one core, analysis takes about 6% longer, and the output is
941
+ unchanged. A test runs the analysis with every memo disabled and requires
942
+ the same verdicts, so a cache key that leaves out a dependency fails the
943
+ suite.
944
+ - A block that spells a class-private name only as a parameter, or in an
945
+ import's module or member, was moved out of its class. There the name is
946
+ not mangled:
947
+ - `(lambda __p=0: 7)(__p=y)` raised `TypeError` in a method and returned 7
948
+ in a module-level helper;
949
+ - `import __tool` inside `class A` imports `_A__tool`, but `__tool` in a
950
+ helper.
951
+
952
+ Every position CPython mangles now counts. This is checked against the
953
+ interpreter's own symbol tables for all 37 identifier positions in its
954
+ grammar. A call's keywords are compared with the parameters as the class
955
+ stores them, so the same call is declined even when the helper stays in
956
+ the class, where its `TypeError` would name the helper.
957
+ - A typing name that a helper's annotation needed was imported publicly
958
+ (`from typing import Callable`). That replaced a same-named binding in
959
+ every module that star-imports the host. It also replaced one in the host
960
+ itself, where a star import, a `try` or an assignment had bound the name.
961
+ `case Callable():` then raised `TypeError`, and a package's own `Any`
962
+ became `typing.Any`. On click, rich and packaging, 13 modules gained a
963
+ public name.
964
+
965
+ Typing names are now reached through a private `import typing as
966
+ _typing`, or through the module's own sole `import typing [as t]`.
967
+ - The `from typing import TYPE_CHECKING` written for a new guard rebound a
968
+ module's own `TYPE_CHECKING`, for example
969
+ `from pkg.flags import DEBUG as TYPE_CHECKING`, and turned its flag from
970
+ True to False. A new guard now reads `if _typing.TYPE_CHECKING:`, which
971
+ mypy and pyright both recognise, unless the module's sole binding of that
972
+ name is typing's own.
973
+ - A class imported for the checker is bound under a private alias
974
+ (`from pkg.models import Item as _Item`, spelled `"_Item"`), since
975
+ checkers carry that import into every star-importer.
976
+ - A new guard carries `# pragma: no cover` only where the project's
977
+ coverage exclusions would not otherwise match it, so coverage is
978
+ unchanged.
979
+ - A typing import was skipped when the same line appeared anywhere in the
980
+ file, even inside a function, and the helper's annotation then raised
981
+ `NameError` at import.
982
+ - On Python 3.11 and 3.12, Towel compared the syntax trees it builds with
983
+ parsed ones by `ast.dump`. Before 3.13, `ast.dump` spells a field the
984
+ constructor was not given differently from one set empty. On 3.12 the
985
+ helper's `FunctionDef` has no `type_params`, so nearly every helper was
986
+ declined as "could not be rendered". Other comparisons could also miss:
987
+ - the subtype relation that needs no checker;
988
+ - union normalisation;
989
+ - the instantiation check;
990
+ - structural keys and proposal identities.
991
+
992
+ Each miss cost a refactoring or precision, never soundness. Every such
993
+ comparison now uses one spelling on every supported Python, the one
994
+ 3.13's `ast.dump` writes. On 3.12 this recovers 5 typed refactorings in
995
+ the corpus: packaging 2, mistune 2 and nox 1.
996
+ - The test suite passes on Python 3.11, 3.12 and 3.13. Fixtures in PEP 695
997
+ syntax, and tests of `typing.override`, are skipped where the running
998
+ Python lacks them.
999
+ - The fallback annotations of a typed run are built from the checker's
1000
+ answer. Under strict mypy, the rung that made every annotation `Any` had
1001
+ verified 4 times in 46, and 32 of its refusals were "Returning Any". Now
1002
+ `Any` goes only where the errors point:
1003
+ - a parameter read on a failing line;
1004
+ - `Callable[[...], Any]` for a thunk whose result is at fault;
1005
+ - the parameter an "Argument N" error names.
1006
+
1007
+ A return is loosened least, to `<declared> | Any`, which is also how a
1008
+ helper returning `NotImplemented` is typed. Under mypy's
1009
+ `warn_return_any`, the every-`Any` rung is not tried. The unannotated
1010
+ helper is not tried under `disallow_untyped_defs`, or in a module whose
1011
+ every function is annotated. Such a proposal is declined saying so;
1012
+ before, idna's output failed its `mypy --strict` CI with 4 errors.
1013
+ - An extraction that no helper signature can type is declined early, under
1014
+ a named reason in the run's summary:
1015
+ - it narrows what its caller reads after the call;
1016
+ - it narrows what a call-site lambda reads;
1017
+ - it declares its class's attributes;
1018
+ - it completes its caller's partial type.
1019
+
1020
+ Two of these are decided from the proposal alone, without asking the
1021
+ checker.
1022
+ - A declined proposal is replayed at a rehearing, rather than checked
1023
+ again, only while nothing it could depend on has changed: its rendered
1024
+ files, the files its errors lie in and what they import, and the
1025
+ baseline's record of known errors. On packaging, checks that exactly
1026
+ repeated an earlier one went from 16 to 0.
1027
+ - A number of annotation fixes:
1028
+ - outside a class, a `Self` the sites revealed becomes a type variable
1029
+ bound to their classes;
1030
+ - no annotation is written as the string `"None"`, which mypy 2 rejects
1031
+ under `native_parser`;
1032
+ - a site revealed as `Any` no longer erases another site's type in a
1033
+ join;
1034
+ - a copied declaration gives way to the narrower type the block saw;
1035
+ - a method helper is placed where the attributes it assigns keep their
1036
+ declarations;
1037
+ - every rung writes only the type-only imports its own annotations use.
1038
+ - A class name shortened inside a subscripted annotation (`dict[Item, int]`)
1039
+ was left unquoted while `Item` was imported only under `TYPE_CHECKING`.
1040
+ mypy accepted it, but the module raised `NameError` on import.
1041
+ - Coverage exclusions set in a project's configuration now count the way a
1042
+ `# pragma: no cover` comment does. Examples are `if __name__ ==
1043
+ .__main__.:`, `raise NotImplementedError` and `@overload` in
1044
+ `exclude_lines` or `exclude_also`. Before, only the comment counted, so
1045
+ such an entry could move excluded code into a helper that coverage
1046
+ measures. Towel reads the configuration as coverage.py 7.16 does: from
1047
+ `COVERAGE_RCFILE`, `.coveragerc`, `.coveragerc.toml`, `setup.cfg` or
1048
+ `tox.ini` `[coverage:report]`, or `pyproject.toml`
1049
+ `[tool.coverage.report]`. Its three default patterns count as well. Where
1050
+ `exclude_lines` leaves the pragma out, a `# pragma: no cover` comment
1051
+ excludes nothing, so it no longer declines a pair.
1052
+ - A type-only import now joins the module's existing `TYPE_CHECKING` guard,
1053
+ recognised by binding as the import graph recognises it. Towel had found
1054
+ the guard by its exact text, and indented the new import four spaces:
1055
+ - packaging's `if TYPE_CHECKING: # pragma: no cover` got a second guard;
1056
+ - a guard body indented two spaces or with a tab raised `IndentationError`;
1057
+ - in a module that rebinds `TYPE_CHECKING = True`, the import was joined
1058
+ to a block that runs.
1059
+
1060
+ The import now takes the indentation of the guard's own body.
1061
+ - A `--cross-module` run refuses only for a problem that leaves a name of the
1062
+ code being refactored in doubt. Such problems are:
1063
+ - an ambiguous name, such as a stale `build/lib` copy of the package, which
1064
+ `--exclude build` still clears;
1065
+ - a file reachable under two names;
1066
+ - a top-level name found inside a package;
1067
+ - a relative import that climbs out of its package.
1068
+
1069
+ An import of a module the tree lacks refuses nothing, whether the run is
1070
+ from the root, on a package or on a sub-package. Such imports had stopped
1071
+ every run on sphinx, astroid and prompt-toolkit, and on seven packages
1072
+ whose modules import the `_version.py` their build generates, which a
1073
+ fresh clone lacks. With the refusal set aside, the package's name was
1074
+ flagged, so every helper its modules could share was declined: 3,858 of
1075
+ the 3,860 cross-module pairs on sphinx.
1076
+
1077
+ Over 140 corpus projects, runs on the package refused 14 before and 4
1078
+ after. Runs from the root, measured only after the first of these changes,
1079
+ refused 24 and now refuse 18. Every remaining refusal is for a name in
1080
+ doubt, such as the four module names sphinx's `tests/roots` each defines
1081
+ more than once.
1082
+ - In a `--cross-module` run, a file making such an import is left exactly as
1083
+ it was. It hosts no helper, borrows none, and none of its own duplicates
1084
+ are extracted. The run names each such file, with a remedy that fits:
1085
+ test data or an example can be left out with `--exclude`, and a package's
1086
+ generated module appears once the project is installed. When the file is
1087
+ a package's `__init__.py`, that package's modules still share helpers
1088
+ among themselves, and the run says in one line that they host none for
1089
+ modules outside the package.
1090
+ - A run on a sub-package now refuses, instead of going on with every helper
1091
+ declined, when a relative import elsewhere in the package climbs out of
1092
+ it.
1093
+ - An import below a module file names the module it lacks: `util.gone`, not
1094
+ `util`, when `util.py` exists. A module file that registers submodules at
1095
+ run time, as `six.py` registers `six.moves`, is not reported as missing
1096
+ them, wherever it sits.
1097
+ - A typed run no longer changes code that the type checker does not look
1098
+ at. That is code the checker takes to be unreachable on the platform and
1099
+ Python version it checks for, and there it reports nothing. On darwin,
1100
+ mypy skips a module guarded by `assert sys.platform == "win32"`, so
1101
+ Towel's check of changes there was vacuous. trio's CI, which checks linux,
1102
+ darwin and win32, found 14 errors in output Towel had accepted.
1103
+
1104
+ Every configured checker is now asked, by a `reveal_type` probe, whether
1105
+ it looks at the lines a change writes. A change it does not look at is
1106
+ declined as not verifiable. The regions are named before the run. trio's
1107
+ CI now passes on all three platforms.
1108
+ - An import under `if TYPE_CHECKING:` never runs, and the cycle guard no
1109
+ longer follows it. Modules that name each other's classes only for the
1110
+ checker can now share a helper. A type-only import that Towel writes no
1111
+ longer refuses later pairs between the same two modules; on mistune it
1112
+ had cost two typed refactorings.
1113
+
1114
+ The guard is recognised by resolving the name: typing's or
1115
+ typing_extensions' `TYPE_CHECKING`, however imported or aliased, or the
1116
+ module's own `TYPE_CHECKING = False`. Its `else` branch still counts as
1117
+ an import that runs, as do `if not TYPE_CHECKING:` and a shadowed or
1118
+ unresolvable name. A module's requirements now include the imports in the
1119
+ guard's `else`, which had been dropped.
1120
+ - A type variable over classes from two modules now imports the one its host
1121
+ lacks, under `TYPE_CHECKING`, spelled as the program's own imports spell
1122
+ it. packaging's validation and required-key errors, and mistune's
1123
+ renderer `__call__`, are now typed without `Any`.
1124
+ - Comments inside a moved block were lost with it, because the helper was
1125
+ rendered from its syntax tree. That included tool directives, such as
1126
+ asyncstdlib's and mashumaro's `# type: ignore`, as well as
1127
+ `# pyright: ignore`, `# noqa` and `# pragma: no cover`, and every
1128
+ explanatory comment. A lost directive changes what a checker, linter or
1129
+ coverage tool reports.
1130
+
1131
+ The helper now carries each comment beside the code it was written for,
1132
+ in order. It also keeps the grouping parentheses and trailing commas that
1133
+ held a list split across lines, so Black and ruff reproduce the source
1134
+ layout. Where a formatter would move a directive off its code's line,
1135
+ that helper is written unformatted. Comments above or below a moved block
1136
+ stay with its call, and `preview` shows the helper's comments.
1137
+ - A typed run no longer refuses a project whose type check already reports
1138
+ errors. It reports them first, and rejects a change only for an error they
1139
+ do not account for:
1140
+ - In a file no change touched, an error must match one at the same line.
1141
+ - In a file a change touched, the two texts are aligned by a line diff. An
1142
+ error on a line the change left alone must match the original's error
1143
+ on that line. An error on a line the change wrote must match the
1144
+ original's error where that code stood, as described above.
1145
+ - A message that names a line fails closed.
1146
+ - Each written change's check becomes the reference for the next.
1147
+ - The cold confirmation compares the same way.
1148
+
1149
+ In a study of 20 corpus projects in their own environments, the old rule
1150
+ let 5 through. 19 are now refactored with types, for 125 refactorings, 77
1151
+ of them in the 14 newly admitted projects.
1152
+ - With mypy and pyright both configured, the combined check stopped at the
1153
+ first checker that reported anything. Against pre-existing mypy errors,
1154
+ pyright was then never asked about any candidate. Every checker is now
1155
+ asked until one reports a new error.
1156
+ - A file where the original check leaves a name the checker cannot type is
1157
+ not changed. Such names come from an unresolved or untyped import, a
1158
+ missing stub, an untyped decorator or an `Any` base class. A change there
1159
+ would be checked against `Any`, and could not fail. The run names these
1160
+ files up front and counts their proposals as not verifiable.
1161
+ - The cold confirmation checks the original cold before it treats as new an
1162
+ error that only it reports. On trio, pyright's language server and command
1163
+ line disagreed about files no change touched, so every typed run failed at
1164
+ the end.
1165
+ - Only a checker that cannot run still refuses a typed run. The corpus
1166
+ harness reruns a project without types only in that case, and records
1167
+ every other project's pre-existing errors.
1168
+ - Typed runs read every type spelling that mypy 1.x, mypy 2.x and pyright
1169
+ print. A regular expression took the last `) -> ` as the end of a
1170
+ parameter list, so `lambda: parse_extras` in packaging's `_parser` was
1171
+ annotated as the function the lambda returns. Now read correctly:
1172
+ - a function returning `None` (`def (builtins.int)`), a function
1173
+ returning a function, and a generic function;
1174
+ - a named tuple or typed dict, and its constructor;
1175
+ - `Union` and `Optional` beside `|`, and a literal whose text holds `<`.
1176
+
1177
+ Only a literal type the checker inferred is widened, and a declared one is
1178
+ kept. `Union`, `Optional` and `Literal` are imported where they are
1179
+ written.
1180
+ - The type-variable rung recognises the program's own classes. It had
1181
+ identified a class by where its import points or where it is defined,
1182
+ which never matches the checker's `packaging.version.Version`. So the
1183
+ row, and every type variable in it, was lost: rows formed in 13 of 81
1184
+ attempts across packaging, rich, mistune and nox.
1185
+
1186
+ A class is now named by the absolute name the import model gives its
1187
+ module. Where the program's imports name no module, the rung uses mypy's
1188
+ `__init__` chain instead. Rows now form in 58 of 66 attempts. Along with
1189
+ that:
1190
+ - a type only a call site can name may stand inside a type variable;
1191
+ - `Any` nested in a type is kept;
1192
+ - the signature brings its typing imports;
1193
+ - a parameter the body never reads is `object`;
1194
+ - union members line up by structure;
1195
+ - a class passed directly or through a thunk (`lambda: Row`) is
1196
+ `type[Row]`, and a returned variable bound to a parameter takes that
1197
+ argument's type.
1198
+ - Sites in different modules that agree on every type get their common
1199
+ signature, naming the host's classes. Before, the ordinary signature wrote
1200
+ only builtins and fell back to `Any`, and mistune's block quote and spoiler
1201
+ helpers were declined.
1202
+
1203
+ Together with the ladder and baseline changes above, typed refactorings
1204
+ rise as follows, measured on Python 3.12.13 with `--cross-module` from
1205
+ `eaa3882` to `336c890`:
1206
+
1207
+ | Project | Typed refactorings | Project checks per run |
1208
+ |---|---|---|
1209
+ | packaging | 10 to 20 | 68 to 36 |
1210
+ | rich | 18 to 22 | 45 to 30 |
1211
+ | mistune | 15 to 19 | 31 to 19 |
1212
+ | nox | 5 to 5 | 9 to 7 |
1213
+ | idna | 3 to 1 | 5 to 5 |
1214
+
1215
+ idna's output now passes its CI's `mypy --strict idna`. Every output
1216
+ passes its project's own mypy and test suite exactly as the unchanged
1217
+ project does, and every module imports as it did.
1218
+ - Pyright's language server checks a project as `pyright` itself does. Towel
1219
+ sent it a `python.analysis` section without `autoSearchPaths`, which the
1220
+ server then leaves off and the command line always sets, so a src
1221
+ layout's package was analysed as `src.<pkg>` and consumers outside `src`
1222
+ imported the installed copy, which for an editable install is the user's
1223
+ own tree. A candidate that removed `edit` from click's exports broke six
1224
+ lines of its typing tests and was reported clean, and trio reported 1989
1225
+ errors where its own pyright reports 1870. The server's settings are now
1226
+ stated in full and match the command line's in every configuration
1227
+ tested; on click, trio, jinja2, markupsafe, attrs and structlog the two
1228
+ report identical errors. A consumer that imports its package through an
1229
+ editable install is judged against the candidate wherever the package
1230
+ lives (`python/`, `lib/`, `packages/<name>/src`, or configured
1231
+ `extraPaths`), and pyright's command line is told the project it checks,
1232
+ so its answers no longer depend on where the temporary directory lives.
1233
+ - `s = super; s()` shared by sibling classes was moved into a module
1234
+ function, where it raised `RuntimeError: super(): __class__ cell not
1235
+ found`; `super()` reached through another name now stays where it is.
1236
+ - A frame handle taken earlier in the loop body or branch that holds a
1237
+ duplicated block (`frame = sys._getframe()`, read later as
1238
+ `frame.f_locals`) no longer lets the block move; the check had stopped
1239
+ walking at the block and never saw the handle.
1240
+ - A directory run ends when a proposal renders exactly the bytes its files
1241
+ already hold. The directory driver had counted such a proposal as applied,
1242
+ so the next analysis found it again and, with no iteration bound, the loop
1243
+ never stopped; the single-file driver has always had this guard. The
1244
+ proposal is now declined and remembered until the project changes.
1245
+ - Type probes at adjacent extraction sites retain their lexical scope even when
1246
+ they share a source line. Conflicting mypy specialization notes for one probe
1247
+ are treated as ambiguous evidence instead of silently retaining the last type.
1248
+ - An extraction no longer gives a method a receiver it never needed. A method
1249
+ reached through its class is an ordinary call with nothing bound, so
1250
+ `Formatter.as_dollars(None, 1.5)` runs for as long as the body reads no
1251
+ attribute of `self`, and routing the block it shares through
1252
+ `self._extracted_func_0(...)` made that an `AttributeError` while every
1253
+ genuine instance kept its answer and no checker said a word. Such a helper,
1254
+ and one shared by static methods or by classmethods that never read `cls`,
1255
+ is now a module-level function. An intermediate candidate made it a
1256
+ `staticmethod` reached as `ClassName._extracted_func_0`, and the class's
1257
+ name does not always reach the class: a parameter of that name, `del`,
1258
+ `global` rebinding, a mangled `class __C`, a decorator returning something
1259
+ else, or a call while the class body still runs each broke it. `__class__`
1260
+ would reach it, but mypy does not accept it. Over packaging, click and rich
1261
+ nothing is declined; click goes from 11 helpers to 10, one module function
1262
+ serving a third class.
1263
+ - An import Towel writes names a module the installed project has, because
1264
+ its name is taken from the program's own imports instead of computed from
1265
+ packaging metadata. Checked against built wheels, the old layout readers
1266
+ named 102 files of seven corpus projects wrongly (a `setup.cfg` or
1267
+ `setup.py` src layout, never read, became `src.foo.a`), 937 more when a
1268
+ project directory shares its package's name (`foo.src.foo.a`), and
1269
+ waitress' `src/waitress/task.py` as `src.waitress.task`. Without a project
1270
+ mypy configuration the checker named modules from the same root, so it
1271
+ accepted those imports, and the adopted output failed with
1272
+ `ModuleNotFoundError`. Within a package Towel writes the spelling the
1273
+ importing module already uses for its neighbours, or a relative import.
1274
+ Across top-level packages it writes an import only where the importing
1275
+ package already imports the other one, spelled as it spells it. It enters
1276
+ a directory only where its own side already imports from it, so a library
1277
+ never borrows from a test package its wheel leaves out. A relative import
1278
+ never climbs above the importer's top package. What an import runs, for the
1279
+ cycle guard and the import-time checks, is read the same way; the old
1280
+ graph had matched filenames case-insensitively (`pygments/Lexer.py`) and
1281
+ let eight pygments lexers import others at load time. An import into an
1282
+ excluded directory, such as pip's `_vendor`, is treated as unknown rather
1283
+ than empty. `rename-helpers` names modules the same way, so it works on src
1284
+ layouts. The packaging readers are gone; `--prefer-absolute-imports`,
1285
+ `--pep420` and their engine keywords are accepted as deprecated no-ops, and
1286
+ `ProjectLayout` is removed. The new reject reason `unproven_import`
1287
+ replaces `unknown_layout`.
1288
+ - `towel dry TARGET OUT` refactors TARGET inside a private copy of its whole
1289
+ project and writes only TARGET to OUT, when the run succeeds. It refactored a
1290
+ copy of TARGET alone, so everything read during the run saw a directory with
1291
+ no packaging metadata and no rest-of-project: the layout readers were never
1292
+ reached (every import came out relative, which hid the defects above), and
1293
+ an import cycle or an import-time effect through a module outside TARGET was
1294
+ invisible, leaving the adopted package unimportable where the same run in
1295
+ place was correct. Out-of-place and in-place runs now make the same
1296
+ decisions; staging click, rich and pygments (460 files) takes 0.07 s. A
1297
+ project root holding more than 20,000 Python files is refused with a
1298
+ message. A failed or interrupted run leaves no OUT behind.
1299
+ - The complete mypy check no longer calls a broken consumer clean. The
1300
+ consumer scan cached an answer computed with the baseline's packages left
1301
+ out and reused it for later sparse requests, so after the first check of
1302
+ `towel dry . .` a sibling analysed package went unchecked; it never noticed a
1303
+ file an applied refactoring had made into a consumer; it named a PEP 420
1304
+ module `lib` where its importers say `nsp.lib`; it read `from app import
1305
+ helpers` as an import of `app` alone; and it resolved an `__init__`'s
1306
+ relative imports against the package's parent. It now keeps the whole import
1307
+ graph, re-reads only files whose stamp changed, and applies exclusions per
1308
+ request; at its file limit it fails the check instead of returning a partial
1309
+ list. A mypy run that applied anything ends with one complete check from an
1310
+ empty cache and a fresh scan, as a pyright run already did (0.6 s on click).
1311
+ An error mypy reports without a line is counted, and a crashed worker's
1312
+ standard error is quoted.
1313
+ - A helper is placed only where it stays a plain member. Never in a
1314
+ `Protocol`, where it became a protocol member and turned runtime-checkable
1315
+ `isinstance` checks false; never in a class written on one line
1316
+ (`class E(Exception): pass`), where it was written at column zero; and only
1317
+ in a class, or through a base, whose every decorator is known to keep the
1318
+ namespace (`dataclass`, `total_ordering`, `final`, `enum.unique`), since a
1319
+ decorator that rebuilds or wraps it dropped or wrapped the helper. A module
1320
+ helper is no longer placed after an assignment, decorator or class body that
1321
+ could call it at import.
1322
+ - A borrower is never made to import a host that requires a module the
1323
+ borrower does not: `import tornado` is inert as a statement, but a helper
1324
+ hosted in gunicorn's tornado worker made the sync worker unimportable
1325
+ wherever tornado was absent. The standard library, declared dependencies,
1326
+ and imports inside `try` require nothing. Over rich, click, packaging and
1327
+ pygments the output is byte-identical.
1328
+ - A call site whose generated thunk would read a local that may be unbound is
1329
+ declined: the thunk raised `NameError` where the original raised
1330
+ `UnboundLocalError`, and `except UnboundLocalError` stopped matching.
1331
+ - Generated helper names avoid every name another source under the project
1332
+ root defines as a class member or attribute, so a subclass outside the
1333
+ target can no longer override a new helper.
1334
+ - An escape in a string literal survives extraction into a file whose
1335
+ encoding cannot hold the character it denotes. Rendering spells a constant
1336
+ by value, so `"\u20ac"` in a Latin-1 file came back as `€`, which the file
1337
+ cannot hold, and the run aborted. The escape is now written back, inside
1338
+ the literal only and kept only when the syntax tree is unchanged by it; a
1339
+ character no escape can spell is declined instead. A file nested too deeply
1340
+ to analyze is skipped with a warning instead of ending directory mode with
1341
+ `RecursionError`.
1342
+ - A run whose every candidate the type checker could not judge (timeout or
1343
+ crash) exits non-zero and says so, instead of printing "No refactorings
1344
+ found!"; a run that applied some reports how many went unjudged. The summary
1345
+ shows the run's actual termination reason.
1346
+ - `rename-helpers` refuses a batch that would leave an import of the old name
1347
+ behind, as it did on an out-of-place output whose imports name the package
1348
+ rather than the output directory. Rename after adopting.
1349
+ - A project whose own mypy configuration excludes files (`exclude`, or `files`
1350
+ not naming them) is no longer refused for errors in files its own mypy run
1351
+ never checks; an excluded file that checked code imports is still checked.
1352
+ - A block passes the caller's names that only a definition inside it reads
1353
+ where it stands: defaults and keyword-only defaults, decorators and
1354
+ annotations, class bases, keywords and bodies. The helper raised
1355
+ `NameError` before its first call. A bare `x: int` no longer counts as
1356
+ binding `x`, which raised `UnboundLocalError`.
1357
+ - A `match` pattern's class, dotted value and mapping keys are read from the
1358
+ caller, and nothing in a pattern becomes a parameter except a class
1359
+ pattern's class or the root of a dotted name. `case [1, x]` against
1360
+ `case [2, x]` had become a capture that matched every pair, and
1361
+ `case Color.RED` a class pattern that raised `TypeError`.
1362
+ - A `type` statement's value and a type parameter's bound are closures
1363
+ evaluated when first read, and are declined wherever the caller or the
1364
+ block rebinds what they read, as lambdas are.
1365
+ - A block is declined when a function, lambda, generator or class it creates
1366
+ could be observed other than by calling it. Such an object would carry the
1367
+ helper's `__qualname__`, and a unified lambda the template's parameter
1368
+ names. It may still be called in the block, be the `key=` of `sorted`,
1369
+ `min` or `max`, or be the function of a `map` or `filter` consumed there.
1370
+ Rich makes 27 helpers instead of 28; packaging, click and pygments are
1371
+ unchanged.
1372
+ - Constants that compare equal but differ in type (`0`, `0.0` and `False`;
1373
+ `1` and `True`) are different constants, extracted as arguments where the
1374
+ instantiation check used to decline them. Pygments makes 74 helpers
1375
+ instead of 72, and its lexers and formatters produce identical output over
1376
+ 12,679 observations.
1377
+ - An integer literal too wide for decimal conversion no longer ends the run;
1378
+ a block holding one of more than 640 digits is declined.
1379
+ - A checker the project configures that is not installed refuses the typed
1380
+ run before anything is written, naming the checker and its configuration.
1381
+ It had been replaced by the other checker, or by none after a one-line
1382
+ note, so a pyright-only project was refactored unverified with exit
1383
+ status 0.
1384
+ - mypy checks with the project's configured plugins, loaded as its own mypy
1385
+ loads them; a plugin that cannot load refuses the run, quoting mypy's
1386
+ error. Without them Towel accepted a helper the project's own mypy
1387
+ rejected.
1388
+ - A module that ships its own stub is checked through the stub, as mypy
1389
+ checks it, so an importer of a name the implementation gained and the stub
1390
+ lacks is refused rather than accepted.
1391
+ - An in-place run refactors a private copy of the project and writes the
1392
+ result once, as one journaled change, after its final confirmation
1393
+ succeeds. A refused confirmation or an interruption leaves the project
1394
+ unchanged, and a file edited during the run refuses the write instead of
1395
+ losing the edit. Over click the output is byte-identical and 1.4% slower.
1396
+ - A pyright configuration is read with pyright's own grammar, so a file
1397
+ pyright rejects refuses the run before anything is written, naming the
1398
+ file and position; the language server would otherwise have checked with
1399
+ default settings. pyright's failures quote its standard error, and its
1400
+ command-line probes are written only into Towel's private copy.
1401
+ - A generated annotation that uses syntax newer than the project's oldest
1402
+ Python (`int | None` before 3.10, `list[int]` before 3.9) is written as a
1403
+ string in a module that does not postpone annotations. The oldest Python
1404
+ comes from `requires-python`, else mypy's `python_version` or pyright's
1405
+ `pythonVersion`. A project declaring `>=3.9` got a helper that raised
1406
+ `TypeError` at import under 3.9.
1407
+ - `dry` reports what it declined, counted by reason, instead of "No
1408
+ refactorings found!" alone; a type-check refusal is no longer reported as
1409
+ "could not be rendered"; and the `.towel-helpers.json` sidecar lists only
1410
+ helpers present in the output.
1411
+ - A cross-module helper no longer reads a builtin that one of its modules may
1412
+ hold differently. The helper had read builtins in its host, so `len`
1413
+ shadowed only in the borrower was read as the builtin, and a test patching
1414
+ `open` into the borrower (`mock.patch("pkg.mod.open", ..., create=True)`,
1415
+ the documented idiom) stopped reaching the moved code. The pair is now
1416
+ declined when a participating module binds the name, may bind it through a
1417
+ star import, rebinds `__builtins__` or writes its own namespace at run
1418
+ time, or when the project's code or tests patch the name into one of them
1419
+ (`mock.patch`, `patch.object`, `monkeypatch.setattr`, and targets they
1420
+ compute). No helper takes a builtin as a parameter. A patch applied from
1421
+ outside the project is not seen. A relative import inside an extracted
1422
+ block stays within its own package.
1423
+ - No helper takes a builtin as a parameter within one module either. Where
1424
+ one function binds `len` (`second(rows, name, len=...)`) and its duplicate
1425
+ reads the builtin, the helper had taken `len`, and the first function
1426
+ passed it the builtin; a block reading the builtin had also joined a
1427
+ helper whose other sites passed their own `len`, and `__import__` or a
1428
+ tuple of builtins could be passed as a value. Each is declined
1429
+ (`builtin_argument`); where both functions bind the name, each still
1430
+ passes its own.
1431
+ - One predicate now decides what importing a module runs, for choosing a
1432
+ host and for placing a helper. Decorators, defaults, annotations,
1433
+ metaclasses and `__init_subclass__` count as code; a `TYPE_CHECKING` block
1434
+ and a short list of callables verified at run time do not. A registration
1435
+ decorator in the host had run when the borrower was imported.
1436
+ - A helper is hosted only in a module that ships with the module importing
1437
+ it, never in `tests/` or `examples/` for the package to import. A module
1438
+ with a stub (`.pyi`, `typings/`, `<pkg>-stubs`) never hosts a cross-module
1439
+ helper, and a module that can run as a script (`__main__.py`, a main guard
1440
+ in any form, a `#!` line) stays runnable by its path. Dependencies
1441
+ declared by Poetry or in setup.cfg `install_requires` count as declared.
1442
+ - One existing function is never rewritten to call another. When duplicates
1443
+ are whole function bodies, every site calls one new helper, so patching
1444
+ `mod.f1` in a test no longer changes `f2`. `reuse_existing_functions` no
1445
+ longer has any effect.
1446
+ - A class keeps a method helper only when its receivers are unannotated or
1447
+ annotated as the class, `Self` or a type variable bound to it, and its
1448
+ metaclass and every `__init_subclass__` it runs are known to leave an
1449
+ added function alone. Otherwise the helper is a module-level function
1450
+ taking the receiver.
1451
+ - A helper goes into a class only when every duplicate it replaces is a
1452
+ method of that class; blocks shared by different classes become
1453
+ module-level functions taking the receiver. Towel had hoisted method
1454
+ helpers into ancestors that held none of the code, among them click's
1455
+ `UsageError`, rich's `JupyterMixin`, packaging's `BaseSpecifier` and
1456
+ pygments' `Formatter` and `Lexer`. These are public bases that other code
1457
+ subclasses, where any subclass could take the helper's place
1458
+ (`docs/DECISIONS.md` gives the count measured when the rule was chosen).
1459
+ Whether such a function belongs in a class is left to whoever reviews the
1460
+ output (see `docs/DECISIONS.md`). pygments makes 71 refactorings instead
1461
+ of 77 and rich 30 instead of 33; click and packaging are unchanged, and
1462
+ all four behave identically on smoke programs.
1463
+ - A method helper is class-private (`__extracted_func_N`, stored as
1464
+ `_Cls__extracted_func_N`), so no subclass in or outside the project can
1465
+ override it; a class that answers unknown attribute names through
1466
+ `__getattr__`, as tinydb's `Query` does, keeps answering the helper's old
1467
+ name. A class whose hierarchy defines `__getattribute__` gets a
1468
+ module-level helper instead, since it intercepts every lookup.
1469
+ - `rename-helpers` renames a class-private helper by its class
1470
+ (`path.py:Class.__extracted_func_N`) to another class-private name; a
1471
+ non-private new name, or the stored name spelled elsewhere, refuses the
1472
+ batch. `reuse_existing_functions` is still accepted, as a documented
1473
+ no-op.
1474
+ - A project that configures no mypy is checked as its own `mypy` would check
1475
+ the same files, with mypy's defaults. Towel had forced
1476
+ `check_untyped_defs`, `ignore_missing_imports` and `explicit_package_bases`
1477
+ on it, and each changed the verdict: dacite, clean under `mypy .`, was
1478
+ refused for 53 errors inside unannotated tests, and a root-relative
1479
+ `src.foo.a` import was accepted. Probes that infer a helper's types still
1480
+ check unannotated bodies, in a cache of their own. Such a project is now
1481
+ refused a typed run wherever its own `mypy` fails; configure mypy or pass
1482
+ `--no-types`.
1483
+ - A check resolves a module's imports where the project's own mypy does. The
1484
+ project root had been searched first, so a test's `import helpers` was
1485
+ checked against a root `helpers.py` instead of the one beside it.
1486
+ - A literal that a tool reads without running the program stays where the
1487
+ tool reads it. python-statemachine's `_("There should be exactly one
1488
+ initial state: {!r}")` had become `_(__param_1)`, and pybabel extracted
1489
+ neither message; click had lost four of its 71 the same way. The message
1490
+ and context arguments of Babel's, Django's and Flask-Babel's markers, and
1491
+ of keywords a project configures, are never parameters; nor are the names,
1492
+ fields and types of the functional typing forms, `Literal[...]`, or the
1493
+ type argument of typing's `cast` and `assert_type`, where no annotation
1494
+ makes a parameter acceptable to mypy or pyright. A typing form is
1495
+ recognized by what its callee is bound to, however it is spelled
1496
+ (`from typing import TypeVar as TV`, `typing.cast`, `typing_extensions`,
1497
+ a project module that re-exports it), so a project's own `cast`, such as
1498
+ sqlglot's `exp.cast(column, to)` or SQLAlchemy's, stays an ordinary call.
1499
+ Only click changes over the four reference packages: 10 refactorings
1500
+ instead of 11, with every message still extracted.
1501
+ - A helper that computes nothing is no longer extracted, whatever
1502
+ `skip_trivial_helpers` says: two unrelated `return` statements had become
1503
+ `def _extracted_func_24(__param_0, self): return __param_0`, which rich's
1504
+ `Tag.markup` and `MofNCompleteColumn.render` called across two modules;
1505
+ packaging and pygments had one each, and those are exactly what is gone.
1506
+ - The fixed point ends for a stated reason rather than an incidental one. On
1507
+ sqlglot it once extracted 597 helpers, each forwarding to the previous one
1508
+ with its tuple permuted, until ordinary SQL raised `RecursionError`. A
1509
+ helper that only calls generated helpers and repacks their results is now
1510
+ declined in every configuration, forwarding is recognized whatever order
1511
+ results come back in, and a lambda handed on whole is passed through
1512
+ rather than wrapped again. With the escape guard switched off, sqlglot's
1513
+ DuckDB generator went from no fixed point in 900 s to one in 18 s.
1514
+ - A base-class name is resolved as the binding in effect where the class
1515
+ statement runs, not by finding a class of that qualname anywhere in the
1516
+ file. Python binds globals as a module executes, so `Base = object`
1517
+ written between two subclasses gives them different bases. The checks on
1518
+ a host class's bases (its metaclass, `__init_subclass__` and
1519
+ `__getattribute__`) therefore read the base the class really has. A
1520
+ binding that cannot be established there counts as unknown, and the
1521
+ helper is a module-level function.
1522
+ - A copied annotation is no longer evaluated a second time. An annotation is an
1523
+ expression, and the copy runs at the helper's own `def`:
1524
+ `Annotated[int, mark('a')]` called `mark` again at import, and an annotation
1525
+ the source had quoted was unquoted into one that called it for the first
1526
+ time. An annotation is written bare only when evaluating it runs none of the
1527
+ program's own code; anything holding a call, a lambda, a comprehension, a
1528
+ conditional or an f-string is written as a string, which a checker reads
1529
+ identically and the interpreter never evaluates.
1530
+ - A complete project check covers the modules that import the change. mypy
1531
+ follows imports out of the files it is given and reaches no caller, so a
1532
+ subclass in another package, unchanged and never imported by the package it
1533
+ extends, was broken by a helper whose name it already used while the check
1534
+ reported clean. Those modules are found by one `ast` pass per project. The
1535
+ project root is not walked in its place: repositories hold files no checker
1536
+ can build, and one of them fails the build and refuses the project.
1537
+ - A rejected candidate no longer answers for the project that follows it.
1538
+ Its text was checked, so mypy cached each of its modules against the real
1539
+ file's mtime and size, which mypy trusts without hashing. Those paths were
1540
+ given text again only when the next request named them, and the next request
1541
+ is sparse, so a provider left speculatively returning `str` went on answering
1542
+ `str` while its file returned `int`. Such a path is now given what its file
1543
+ holds, named or not. On Sphinx this costs 3.5% and changes no output.
1544
+ - Two unrelated files that infer one module name are no longer collapsed into
1545
+ one, which dropped the second file's errors and reported the project clean.
1546
+ Only a stub and the implementation beside it collapse; anything else keeps
1547
+ mypy's duplicate-module refusal.
1548
+ - A project whose checker cannot start at all -- a config naming a Python
1549
+ version mypy has dropped -- is told how to proceed, as a project with
1550
+ pre-existing errors already was.
1551
+ - The mypy worker's cost per request no longer grows over a run. Successive
1552
+ `build.build` calls in one process keep every rechecked module's tree alive
1553
+ (mypy 1.19; about 250,000 objects per build of `sphinx.application`), and
1554
+ each build opens with a full collection over all of it, so requests slowed
1555
+ linearly and a run quadratically: 14 s per request and a 14 GB worker after
1556
+ 80 minutes. Each build now runs in a forked child that exits when it has
1557
+ answered. The same 117 recorded requests take 86.5 s instead of 855 s, at a
1558
+ flat 0.75 s and 60 MB, with identical diagnostics.
1559
+ - A complete project check no longer makes mypy recheck every analyzed module.
1560
+ mypy consults its cache only for a module it reads itself, and every module
1561
+ was supplied as text. Text a file already holds is now withheld. A path that
1562
+ has once been supplied with differing text stays supplied for the life of
1563
+ the cache, because mypy records the file's mtime and size beside the text's
1564
+ hash and would otherwise answer for the file with its verdict on the text.
1565
+ - The Pyright language server's silence is taken as a verdict only after it
1566
+ has answered for the change. A server slow to begin is as silent as one that
1567
+ has finished, and a candidate that broke three consumers read as clean when
1568
+ the server was delayed past the 0.35 s quiet period. Each check now carries a
1569
+ marker the server must publish first.
1570
+ - A candidate is checked against the project as it now stands, which is
1571
+ decided by the content of each checker input rather than by its size and
1572
+ timestamp, so an edit by something other than Towel cannot leave a verdict
1573
+ standing against a project the copy no longer matches. The language
1574
+ server's private copy restored every file a candidate did not supply to the
1575
+ bytes it first saw, so in-place, single-file and library runs lost every
1576
+ refactoring already applied: a valid follow-up was rejected and a breaking
1577
+ candidate accepted. The copy now follows the project and tells the server
1578
+ exactly which files were created, changed or deleted.
1579
+ - A supplied-text record cut short by an interrupted append is repaired instead
1580
+ of failing every later request, and stopping the mypy worker stops the build
1581
+ it was waiting for.
1582
+
1583
+ - An extraction never separates a narrowing test from code that depends on it.
1584
+ A checker narrows a variable along a control-flow region, so moving the test
1585
+ into a helper while an expression that needs it stays at the call site left
1586
+ each half well typed and the pair not. Declined where the proposal is built,
1587
+ before any checker is asked, so the same extractions happen whether or not
1588
+ type checking is on.
1589
+ - A method's receiver is no longer annotated from its call sites. It was the
1590
+ union of the classes that happened to call it, which a checker rejects,
1591
+ since an explicit receiver must be a supertype of its own class, and which
1592
+ understated the method's domain in any case: a helper on a base class is
1593
+ inherited by every subclass. One such annotation was enough to send a whole
1594
+ helper down to the all-`Any` rung, so signatures that had lost every type
1595
+ recover them.
1596
+ - A class passed to a helper is typed `type[C]`. A checker shows a reference
1597
+ to a class as its constructor's signature, which reads as something merely
1598
+ callable and is rejected where a type is wanted, by `isinstance` among
1599
+ others.
1600
+ - An inferred annotation that names a class the module cannot reach imports it
1601
+ under `TYPE_CHECKING`. An ordinary import would often close a cycle, the
1602
+ extraction having just made the other module import this one, and a name
1603
+ wanted only by an annotation need not exist at run time.
1604
+ - An imported helper is named after the project it belongs to, not after the
1605
+ directory a run is staging its output in. A module named after a scratch
1606
+ path cannot be resolved by the checker and breaks as soon as the reviewed
1607
+ output is adopted into the place it was written for.
1608
+
1609
+ ### Changed
1610
+ - The default suite now runs the round-3 semantic auditor's generator of
1611
+ near-duplicate code, seeded: 406 cases in about 45 s. The hostile
1612
+ batteries hold every case that audit reported as a P1, each pinned in the
1613
+ state its fix leaves it, and a sample of the cases it found sound.
1614
+ `just fuzz` runs the generator over thousands of fresh seeds as a
1615
+ release-candidate step, and writes each failure as a hostile fixture
1616
+ ready to commit.
1617
+ - A coverage configuration that coverage.py could not read is reported once
1618
+ per project root, and coverage.py's defaults are used in its place.
1619
+ - A pair whose tool directives cannot move soundly is declined:
1620
+ - directives that differ between its sites (`directives_differ`): the
1621
+ helper has one line where the sites had several, so an ignore only one
1622
+ site needed would either silence the other or be lost;
1623
+ - any tool directive that reaches code, other than a name or a literal,
1624
+ which would become a call argument (`directive_on_argument`). Checker,
1625
+ linter, coverage, bandit and formatter directives all count. The
1626
+ argument would sit outside the directive's reach. jinja2's `as_const`
1627
+ extraction had put two `attr-defined` errors at its call sites this way.
1628
+ No directive is copied onto a call;
1629
+ - a region or file directive that would reach past the moved code
1630
+ (`directive_outlives_block`);
1631
+ - a coverage pragma or pylint `disable` around every site's block that
1632
+ would not reach the helper (`directive_around_block`). A module helper
1633
+ for pygments' `__main__`-only functions took `_lua_builtins.py` from
1634
+ 100% to 40% line coverage;
1635
+ - a block whose first statement coverage excludes, since the call that
1636
+ replaces it would be measured (`excluded_block_start`).
1637
+
1638
+ Explanatory comments from every site are kept, the first site's first.
1639
+ - Helpers are shared across modules only with `--cross-module`
1640
+ (`cross_module_helpers=True` for library use), because a user
1641
+ deduplicating a package may not expect Towel to add imports between its
1642
+ modules. By default duplicates pair only within a module, the pair budget
1643
+ is spent only on pairs a run can form, and Towel writes no import between
1644
+ the project's modules that runs; an annotation that needs another module's
1645
+ type still gets a type-only import under `if TYPE_CHECKING:`. With
1646
+ `--cross-module`, `dry` and `preview` name the import problems they meet,
1647
+ with the `--exclude` remedy, and refuse a run when one concerns the package
1648
+ being refactored, such as a stale `build/lib` copy of it; `preview` accepts
1649
+ `--exclude`. Over click, rich, packaging and pygments, the default drops
1650
+ exactly the cross-module helpers (0, 3, 5 and 13 of them).
1651
+ - Code that calls zero-argument `super()` is extracted into a method helper
1652
+ of the class that holds both duplicates, where it resolves as it did,
1653
+ diamonds and subclass overrides included: the helper has the class's own
1654
+ `__class__` cell and the method's receiver. Where no such helper can be
1655
+ written the pair is declined, never given a module function
1656
+ (`needs_class_body`, `super_in_call`). Output over click, rich, packaging
1657
+ and pygments is unchanged.
1658
+ - A long run says what it is doing. Verifying a proposal the project rejects
1659
+ advances no counter, so the progress bar could stand still for minutes,
1660
+ which is indistinguishable from a hung run; the display is now redrawn while
1661
+ a proposal is being weighed and names the proposal it is weighing.
1662
+ - `towel dry` reports what a typed run involves before asking to proceed: how
1663
+ many files a candidate is verified against, how many third-party packages
1664
+ their import graph pulls in, and that the number of checks depends on how
1665
+ many proposals the project rejects. It states no duration, that being
1666
+ governed by the rejections and so unknown in advance.
1667
+ - Pyright is consulted through one long-lived language server per project and
1668
+ a persistent private copy, instead of a fresh `pyright --outputjson` and a
1669
+ fresh copy per check. The command line remains the fallback and reaches the
1670
+ same verdicts.
1671
+ - Every configured checker must accept a candidate, so the first rejection is
1672
+ the verdict and the remaining checkers are not asked. Verdicts are remembered
1673
+ per candidate and project state.
1674
+ - An unannotated helper is checked only when every error of the all-`Any`
1675
+ rejection lies inside the helper's own definition. To a caller the two are
1676
+ the same function, so an error anywhere else survives the change.
1677
+ - A proposal the project declines is remembered for the whole run instead of
1678
+ until the next analysis. When nothing more applies and something was
1679
+ declined that the project has changed under since, the run holds a
1680
+ rehearing: the memory is cleared and the whole project analysed once more,
1681
+ so every declined proposal is heard against the project as it now stands.
1682
+ Only a rehearing that applies nothing ends the run, which is a stronger
1683
+ guarantee than before, when the terminating analysis was restricted to the
1684
+ files that had changed. Of the 382 extractions an uncapped Sphinx run
1685
+ considers, 24 had every annotation variant refused and not one of those was
1686
+ ever accepted at a later analysis.
1687
+ - A typed run that was checked through a language server is confirmed once
1688
+ more at the end by a pyright started from nothing, sharing none of the
1689
+ session's state. A session that fails part way through a run still earns
1690
+ that confirmation, being exactly when the verdicts already given are worth a
1691
+ second opinion, and a confirmation that cannot run refuses the run rather
1692
+ than reporting success. A language server answers when it has gone quiet, and
1693
+ while a marker it must publish first keeps silence from being read as a
1694
+ verdict before it has begun, one cold check over the finished project turns
1695
+ any residue of that kind from a silent wrong answer into a loud one. About
1696
+ ten seconds on Sphinx, and no flag: a guarantee that holds only when asked
1697
+ for is not one.
1698
+
1699
+ ### Preserving type relationships
1700
+
1701
+ An extracted helper used to lose the relationships among its types. Where two
1702
+ call sites passed `int` and `str`, the shared parameter became `int | str` and
1703
+ so did the return, which says nothing about the two travelling together: the
1704
+ helper could be read as taking an `int` and returning a `str`. Towel now
1705
+ anti-unifies the types alongside the code, so the helper's signature carries
1706
+ the correlation the call sites had.
1707
+
1708
+ ### Added
1709
+ - A library API for errors and reports:
1710
+ - exceptions in `towel.unification.exceptions`, based on `TowelError`:
1711
+ `CheckerUnavailableError`, `UntypeableExtraction` (with `.reason`, an
1712
+ `Untypeable`, and `.detail`), `UnverifiableChangeError` and
1713
+ `UncheckedCodeError`, `AmbiguousImportsError` and
1714
+ `ProjectScanLimitError`; `UnsupportedLayoutError` is kept, though no
1715
+ longer raised;
1716
+ - `engine.run_report`, a frozen `RunReport` whose `declined_pairs` and
1717
+ `declined_proposals` count declines by reason; `engine.declined_pairs`
1718
+ for the latest analysis; and `engine.checker_failures`, how many
1719
+ proposals the last run dropped because the checker could not run.
1720
+ - `--parameterize-builtins` (`parameterize_builtins=True`), off by default:
1721
+ where a builtin that duplicated code reads may differ between its sites (a
1722
+ function's own `len` against the builtin, or with `--cross-module` a module
1723
+ that may hold the name), each site passes its own binding to the helper as
1724
+ a parameter instead of the pair being declined. A builtin every site reads
1725
+ alike is still read directly. In typed code the parameter keeps the
1726
+ checker's signature where it can be written, else `type[C]` for a class
1727
+ (`type[str]`) or `Callable[..., R]` for a callable (`Callable[..., int]`
1728
+ for `len`).
1729
+ - Extracted module-level helpers can preserve relationships among argument and
1730
+ return types through type anti-unification. Nested containers, multiple type
1731
+ parameters, and supported existing generic binders receive fresh helper type
1732
+ parameters. Concrete disagreements can use constrained `TypeVar` declarations
1733
+ when an unrestricted generic body does not type-check.
1734
+ - Generic signatures, their imports, and their declarations are checked with
1735
+ the complete prospective project and committed as one transaction. Failed
1736
+ attempts leave no declarations behind. Generated syntax remains compatible
1737
+ with Python 3.11; existing PEP 695 input requires Python 3.12 or newer.
1738
+ - Generic instance and class helper methods preserve argument/result
1739
+ relationships and retain the host's type parameters. A module-level helper
1740
+ shared by methods that never read their receiver infers fresh parameters
1741
+ from its explicit arguments. Fresh declarations precede the host class at
1742
+ module scope, preserving descriptor behavior and declaration rollback.
1743
+
1744
+ ### Fixed (release harness)
1745
+ - The corpus runs Towel the way a user runs it: as `towel` inside each
1746
+ project's own environment. That environment holds the project installed
1747
+ editable from the tree under test, Towel's `format` and `types` extras,
1748
+ and one candidate wheel, checked against `--towel-src` in every
1749
+ environment. mypy, pyright, Black, ruff and isort are taken at the
1750
+ versions the project pins: its lock file first, then the `rev` of the
1751
+ tool's `.pre-commit-config.yaml` hook, then an exact pin in a requirements
1752
+ file (httpx's `requirements.txt` has `mypy==1.17.1`). The environment also holds whatever the project declares its
1753
+ own type check needs: typing-named dependency groups and extras, the
1754
+ dependencies of tox environments and nox sessions that run a checker, its
1755
+ pre-commit mypy and pyright hooks' `additional_dependencies`, and
1756
+ requirements files named for typing. That install only adds; nothing
1757
+ already there may change. Towel had run in the harness's own interpreter,
1758
+ which held Towel's tools and none of the project's dependencies. mypy
1759
+ therefore reported a project's third-party imports as errors: packaging's
1760
+ 1158 errors are 14 in its own environment and none once its typing
1761
+ dependencies are installed, and its typed run now completes. The import
1762
+ model found the tools' own copies of click and packaging, and called those
1763
+ projects' names ambiguous. Each result records the interpreter, the
1764
+ candidate, every tool's version and what chose it, and what was installed
1765
+ for typing.
1766
+ - The project's editable install follows the tree each test run exercises:
1767
+ the clone for the baseline, the refactored copy for Towel and the run
1768
+ after it, and the original package for a retest of the original. A test
1769
+ that imports the installed copy therefore tests the same code as the rest
1770
+ of its run. The run after refactoring had reached the unrefactored clone
1771
+ that way, so a regression there could pass as flaky.
1772
+ - Every corpus refactor passes `--cross-module`. A manifest entry turns it
1773
+ off only with a `cross_module_reason`, and the summary names each such
1774
+ project.
1775
+ - The sdist no longer ships a built wheel: `recursive-include scripts *`
1776
+ picked up the corpus image's copy whenever one had been built there.
1777
+ - Two runs that failed *different* tests can no longer both count as a PASS. A
1778
+ failure line is `FAILED <node id> - <message>`, and the id was taken by
1779
+ splitting at the first `" - "` -- which a parametrized id may contain, so
1780
+ `test_case[same - before]` and `test_case[same - after]` both truncated to
1781
+ `test_case[same`. The harness compares those sets to award PASS, so a failure
1782
+ Towel introduced could hide behind a pre-existing failure in the same
1783
+ parametrized test. Only a separator outside brackets ends the id now.
1784
+ - A phase that times out takes its descendants with it. Killing the immediate
1785
+ process left a suite's own workers, a server it started or a build it spawned
1786
+ running, writing into the scratch tree that the project's later phases read.
1787
+ Each phase leads a process group ended with it, and the worker watchdog ends
1788
+ those groups too.
1789
+ - The corpus runs the default type policy and reruns without types only the
1790
+ projects Towel declines to verify, naming them and their reason in the
1791
+ report; their verdicts are evidence about the untyped path alone. The refusal
1792
+ is first held to its wording -- the count, a diagnostic naming its file, and
1793
+ the way forward -- and one that fails that is a verdict of its own rather
1794
+ than a project quietly skipped.
1795
+ - The ecosystem check gives each corpus project its own output directory.
1796
+ Towel writes its recovery journal to the common parent of the files a
1797
+ transaction changes and refuses to start beneath a pending journal that may
1798
+ cover its targets. A one-module project's single output file put that journal
1799
+ directly in the shared work directory, an ancestor of every other project, so
1800
+ concurrent projects refused each other at `--workers 4`. The runtime is
1801
+ unchanged; its refusal was correct.
1802
+
1803
+ ### Notes
1804
+ - Towel keeps a precise ordinary signature when one verifies against the whole
1805
+ project, and reaches for a generic signature only when that ordinary
1806
+ signature does not. A generic candidate is therefore an alternative to losing
1807
+ the annotation, not a replacement for an exact one.
1808
+ - Declined by design, with no weakening of the annotations that do ship: a
1809
+ helper hosted inside a function, variadic type parameters, a source method
1810
+ whose `self` or `cls` carries an explicit annotation, and evidence that
1811
+ resolves to `Any` or an unknown name.
1812
+ - A fresh parameter whose bound mentions another helper parameter (`U` bounded
1813
+ by `list[T]`) is declined; an ordinary module `TypeVar` bound cannot depend on
1814
+ another function's binder. Where a constrained generic function makes mypy
1815
+ report several specializations for one probe, the evidence is treated as
1816
+ ambiguous rather than resolved arbitrarily. Both are recorded in
1817
+ [the type-parameter design](docs/proposals/type-parameters.md).
1818
+
1819
+ ## [1.732.post1] - 2026-09-19
1820
+
1821
+ ### Fixed
1822
+ - README documentation links use absolute URLs pinned to the release tag, so
1823
+ they resolve from PyPI as well as GitHub. The Python implementation is
1824
+ unchanged from 1.732.
1825
+ - Regression checks reject repository-relative README links and stale release
1826
+ tags in documentation URLs. The release procedure verifies GitHub source,
1827
+ documentation, and CI before uploading packages to PyPI.
1828
+
1829
+ ## [1.732] - 2026-09-19
1830
+
1831
+ Changes since 1.618.
1832
+
1833
+ ### Added
1834
+ - A duplicate that is the whole body of a plain module-level function now
1835
+ calls that function instead of extracting a helper. Two identical functions
1836
+ no longer become a helper plus two forwarders: the first-defined one is kept
1837
+ and the other calls it, and a matching block inside a larger function calls
1838
+ the existing function directly. Arguments follow the function's parameter
1839
+ order; names the body reads from its own module (functions, classes,
1840
+ absolute imports) are not passed. Across files the call is imported like a
1841
+ helper and refused when it would close an import cycle; a decorated, async,
1842
+ variadic, shadowed, or rebound function falls back to ordinary extraction.
1843
+ A function whose body is the block followed by a plain `return` of the
1844
+ block's live variables is reused too; the other sites unpack its result in
1845
+ its order. Construct the engine with `reuse_existing_functions=False` to
1846
+ restore the old behavior.
1847
+ - A helper that returns live variables now admits every further same-file
1848
+ occurrence whose call assigns them, so twelve identical functions become
1849
+ one helper with twelve calls on the first pass rather than a pair per
1850
+ pass. Repeated passes used to stack such helpers into a chain of
1851
+ forwarders, each returning the next one's result; a proposal that would
1852
+ reduce a helper an earlier pass inserted to a one-line forwarder is now
1853
+ declined instead (part of `skip_trivial_helpers`).
1854
+ - `towel dry` formats the code it inserts with the formatter the project
1855
+ configures (`pip install "code-towel[format]"`): `ruff format` when
1856
+ `[tool.ruff]`, `ruff.toml` or `.ruff.toml` is present and ruff is
1857
+ installed, otherwise Black with the project's own line length and string
1858
+ quoting. Only the
1859
+ generated helper and the rewritten call statements are formatted, never
1860
+ the surrounding file, and each snippet is checked to have the same syntax
1861
+ tree before and after. Inserted imports are sorted the way the project
1862
+ sorts them, with ruff's `I` rules when selected or isort when configured;
1863
+ a sorter may only reorder or merge the import statements, which is
1864
+ verified. Pass `--no-format` to insert the unformatted rendering; without
1865
+ a formatter a note says so. Library callers pass any `snippet_formatter`
1866
+ and `file_finisher` callables to the engine.
1867
+ - Black's line length for generated code is the limit the project declares
1868
+ anywhere: `[tool.black]`, `[tool.ruff]`, `[tool.pycodestyle]`, or a
1869
+ `[flake8]`/`[pycodestyle]` section in `setup.cfg`, `tox.ini` or `.flake8`
1870
+ (pycodestyle's own dog-food test failed on an 86-character generated call
1871
+ under Black's default of 88 against its declared 79).
1872
+ - Extracted helpers carry the type annotations their call sites declare. A
1873
+ parameter is annotated when every site passes an annotated, never-rebound
1874
+ parameter of its enclosing function, or a literal of one builtin type, and
1875
+ the sites agree; the return is annotated from the sites' declared return
1876
+ type, from annotated locals the helper returns, or as `None` for a helper
1877
+ that returns nothing. Nothing is inferred. Annotations are copied unquoted
1878
+ only where they cannot fail to resolve (builtins, deferred annotations, or
1879
+ names bound by a module-level import) and as strings otherwise; across
1880
+ modules only builtin names are used. Code without annotations stays that
1881
+ way. Construct the engine with `annotate_helpers=False` to disable it.
1882
+ - When a type checker is installed (`pip install "code-towel[types]"`), the
1883
+ argument expressions and return values those copied annotations could not
1884
+ name are typed by it. The checker is the one the project configures: mypy
1885
+ for a project with `[tool.mypy]`, `mypy.ini`, `.mypy.ini` or a `[mypy]`
1886
+ section in `setup.cfg`, pyright for one with `[tool.pyright]` or
1887
+ `pyrightconfig.json`; for a project configuring both,
1888
+ mypy infers while both verify the prospective project for new errors.
1889
+ For inference, Pyright probes a temporary sibling copy of the module;
1890
+ mypy reveals expressions in an in-memory copy of the site's module, at
1891
+ the point where the call will stand, using an owned worker with incremental
1892
+ caches. Verification checks the modified files together with unchanged
1893
+ consumers under the project's configured scope. A revealed type is written only
1894
+ when it is not bare `Any` and every name in it resolves where the helper
1895
+ is defined. `--no-types` leaves helpers unannotated; library callers pass
1896
+ a `type_oracle` to the engine.
1897
+ - Sites that disagree on a parameter's type, or on a revealed return type,
1898
+ join into a union (`int | None`, `int | str`); sites that declare
1899
+ different return types take the meet of the declarations, found through
1900
+ the checker's subtype relation. Once a helper carries any annotation,
1901
+ whatever is still bare becomes `Any`, so the signature is complete (a
1902
+ partial one is an error under mypy's `disallow-incomplete-defs`), and
1903
+ `from typing import Any` is added to the host when it lacks it. Code with
1904
+ no annotations stays bare.
1905
+ - With mypy installed the subtype relation is mypy's own, asked through
1906
+ probe functions appended to an in-memory copy of the host module: unions
1907
+ are normalized by it (`int | bool` is `int`, `float | int` is `float`, a
1908
+ subclass under its base disappears), the declared return types' meet is
1909
+ found through it, and the helper's revealed return type is written only
1910
+ when mypy confirms it is a subtype of every site's declared return type,
1911
+ which is what keeps the sites type-checking. Without mypy Towel copies
1912
+ and does not reason: unions are written unreduced and the meet needs
1913
+ identical declarations, since there is no second implementation of the
1914
+ subtype relation.
1915
+ - Thunk and callee arguments get `Callable` annotations from mypy's callable
1916
+ spelling (`Callable[[], int]`, `Callable[[int, str], bool]`,
1917
+ `Callable[..., T]`), with `from typing import Callable` added as needed.
1918
+ - A module-level helper whose annotations name classes or functions defined
1919
+ in the module is placed after the last such definition, so those names are
1920
+ written bare instead of as quoted forward references; it stays at the top,
1921
+ with quotes, when any statement before that point could run code at
1922
+ import time.
1923
+ - A subscripted annotation is written bare only when it evaluates at
1924
+ definition time: a PEP 585 builtin generic, a name from `typing` or
1925
+ `collections.abc`, or a module that defers annotations. Anything else is a
1926
+ string annotation: `memoryview[int]`, copied from tornado's own signatures,
1927
+ raised `TypeError` at import on an interpreter where `memoryview` is not
1928
+ generic.
1929
+ - With a clean original type-checking baseline, helper extractions and existing
1930
+ function reuse check all modified files together in the prospective project,
1931
+ including unchanged consumers. New errors make generated helper annotations
1932
+ fall back to `Any`, then to none; every variant must pass. Reused functions
1933
+ keep their existing signatures, and incompatible calls decline the reuse.
1934
+ Checker failure or remaining new errors decline the proposal. Cross-file
1935
+ helper imports no longer lose valid annotations because their host was stale.
1936
+ - Before oracle inference or verification, the original complete project is
1937
+ checked. If it already has type errors, Towel aborts and asks the user to
1938
+ fix them or explicitly rerun with `--no-types`. That option preserves
1939
+ existing source annotations and generates unannotated helpers. Checker
1940
+ crashes and timeouts remain distinct failures; checking is never silently disabled.
1941
+ A clean baseline keeps verification enabled for subsequent proposals.
1942
+ - A [proposal for type-parameter inference](docs/proposals/type-parameters.md)
1943
+ records how generic helpers could preserve relationships among arguments
1944
+ and return values. This work is deferred beyond 1.732.
1945
+ - Property-based tests (hypothesis, in the `dev` extra) check that alpha-variant
1946
+ blocks unify with a renaming-only substitution, that definite assignment
1947
+ agrees with a path-enumerating reference, and that every generated helper
1948
+ passes the instantiation round trip; `visitors.py` has direct tests; the
1949
+ cross-file hostile battery pins which packages must transform; ten
1950
+ cross-file integration tests fail instead of skipping when a fixture is
1951
+ missing; six assertion-free tests assert what their names claim.
1952
+ - The suite now drives the forked pair-evaluation pool on a small project and
1953
+ checks it against the serial path, including the fallback when a worker
1954
+ raises or dies; corrupts the recovery journal one guard at a time and
1955
+ round-trips interrupted transactions under Hypothesis; drops a proposal
1956
+ that goes stale mid-run and covers the three progress displays; reaches
1957
+ the return-coverage and free-variable-lifetime rejections by name (and
1958
+ pins that the first block's coverage guard is shadowed by block
1959
+ enumeration); and adds idempotence, byte-convention and observational
1960
+ equivalence properties, with `with` in the flow grammar. The cross-file
1961
+ timing test no longer measures the machine, the watchdog test finishes
1962
+ in a fraction of a second, and both hostile batteries execute fixtures
1963
+ the same isolated way. Three hostile fixtures pin the closure, `dir()`
1964
+ and unbound-global cases below, and a forwarder-chain suite pins that
1965
+ twelve identical functions yield one helper.
1966
+ - CI runs `pip-audit --strict` against the locked dependency set, and
1967
+ Dependabot proposes weekly, grouped minor/patch updates for the workflow
1968
+ actions and the `uv`-managed Python dependencies.
1969
+ - The candidate pairs an analysis evaluates are bounded by a configurable
1970
+ candidate-pair budget (`--max-pairs`, default 20,000,000; past it the
1971
+ largest groups of similar blocks are left out with a warning), and the
1972
+ minimum block length (`--min-lines`) and helper parameter limit
1973
+ (`--max-parameters`) are exposed on the command line.
1974
+
1975
+ ### Changed
1976
+ - Boolean options come in `--x/--no-x` pairs with the default on:
1977
+ `--types/--no-types`, `--format/--no-format`, `--interactive/--no-interactive`,
1978
+ and the tri-state `--prefer-absolute-imports/--no-prefer-absolute-imports`
1979
+ and `--pep420/--no-pep420` (unset lets the project decide). `--max-refactorings N`
1980
+ names what `--max-iterations` always did, and `rename-helpers --preview`
1981
+ replaces `--dry-run`, since "dry" already means DRY here.
1982
+ - A helper whose body only binds parameters and literals to names and returns
1983
+ them is not proposed: the call that unpacks the tuple is longer than the
1984
+ assignments it replaces and shares no logic. The trivial-forwarding filter
1985
+ also recognizes `name = call(...)` followed by `return name`, and the tuple
1986
+ form `a, b = call(...)` then `return (a, b)`; without it, once Black
1987
+ wrapped such a body over the three-line minimum, two generated helpers of
1988
+ that shape paired with each other and extracted a third, without end (h2).
1989
+ - In directory mode, a global re-pass after the first re-pairs functions in
1990
+ rewritten files and files with deferred verification refusals. Deferred
1991
+ proposals are retried only after the project changes, since verification can
1992
+ depend on unchanged consumers elsewhere in the project. Other unchanged
1993
+ pairs retain their verdict under the conditions explained in
1994
+ `docs/ARCHITECTURE.md`; `incremental_global_passes=False` restores full
1995
+ re-pairing.
1996
+ - Analysis facts are computed once per function instead of once per candidate
1997
+ block (definite assignment, locally bound names, nested scopes), and the
1998
+ same-file clustering pass applies its constant-time filters before the
1999
+ semantic guards. Together these remove about half of the AST traversal on
2000
+ a 16k-line project with an identical proposal list.
2001
+ - Candidate blocks are bucketed on their whole statement-type sequence,
2002
+ which the unifier requires equal, so far fewer pairs reach the filter; the
2003
+ unifier's bound-variable search caches each node's source text instead of
2004
+ re-rendering it per query; the value-producing check is memoized per
2005
+ block; and five visitor classes that were rebuilt on every call are
2006
+ module-level. On Towel's own source these remove a further 28% of all
2007
+ function calls (about half in total since 1.618) with an identical
2008
+ proposal list.
2009
+ - The engine is assembled from mixins, one module per responsibility
2010
+ (`pair_evaluation`, `placement`, `reuse`, `insertion`,
2011
+ `annotation_wiring`, `materialize`, `clustering`, `parallel`,
2012
+ `fixed_point`), over an `EngineState` that declares the state and
2013
+ operations each may rely on; `refactor_engine.py` went from 5,600 lines
2014
+ to 1,400 and the 871-line pair decision is eleven typed stages. The
2015
+ outputs are byte-identical on the exactness baselines.
2016
+ - A second pass over the same seams: the per-block analyses are a
2017
+ `BlockAnalysis` mixin of their own and the engine core is about 800 lines;
2018
+ the unifier is split the same way (`UnifierState` under constant consistency,
2019
+ parameterization and literal promotion, with `Substitution` and the
2020
+ binding-context finder in leaf modules); every state stub names the class
2021
+ that implements it. The functions of an analysis are indexed once
2022
+ (`FunctionIndex`: by file, by name, by enclosing range) instead of scanned
2023
+ per pair, and the engine's per-function maps are weak. Materialization,
2024
+ the directory driver's progress reporting and the rename planner are
2025
+ each a set of named steps rather than one long function. Blocks are
2026
+ narrowed by checks rather than casts, and the `dry` change sidecar is
2027
+ validated on read.
2028
+ - A third structural pass: the block signatures, clustering guards, cache
2029
+ keys, pair context and stage records are typed; the remaining long
2030
+ functions (materialization, the drivers, layout discovery, the pairing
2031
+ loop, the call generator, the clustering pass, the rename planner, the
2032
+ compound-node unifier, the thunk walker) are named steps or dispatch
2033
+ tables; every function and closure with no caller is removed; mypy runs
2034
+ with `warn_unreachable`, and flake8 checks `tests/` for pyflakes errors.
2035
+ One `BoundedCache` replaces three LRU implementations and the parse cache
2036
+ is the engine's own; `FunctionNode` is the one name for a function
2037
+ definition node; the defaults live in `towel.unification.defaults`;
2038
+ `towel.source_text` decodes and re-encodes sources.
2039
+ - The engine computes what it can once per statement instead of once per
2040
+ block: block signatures, return checks, the frame-sensitivity and
2041
+ name-binding guards, structural digests, the unifier's per-statement
2042
+ facts and the substitution's keys are memoized per AST node and folded
2043
+ over each block, the bound-variable query is memoized per block and
2044
+ target text, a pair's structural ids are resolved once and passed to its
2045
+ guards, and each class's file path is resolved once per run. On the
2046
+ Towel source of that day (`towel dry src/towel`, one worker, 45 applied)
2047
+ a run took 6.4 s instead of 10.9 s with `--no-types --no-format` and
2048
+ 10.4 s instead of 15.0 s with the defaults; the profiled run went from
2049
+ 32.7 s and 293 million calls to 20.3 s and 154 million. The current
2050
+ figures, on a smaller source, are in `docs/KNOWN_LIMITATIONS.md`. Every
2051
+ proposal and rendering is byte-identical on the exactness baselines. The
2052
+ structural-id and source-digest caches, and the definite-assignment
2053
+ facts, no longer keep a re-parsed file's old tree alive; peak memory fell
2054
+ from 186 MB to 179 MB (1.11 GB to 1.06 GB with type checking).
2055
+ - A fourth pass, after an audit that found the same concepts written
2056
+ several ways: the local name an import alias binds, the names a
2057
+ statement binds (`bindings_of`, replacing five collectors that
2058
+ disagreed), the names an expression reads, span containment, the
2059
+ method-kind literal, the helper-home and cluster-context records and
2060
+ package-chain ascent each have one implementation; the unifier's
2061
+ dispatch table holds methods rather than their names; blocks are
2062
+ sequences of statements throughout, so the casts that the wider
2063
+ annotation forced are gone; two typing helpers (`all_instances`,
2064
+ `visit_as`) replace most of the rest; each command reads its arguments
2065
+ once into a typed record; the rename command decodes sources the way
2066
+ the refactoring commands do; and comments that restated the next line
2067
+ are removed. The engine's mixins now inherit the mixins they call, so
2068
+ the forty-nine one-caller stubs on `EngineState` are gone and it declares
2069
+ only the shared attributes and the eleven operations the core provides.
2070
+ The import-graph resolution is its own module (`import_graph.py`);
2071
+ parsing yields a `RawModule` and scope analysis a `ParsedModule` whose
2072
+ analyzer and root scope are required rather than Optional; the
2073
+ `verbose` flag threaded through eleven signatures and read once is gone
2074
+ (the logger's level decides); and the `get_` prefix on a handful of
2075
+ functions is dropped (`free_variables`, `used_names`,
2076
+ `enclosing_names`, `affected_lines`, `bound_variables_in_context`).
2077
+ - The test suite is type-checked with the same strict flags as the source
2078
+ (fifteen `type: ignore` comments ignored nothing; the AST accesses behind
2079
+ the rest are `isinstance` assertions now), coverage traces the forked
2080
+ pair workers (`parallel.py` 85% to 95%), the helpers copied across test
2081
+ modules live in `tests/test_helpers.py`, thirty-odd non-emptiness assertions state
2082
+ the value they are about, the goldens expected to equal their inputs are
2083
+ named and checked exactly, the example3 tests run the cross-file path
2084
+ they describe, a symlinked input directory is pinned, and the engine and
2085
+ command-line branches the suite left untested have tests.
2086
+ - The clustering pass scans a file for the sites that can share a helper
2087
+ once per distinct helper template instead of once per pair, and the
2088
+ reuse redirect finds a function whose body starts at a site through an
2089
+ index instead of scanning the file per replacement: 50 identical
2090
+ functions took 17 s and 100 took 134 s at 1.618, and 6.8 s and 36 s at
2091
+ commit a0596f0 (September 18, 2026, one core of a machine shared with
2092
+ other work); measured with `scripts/bench_similar_blocks.py` at commit
2093
+ 5ff2458 (September 19, 2026, one core), 50 take 4.0 s and 100 take
2094
+ 15.9 s, with identical output. Orphan detection, the instantiation
2095
+ check's normalized block and the class-private-name scan are memoized
2096
+ on structure, so the re-parse after each applied proposal hits too. The
2097
+ analysis session grows to the number of files and the source bytes an
2098
+ analysis covers, so a project above 128 files or 8 MiB of source no
2099
+ longer re-parses everything on every pass (trio's second pass: 144
2100
+ parses and 7.2 s, now none and 5.0 s). Both insertion-position parses
2101
+ go through the engine's parse memo.
2102
+ - The AST visitors are built on three Template Method bases in
2103
+ `visitors.py`: `OwnScopeVisitor` for collectors that read one scope's own
2104
+ code, `DefinitionDepthVisitor` for those that track how deeply a
2105
+ definition sits, and `ScopeVisitor` for the analyses that follow lexical
2106
+ scopes, which now share one visiting order for definitions and
2107
+ comprehensions and override hooks where they deviate on purpose.
2108
+ - `refactor_directory_to_fixed_point` returns a `TerminationReason` literal;
2109
+ `CodeBlockPair` carries every field pairing always gives it (only the
2110
+ class and enclosing-function names are Optional) and answers
2111
+ `is_cross_file`; `RefactoringProposal.replacements` holds `Replacement`
2112
+ values only, the tuple coercion is gone; the unused exception classes are
2113
+ gone and `UnsupportedLayoutError` joins `RefactoringError` under
2114
+ `TowelError` (and is still a `ValueError`); `towel.project_layout` is a
2115
+ top-level module (the old path
2116
+ re-exports it); `is_package_dir` takes only the path, since whether a
2117
+ bare directory is a namespace package is the layout's decision.
2118
+ - Progress modes are a `ProgressMode` literal (`normalize_progress`,
2119
+ `wants_bar`, `DEFAULT_PROGRESS`); `orphaned_variables` returns the set of
2120
+ orphaned names and `bound_names_in_block` the names a block binds; the
2121
+ engine's `type_inferrer` parameter is `type_oracle` and the
2122
+ `TypeInferrer` alias is gone, `TypeOracle` is the name. Module-internal
2123
+ helpers that read as public are private, and the predicates that ask
2124
+ whether a project configures a tool all say `project_configures_*`.
2125
+ - `run_pipeline` takes the engine it drives (`engine=`) and the pipeline no
2126
+ longer imports the engine; the two phase entry points it calls are public
2127
+ (`find_block_pairs`, `process_block_pairs`). `from towel.unification
2128
+ import UnificationRefactorEngine` still works and loads the engine lazily.
2129
+ - `formatter_for_project`, `import_sorter_for_project`, and
2130
+ `type_oracle_for_project` return a `ToolChoice` (`tool`, `note`) instead
2131
+ of a tuple; `TypeOracle.is_subtype` returns `Subtyping` verdicts
2132
+ (`YES`, `NO`, `UNKNOWN`) instead of `Optional[bool]`. Rejection reasons
2133
+ are a `RejectReason` enum, evaluation kinds a `ParameterKind` literal,
2134
+ the rename inventory a `TypedDict`, and the applied-change log is
2135
+ `engine.change_log`, a sequence of `AppliedChange`.
2136
+ - The library prints no diagnostics. Warnings go to the `towel` logger,
2137
+ which reaches stderr even when nothing configures logging, and the
2138
+ rejection, validation, overlap, and type traces go to `towel.rejections`,
2139
+ `towel.validation`, `towel.overlap`, and `towel.types` at DEBUG. The
2140
+ documented environment variables still switch them on; they and
2141
+ `TOWEL_WORKERS` are read once into `Settings` at engine construction
2142
+ (`settings=` overrides them for library callers), and the engine
2143
+ constructor no longer changes logger levels
2144
+ (`Settings.enable_debug_logging` is the library caller's to call).
2145
+ - Helpers other modules imported under leading underscores are public:
2146
+ `find_project_root`, `load_pyproject`, `is_package_dir`,
2147
+ `walk_own_scope`, `body_without_docstring`, `stored_names`, `reindent`,
2148
+ `relative_import_module`. Two implementations of the docstring stripper,
2149
+ the own-scope walker, the `__param_N` minting rule, and the subtype
2150
+ verdict reader became one each, and ten duplications Towel found in its
2151
+ own source are named helpers.
2152
+ - The import-graph tables are an `ImportGraphCache` the engine owns per run,
2153
+ bounded, instead of process-global dictionaries, and a required argument
2154
+ of the cycle and resolution checks; the apply path parses each modified
2155
+ file once per source text and re-reads a file only when its stat changes;
2156
+ the pair loop skips two functions whose blocks share no bucket key before
2157
+ visiting any block.
2158
+ - Two catches that turned bugs into silent defaults (a module-name fallback
2159
+ catching every exception, a call renderer swallowing a `TypeError`) are
2160
+ narrowed or removed; the nine copies of `try/except/pass` around
2161
+ progress-bar calls are one `quietly`; four unjustified `type: ignore`
2162
+ comments and three `pragma: no cover` exclusions are gone.
2163
+ - Pair evaluation keeps one proposal per distinct refactoring (the same
2164
+ helper over the same clustered sites, whichever pair found it first)
2165
+ instead of every pair's copy. A file of sixty near-identical functions
2166
+ under the pair budget peaked at 33.6 GB holding the copies and now peaks
2167
+ at 0.74 GB; the output is the same, since the overlap filter never chose
2168
+ a later copy.
2169
+ - A proposal whose helper, home and call sites repeat an earlier pair's is
2170
+ declined (`duplicate_proposal`) before the reuse redirect, the forwarder
2171
+ filter and annotation run on it; the clustering scan's key no longer
2172
+ carries names the template block never reads, which made it differ per
2173
+ function position; and the function lookup every clustered site makes is
2174
+ memoized. The clustering scan cache is bounded by the sites it holds
2175
+ (200,000) as well as by its entry count, since a scan of a file of a
2176
+ thousand near-identical functions holds a thousand sites. Such a file,
2177
+ which the module-name rule now admits where the module-data rule used to
2178
+ decline every pair in seconds, is evaluated in full: a thousand
2179
+ near-identical five-line functions reading one module global take 33
2180
+ minutes on one core (commit `5ff2458`, September 19, 2026) and yield one
2181
+ helper with 669 sites, peaking at 6.6 GB (8.8 GB before the scan cache
2182
+ was bounded); its pair evaluation is what `--max-pairs` bounds. A
2183
+ per-candidate memo beneath the scan, which no run ever read, is gone.
2184
+ - The verdict of the instantiation check is memoized on the helper, call
2185
+ and block, which it repeated many times over across pair and cluster
2186
+ evaluation: a file of a hundred similar functions took 31 s instead of
2187
+ 43 s when the memo landed (commit 77d18a8); the current figure is in the
2188
+ clustering entry above.
2189
+ - The `format` extra's Black floor is the version the goldens were
2190
+ generated with (`black>=26.3.1`, the same floor as the `dev` extra); it
2191
+ was two majors lower, so a user at the extra's floor could get output the
2192
+ goldens do not show. The sdist no longer ships the `.templates` scratch
2193
+ directory or two debugging scripts.
2194
+ - The help says what the commands do: usage lines read `towel`, each
2195
+ boolean option's help names its default, the retired spellings are left
2196
+ out, and `preview` no longer promises per-phase summaries under
2197
+ `--progress detail`, which only the fixed-point driver emits.
2198
+ - The structural memo is keyed on a block's structure, so equal blocks share
2199
+ one entry wherever they appear.
2200
+
2201
+ ### Deprecated
2202
+ - The `--max-iterations`, `--non-interactive` and `rename-helpers
2203
+ --dry-run` spellings still parse but are left out of the help; use
2204
+ `--max-refactorings`, `--no-interactive` and `--preview`.
2205
+
2206
+ ### Removed
2207
+ - `nominal_unifier.py`, which nothing imported, and the TOML backport for
2208
+ Python 3.10, below the supported floor, with its `tomli` dev dependency.
2209
+ - `ImportGraphCache.clear`, which nothing called: the cache is built per run
2210
+ and dropped with the engine.
2211
+
2212
+ ### Fixed
2213
+ - The ecosystem release gate requires completed, nonempty test runs. Setup
2214
+ failures, incomplete runs, unknown verdicts, changed failing-test identities,
2215
+ and missing tests cannot pass merely because exit codes or totals match.
2216
+ Documented known failures and flaky-test reruns cannot hide a changed test
2217
+ count; matching pre-existing failures remain visible in the report. Pytest
2218
+ commands request complete tallies and failure identities; custom runner
2219
+ failure statuses must be declared, and retests retain their actual statuses.
2220
+ Retests remove broad selectors wherever they occur and require the exact
2221
+ selected test count; ambiguous command options decline the retest. Agreement
2222
+ on isolated tests requires confirmation with the complete original test
2223
+ command, so test-order regressions cannot disappear from the check. Failed
2224
+ Git observations cannot become `NO_CHANGE`, and added, deleted, or renamed
2225
+ paths count as changes. Source provenance names the checkout actually used;
2226
+ archives explicitly require a separately retained source manifest.
2227
+ The corpus manifest supplies Cheroot's declared test plugins and SimPy's
2228
+ benchmark fixture, and runs PLY's test scripts from the project root so each
2229
+ suite imports the source tree under test.
2230
+ The harness records its requested typing mode. Its explicit `--no-types`
2231
+ option supports behavioral validation of projects without a complete typing
2232
+ environment; it never retries a failed typed run by silently opting out.
2233
+ - The worker-cleanup regression fails when process inspection fails, instead
2234
+ of treating an empty result from a failed command as proof that workers exited.
2235
+ - Mypy runs in an owned persistent worker with incremental caches and periodic
2236
+ garbage collection. Its process-global state cannot freeze or unfreeze a
2237
+ library caller's heap, concurrent requests are serialized, and explicit
2238
+ cleanup covers both combined checkers and failed optional-dependency setup.
2239
+ The CLI preserves input-project configuration while checking the copied
2240
+ output under its original module identities, and closes the checker on
2241
+ success and failure. Project type rules are honored while plugins,
2242
+ configured executables and report destinations remain disabled.
2243
+ (1.772 replaced that periodic collection: each build now runs in a forked
2244
+ child of the worker which exits when it has answered.)
2245
+ - Mypy diagnostic presentation is normalized for in-memory sources. A
2246
+ project's `pretty = true` setting no longer crashes when a subtype probe
2247
+ or prospective helper extends beyond the on-disk file; project type rules
2248
+ remain unchanged.
2249
+ - Checker outcomes distinguish infrastructure failure from valid diagnostics.
2250
+ A pyright timeout, malformed output or failure is never evidence of a clean
2251
+ project or a successful subtype relation.
2252
+ - Lexical binding analysis recognizes PEP 695 type parameters and shadowed
2253
+ builtins, preserving generic identity and conditional-name evaluation.
2254
+ - Ruff subprocesses exclude the current project from Python's import path.
2255
+ Import sorting preserves ordered providers of shared bindings and statement
2256
+ boundaries. Permanent filesystem conflicts stop instead of retrying forever.
2257
+ Directory mode also terminates after all proposals in an unchanged project
2258
+ fail rendering or type verification, and retries deferred proposals after
2259
+ another successful change can alter their checking context.
2260
+ - Helper renaming preserves builtin reads, keyword callers, exact selection
2261
+ filters and Python protocol behavior. Static aliases and re-exports are
2262
+ tracked; ambiguous callable/module aliases, visible reflection and dynamic
2263
+ keyword dictionaries are refused before writing. Source discovery prunes
2264
+ environments and excluded directories and reports unreadable consumers.
2265
+ - The eager-argument guard is rebuilt on control flow. Twelve shapes that
2266
+ passed a differing name eagerly where the original read it only on some
2267
+ path are thunked or declined: a failed optional import, a `TYPE_CHECKING`
2268
+ import, a class attribute read bare in a method, a name bound later,
2269
+ deleted, or bound conditionally in the enclosing function, and at module
2270
+ level a name bound by `except ... as`, a `match` capture, a later `def`,
2271
+ or a later import.
2272
+ - A free variable the two blocks share follows the same rule as a differing
2273
+ argument: it is passed eagerly only when the call site resolves it on
2274
+ every path, and as a thunk otherwise. A name bound nowhere, read only on
2275
+ a branch no run takes, used to be hoisted into an eager argument and raise
2276
+ `NameError` at every call (found by the new property test); a helper
2277
+ defined below its callers, called once at import time before its
2278
+ definition, raised the same way. Both are now read where the block read
2279
+ them: a same-module helper reads the name bare (next entry), and a
2280
+ cross-file helper takes it as a thunk.
2281
+ - A free name that both sites resolve at module scope, or nowhere, is no
2282
+ longer a parameter of a same-module helper: the helper reads it bare,
2283
+ which is the lookup the block made, at the moment the block made it. A
2284
+ helper defined below its callers, a class, an import, or module data a
2285
+ callback rebinds between two reads (previously declined as
2286
+ `module_data_lookup` or `rebound_external_binding`) all extract, with
2287
+ fewer parameters and no thunk; hyper-h2 loses seven such parameters and
2288
+ gains three extractions, and its own 1,662 tests pass on the output. A
2289
+ clustered occurrence whose same-spelled name is a local does not join;
2290
+ cross-file helpers still take the name as a parameter, and module data
2291
+ a callback may rebind still declines a cross-file pair. So does a
2292
+ same-file pair whose helper is hosted in a shared ancestor class defined
2293
+ in another module: the pair is decided again with every name a
2294
+ parameter, since the ancestor's module need not import them (the
2295
+ release-candidate ecosystem run found oauthlib's `BearerToken` read bare
2296
+ in `introspect.py`, which raised NameError in 55 tests). `__class__`, the
2297
+ cell zero-argument `super()` reads, names the defining class and stays a
2298
+ parameter of a method helper.
2299
+ - A call to a function or method of the same module whose body reads a
2300
+ frame relative to its caller (`sys._getframe(n)`, `inspect.stack()`, a
2301
+ `stacklevel=`), directly or through other such functions, is a frame read
2302
+ at its call site, and the block stays where it is. The module-name rule
2303
+ had admitted blocks that typing_extensions' `_caller()` reads through,
2304
+ which a reflection guard had declined only by accident, and six
2305
+ `TypeAliasType` pickling tests failed in the release-candidate ecosystem
2306
+ run.
2307
+ - A call site that would pass a callee as
2308
+ `lambda *args, **kwargs: callee(*args, **kwargs)` is declined by name
2309
+ (`forwarded_callee`). It used to be declined by accident, because the
2310
+ lambda's own parameters were counted as names the site could not resolve;
2311
+ that miscount also declined any thunk containing a lambda, such as
2312
+ `lambda: sorted(items, key=lambda x: x)`, which now extracts.
2313
+ - A comprehension's target shadows only its own expressions: `[i for i in
2314
+ xs]` used to become `[__param_0() for i in xs]` while a free read of `i`
2315
+ after the comprehension stayed literal.
2316
+ - The frame-reading builtins, `eval`/`exec`, `sys._getframe` and
2317
+ `inspect.currentframe` anywhere in the enclosing function decline the
2318
+ block, not only inside it, and their aliases, imported or assigned
2319
+ (`e = eval`, `warn = warnings.warn`, `gf = sys._getframe`, an alias of an
2320
+ alias), are resolved through the module's bindings.
2321
+ - `warnings.warn` without `stacklevel`, and a `stacklevel` reached through
2322
+ an alias, decline the block.
2323
+ - An object a class instantiation or a resource factory (`open`,
2324
+ `connect`, `socket`, `mkdtemp`, `Popen`, `urlopen`, ...) binds in the
2325
+ block is returned from the helper rather than dropped when the helper's
2326
+ frame ends, since a later read may observe its lifetime (a temporary
2327
+ file, a weak reference).
2328
+ - A helper import goes after the module's last leading import, before its
2329
+ first definition (after the docstring when there are no imports), so a
2330
+ script that runs a statement before its imports keeps that statement
2331
+ first. A host for a cross-file helper is accepted only when the borrower
2332
+ already imports it or every module the new import would load is
2333
+ definition-only, so a helper import cannot run a module that prints at
2334
+ import time (`xf13_import_time_effects` is declined).
2335
+ - A form feed or a Unicode line separator in a source no longer crashes the
2336
+ splice: lines are counted the way the tokenizer counts them.
2337
+ - Async comprehensions are declined.
2338
+ - A rendering failure in one proposal ends that proposal, not the run.
2339
+ - A relative output path no longer ends the fixed point early.
2340
+ - Type inference no longer switches off when the working directory is
2341
+ above the output.
2342
+ - A pending transaction journal blocks a run only when its manifest names
2343
+ a file the run would change (a journal without a readable manifest
2344
+ blocks everything beneath it), and journals of concurrent runs never
2345
+ share a name.
2346
+ - A killed run's pyright probe cannot be mistaken for source.
2347
+ - The mypy cache and partial-copy directories are cleaned on SIGTERM.
2348
+ - An ASCII locale no longer breaks a run.
2349
+ - The change sidecar is written atomically.
2350
+ - `--interactive` with a closed stdin declines instead of raising.
2351
+ - Settings are read from the environment once per run.
2352
+ - Three ways an extraction could change what a program does, each found by
2353
+ executing crafted inputs before and after refactoring: a closure created
2354
+ inside the block over a name the block binds (a loop target) kept the
2355
+ helper's cell where the original saw the caller's later rebinding; an
2356
+ argument-free `dir()` read the helper's frame; and a differing free name
2357
+ was passed eagerly on the assumption that a name has no failure mode,
2358
+ so a global the module never binds raised `NameError` at the call site
2359
+ where the original read it only in a branch it did not take. The first
2360
+ two are declined; the third follows the shared-free-variable rule above.
2361
+ - Single-file `dry` on a file it cannot decode copied it and then stopped
2362
+ with a codec message naming nothing, and on a file with a syntax error
2363
+ reported success over an unchanged copy; both are an error naming the
2364
+ file (and the line). A negative `--max-refactorings` was accepted and
2365
+ meant "run to a fixed point"; it is refused. `preview` of one file showed
2366
+ a progress bar under `--progress none`, and the banner said helpers go at
2367
+ the end of files.
2368
+ - With `--types`, the variables a helper returns are revealed under each
2369
+ call site's own spelling; a site whose names alpha-renaming spelled
2370
+ differently from the helper's used to probe names that did not exist
2371
+ there, so the helper's return type stayed `Any` and parameter unions the
2372
+ return type would have invalidated went unchecked.
2373
+ - A refactored file keeps its own encoding, byte-order mark and newline
2374
+ convention: a CRLF file used to come back with every line changed, a file
2375
+ with a UTF-8 BOM was skipped, and one latin-1 file with a coding cookie
2376
+ failed a whole directory run. Sources are decoded as the interpreter
2377
+ decodes them and written back in the file's own bytes; `rename-helpers`
2378
+ reads the same way and keeps each file's encoding.
2379
+ - A project whose packaging layout Towel cannot model (a `hatch.toml`, some
2380
+ flit, poetry and pdm forms) no longer aborts the run when it has a
2381
+ cross-file candidate: the pair is declined (`unknown_layout` in the
2382
+ rejection trace) and every same-file extraction proceeds. Layout
2383
+ discovery raises `UnsupportedLayoutError`, and the command line reports
2384
+ any `TowelError` as an error line instead of a traceback.
2385
+ - `--progress none` is silent through the localized and stale re-analyses
2386
+ that follow each applied proposal, the single-file driver takes a
2387
+ progress mode, and `preview` accepts `--progress`. Both drivers run to a
2388
+ fixed point by default, as the CLI always did; they used to stop after
2389
+ ten iterations, and the goldens generated through them were ten-step
2390
+ snapshots rather than fixed points.
2391
+ - An import sorter's result is accepted only if it permutes or merges import
2392
+ statements, at any depth (a sorter also orders the imports under
2393
+ `if TYPE_CHECKING:`); anything else is discarded and the file is left as
2394
+ Towel assembled it, rather than failing the refactoring (trio).
2395
+ - `rename-helpers --list --json` no longer crashes on a symlinked module.
2396
+ - A confirmation prompt at a closed stdin declines instead of raising.
2397
+ - An isort skip setting, a failing or hung ruff, a hung pyright, and pyright
2398
+ output of an unexpected shape each degrade with a warning naming the file
2399
+ instead of aborting or being swallowed.
2400
+ - A non-integer or non-positive `TOWEL_WORKERS` is reported, and a
2401
+ configured worker count never reaches a platform without `fork`.
2402
+ - A corrupt transaction manifest and a concurrent transaction are reported
2403
+ as the journal's own errors.
2404
+ - The engine forgets a rewritten file's cached lines when it invalidates
2405
+ the file.
2406
+ - The parallel fallback no longer hides worker exceptions behind a serial
2407
+ retry.
2408
+ - The command line's stderr handler follows a redirected stderr.
2409
+ - The cross-file fixture package named `lib` was hidden from fresh checkouts
2410
+ by the `lib/` ignore pattern; the pattern exempts the fixtures.
2411
+ - Two blocks that differed only in the spelling of a lambda's parameter
2412
+ (`lambda value: value * 2` against `lambda other: other * 2`), or of an
2413
+ assignment expression's target (`(t := f())` against `(temp := f())`),
2414
+ were declined. Lambda parameters are now renamed within their own lambda
2415
+ by the instantiation check, which leaves a free name spelled the same
2416
+ outside the lambda alone, and walrus targets are block-level binders for
2417
+ the unifier, since an assignment expression binds in the enclosing scope.
2418
+ - A block that binds a variable read after it is extracted again, with the
2419
+ helper returning the variable and the call rebinding it (`total =
2420
+ helper(order)`), as the README has always shown. The orphan guard added for
2421
+ networkx in 1.618 did not know the generated call rebinds a returned
2422
+ variable, so it rejected every such block; only blocks that returned or
2423
+ bound nothing live could be extracted.
2424
+ - The import-cycle guard treats `from . import name` (and `from .. import
2425
+ name`) as an edge to the package's `__init__`, which that import runs
2426
+ whether or not `name` is a submodule. A helper hosted in a submodule that
2427
+ reaches back into its package this way was imported by the package
2428
+ initializer, which the submodule then imported half-initialized
2429
+ (beautifulsoup4's tests package). The initializer, which the submodule
2430
+ already imports, is now the host.
2431
+ - The import-cycle guard resolves a file's own package's absolute imports
2432
+ inside the tree being refactored, by suffix, even when a full-path match
2433
+ exists elsewhere: an out-of-place output beside the original clone
2434
+ (`sphinx-cleaned` next to `sphinx`) had `from sphinx.transforms import X`
2435
+ resolved against the original, where the helper import that closed the
2436
+ cycle did not exist, and sphinx's transforms package broke on import.
2437
+ - A union of forward references is written as one string (`'Left | Right'`),
2438
+ not as `'Left' | 'Right'`, which is a TypeError at definition (Towel's own
2439
+ suite, refactored by Towel).
2440
+ - Definite-assignment analysis now knows that `except E as name` deletes
2441
+ `name` when the handler exits, and that a `del` nested in a branch unbinds
2442
+ its target on that path. The returned-variable check relies on this; without
2443
+ it a helper could return a handler's name and raise `UnboundLocalError`
2444
+ where the original code did not.
2445
+ - With mypy, a union whose members the checker could not all order (some
2446
+ verdicts unanswerable: A under B, B under C, C under A) let every member
2447
+ absorb every other, emptied the union, and the join raised `IndexError`
2448
+ (sphinx, after eighteen minutes of refactoring). A member now absorbs
2449
+ another only on a definite `YES`, a normalization that would keep nothing
2450
+ keeps the union as it was, and a join with no members writes no
2451
+ annotation.
2452
+ - A function preceded by `@overload` stubs is a valid reuse target: the
2453
+ reuse check verifies the last module-level definition of the name, which
2454
+ is the runtime binding the calls resolve to, instead of refusing a name
2455
+ defined more than once (rfc3986's `normalize_query`).
2456
+ - A type mypy reveals with the path of an out-of-place output directory
2457
+ that is not an identifier (`h2-dbg.stream.H2Stream`, which parsed as a
2458
+ subtraction and was written as `self: h2 - H2Stream`) is rewritten with a
2459
+ placeholder for that component, and a revealed type is accepted only when
2460
+ its tree is made of names, attributes, subscripts, tuples, constants and
2461
+ unions.
2462
+ - `rename-helpers` with a rename file it cannot open or parse exits 1 with
2463
+ `Error: ...` on stderr like every other command failure; it used to print
2464
+ the failure to stdout without the prefix.
2465
+ - Invariants the engine enforced with `assert`, which `python -O` removes
2466
+ (a helper without a host name, a node without an end position), are
2467
+ exceptions that survive `-O`; a rendered module that does not parse
2468
+ raises `RefactoringError` naming the parse error instead of being dropped
2469
+ as "no insertion point"; and when applying a change fails, the cleanup's
2470
+ own error no longer hides the failure that triggered it. The cross-file
2471
+ reuse redirect follows the same import-time rule as cross-file helpers: a
2472
+ site is not redirected to a function in another module when the import
2473
+ would make the site's module load one that runs code at import time.
2474
+ - Ctrl-C prints one line instead of a traceback, and a reader that closes
2475
+ the pipe ends the run quietly; `preview` and `rename-helpers` warn about
2476
+ a pending journal and an in-place `dry` refuses before analysing; two
2477
+ source paths that differ only by case are refused before an out-of-place
2478
+ copy would merge them on a case-insensitive volume; a virtual environment
2479
+ inside the input is recognized by its `pyvenv.cfg` whatever it is named;
2480
+ the inline progress bar goes to stderr like tqdm's, so redirected output
2481
+ stays clean, and a run that asked for tqdm without it installed says so
2482
+ once.
2483
+ - A single-file run prints the frame-sensitivity warning that directory
2484
+ runs already printed when a file reads `locals()`, `eval` or the frame.
2485
+ - A `pyproject.toml` that does not parse is reported (and no layout
2486
+ information is taken from it) instead of being read as empty.
2487
+
2488
+ ### Security
2489
+ - The pyright oracle starts `python -I -m pyright`. It runs from the
2490
+ module's directory, and `-m` put that directory first on `sys.path`, so a
2491
+ project package named like a standard module was imported and executed
2492
+ in its place: sphinx's `locale` package ran when pyright's launcher
2493
+ imported `subprocess`, and pyright produced nothing for flask, pytest,
2494
+ structlog, sphinx, trio and werkzeug in the release-candidate ecosystem
2495
+ run.
2496
+ - Pyright runs with Towel's interpreter (`--pythonpath`), so a `venv`
2497
+ setting in the analyzed project's pyright configuration can no longer
2498
+ execute that project's interpreter; SECURITY.md says exactly what each
2499
+ checker does and when to pass `--no-types`. Ruff and pyright are resolved
2500
+ from the current interpreter before PATH. The ecosystem job runs
2501
+ third-party test suites without the checkout token persisted and with a
2502
+ scratch HOME; the workflows pin actions to commits. The rename file is
2503
+ read as UTF-8 and the change sidecar is never written through a symlink.
2504
+ - The pyright probe is created with `mkstemp` in the user's package
2505
+ (exclusive, owner-only, never following a symlink) and removed at
2506
+ interpreter exit if a crash skips the cleanup; it used to be a
2507
+ predictable, world-readable file left behind by a kill.
2508
+ - The ecosystem check (`scripts/ecosystem_check.py`, `just ecosystem`)
2509
+ clones public repositories and runs their setup, dependency installation
2510
+ and test suites with the caller's privileges. It now refuses to run
2511
+ unless the caller passes `--run-untrusted-code` or sets
2512
+ `TOWEL_ECOSYSTEM_RUN_UNTRUSTED=1`, the refusal says what would execute
2513
+ and recommends a disposable machine or container, and each manifest
2514
+ entry's `prepare` command runs without a shell. Every project in the
2515
+ manifest is pinned to the full commit the release-gate run tested rather
2516
+ than `HEAD`, so a hijacked upstream cannot put unreviewed code into the
2517
+ run; `--print-pins` lists the commits a run tested for refreshing the pins.
2518
+ `towel-main` alone still tracks `main`. Its work directory is a fresh
2519
+ private temporary directory unless `--work` names one, so another local
2520
+ user cannot pre-create the tree it clones into and executes from.
2521
+
2522
+ ## [1.618] - 2026-09-17
2523
+
2524
+ ### Changed
2525
+ - Cross-file helpers are imported relatively by default (`from .module import
2526
+ helper`), which stays valid when an out-of-place output is adopted into its
2527
+ real location. An absolute import is used only when a packaging marker
2528
+ (`pyproject.toml`/`setup.*`) anchors the module name, so the previous
2529
+ behavior is preserved for in-place refactoring of a packaged project.
2530
+ - Trivial forwarding helpers are no longer proposed: a block whose helper body
2531
+ would be a single `raise`, a `return` of one call, or a bare call adds
2532
+ indirection without sharing logic. Construct the engine with
2533
+ `skip_trivial_helpers=False` to restore the old behavior.
2534
+ - A cross-file helper is placed in a module that does not close an import cycle.
2535
+ When the shared block spans modules, the helper is hosted in one the others
2536
+ already import rather than adding a back-edge; the extraction is declined only
2537
+ when no placement is safe (a genuine pre-existing cycle). This replaces the
2538
+ earlier behavior of hosting the helper in the first module and declining
2539
+ whenever that would cycle.
2540
+
2541
+ ### Fixed
2542
+ - The rename tool no longer refuses a module merely because it contains a local
2543
+ variable or parameter named `vars`, `globals`, `locals`, `eval`, or `exec`;
2544
+ it flags only a genuine reference to the builtin.
2545
+
2546
+ ## [1.414] - 2026-09-15
2547
+
2548
+ First release prepared under the open-source audit. Beta: the engineering and
2549
+ evidence are strong, but Towel rewrites source code and has documented
2550
+ limitations it cannot always detect, so preview, review the diff, and run the
2551
+ affected project's own tests.
2552
+
2553
+ ### Added
2554
+ - Cross-file refactoring with import-root inference for setuptools, Hatch,
2555
+ Flit, Poetry, and pdm project layouts.
2556
+ - `towel rename-helpers`: a JSON inventory of extracted helpers and an atomic,
2557
+ checked rename batch, intended to be driven by a coding assistant.
2558
+ - `towel dry --exclude DIR` to leave a directory out of directory mode.
2559
+ - A pre-run scan that warns, before refactoring a directory, about modules that
2560
+ inspect frames or tracebacks, attribute warnings by `stacklevel`, or read
2561
+ source through `inspect.getsource`.
2562
+ - A standing ecosystem check over 91 public projects
2563
+ (`scripts/ecosystem_check.py`, `just ecosystem`), run weekly in CI.
2564
+ - Fork-based parallel analysis, enabled by a timed probe and capped by
2565
+ available memory, with a per-worker watchdog so a killed run leaves no
2566
+ workers behind. `TOWEL_WORKERS` controls it.
2567
+
2568
+ ### Changed
2569
+ - Every accepted proposal is verified by instantiating the helper with each
2570
+ call site's arguments and comparing against the block it replaces, up to
2571
+ renamed binders. Arguments that could have observable effects or fresh
2572
+ identity are evaluated inside the helper at their original position.
2573
+ - Analysis is memoized by block structure and shares parsed graphs by
2574
+ reference, checked under `TOWEL_CHECK_AST_IMMUTABLE=1`.
2575
+ - Minimum Python is 3.11; the matrix covers 3.11 through 3.13.
2576
+
2577
+ ### Fixed
2578
+ - A large set of soundness and scope defects found by adversarial batteries and
2579
+ the ecosystem check, each now covered by a fixture and a row in
2580
+ [docs/ADVERSARIAL_REVIEW.md](docs/ADVERSARIAL_REVIEW.md).
2581
+
2582
+ ### Notes
2583
+ - The PyPI releases `1.0.0`–`1.0.4` are yanked for broken import handling and
2584
+ are not a recommended installation target.
2585
+
2586
+ [Unreleased]: https://github.com/ericeallen/towel/compare/v1.947...HEAD
2587
+ [1.947]: https://github.com/ericeallen/towel/compare/v1.946...v1.947
2588
+ [1.946]: https://github.com/ericeallen/towel/compare/v1.792...v1.946
2589
+ [1.792]: https://github.com/ericeallen/towel/compare/v1.772...v1.792
2590
+ [1.772]: https://github.com/ericeallen/towel/compare/v1.732.post1...v1.772
2591
+ [1.732.post1]: https://github.com/ericeallen/towel/compare/v1.732...v1.732.post1
2592
+ [1.732]: https://github.com/ericeallen/towel/compare/v1.618...v1.732
2593
+ [1.618]: https://github.com/ericeallen/towel/compare/v1.414...v1.618
2594
+ [1.414]: https://github.com/ericeallen/towel/releases/tag/v1.414