dry-lint 1.6.0__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 (1616) hide show
  1. dry_lint-1.6.0/.gitignore +11 -0
  2. dry_lint-1.6.0/.pre-commit-hooks.yaml +32 -0
  3. dry_lint-1.6.0/AGENTS.md +26 -0
  4. dry_lint-1.6.0/CONTRIBUTING.md +24 -0
  5. dry_lint-1.6.0/LICENSE +202 -0
  6. dry_lint-1.6.0/PKG-INFO +349 -0
  7. dry_lint-1.6.0/README.md +314 -0
  8. dry_lint-1.6.0/action.yml +282 -0
  9. dry_lint-1.6.0/counter/README.md +53 -0
  10. dry_lint-1.6.0/counter/src/lint.js +2 -0
  11. dry_lint-1.6.0/counter/src/tally.js +297 -0
  12. dry_lint-1.6.0/counter/src/worker.js +139 -0
  13. dry_lint-1.6.0/docs/adoption-playbook.md +362 -0
  14. dry_lint-1.6.0/docs/agent-feedback-curves.csv +313 -0
  15. dry_lint-1.6.0/docs/agent-feedback-experiment.md +105 -0
  16. dry_lint-1.6.0/docs/agent-feedback-results.json +8321 -0
  17. dry_lint-1.6.0/docs/agent-reviewed-discovery.md +101 -0
  18. dry_lint-1.6.0/docs/assets/avatar.png +0 -0
  19. dry_lint-1.6.0/docs/assets/dry-lint-mark.svg +5 -0
  20. dry_lint-1.6.0/docs/assets/four-cent-discovery.svg +2292 -0
  21. dry_lint-1.6.0/docs/assets/historical-discovery.csv +55 -0
  22. dry_lint-1.6.0/docs/assets/icon.png +0 -0
  23. dry_lint-1.6.0/docs/assets/lint.png +0 -0
  24. dry_lint-1.6.0/docs/assets/operation-block-performance.json +973 -0
  25. dry_lint-1.6.0/docs/assets/readme-hero-dark.svg +20 -0
  26. dry_lint-1.6.0/docs/assets/readme-hero-light.svg +20 -0
  27. dry_lint-1.6.0/docs/assets/social-preview.png +0 -0
  28. dry_lint-1.6.0/docs/assets/social-preview.svg +10 -0
  29. dry_lint-1.6.0/docs/assets/sticky-banner-dark.svg +13 -0
  30. dry_lint-1.6.0/docs/assets/sticky-banner-light.svg +13 -0
  31. dry_lint-1.6.0/docs/benchmark-backgrounds.md +125 -0
  32. dry_lint-1.6.0/docs/benchmark.md +563 -0
  33. dry_lint-1.6.0/docs/budgeted-recall.md +124 -0
  34. dry_lint-1.6.0/docs/case-studies/pytest-obligation-cleanup.md +157 -0
  35. dry_lint-1.6.0/docs/case-studies/pytest-selective.md +140 -0
  36. dry_lint-1.6.0/docs/channel-trial.md +187 -0
  37. dry_lint-1.6.0/docs/comment-preview.md +81 -0
  38. dry_lint-1.6.0/docs/context-probe.md +81 -0
  39. dry_lint-1.6.0/docs/coverage-exploration.md +336 -0
  40. dry_lint-1.6.0/docs/cpu-embedding.md +192 -0
  41. dry_lint-1.6.0/docs/cpu-recovery.md +46 -0
  42. dry_lint-1.6.0/docs/cpu-tail-rrf.md +61 -0
  43. dry_lint-1.6.0/docs/design.md +324 -0
  44. dry_lint-1.6.0/docs/detectors.md +105 -0
  45. dry_lint-1.6.0/docs/discovery-comparers.md +87 -0
  46. dry_lint-1.6.0/docs/dryer-comparison.md +172 -0
  47. dry_lint-1.6.0/docs/enablement-results.json +515 -0
  48. dry_lint-1.6.0/docs/enablement-results.md +164 -0
  49. dry_lint-1.6.0/docs/four-cent-discovery-curves.csv +1714 -0
  50. dry_lint-1.6.0/docs/four-cent-discovery-results.json +1777 -0
  51. dry_lint-1.6.0/docs/four-cent-discovery.md +220 -0
  52. dry_lint-1.6.0/docs/function-indexes.md +107 -0
  53. dry_lint-1.6.0/docs/github-action.md +386 -0
  54. dry_lint-1.6.0/docs/historical-discovery.md +249 -0
  55. dry_lint-1.6.0/docs/judges.md +231 -0
  56. dry_lint-1.6.0/docs/model-adoption.md +136 -0
  57. dry_lint-1.6.0/docs/model-duplication.md +288 -0
  58. dry_lint-1.6.0/docs/operation-block-performance.md +64 -0
  59. dry_lint-1.6.0/docs/operation-blocks.md +250 -0
  60. dry_lint-1.6.0/docs/plugins.md +246 -0
  61. dry_lint-1.6.0/docs/production-discovery-results.json +2407 -0
  62. dry_lint-1.6.0/docs/production-discovery-results.md +106 -0
  63. dry_lint-1.6.0/docs/production-discovery.md +188 -0
  64. dry_lint-1.6.0/docs/protected-exploration-curves.csv +379 -0
  65. dry_lint-1.6.0/docs/protected-exploration.md +203 -0
  66. dry_lint-1.6.0/docs/research/agentic-judge/CASES.md +59 -0
  67. dry_lint-1.6.0/docs/research/agentic-judge/CORPUS.md +15 -0
  68. dry_lint-1.6.0/docs/research/agentic-judge/FULL-RERUN.json +46 -0
  69. dry_lint-1.6.0/docs/research/agentic-judge/HANDOFF.json +21 -0
  70. dry_lint-1.6.0/docs/research/agentic-judge/PR-body.md +20 -0
  71. dry_lint-1.6.0/docs/research/agentic-judge/PR-title.txt +1 -0
  72. dry_lint-1.6.0/docs/research/agentic-judge/README.md +109 -0
  73. dry_lint-1.6.0/docs/research/agentic-judge/REPRODUCTION.md +42 -0
  74. dry_lint-1.6.0/docs/research/agentic-judge/SHA256SUMS +143 -0
  75. dry_lint-1.6.0/docs/research/agentic-judge/audit.py +43 -0
  76. dry_lint-1.6.0/docs/research/agentic-judge/data/background-acquisition.json +153 -0
  77. dry_lint-1.6.0/docs/research/agentic-judge/data/evidence/conclusion/COMPARATOR-V3-AMENDMENT.json +13 -0
  78. dry_lint-1.6.0/docs/research/agentic-judge/data/evidence/funded-rounds/round1/final-join/metrics.json +68 -0
  79. dry_lint-1.6.0/docs/research/agentic-judge/data/evidence/funded-rounds/round2/paired-baselines-repair-v3/analysis/metrics.json +62 -0
  80. dry_lint-1.6.0/docs/research/agentic-judge/data/evidence/resolution/followup-results/summary.json +205 -0
  81. dry_lint-1.6.0/docs/research/agentic-judge/data/holds.json +9 -0
  82. dry_lint-1.6.0/docs/research/agentic-judge/data/metrics.json +380 -0
  83. dry_lint-1.6.0/docs/research/agentic-judge/data/original/README.md +16 -0
  84. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/EXPERIMENT.json.txt +1 -0
  85. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/agentic-claude/analyze.py.txt +204 -0
  86. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/agentic-claude/check_sdk_constructor.py.txt +60 -0
  87. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/agentic-claude/check_sdk_requests.py.txt +123 -0
  88. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/agentic-claude/commands.json.txt +9 -0
  89. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/agentic-claude/diagnostic_text_parser.py.txt +146 -0
  90. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/agentic-claude/finalize_prereg.py.txt +67 -0
  91. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/agentic-claude/harness.py.txt +696 -0
  92. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/agentic-claude/prepare.py.txt +233 -0
  93. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/agentic-claude/test_diagnostic_text_parser.py.txt +66 -0
  94. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/agentic-claude/test_harness.py.txt +216 -0
  95. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/funded-rounds/analyze_funded.py.txt +174 -0
  96. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/funded-rounds/check_paired_baselines.py.txt +61 -0
  97. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/funded-rounds/check_root_paired_baselines.py.txt +58 -0
  98. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/funded-rounds/export_paired_baselines.py.txt +90 -0
  99. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/funded-rounds/join_round1_source.py.txt +63 -0
  100. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/funded-rounds/paired_baseline_adapter.py.txt +75 -0
  101. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/funded-rounds/root_paired_baselines.py.txt +66 -0
  102. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/funded-rounds/round1/EXPERIMENT.json.txt +1 -0
  103. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/funded-rounds/round1/analyze_round1.py.txt +87 -0
  104. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/funded-rounds/round1/check_control_schedule.py.txt +63 -0
  105. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/funded-rounds/round1/check_topup.py.txt +90 -0
  106. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/funded-rounds/round1/freeze_requests.py.txt +80 -0
  107. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/funded-rounds/round1/prepare_supply.py.txt +246 -0
  108. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/funded-rounds/round1/run_topup.py.txt +135 -0
  109. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/funded-rounds/round1/teacher_v3_adapter.py.txt +80 -0
  110. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/funded-rounds/round2/EXPERIMENT.json.txt +1 -0
  111. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/funded-rounds/round2/check_control_schedule.py.txt +63 -0
  112. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/funded-rounds/round2/check_literal_search.py.txt +51 -0
  113. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/funded-rounds/round2/check_round2.py.txt +106 -0
  114. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/funded-rounds/round2/freeze_requests.py.txt +80 -0
  115. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/funded-rounds/round2/paired-baselines-repair-v2/EXPERIMENT.json.txt +1 -0
  116. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/funded-rounds/round2/paired-baselines-repair-v2/adapter.py.txt +95 -0
  117. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/funded-rounds/round2/paired-baselines-repair-v2/check.py.txt +93 -0
  118. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/funded-rounds/round2/paired-baselines-repair-v2/instruction-diff.txt.txt +30 -0
  119. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/funded-rounds/round2/paired-baselines-repair-v2/prepare.py.txt +83 -0
  120. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/funded-rounds/round2/paired-baselines-repair-v2/root_runner.py.txt +66 -0
  121. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/funded-rounds/round2/paired-baselines-repair-v3/EXPERIMENT.json.txt +32 -0
  122. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/funded-rounds/round2/paired-baselines-repair-v3/adapter.py.txt +95 -0
  123. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/funded-rounds/round2/paired-baselines-repair-v3/analyze.py.txt +95 -0
  124. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/funded-rounds/round2/paired-baselines-repair-v3/check.py.txt +112 -0
  125. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/funded-rounds/round2/paired-baselines-repair-v3/instruction-diff.txt.txt +4 -0
  126. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/funded-rounds/round2/paired-baselines-repair-v3/repair_budget_runner.py.txt +161 -0
  127. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/funded-rounds/round2/paired-baselines-repair-v3/root_runner.py.txt +72 -0
  128. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/funded-rounds/round2/prepare_supply.py.txt +261 -0
  129. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/funded-rounds/round2/run_round2.py.txt +135 -0
  130. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/funded-rounds/round2/teacher_v4_adapter.py.txt +142 -0
  131. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/resolution/EXPERIMENT.json.txt +19 -0
  132. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/resolution/analyze_teacher_v2.py.txt +159 -0
  133. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/resolution/attribute_teacher_failures.py.txt +89 -0
  134. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/resolution/check_parallel_teacher.py.txt +122 -0
  135. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/resolution/check_teacher_v2.py.txt +91 -0
  136. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/resolution/commands.json.txt +6 -0
  137. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/resolution/evaluate_followup.py.txt +151 -0
  138. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/resolution/run_teacher_v2_parallel.py.txt +60 -0
  139. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/resolution/source_novelty.py.txt +54 -0
  140. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/resolution/teacher_v2.py.txt +214 -0
  141. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/resolution/test_followup_scoring.py.txt +72 -0
  142. dry_lint-1.6.0/docs/research/agentic-judge/data/original/lab/resolution/validate_followup.py.txt +158 -0
  143. dry_lint-1.6.0/docs/research/agentic-judge/data/original/product/pyproject.toml.txt +71 -0
  144. dry_lint-1.6.0/docs/research/agentic-judge/data/original/product/src/dry_lint/__init__.py.txt +3 -0
  145. dry_lint-1.6.0/docs/research/agentic-judge/data/original/product/src/dry_lint/__main__.py.txt +5 -0
  146. dry_lint-1.6.0/docs/research/agentic-judge/data/original/product/src/dry_lint/action.py.txt +717 -0
  147. dry_lint-1.6.0/docs/research/agentic-judge/data/original/product/src/dry_lint/baseline.py.txt +370 -0
  148. dry_lint-1.6.0/docs/research/agentic-judge/data/original/product/src/dry_lint/bench.py.txt +274 -0
  149. dry_lint-1.6.0/docs/research/agentic-judge/data/original/product/src/dry_lint/bench_background.py.txt +88 -0
  150. dry_lint-1.6.0/docs/research/agentic-judge/data/original/product/src/dry_lint/cli.py.txt +1009 -0
  151. dry_lint-1.6.0/docs/research/agentic-judge/data/original/product/src/dry_lint/commits.py.txt +161 -0
  152. dry_lint-1.6.0/docs/research/agentic-judge/data/original/product/src/dry_lint/comparers.py.txt +62 -0
  153. dry_lint-1.6.0/docs/research/agentic-judge/data/original/product/src/dry_lint/comparison.py.txt +288 -0
  154. dry_lint-1.6.0/docs/research/agentic-judge/data/original/product/src/dry_lint/comparison_helpers.py.txt +85 -0
  155. dry_lint-1.6.0/docs/research/agentic-judge/data/original/product/src/dry_lint/costs.py.txt +152 -0
  156. dry_lint-1.6.0/docs/research/agentic-judge/data/original/product/src/dry_lint/detector.py.txt +354 -0
  157. dry_lint-1.6.0/docs/research/agentic-judge/data/original/product/src/dry_lint/discovery.py.txt +160 -0
  158. dry_lint-1.6.0/docs/research/agentic-judge/data/original/product/src/dry_lint/dryer.py.txt +96 -0
  159. dry_lint-1.6.0/docs/research/agentic-judge/data/original/product/src/dry_lint/evidence.py.txt +65 -0
  160. dry_lint-1.6.0/docs/research/agentic-judge/data/original/product/src/dry_lint/extractors.py.txt +81 -0
  161. dry_lint-1.6.0/docs/research/agentic-judge/data/original/product/src/dry_lint/feedback.py.txt +50 -0
  162. dry_lint-1.6.0/docs/research/agentic-judge/data/original/product/src/dry_lint/function_index.py.txt +203 -0
  163. dry_lint-1.6.0/docs/research/agentic-judge/data/original/product/src/dry_lint/functions.py.txt +386 -0
  164. dry_lint-1.6.0/docs/research/agentic-judge/data/original/product/src/dry_lint/git.py.txt +25 -0
  165. dry_lint-1.6.0/docs/research/agentic-judge/data/original/product/src/dry_lint/github.py.txt +11 -0
  166. dry_lint-1.6.0/docs/research/agentic-judge/data/original/product/src/dry_lint/index.py.txt +44 -0
  167. dry_lint-1.6.0/docs/research/agentic-judge/data/original/product/src/dry_lint/index_github.py.txt +183 -0
  168. dry_lint-1.6.0/docs/research/agentic-judge/data/original/product/src/dry_lint/judges/__init__.py.txt +30 -0
  169. dry_lint-1.6.0/docs/research/agentic-judge/data/original/product/src/dry_lint/judges/anthropic.py.txt +102 -0
  170. dry_lint-1.6.0/docs/research/agentic-judge/data/original/product/src/dry_lint/judges/command.py.txt +263 -0
  171. dry_lint-1.6.0/docs/research/agentic-judge/data/original/product/src/dry_lint/judges/gemini.py.txt +25 -0
  172. dry_lint-1.6.0/docs/research/agentic-judge/data/original/product/src/dry_lint/judges/http.py.txt +54 -0
  173. dry_lint-1.6.0/docs/research/agentic-judge/data/original/product/src/dry_lint/judges/jev.py.txt +224 -0
  174. dry_lint-1.6.0/docs/research/agentic-judge/data/original/product/src/dry_lint/judges/model_jev.py.txt +114 -0
  175. dry_lint-1.6.0/docs/research/agentic-judge/data/original/product/src/dry_lint/judges/subscription.py.txt +76 -0
  176. dry_lint-1.6.0/docs/research/agentic-judge/data/original/product/src/dry_lint/judging.py.txt +289 -0
  177. dry_lint-1.6.0/docs/research/agentic-judge/data/original/product/src/dry_lint/labelling.py.txt +402 -0
  178. dry_lint-1.6.0/docs/research/agentic-judge/data/original/product/src/dry_lint/ledger.py.txt +573 -0
  179. dry_lint-1.6.0/docs/research/agentic-judge/data/original/product/src/dry_lint/model_review.py.txt +123 -0
  180. dry_lint-1.6.0/docs/research/agentic-judge/data/original/product/src/dry_lint/model_shapes.py.txt +307 -0
  181. dry_lint-1.6.0/docs/research/agentic-judge/data/original/product/src/dry_lint/models.py.txt +270 -0
  182. dry_lint-1.6.0/docs/research/agentic-judge/data/original/product/src/dry_lint/plugins.py.txt +120 -0
  183. dry_lint-1.6.0/docs/research/agentic-judge/data/original/product/src/dry_lint/policies.py.txt +63 -0
  184. dry_lint-1.6.0/docs/research/agentic-judge/data/original/product/src/dry_lint/presets.py.txt +149 -0
  185. dry_lint-1.6.0/docs/research/agentic-judge/data/original/product/src/dry_lint/python_schemas.py.txt +113 -0
  186. dry_lint-1.6.0/docs/research/agentic-judge/data/original/product/src/dry_lint/ranking.py.txt +43 -0
  187. dry_lint-1.6.0/docs/research/agentic-judge/data/original/product/src/dry_lint/replay.py.txt +174 -0
  188. dry_lint-1.6.0/docs/research/agentic-judge/data/original/product/src/dry_lint/report.py.txt +848 -0
  189. dry_lint-1.6.0/docs/research/agentic-judge/data/original/product/src/dry_lint/schema_policy.py.txt +235 -0
  190. dry_lint-1.6.0/docs/research/agentic-judge/data/original/product/src/dry_lint/settings.py.txt +205 -0
  191. dry_lint-1.6.0/docs/research/agentic-judge/data/original/product/src/dry_lint/source_context.py.txt +69 -0
  192. dry_lint-1.6.0/docs/research/agentic-judge/data/original/product/src/dry_lint/sticky.py.txt +384 -0
  193. dry_lint-1.6.0/docs/research/agentic-judge/data/original/product/src/dry_lint/store.py.txt +228 -0
  194. dry_lint-1.6.0/docs/research/agentic-judge/data/original/product/src/dry_lint/typescript.py.txt +386 -0
  195. dry_lint-1.6.0/docs/research/agentic-judge/data/original/product/uv.lock.txt +1106 -0
  196. dry_lint-1.6.0/docs/research/agentic-judge/data/paired-round1.json +1174 -0
  197. dry_lint-1.6.0/docs/research/agentic-judge/data/provenance.json +881 -0
  198. dry_lint-1.6.0/docs/research/agentic-judge/data/recordings.json +6509 -0
  199. dry_lint-1.6.0/docs/research/agentic-judge/data/source-files.json.gz +0 -0
  200. dry_lint-1.6.0/docs/research/agentic-judge/data/source-pins.json +30 -0
  201. dry_lint-1.6.0/docs/research/agentic-judge/hydrate.py +37 -0
  202. dry_lint-1.6.0/docs/research/agentic-judge/licenses/BerriAI--litellm.txt +26 -0
  203. dry_lint-1.6.0/docs/research/agentic-judge/licenses/OpenHands--software-agent-sdk.txt +21 -0
  204. dry_lint-1.6.0/docs/research/agentic-judge/licenses/anomalyco--opencode.txt +21 -0
  205. dry_lint-1.6.0/docs/research/agentic-judge/licenses/dry-lint.txt +202 -0
  206. dry_lint-1.6.0/docs/research/agentic-judge/licenses/pingdotgg--t3code.txt +21 -0
  207. dry_lint-1.6.0/docs/research/agentic-judge/materialize.py +21 -0
  208. dry_lint-1.6.0/docs/research/agentic-judge/native.py +30 -0
  209. dry_lint-1.6.0/docs/research/agentic-judge/reproduce.py +186 -0
  210. dry_lint-1.6.0/docs/research/budget-ranking/DATA-CONTRACT.json +46 -0
  211. dry_lint-1.6.0/docs/research/budget-ranking/HANDOFF.json +30 -0
  212. dry_lint-1.6.0/docs/research/budget-ranking/PR-body.md +24 -0
  213. dry_lint-1.6.0/docs/research/budget-ranking/PR-title.txt +1 -0
  214. dry_lint-1.6.0/docs/research/budget-ranking/README.md +111 -0
  215. dry_lint-1.6.0/docs/research/budget-ranking/SHA256SUMS +112 -0
  216. dry_lint-1.6.0/docs/research/budget-ranking/VALIDATION.md +11 -0
  217. dry_lint-1.6.0/docs/research/budget-ranking/algorithm.py +54 -0
  218. dry_lint-1.6.0/docs/research/budget-ranking/backgrounds.py +37 -0
  219. dry_lint-1.6.0/docs/research/budget-ranking/cases/BR-R1-0010/case.json +450 -0
  220. dry_lint-1.6.0/docs/research/budget-ranking/cases/BR-R1-0010/claude-answer.json +51 -0
  221. dry_lint-1.6.0/docs/research/budget-ranking/cases/BR-R1-0010/claude-request.txt +136 -0
  222. dry_lint-1.6.0/docs/research/budget-ranking/cases/BR-R1-0010/jev-answer.json +25 -0
  223. dry_lint-1.6.0/docs/research/budget-ranking/cases/BR-R1-0010/jev-request.txt +1 -0
  224. dry_lint-1.6.0/docs/research/budget-ranking/cases/BR-R1-0018/case.json +466 -0
  225. dry_lint-1.6.0/docs/research/budget-ranking/cases/BR-R1-0018/claude-answer.json +51 -0
  226. dry_lint-1.6.0/docs/research/budget-ranking/cases/BR-R1-0018/claude-request.txt +233 -0
  227. dry_lint-1.6.0/docs/research/budget-ranking/cases/BR-R1-0018/jev-answer.json +25 -0
  228. dry_lint-1.6.0/docs/research/budget-ranking/cases/BR-R1-0018/jev-request.txt +1 -0
  229. dry_lint-1.6.0/docs/research/budget-ranking/cases/BR-R1-0059/case.json +423 -0
  230. dry_lint-1.6.0/docs/research/budget-ranking/cases/BR-R1-0059/claude-answer.json +51 -0
  231. dry_lint-1.6.0/docs/research/budget-ranking/cases/BR-R1-0059/claude-request.txt +163 -0
  232. dry_lint-1.6.0/docs/research/budget-ranking/cases/BR-R1-0059/jev-answer.json +25 -0
  233. dry_lint-1.6.0/docs/research/budget-ranking/cases/BR-R1-0059/jev-request.txt +1 -0
  234. dry_lint-1.6.0/docs/research/budget-ranking/cases/BR-R2-0019/case.json +506 -0
  235. dry_lint-1.6.0/docs/research/budget-ranking/cases/BR-R2-0019/claude-answer.json +41 -0
  236. dry_lint-1.6.0/docs/research/budget-ranking/cases/BR-R2-0019/claude-request.txt +918 -0
  237. dry_lint-1.6.0/docs/research/budget-ranking/cases/BR-R2-0019/jev-answer.json +25 -0
  238. dry_lint-1.6.0/docs/research/budget-ranking/cases/BR-R2-0019/jev-request.txt +1 -0
  239. dry_lint-1.6.0/docs/research/budget-ranking/data/DISJOINTNESS-RECEIPT.json +25 -0
  240. dry_lint-1.6.0/docs/research/budget-ranking/data/GOLD-ADMISSION-REGRESSION.json +121 -0
  241. dry_lint-1.6.0/docs/research/budget-ranking/data/algorithm-input.json +1806 -0
  242. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/LICENSE.txt +202 -0
  243. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/build_funded_round1.py.txt +242 -0
  244. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/build_funded_round2_public.py.txt +283 -0
  245. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/funded-rounds/public_budget_revised_funding_adapter_v1.py.txt +76 -0
  246. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/funded-rounds/public_ranking_intake.py.txt +115 -0
  247. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/funded-rounds/seal_public_ranking_intake.py.txt +90 -0
  248. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/join_public_funded_round.py.txt +116 -0
  249. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/join_public_funded_round_v2.py.txt +123 -0
  250. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/join_public_source_truth.py.txt +94 -0
  251. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/pyproject.toml.txt +71 -0
  252. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/run_experiment.py.txt +521 -0
  253. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/run_fair_fixed_revision.py.txt +163 -0
  254. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/src/dry_lint/__init__.py.txt +3 -0
  255. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/src/dry_lint/__main__.py.txt +5 -0
  256. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/src/dry_lint/action.py.txt +717 -0
  257. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/src/dry_lint/baseline.py.txt +370 -0
  258. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/src/dry_lint/bench.py.txt +274 -0
  259. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/src/dry_lint/bench_background.py.txt +88 -0
  260. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/src/dry_lint/cli.py.txt +1009 -0
  261. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/src/dry_lint/commits.py.txt +161 -0
  262. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/src/dry_lint/comparers.py.txt +62 -0
  263. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/src/dry_lint/comparison.py.txt +288 -0
  264. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/src/dry_lint/comparison_helpers.py.txt +85 -0
  265. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/src/dry_lint/costs.py.txt +152 -0
  266. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/src/dry_lint/detector.py.txt +354 -0
  267. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/src/dry_lint/discovery.py.txt +160 -0
  268. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/src/dry_lint/dryer.py.txt +96 -0
  269. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/src/dry_lint/evidence.py.txt +65 -0
  270. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/src/dry_lint/extractors.py.txt +81 -0
  271. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/src/dry_lint/feedback.py.txt +50 -0
  272. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/src/dry_lint/function_index.py.txt +203 -0
  273. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/src/dry_lint/functions.py.txt +386 -0
  274. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/src/dry_lint/git.py.txt +25 -0
  275. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/src/dry_lint/github.py.txt +11 -0
  276. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/src/dry_lint/index.py.txt +44 -0
  277. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/src/dry_lint/index_github.py.txt +183 -0
  278. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/src/dry_lint/judges/__init__.py.txt +30 -0
  279. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/src/dry_lint/judges/anthropic.py.txt +102 -0
  280. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/src/dry_lint/judges/command.py.txt +263 -0
  281. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/src/dry_lint/judges/gemini.py.txt +25 -0
  282. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/src/dry_lint/judges/http.py.txt +54 -0
  283. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/src/dry_lint/judges/jev.py.txt +224 -0
  284. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/src/dry_lint/judges/model_jev.py.txt +114 -0
  285. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/src/dry_lint/judges/subscription.py.txt +76 -0
  286. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/src/dry_lint/judging.py.txt +289 -0
  287. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/src/dry_lint/labelling.py.txt +402 -0
  288. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/src/dry_lint/ledger.py.txt +573 -0
  289. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/src/dry_lint/model_review.py.txt +123 -0
  290. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/src/dry_lint/model_shapes.py.txt +307 -0
  291. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/src/dry_lint/models.py.txt +270 -0
  292. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/src/dry_lint/plugins.py.txt +120 -0
  293. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/src/dry_lint/policies.py.txt +63 -0
  294. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/src/dry_lint/presets.py.txt +149 -0
  295. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/src/dry_lint/python_schemas.py.txt +113 -0
  296. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/src/dry_lint/ranking.py.txt +43 -0
  297. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/src/dry_lint/replay.py.txt +174 -0
  298. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/src/dry_lint/report.py.txt +848 -0
  299. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/src/dry_lint/schema_policy.py.txt +235 -0
  300. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/src/dry_lint/settings.py.txt +205 -0
  301. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/src/dry_lint/source_context.py.txt +69 -0
  302. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/src/dry_lint/sticky.py.txt +384 -0
  303. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/src/dry_lint/store.py.txt +228 -0
  304. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/src/dry_lint/typescript.py.txt +386 -0
  305. dry_lint-1.6.0/docs/research/budget-ranking/data/archived-code/uv.lock.txt +1106 -0
  306. dry_lint-1.6.0/docs/research/budget-ranking/data/background-catalog-lookup.json +32 -0
  307. dry_lint-1.6.0/docs/research/budget-ranking/data/expected-replay.json +119 -0
  308. dry_lint-1.6.0/docs/research/budget-ranking/data/metrics.json +36 -0
  309. dry_lint-1.6.0/docs/research/budget-ranking/data/private-aggregates.json +1 -0
  310. dry_lint-1.6.0/docs/research/budget-ranking/data/provenance.json +530 -0
  311. dry_lint-1.6.0/docs/research/budget-ranking/data/recordings.json.gz +0 -0
  312. dry_lint-1.6.0/docs/research/budget-ranking/data/selected-source-files.json.gz +0 -0
  313. dry_lint-1.6.0/docs/research/budget-ranking/data/source-manifest.json +738 -0
  314. dry_lint-1.6.0/docs/research/budget-ranking/data/specifications.json +153 -0
  315. dry_lint-1.6.0/docs/research/budget-ranking/hydrate.py +59 -0
  316. dry_lint-1.6.0/docs/research/budget-ranking/licenses/BerriAI--litellm.txt +26 -0
  317. dry_lint-1.6.0/docs/research/budget-ranking/licenses/OpenHands--software-agent-sdk.txt +21 -0
  318. dry_lint-1.6.0/docs/research/budget-ranking/licenses/anomalyco--opencode.txt +21 -0
  319. dry_lint-1.6.0/docs/research/budget-ranking/licenses/dry-lint-Apache-2.0.txt +202 -0
  320. dry_lint-1.6.0/docs/research/budget-ranking/licenses/pingdotgg--t3code.txt +21 -0
  321. dry_lint-1.6.0/docs/research/budget-ranking/replay.py +142 -0
  322. dry_lint-1.6.0/docs/research/budget-ranking/verify.py +76 -0
  323. dry_lint-1.6.0/docs/research/contract-tokens/.gitignore +2 -0
  324. dry_lint-1.6.0/docs/research/contract-tokens/CHECKS.json +394 -0
  325. dry_lint-1.6.0/docs/research/contract-tokens/CORPUS.json +838 -0
  326. dry_lint-1.6.0/docs/research/contract-tokens/HANDOFF.json +15 -0
  327. dry_lint-1.6.0/docs/research/contract-tokens/PR-body.md +20 -0
  328. dry_lint-1.6.0/docs/research/contract-tokens/PR-title.txt +1 -0
  329. dry_lint-1.6.0/docs/research/contract-tokens/PROVENANCE.json +65 -0
  330. dry_lint-1.6.0/docs/research/contract-tokens/README.md +67 -0
  331. dry_lint-1.6.0/docs/research/contract-tokens/SHA256SUMS +40 -0
  332. dry_lint-1.6.0/docs/research/contract-tokens/acquire.py +22 -0
  333. dry_lint-1.6.0/docs/research/contract-tokens/aggregate.py +23 -0
  334. dry_lint-1.6.0/docs/research/contract-tokens/data/evidence/MANIFEST.json +38 -0
  335. dry_lint-1.6.0/docs/research/contract-tokens/data/evidence/README.md +24 -0
  336. dry_lint-1.6.0/docs/research/contract-tokens/data/evidence/final-source-decision.json +1 -0
  337. dry_lint-1.6.0/docs/research/contract-tokens/data/evidence/original-metrics.json +1 -0
  338. dry_lint-1.6.0/docs/research/contract-tokens/data/evidence/revised-metrics.json +210 -0
  339. dry_lint-1.6.0/docs/research/contract-tokens/data/evidence/verify_evidence.py +44 -0
  340. dry_lint-1.6.0/docs/research/contract-tokens/data/feed-provenance.json +10 -0
  341. dry_lint-1.6.0/docs/research/contract-tokens/data/final-source-decisions.json +123 -0
  342. dry_lint-1.6.0/docs/research/contract-tokens/data/held-request-templates.json +1 -0
  343. dry_lint-1.6.0/docs/research/contract-tokens/data/implementation.json.gz +0 -0
  344. dry_lint-1.6.0/docs/research/contract-tokens/data/observations.jsonl +142 -0
  345. dry_lint-1.6.0/docs/research/contract-tokens/data/paired-records.json.gz +0 -0
  346. dry_lint-1.6.0/docs/research/contract-tokens/data/policy-admissions.jsonl +39 -0
  347. dry_lint-1.6.0/docs/research/contract-tokens/data/recorded-replay.json +154 -0
  348. dry_lint-1.6.0/docs/research/contract-tokens/data/selected-cases.json.gz +0 -0
  349. dry_lint-1.6.0/docs/research/contract-tokens/data/source-files.json.gz +0 -0
  350. dry_lint-1.6.0/docs/research/contract-tokens/data/source-manifest.json +3461 -0
  351. dry_lint-1.6.0/docs/research/contract-tokens/data/source-pins.json +16 -0
  352. dry_lint-1.6.0/docs/research/contract-tokens/data/transform-inputs.json +49 -0
  353. dry_lint-1.6.0/docs/research/contract-tokens/hydrate.py +31 -0
  354. dry_lint-1.6.0/docs/research/contract-tokens/implementation/README.md +1 -0
  355. dry_lint-1.6.0/docs/research/contract-tokens/implementation/lab--funded-rounds--round2--conjunctive.py.txt +146 -0
  356. dry_lint-1.6.0/docs/research/contract-tokens/implementation/lab--measured_contract_tokens.py.txt +735 -0
  357. dry_lint-1.6.0/docs/research/contract-tokens/licenses/BerriAI--litellm.txt +26 -0
  358. dry_lint-1.6.0/docs/research/contract-tokens/licenses/OpenHands--software-agent-sdk.txt +21 -0
  359. dry_lint-1.6.0/docs/research/contract-tokens/licenses/anomalyco--opencode.txt +21 -0
  360. dry_lint-1.6.0/docs/research/contract-tokens/licenses/dry-lint.txt +202 -0
  361. dry_lint-1.6.0/docs/research/contract-tokens/licenses/pingdotgg--t3code.txt +21 -0
  362. dry_lint-1.6.0/docs/research/contract-tokens/reproduce.py +133 -0
  363. dry_lint-1.6.0/docs/research/contract-tokens/transform.py +35 -0
  364. dry_lint-1.6.0/docs/research/cpu-embeddings/CASES.md +118 -0
  365. dry_lint-1.6.0/docs/research/cpu-embeddings/CORPUS.md +15 -0
  366. dry_lint-1.6.0/docs/research/cpu-embeddings/FULL-RERUN.json +56 -0
  367. dry_lint-1.6.0/docs/research/cpu-embeddings/HANDOFF.json +26 -0
  368. dry_lint-1.6.0/docs/research/cpu-embeddings/PR-body.md +21 -0
  369. dry_lint-1.6.0/docs/research/cpu-embeddings/PR-title.txt +1 -0
  370. dry_lint-1.6.0/docs/research/cpu-embeddings/README.md +134 -0
  371. dry_lint-1.6.0/docs/research/cpu-embeddings/REPRODUCTION.md +48 -0
  372. dry_lint-1.6.0/docs/research/cpu-embeddings/SHA256SUMS +159 -0
  373. dry_lint-1.6.0/docs/research/cpu-embeddings/VALIDATION.json +65 -0
  374. dry_lint-1.6.0/docs/research/cpu-embeddings/audit.py +43 -0
  375. dry_lint-1.6.0/docs/research/cpu-embeddings/data/anonymous-regression-pairs.json +2232 -0
  376. dry_lint-1.6.0/docs/research/cpu-embeddings/data/background-acquisition.json +1060 -0
  377. dry_lint-1.6.0/docs/research/cpu-embeddings/data/evidence/acquisition.json +90 -0
  378. dry_lint-1.6.0/docs/research/cpu-embeddings/data/evidence/cache-measurements.json +28 -0
  379. dry_lint-1.6.0/docs/research/cpu-embeddings/data/evidence/conclusion/disputed-source-sensitivity.json +188 -0
  380. dry_lint-1.6.0/docs/research/cpu-embeddings/data/evidence/funded-rounds/round2/emission-summary.json +11 -0
  381. dry_lint-1.6.0/docs/research/cpu-embeddings/data/evidence/funded-rounds/round2/matched-sparse-baseline-summary.json +16 -0
  382. dry_lint-1.6.0/docs/research/cpu-embeddings/data/evidence/funded-rounds/round2/projection-policy.json +15 -0
  383. dry_lint-1.6.0/docs/research/cpu-embeddings/data/evidence/funded-rounds/round2/regression/comparison-summary.json +49 -0
  384. dry_lint-1.6.0/docs/research/cpu-embeddings/data/evidence/promotion/CPUE04-directional-emissions.jsonl +215 -0
  385. dry_lint-1.6.0/docs/research/cpu-embeddings/data/evidence/promotion/CPUE04.json +31 -0
  386. dry_lint-1.6.0/docs/research/cpu-embeddings/data/evidence/promotion/default3/production-summary.json +24 -0
  387. dry_lint-1.6.0/docs/research/cpu-embeddings/data/evidence/promotion/production-summary.json +24 -0
  388. dry_lint-1.6.0/docs/research/cpu-embeddings/data/holds.json +9 -0
  389. dry_lint-1.6.0/docs/research/cpu-embeddings/data/metrics.json +53 -0
  390. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/README.md +17 -0
  391. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/EXPERIMENT.json.txt +160 -0
  392. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/acquire.py.txt +98 -0
  393. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/build_handoff.py.txt +103 -0
  394. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/conclusion/disputed_source_sensitivity.py.txt +24 -0
  395. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/conclusion/join_source_review.py.txt +25 -0
  396. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/discover.py.txt +179 -0
  397. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/embed.py.txt +187 -0
  398. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/environment.json.txt +10 -0
  399. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/experiment.py.txt +688 -0
  400. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/freeze.py.txt +151 -0
  401. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/full-corpus/EXPERIMENT.json.txt +32 -0
  402. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/full-corpus/adjudication_sensitivity.py.txt +69 -0
  403. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/full-corpus/bind_coordinator_acceptance.py.txt +83 -0
  404. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/full-corpus/commands.json.txt +22 -0
  405. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/full-corpus/coverage_tables.py.txt +181 -0
  406. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/full-corpus/encode.py.txt +201 -0
  407. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/full-corpus/execution-failures/nullable-drifted-summary-v1/experiment.py.txt +687 -0
  408. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/full-corpus/execution-failures/nullable-drifted-summary-v1/run_full.py.txt +588 -0
  409. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/full-corpus/export_span_inputs.py.txt +158 -0
  410. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/full-corpus/finalize.py.txt +389 -0
  411. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/full-corpus/finish_all.py.txt +66 -0
  412. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/full-corpus/freeze_policy_results.py.txt +82 -0
  413. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/full-corpus/make_batch1.py.txt +291 -0
  414. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/full-corpus/migrate_spans.py.txt +237 -0
  415. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/full-corpus/migration_receipt.py.txt +191 -0
  416. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/full-corpus/models.py.txt +167 -0
  417. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/full-corpus/paired_summary.py.txt +182 -0
  418. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/full-corpus/prepare.py.txt +174 -0
  419. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/full-corpus/prepare_available.py.txt +32 -0
  420. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/full-corpus/project_intake.py.txt +232 -0
  421. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/full-corpus/resource_call.py.txt +46 -0
  422. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/full-corpus/run_full.py.txt +598 -0
  423. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/full-corpus/runtime_receipt.py.txt +41 -0
  424. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/full-corpus/span-audit.py.txt +27 -0
  425. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/full-corpus/span-migration/helper-v1/resolver.py.txt +248 -0
  426. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/full-corpus/span-migration/pre-helper-v1/experiment.py.txt +624 -0
  427. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/full-corpus/span_adapter.py.txt +31 -0
  428. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/full-corpus/validate_batch.py.txt +191 -0
  429. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/funded-rounds/audit_round2_ranks.py.txt +27 -0
  430. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/funded-rounds/discover_round1.py.txt +129 -0
  431. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/funded-rounds/discover_round2.py.txt +136 -0
  432. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/funded-rounds/matched_sparse_baselines.py.txt +51 -0
  433. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/funded-rounds/project_round1.py.txt +18 -0
  434. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/funded-rounds/project_round2.py.txt +18 -0
  435. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/funded-rounds/round1/EXPERIMENT.json.txt +15 -0
  436. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/funded-rounds/round2/EXPERIMENT.json.txt +16 -0
  437. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/funded-rounds/round2/REPRODUCE.json.txt +47 -0
  438. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/funded-rounds/round2/projection-policy.json.txt +15 -0
  439. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/funded-rounds/summarize_round2.py.txt +27 -0
  440. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/funded-rounds/translate_central.py.txt +59 -0
  441. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/funded-rounds/translate_round2.py.txt +59 -0
  442. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/funded-rounds/validate_round1.py.txt +35 -0
  443. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/funded-rounds/validate_round2.py.txt +42 -0
  444. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/make_packets.py.txt +173 -0
  445. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/measure_sparse.py.txt +38 -0
  446. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/pilot-preserved/experiment.py.txt +618 -0
  447. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/promotion/EXPERIMENT.json.txt +15 -0
  448. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/promotion/compare.py.txt +121 -0
  449. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/promotion/cpue04_directions.py.txt +47 -0
  450. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/promotion/freeze_funded.py.txt +68 -0
  451. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/promotion/project_v2.py.txt +50 -0
  452. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/reproduce.sh.txt +24 -0
  453. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/runtime-requirements.lock.txt +20 -0
  454. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/summarize.py.txt +228 -0
  455. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/validate.py.txt +130 -0
  456. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/lab/validate_queue.py.txt +200 -0
  457. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/product/pyproject.toml.txt +72 -0
  458. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/product/src/dry_lint/__init__.py.txt +3 -0
  459. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/product/src/dry_lint/__main__.py.txt +5 -0
  460. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/product/src/dry_lint/action.py.txt +717 -0
  461. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/product/src/dry_lint/baseline.py.txt +370 -0
  462. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/product/src/dry_lint/bench.py.txt +274 -0
  463. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/product/src/dry_lint/bench_background.py.txt +88 -0
  464. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/product/src/dry_lint/cli.py.txt +1009 -0
  465. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/product/src/dry_lint/commits.py.txt +161 -0
  466. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/product/src/dry_lint/comparers.py.txt +62 -0
  467. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/product/src/dry_lint/comparison.py.txt +288 -0
  468. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/product/src/dry_lint/comparison_helpers.py.txt +85 -0
  469. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/product/src/dry_lint/costs.py.txt +152 -0
  470. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/product/src/dry_lint/cpu_embedding.py.txt +275 -0
  471. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/product/src/dry_lint/detector.py.txt +363 -0
  472. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/product/src/dry_lint/discovery.py.txt +160 -0
  473. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/product/src/dry_lint/dryer.py.txt +96 -0
  474. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/product/src/dry_lint/evidence.py.txt +65 -0
  475. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/product/src/dry_lint/extractors.py.txt +81 -0
  476. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/product/src/dry_lint/feedback.py.txt +50 -0
  477. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/product/src/dry_lint/function_index.py.txt +203 -0
  478. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/product/src/dry_lint/functions.py.txt +386 -0
  479. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/product/src/dry_lint/git.py.txt +25 -0
  480. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/product/src/dry_lint/github.py.txt +11 -0
  481. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/product/src/dry_lint/index.py.txt +44 -0
  482. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/product/src/dry_lint/index_github.py.txt +183 -0
  483. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/product/src/dry_lint/judges/__init__.py.txt +30 -0
  484. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/product/src/dry_lint/judges/anthropic.py.txt +102 -0
  485. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/product/src/dry_lint/judges/command.py.txt +263 -0
  486. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/product/src/dry_lint/judges/gemini.py.txt +25 -0
  487. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/product/src/dry_lint/judges/http.py.txt +54 -0
  488. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/product/src/dry_lint/judges/jev.py.txt +224 -0
  489. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/product/src/dry_lint/judges/model_jev.py.txt +114 -0
  490. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/product/src/dry_lint/judges/subscription.py.txt +76 -0
  491. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/product/src/dry_lint/judging.py.txt +289 -0
  492. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/product/src/dry_lint/labelling.py.txt +402 -0
  493. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/product/src/dry_lint/ledger.py.txt +573 -0
  494. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/product/src/dry_lint/model_review.py.txt +123 -0
  495. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/product/src/dry_lint/model_shapes.py.txt +307 -0
  496. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/product/src/dry_lint/models.py.txt +270 -0
  497. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/product/src/dry_lint/plugins.py.txt +121 -0
  498. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/product/src/dry_lint/policies.py.txt +63 -0
  499. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/product/src/dry_lint/presets.py.txt +149 -0
  500. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/product/src/dry_lint/python_schemas.py.txt +113 -0
  501. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/product/src/dry_lint/ranking.py.txt +43 -0
  502. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/product/src/dry_lint/replay.py.txt +174 -0
  503. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/product/src/dry_lint/report.py.txt +848 -0
  504. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/product/src/dry_lint/schema_policy.py.txt +235 -0
  505. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/product/src/dry_lint/settings.py.txt +205 -0
  506. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/product/src/dry_lint/source_context.py.txt +69 -0
  507. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/product/src/dry_lint/sticky.py.txt +384 -0
  508. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/product/src/dry_lint/store.py.txt +228 -0
  509. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/product/src/dry_lint/typescript.py.txt +386 -0
  510. dry_lint-1.6.0/docs/research/cpu-embeddings/data/original/product/uv.lock.txt +1348 -0
  511. dry_lint-1.6.0/docs/research/cpu-embeddings/data/paired-round2.json +1730 -0
  512. dry_lint-1.6.0/docs/research/cpu-embeddings/data/provenance.json +922 -0
  513. dry_lint-1.6.0/docs/research/cpu-embeddings/data/recordings.json +1810 -0
  514. dry_lint-1.6.0/docs/research/cpu-embeddings/data/selected-vectors.json +3172 -0
  515. dry_lint-1.6.0/docs/research/cpu-embeddings/data/source-files.json.gz +0 -0
  516. dry_lint-1.6.0/docs/research/cpu-embeddings/data/source-pins.json +9 -0
  517. dry_lint-1.6.0/docs/research/cpu-embeddings/data/wide-round2.json +3714 -0
  518. dry_lint-1.6.0/docs/research/cpu-embeddings/hydrate.py +37 -0
  519. dry_lint-1.6.0/docs/research/cpu-embeddings/licenses/BerriAI--litellm.txt +26 -0
  520. dry_lint-1.6.0/docs/research/cpu-embeddings/licenses/dry-lint.txt +202 -0
  521. dry_lint-1.6.0/docs/research/cpu-embeddings/materialize.py +21 -0
  522. dry_lint-1.6.0/docs/research/cpu-embeddings/native.py +30 -0
  523. dry_lint-1.6.0/docs/research/cpu-embeddings/raw-rank-followup/COORDINATOR-ISOLATED-RESULT.json +18 -0
  524. dry_lint-1.6.0/docs/research/cpu-embeddings/raw-rank-followup/COORDINATOR-REPLAY-RESULT.json +21 -0
  525. dry_lint-1.6.0/docs/research/cpu-embeddings/raw-rank-followup/COVERAGE.json +26 -0
  526. dry_lint-1.6.0/docs/research/cpu-embeddings/raw-rank-followup/DATA-RECEIPT.json +31 -0
  527. dry_lint-1.6.0/docs/research/cpu-embeddings/raw-rank-followup/EXAMPLES.json +38 -0
  528. dry_lint-1.6.0/docs/research/cpu-embeddings/raw-rank-followup/FINAL-ADDITIVE-CHECK.json +10 -0
  529. dry_lint-1.6.0/docs/research/cpu-embeddings/raw-rank-followup/MATCHED-SUMMARY.json +453 -0
  530. dry_lint-1.6.0/docs/research/cpu-embeddings/raw-rank-followup/PUBLICATION-PROVENANCE.json +40 -0
  531. dry_lint-1.6.0/docs/research/cpu-embeddings/raw-rank-followup/README.md +72 -0
  532. dry_lint-1.6.0/docs/research/cpu-embeddings/raw-rank-followup/REPLAY-RESULT.json +18 -0
  533. dry_lint-1.6.0/docs/research/cpu-embeddings/raw-rank-followup/RUNNER-MANIFEST.json +86 -0
  534. dry_lint-1.6.0/docs/research/cpu-embeddings/raw-rank-followup/common.py +68 -0
  535. dry_lint-1.6.0/docs/research/cpu-embeddings/raw-rank-followup/hybrid.py +300 -0
  536. dry_lint-1.6.0/docs/research/cpu-embeddings/raw-rank-followup/matched-results.json +155 -0
  537. dry_lint-1.6.0/docs/research/cpu-embeddings/raw-rank-followup/multiquery.py +174 -0
  538. dry_lint-1.6.0/docs/research/cpu-embeddings/raw-rank-followup/payments.json +38 -0
  539. dry_lint-1.6.0/docs/research/cpu-embeddings/raw-rank-followup/recordings.py +27 -0
  540. dry_lint-1.6.0/docs/research/cpu-embeddings/raw-rank-followup/regression-summary.json +380 -0
  541. dry_lint-1.6.0/docs/research/cpu-embeddings/raw-rank-followup/replay.py +203 -0
  542. dry_lint-1.6.0/docs/research/cpu-embeddings/raw-rank-followup/requirements.txt +5 -0
  543. dry_lint-1.6.0/docs/research/cpu-embeddings/raw-rank-followup/retrieval.py +115 -0
  544. dry_lint-1.6.0/docs/research/cpu-embeddings/raw-rank-followup/tail_index.py +59 -0
  545. dry_lint-1.6.0/docs/research/cpu-embeddings/reproduce.py +186 -0
  546. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/EXPERIMENT-v1.json +21 -0
  547. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/EXPERIMENT-v2-implementation-amendment.json +58 -0
  548. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/EXPERIMENT-v2.json +59 -0
  549. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/FINAL-RESULTS.json +704 -0
  550. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/FINAL-VERIFICATION.json +22 -0
  551. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/README.md +75 -0
  552. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/all-cases-numeric.jsonl +118 -0
  553. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/balanced/LICENSE-runtime +202 -0
  554. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/balanced/MANIFEST.json +10 -0
  555. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/balanced/UPSTREAM-MANIFEST.json +22 -0
  556. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/balanced/reproduce.py +367 -0
  557. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/balanced/requirements.txt +2 -0
  558. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/balanced/runtime.zip +0 -0
  559. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/balanced-posthoc/LICENSE-software-agent-sdk +21 -0
  560. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/balanced-posthoc/MANIFEST.json +18 -0
  561. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/balanced-posthoc/README.md +29 -0
  562. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/balanced-posthoc/UPSTREAM-MANIFEST.json +16 -0
  563. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/balanced-posthoc/accepted-source-public.json +117 -0
  564. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/balanced-posthoc/balanced-dependency.json +4 -0
  565. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/balanced-posthoc/native-snapshots.zip +0 -0
  566. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/balanced-posthoc/recordings.json.gz +0 -0
  567. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/balanced-posthoc/replay.py +112 -0
  568. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/balanced-posthoc/summary.json +138 -0
  569. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/balanced-posthoc/validation.json +10 -0
  570. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/balanced-posthoc/verification.txt +13 -0
  571. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/census-summary.json +14 -0
  572. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/final-cohort-supplement-disposition.json +154 -0
  573. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/final-tests.log +2 -0
  574. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/held-hydration.jsonl +75 -0
  575. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/hydrate.py +42 -0
  576. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/implementation/harness.py +146 -0
  577. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/implementation/pr109/costs.py +152 -0
  578. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/implementation/pr109/cpu_embedding.py +243 -0
  579. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/implementation/pr109/judges/command.py +263 -0
  580. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/implementation/pr109/judges/jev.py +224 -0
  581. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/implementation/selection.py +67 -0
  582. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/implementation/successor.py +33 -0
  583. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/implementation/test_successor.py +32 -0
  584. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/implementation/views.py +64 -0
  585. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/manifest.json +96 -0
  586. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/native-source-coverage-by-background.csv +17 -0
  587. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/native-source-coverage-by-background.jsonl +16 -0
  588. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/native-source-exclusions.json +7 -0
  589. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/native-view-coverage.json +5 -0
  590. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/public-extension-v2/rows.jsonl +115 -0
  591. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/public-extension-v2/summary.json +255 -0
  592. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/replay.py +95 -0
  593. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/runtime-cache-measurement.json +37 -0
  594. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/selected-cases.json.gz +0 -0
  595. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/source-coverage-amendment.json +235 -0
  596. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/sources/OpenHands__software-agent-sdk/cfae94d00e7addaa592ee7c9a92ebb4939b13034/LICENSE +21 -0
  597. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/sources/OpenHands__software-agent-sdk/cfae94d00e7addaa592ee7c9a92ebb4939b13034/openhands/sdk/agent/agent.py +413 -0
  598. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/sources/OpenHands__software-agent-sdk/cfae94d00e7addaa592ee7c9a92ebb4939b13034/openhands/sdk/llm/llm.py +928 -0
  599. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/sources/OpenHands__software-agent-sdk/cfae94d00e7addaa592ee7c9a92ebb4939b13034/openhands/sdk/llm/utils/metrics.py +310 -0
  600. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/sources/OpenHands__software-agent-sdk/cfae94d00e7addaa592ee7c9a92ebb4939b13034/openhands/sdk/security/llm_analyzer.py +29 -0
  601. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/sources/anomalyco__opencode/51626eee903ea31fde7f41deb6a3430c939d9d90/LICENSE +21 -0
  602. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/sources/anomalyco__opencode/51626eee903ea31fde7f41deb6a3430c939d9d90/packages/core/src/models-dev.ts +451 -0
  603. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/sources/anomalyco__opencode/51626eee903ea31fde7f41deb6a3430c939d9d90/packages/core/src/plugin/provider/openai.ts +438 -0
  604. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/sources/anomalyco__opencode/51626eee903ea31fde7f41deb6a3430c939d9d90/packages/core/src/plugin/provider/opencode.ts +714 -0
  605. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/sources/anomalyco__opencode/51626eee903ea31fde7f41deb6a3430c939d9d90/packages/core/src/v1/config/migrate.ts +263 -0
  606. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/sources/anomalyco__opencode/51626eee903ea31fde7f41deb6a3430c939d9d90/packages/tui/src/component/logo.tsx +79 -0
  607. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/sources/anomalyco__opencode/51626eee903ea31fde7f41deb6a3430c939d9d90/packages/tui/src/util/presentation.ts +35 -0
  608. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/sources/gigaverse-app__dry-lint/b6b8db3aecbf0ea9bccaef5eced516415ccbfd83/LICENSE +202 -0
  609. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/sources/gigaverse-app__dry-lint/b6b8db3aecbf0ea9bccaef5eced516415ccbfd83/scripts/make_assets.py +170 -0
  610. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/unresolved-competitor-impact.json +23 -0
  611. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/unresolved-report-query-influence.jsonl +2 -0
  612. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/v2-regression-summary.json +29 -0
  613. dry_lint-1.6.0/docs/research/cpu-embeddings/tail-recovery/v2-standalone-original-summary.json +35 -0
  614. dry_lint-1.6.0/docs/research/funded-recall/README.md +61 -0
  615. dry_lint-1.6.0/docs/research/funded-recall/context/COORDINATOR-VERIFICATION.json +21 -0
  616. dry_lint-1.6.0/docs/research/funded-recall/context/PR-SUMMARY.md +1 -0
  617. dry_lint-1.6.0/docs/research/funded-recall/context/README.md +98 -0
  618. dry_lint-1.6.0/docs/research/funded-recall/context/SHA256SUMS +47 -0
  619. dry_lint-1.6.0/docs/research/funded-recall/context/audit.py +45 -0
  620. dry_lint-1.6.0/docs/research/funded-recall/context/evidence.json +117 -0
  621. dry_lint-1.6.0/docs/research/funded-recall/context/implementation/ORIGINS.json +32 -0
  622. dry_lint-1.6.0/docs/research/funded-recall/context/implementation/README.md +10 -0
  623. dry_lint-1.6.0/docs/research/funded-recall/context/implementation/anthropic.py +102 -0
  624. dry_lint-1.6.0/docs/research/funded-recall/context/implementation/coverage_round2.py +247 -0
  625. dry_lint-1.6.0/docs/research/funded-recall/context/implementation/jev.py +224 -0
  626. dry_lint-1.6.0/docs/research/funded-recall/context/implementation/score_coverage_round2.py +186 -0
  627. dry_lint-1.6.0/docs/research/funded-recall/context/implementation/trace_evaluate.py +153 -0
  628. dry_lint-1.6.0/docs/research/funded-recall/context/implementation/trace_followup.py +266 -0
  629. dry_lint-1.6.0/docs/research/funded-recall/context/paired-results.csv +33 -0
  630. dry_lint-1.6.0/docs/research/funded-recall/context/reproduction/.gitignore +2 -0
  631. dry_lint-1.6.0/docs/research/funded-recall/context/reproduction/INVENTORY.json +151 -0
  632. dry_lint-1.6.0/docs/research/funded-recall/context/reproduction/README.md +148 -0
  633. dry_lint-1.6.0/docs/research/funded-recall/context/reproduction/SHA256SUMS +30 -0
  634. dry_lint-1.6.0/docs/research/funded-recall/context/reproduction/VERIFICATION.md +31 -0
  635. dry_lint-1.6.0/docs/research/funded-recall/context/reproduction/acquire.py +38 -0
  636. dry_lint-1.6.0/docs/research/funded-recall/context/reproduction/archive.py +16 -0
  637. dry_lint-1.6.0/docs/research/funded-recall/context/reproduction/build_export.py +233 -0
  638. dry_lint-1.6.0/docs/research/funded-recall/context/reproduction/common.py +101 -0
  639. dry_lint-1.6.0/docs/research/funded-recall/context/reproduction/hydrate.py +67 -0
  640. dry_lint-1.6.0/docs/research/funded-recall/context/reproduction/implementation-provenance.json +13 -0
  641. dry_lint-1.6.0/docs/research/funded-recall/context/reproduction/implementation.json.gz +0 -0
  642. dry_lint-1.6.0/docs/research/funded-recall/context/reproduction/inspect_case.py +74 -0
  643. dry_lint-1.6.0/docs/research/funded-recall/context/reproduction/kit.py +16 -0
  644. dry_lint-1.6.0/docs/research/funded-recall/context/reproduction/licenses/BerriAI--litellm.txt +26 -0
  645. dry_lint-1.6.0/docs/research/funded-recall/context/reproduction/licenses/OpenHands--software-agent-sdk.txt +21 -0
  646. dry_lint-1.6.0/docs/research/funded-recall/context/reproduction/licenses/anomalyco--opencode.txt +21 -0
  647. dry_lint-1.6.0/docs/research/funded-recall/context/reproduction/licenses/dry-lint-Apache-2.0.txt +202 -0
  648. dry_lint-1.6.0/docs/research/funded-recall/context/reproduction/licenses/pingdotgg--t3code.txt +21 -0
  649. dry_lint-1.6.0/docs/research/funded-recall/context/reproduction/live.py +115 -0
  650. dry_lint-1.6.0/docs/research/funded-recall/context/reproduction/native-verification.json +29 -0
  651. dry_lint-1.6.0/docs/research/funded-recall/context/reproduction/native.py +133 -0
  652. dry_lint-1.6.0/docs/research/funded-recall/context/reproduction/prompts.json +1 -0
  653. dry_lint-1.6.0/docs/research/funded-recall/context/reproduction/public_safety.py +48 -0
  654. dry_lint-1.6.0/docs/research/funded-recall/context/reproduction/published-paired-results.csv +33 -0
  655. dry_lint-1.6.0/docs/research/funded-recall/context/reproduction/recordings.json.gz +0 -0
  656. dry_lint-1.6.0/docs/research/funded-recall/context/reproduction/reproduce.py +257 -0
  657. dry_lint-1.6.0/docs/research/funded-recall/context/reproduction/source-files.json.gz +0 -0
  658. dry_lint-1.6.0/docs/research/funded-recall/context/reproduction/source-pins.json +1 -0
  659. dry_lint-1.6.0/docs/research/funded-recall/context/reproduction/test_kit.py +113 -0
  660. dry_lint-1.6.0/docs/research/funded-recall/context/reproduction/transforms.py +33 -0
  661. dry_lint-1.6.0/docs/research/funded-recall/context/request-hash-receipts.jsonl +80 -0
  662. dry_lint-1.6.0/docs/research/funded-recall/context/source-pins.json +466 -0
  663. dry_lint-1.6.0/docs/research/historical-recovery/LICENSE-APACHE-2.0.txt +202 -0
  664. dry_lint-1.6.0/docs/research/historical-recovery/README.md +130 -0
  665. dry_lint-1.6.0/docs/research/historical-recovery/REPRODUCTION.md +83 -0
  666. dry_lint-1.6.0/docs/research/historical-recovery/SHA256SUMS +54 -0
  667. dry_lint-1.6.0/docs/research/historical-recovery/archive/final-report-correction/replay_h05_final.py.txt +96 -0
  668. dry_lint-1.6.0/docs/research/historical-recovery/archive/guarded/final_counts.py.txt +27 -0
  669. dry_lint-1.6.0/docs/research/historical-recovery/archive/guarded/provider_support.py.txt +117 -0
  670. dry_lint-1.6.0/docs/research/historical-recovery/archive/guarded/replay.py.txt +354 -0
  671. dry_lint-1.6.0/docs/research/historical-recovery/archive/guarded/report.py.txt +123 -0
  672. dry_lint-1.6.0/docs/research/historical-recovery/archive/historical-template.txt +20 -0
  673. dry_lint-1.6.0/docs/research/historical-recovery/archive/manifest.json +290 -0
  674. dry_lint-1.6.0/docs/research/historical-recovery/archive/native/judge_history.py.txt +492 -0
  675. dry_lint-1.6.0/docs/research/historical-recovery/archive/native/replay.py.txt +206 -0
  676. dry_lint-1.6.0/docs/research/historical-recovery/archive/native/replay_coverage.py.txt +237 -0
  677. dry_lint-1.6.0/docs/research/historical-recovery/archive/native/summarize.py.txt +66 -0
  678. dry_lint-1.6.0/docs/research/historical-recovery/archive/production/comparers.py.txt +62 -0
  679. dry_lint-1.6.0/docs/research/historical-recovery/archive/production/costs.py.txt +153 -0
  680. dry_lint-1.6.0/docs/research/historical-recovery/archive/production/detector.py.txt +354 -0
  681. dry_lint-1.6.0/docs/research/historical-recovery/archive/production/discovery.py.txt +157 -0
  682. dry_lint-1.6.0/docs/research/historical-recovery/archive/production/index.py.txt +44 -0
  683. dry_lint-1.6.0/docs/research/historical-recovery/archive/production/judges/anthropic.py.txt +102 -0
  684. dry_lint-1.6.0/docs/research/historical-recovery/archive/production/judges/command.py.txt +263 -0
  685. dry_lint-1.6.0/docs/research/historical-recovery/archive/production/judging.py.txt +281 -0
  686. dry_lint-1.6.0/docs/research/historical-recovery/archive/production/presets.py.txt +150 -0
  687. dry_lint-1.6.0/docs/research/historical-recovery/archive/production/report.py.txt +847 -0
  688. dry_lint-1.6.0/docs/research/historical-recovery/archive/production/settings.py.txt +206 -0
  689. dry_lint-1.6.0/docs/research/historical-recovery/archive/protected-reference-templates.json.txt +10 -0
  690. dry_lint-1.6.0/docs/research/historical-recovery/archive/shared-operations-template.txt +46 -0
  691. dry_lint-1.6.0/docs/research/historical-recovery/archive/source-recovery/continue.py.txt +92 -0
  692. dry_lint-1.6.0/docs/research/historical-recovery/archive/source-recovery/h02_support.py.txt +333 -0
  693. dry_lint-1.6.0/docs/research/historical-recovery/archive/source-recovery/handoff.py.txt +179 -0
  694. dry_lint-1.6.0/docs/research/historical-recovery/archive/source-recovery/provider.py.txt +67 -0
  695. dry_lint-1.6.0/docs/research/historical-recovery/archive/source-recovery/run.py.txt +146 -0
  696. dry_lint-1.6.0/docs/research/historical-recovery/archive/source-recovery/settled_provider_support.py.txt +108 -0
  697. dry_lint-1.6.0/docs/research/historical-recovery/archive/sparse/run.py.txt +117 -0
  698. dry_lint-1.6.0/docs/research/historical-recovery/archive/sparse/validate.py.txt +46 -0
  699. dry_lint-1.6.0/docs/research/historical-recovery/config/balanced.json +79 -0
  700. dry_lint-1.6.0/docs/research/historical-recovery/config/half-name.json +22 -0
  701. dry_lint-1.6.0/docs/research/historical-recovery/config/native-recorded-contracts.json +48 -0
  702. dry_lint-1.6.0/docs/research/historical-recovery/config/native-replay.json +22 -0
  703. dry_lint-1.6.0/docs/research/historical-recovery/config/prompt-contract.json +10 -0
  704. dry_lint-1.6.0/docs/research/historical-recovery/expected.json +800 -0
  705. dry_lint-1.6.0/docs/research/historical-recovery/inputs/weight-projections.json +285 -0
  706. dry_lint-1.6.0/docs/research/historical-recovery/recordings/guarded-deltas.json +48 -0
  707. dry_lint-1.6.0/docs/research/historical-recovery/recordings/guarded-first-loss.json +85 -0
  708. dry_lint-1.6.0/docs/research/historical-recovery/recordings/guarded-physical.json +6 -0
  709. dry_lint-1.6.0/docs/research/historical-recovery/recordings/guarded.json +160 -0
  710. dry_lint-1.6.0/docs/research/historical-recovery/recordings/independent-review.json +51 -0
  711. dry_lint-1.6.0/docs/research/historical-recovery/recordings/native-first-loss.json +162 -0
  712. dry_lint-1.6.0/docs/research/historical-recovery/recordings/native.json +178 -0
  713. dry_lint-1.6.0/docs/research/historical-recovery/recordings/provenance.json +30 -0
  714. dry_lint-1.6.0/docs/research/historical-recovery/recordings/source-recovery.json +33 -0
  715. dry_lint-1.6.0/docs/research/historical-recovery/recordings/sparse.json +126 -0
  716. dry_lint-1.6.0/docs/research/historical-recovery/reproduce.py +183 -0
  717. dry_lint-1.6.0/docs/research/historical-recovery/validation.json +36 -0
  718. dry_lint-1.6.0/docs/research/linked-docs/.gitignore +2 -0
  719. dry_lint-1.6.0/docs/research/linked-docs/CHECKS.json +532 -0
  720. dry_lint-1.6.0/docs/research/linked-docs/CORPUS.json +838 -0
  721. dry_lint-1.6.0/docs/research/linked-docs/HANDOFF.json +15 -0
  722. dry_lint-1.6.0/docs/research/linked-docs/PR-body.md +20 -0
  723. dry_lint-1.6.0/docs/research/linked-docs/PR-title.txt +1 -0
  724. dry_lint-1.6.0/docs/research/linked-docs/PROVENANCE.json +65 -0
  725. dry_lint-1.6.0/docs/research/linked-docs/README.md +110 -0
  726. dry_lint-1.6.0/docs/research/linked-docs/SHA256SUMS +40 -0
  727. dry_lint-1.6.0/docs/research/linked-docs/acquire.py +22 -0
  728. dry_lint-1.6.0/docs/research/linked-docs/aggregate.py +24 -0
  729. dry_lint-1.6.0/docs/research/linked-docs/data/evidence/PR110-AUDIT.json +1 -0
  730. dry_lint-1.6.0/docs/research/linked-docs/data/evidence/README.md +65 -0
  731. dry_lint-1.6.0/docs/research/linked-docs/data/evidence/metrics.json +1 -0
  732. dry_lint-1.6.0/docs/research/linked-docs/data/evidence/portable-public-prior-phase-attribution.jsonl +12 -0
  733. dry_lint-1.6.0/docs/research/linked-docs/data/evidence/portable-public-requests.jsonl +128 -0
  734. dry_lint-1.6.0/docs/research/linked-docs/data/evidence/portable-source-review-v1.jsonl +7 -0
  735. dry_lint-1.6.0/docs/research/linked-docs/data/feed-provenance.json +10 -0
  736. dry_lint-1.6.0/docs/research/linked-docs/data/final-source-decisions.json +255 -0
  737. dry_lint-1.6.0/docs/research/linked-docs/data/held-request-templates.json +1 -0
  738. dry_lint-1.6.0/docs/research/linked-docs/data/implementation.json.gz +0 -0
  739. dry_lint-1.6.0/docs/research/linked-docs/data/linked-window-inputs.json +1606 -0
  740. dry_lint-1.6.0/docs/research/linked-docs/data/observations.jsonl +128 -0
  741. dry_lint-1.6.0/docs/research/linked-docs/data/paired-records.json.gz +0 -0
  742. dry_lint-1.6.0/docs/research/linked-docs/data/policy-admissions.jsonl +106 -0
  743. dry_lint-1.6.0/docs/research/linked-docs/data/recorded-replay.json +242 -0
  744. dry_lint-1.6.0/docs/research/linked-docs/data/selected-cases.json.gz +0 -0
  745. dry_lint-1.6.0/docs/research/linked-docs/data/source-files.json.gz +0 -0
  746. dry_lint-1.6.0/docs/research/linked-docs/data/source-manifest.json +3176 -0
  747. dry_lint-1.6.0/docs/research/linked-docs/data/source-pins.json +16 -0
  748. dry_lint-1.6.0/docs/research/linked-docs/hydrate.py +31 -0
  749. dry_lint-1.6.0/docs/research/linked-docs/implementation/README.md +1 -0
  750. dry_lint-1.6.0/docs/research/linked-docs/implementation/lab--funded-rounds--evaluate_round2.py.txt +50 -0
  751. dry_lint-1.6.0/docs/research/linked-docs/implementation/lab--linked_docs.py.txt +361 -0
  752. dry_lint-1.6.0/docs/research/linked-docs/licenses/BerriAI--litellm.txt +26 -0
  753. dry_lint-1.6.0/docs/research/linked-docs/licenses/OpenHands--software-agent-sdk.txt +21 -0
  754. dry_lint-1.6.0/docs/research/linked-docs/licenses/anomalyco--opencode.txt +21 -0
  755. dry_lint-1.6.0/docs/research/linked-docs/licenses/dry-lint.txt +202 -0
  756. dry_lint-1.6.0/docs/research/linked-docs/licenses/pingdotgg--t3code.txt +21 -0
  757. dry_lint-1.6.0/docs/research/linked-docs/reproduce.py +138 -0
  758. dry_lint-1.6.0/docs/research/linked-docs/transform.py +35 -0
  759. dry_lint-1.6.0/docs/research/model-function/DATA-CONTRACT.json +138 -0
  760. dry_lint-1.6.0/docs/research/model-function/HANDOFF.json +33 -0
  761. dry_lint-1.6.0/docs/research/model-function/PR-body.md +27 -0
  762. dry_lint-1.6.0/docs/research/model-function/PR-title.txt +1 -0
  763. dry_lint-1.6.0/docs/research/model-function/README.md +123 -0
  764. dry_lint-1.6.0/docs/research/model-function/SHA256SUMS +123 -0
  765. dry_lint-1.6.0/docs/research/model-function/VALIDATION.md +13 -0
  766. dry_lint-1.6.0/docs/research/model-function/algorithm.py +36 -0
  767. dry_lint-1.6.0/docs/research/model-function/backgrounds.py +37 -0
  768. dry_lint-1.6.0/docs/research/model-function/cases/MF-FC-41a0b0cb6b53/case.json +504 -0
  769. dry_lint-1.6.0/docs/research/model-function/cases/MF-FC-41a0b0cb6b53/claude-answer.json +51 -0
  770. dry_lint-1.6.0/docs/research/model-function/cases/MF-FC-41a0b0cb6b53/claude-request.txt +97 -0
  771. dry_lint-1.6.0/docs/research/model-function/cases/MF-FC-41a0b0cb6b53/jev-answer.json +25 -0
  772. dry_lint-1.6.0/docs/research/model-function/cases/MF-FC-41a0b0cb6b53/jev-request.txt +1 -0
  773. dry_lint-1.6.0/docs/research/model-function/cases/MF-FC-540f9bcdc2b2/case.json +629 -0
  774. dry_lint-1.6.0/docs/research/model-function/cases/MF-FC-540f9bcdc2b2/claude-answer.json +51 -0
  775. dry_lint-1.6.0/docs/research/model-function/cases/MF-FC-540f9bcdc2b2/claude-request.txt +104 -0
  776. dry_lint-1.6.0/docs/research/model-function/cases/MF-FC-540f9bcdc2b2/jev-answer.json +25 -0
  777. dry_lint-1.6.0/docs/research/model-function/cases/MF-FC-540f9bcdc2b2/jev-request.txt +1 -0
  778. dry_lint-1.6.0/docs/research/model-function/cases/MF-FC-7e77ae1ff789/case.json +401 -0
  779. dry_lint-1.6.0/docs/research/model-function/cases/MF-FC-7e77ae1ff789/claude-answer.json +51 -0
  780. dry_lint-1.6.0/docs/research/model-function/cases/MF-FC-7e77ae1ff789/claude-request.txt +108 -0
  781. dry_lint-1.6.0/docs/research/model-function/cases/MF-FC-7e77ae1ff789/jev-answer.json +25 -0
  782. dry_lint-1.6.0/docs/research/model-function/cases/MF-FC-7e77ae1ff789/jev-request.txt +1 -0
  783. dry_lint-1.6.0/docs/research/model-function/cases/MF-FC-857c073a93d2/case.json +477 -0
  784. dry_lint-1.6.0/docs/research/model-function/cases/MF-FC-857c073a93d2/claude-answer.json +51 -0
  785. dry_lint-1.6.0/docs/research/model-function/cases/MF-FC-857c073a93d2/claude-request.txt +146 -0
  786. dry_lint-1.6.0/docs/research/model-function/cases/MF-FC-857c073a93d2/jev-answer.json +25 -0
  787. dry_lint-1.6.0/docs/research/model-function/cases/MF-FC-857c073a93d2/jev-request.txt +1 -0
  788. dry_lint-1.6.0/docs/research/model-function/data/algorithm-input.json +667 -0
  789. dry_lint-1.6.0/docs/research/model-function/data/archived-code/LICENSE.txt +202 -0
  790. dry_lint-1.6.0/docs/research/model-function/data/archived-code/build_review_queue.py.txt +330 -0
  791. dry_lint-1.6.0/docs/research/model-function/data/archived-code/full-corpus-followup/export_novel_batch.py.txt +430 -0
  792. dry_lint-1.6.0/docs/research/model-function/data/archived-code/full-corpus-followup/model_gold_diagnostic.py.txt +49 -0
  793. dry_lint-1.6.0/docs/research/model-function/data/archived-code/full-corpus-followup/query_spans.py.txt +113 -0
  794. dry_lint-1.6.0/docs/research/model-function/data/archived-code/full-corpus-followup/replication_core.py.txt +861 -0
  795. dry_lint-1.6.0/docs/research/model-function/data/archived-code/full-corpus-followup/run_full_corpus.py.txt +469 -0
  796. dry_lint-1.6.0/docs/research/model-function/data/archived-code/full-corpus-followup/ts_ownership.py.txt +312 -0
  797. dry_lint-1.6.0/docs/research/model-function/data/archived-code/full-corpus-followup/validate_novel_batch.py.txt +159 -0
  798. dry_lint-1.6.0/docs/research/model-function/data/archived-code/funded-rounds/contract_operations.py.txt +127 -0
  799. dry_lint-1.6.0/docs/research/model-function/data/archived-code/funded-rounds/expand_round2.py.txt +121 -0
  800. dry_lint-1.6.0/docs/research/model-function/data/archived-code/funded-rounds/prepare_round.py.txt +432 -0
  801. dry_lint-1.6.0/docs/research/model-function/data/archived-code/funded-rounds/prepare_round2.py.txt +416 -0
  802. dry_lint-1.6.0/docs/research/model-function/data/archived-code/funded-rounds/prepare_round2_supplement.py.txt +424 -0
  803. dry_lint-1.6.0/docs/research/model-function/data/archived-code/funded-rounds/project_round1.py.txt +55 -0
  804. dry_lint-1.6.0/docs/research/model-function/data/archived-code/funded-rounds/project_round2_precision.py.txt +56 -0
  805. dry_lint-1.6.0/docs/research/model-function/data/archived-code/funded-rounds/project_round2_supplement.py.txt +56 -0
  806. dry_lint-1.6.0/docs/research/model-function/data/archived-code/funded-rounds/run_round2.py.txt +159 -0
  807. dry_lint-1.6.0/docs/research/model-function/data/archived-code/funded-rounds/seal_intake.py.txt +100 -0
  808. dry_lint-1.6.0/docs/research/model-function/data/archived-code/funded-rounds/seal_round2_intake.py.txt +102 -0
  809. dry_lint-1.6.0/docs/research/model-function/data/archived-code/funded-rounds/seal_round2_supplement.py.txt +110 -0
  810. dry_lint-1.6.0/docs/research/model-function/data/archived-code/pyproject.toml.txt +71 -0
  811. dry_lint-1.6.0/docs/research/model-function/data/archived-code/run_experiment.py.txt +860 -0
  812. dry_lint-1.6.0/docs/research/model-function/data/archived-code/src/dry_lint/__init__.py.txt +3 -0
  813. dry_lint-1.6.0/docs/research/model-function/data/archived-code/src/dry_lint/__main__.py.txt +5 -0
  814. dry_lint-1.6.0/docs/research/model-function/data/archived-code/src/dry_lint/action.py.txt +717 -0
  815. dry_lint-1.6.0/docs/research/model-function/data/archived-code/src/dry_lint/baseline.py.txt +370 -0
  816. dry_lint-1.6.0/docs/research/model-function/data/archived-code/src/dry_lint/bench.py.txt +274 -0
  817. dry_lint-1.6.0/docs/research/model-function/data/archived-code/src/dry_lint/bench_background.py.txt +88 -0
  818. dry_lint-1.6.0/docs/research/model-function/data/archived-code/src/dry_lint/cli.py.txt +1009 -0
  819. dry_lint-1.6.0/docs/research/model-function/data/archived-code/src/dry_lint/commits.py.txt +161 -0
  820. dry_lint-1.6.0/docs/research/model-function/data/archived-code/src/dry_lint/comparers.py.txt +62 -0
  821. dry_lint-1.6.0/docs/research/model-function/data/archived-code/src/dry_lint/comparison.py.txt +288 -0
  822. dry_lint-1.6.0/docs/research/model-function/data/archived-code/src/dry_lint/comparison_helpers.py.txt +85 -0
  823. dry_lint-1.6.0/docs/research/model-function/data/archived-code/src/dry_lint/costs.py.txt +152 -0
  824. dry_lint-1.6.0/docs/research/model-function/data/archived-code/src/dry_lint/detector.py.txt +354 -0
  825. dry_lint-1.6.0/docs/research/model-function/data/archived-code/src/dry_lint/discovery.py.txt +160 -0
  826. dry_lint-1.6.0/docs/research/model-function/data/archived-code/src/dry_lint/dryer.py.txt +96 -0
  827. dry_lint-1.6.0/docs/research/model-function/data/archived-code/src/dry_lint/evidence.py.txt +65 -0
  828. dry_lint-1.6.0/docs/research/model-function/data/archived-code/src/dry_lint/extractors.py.txt +81 -0
  829. dry_lint-1.6.0/docs/research/model-function/data/archived-code/src/dry_lint/feedback.py.txt +50 -0
  830. dry_lint-1.6.0/docs/research/model-function/data/archived-code/src/dry_lint/function_index.py.txt +203 -0
  831. dry_lint-1.6.0/docs/research/model-function/data/archived-code/src/dry_lint/functions.py.txt +386 -0
  832. dry_lint-1.6.0/docs/research/model-function/data/archived-code/src/dry_lint/git.py.txt +25 -0
  833. dry_lint-1.6.0/docs/research/model-function/data/archived-code/src/dry_lint/github.py.txt +11 -0
  834. dry_lint-1.6.0/docs/research/model-function/data/archived-code/src/dry_lint/index.py.txt +44 -0
  835. dry_lint-1.6.0/docs/research/model-function/data/archived-code/src/dry_lint/index_github.py.txt +183 -0
  836. dry_lint-1.6.0/docs/research/model-function/data/archived-code/src/dry_lint/judges/__init__.py.txt +30 -0
  837. dry_lint-1.6.0/docs/research/model-function/data/archived-code/src/dry_lint/judges/anthropic.py.txt +102 -0
  838. dry_lint-1.6.0/docs/research/model-function/data/archived-code/src/dry_lint/judges/command.py.txt +263 -0
  839. dry_lint-1.6.0/docs/research/model-function/data/archived-code/src/dry_lint/judges/gemini.py.txt +25 -0
  840. dry_lint-1.6.0/docs/research/model-function/data/archived-code/src/dry_lint/judges/http.py.txt +54 -0
  841. dry_lint-1.6.0/docs/research/model-function/data/archived-code/src/dry_lint/judges/jev.py.txt +224 -0
  842. dry_lint-1.6.0/docs/research/model-function/data/archived-code/src/dry_lint/judges/model_jev.py.txt +114 -0
  843. dry_lint-1.6.0/docs/research/model-function/data/archived-code/src/dry_lint/judges/subscription.py.txt +76 -0
  844. dry_lint-1.6.0/docs/research/model-function/data/archived-code/src/dry_lint/judging.py.txt +289 -0
  845. dry_lint-1.6.0/docs/research/model-function/data/archived-code/src/dry_lint/labelling.py.txt +402 -0
  846. dry_lint-1.6.0/docs/research/model-function/data/archived-code/src/dry_lint/ledger.py.txt +573 -0
  847. dry_lint-1.6.0/docs/research/model-function/data/archived-code/src/dry_lint/model_review.py.txt +123 -0
  848. dry_lint-1.6.0/docs/research/model-function/data/archived-code/src/dry_lint/model_shapes.py.txt +307 -0
  849. dry_lint-1.6.0/docs/research/model-function/data/archived-code/src/dry_lint/models.py.txt +270 -0
  850. dry_lint-1.6.0/docs/research/model-function/data/archived-code/src/dry_lint/plugins.py.txt +120 -0
  851. dry_lint-1.6.0/docs/research/model-function/data/archived-code/src/dry_lint/policies.py.txt +63 -0
  852. dry_lint-1.6.0/docs/research/model-function/data/archived-code/src/dry_lint/presets.py.txt +149 -0
  853. dry_lint-1.6.0/docs/research/model-function/data/archived-code/src/dry_lint/python_schemas.py.txt +113 -0
  854. dry_lint-1.6.0/docs/research/model-function/data/archived-code/src/dry_lint/ranking.py.txt +43 -0
  855. dry_lint-1.6.0/docs/research/model-function/data/archived-code/src/dry_lint/replay.py.txt +174 -0
  856. dry_lint-1.6.0/docs/research/model-function/data/archived-code/src/dry_lint/report.py.txt +848 -0
  857. dry_lint-1.6.0/docs/research/model-function/data/archived-code/src/dry_lint/schema_policy.py.txt +235 -0
  858. dry_lint-1.6.0/docs/research/model-function/data/archived-code/src/dry_lint/settings.py.txt +205 -0
  859. dry_lint-1.6.0/docs/research/model-function/data/archived-code/src/dry_lint/source_context.py.txt +69 -0
  860. dry_lint-1.6.0/docs/research/model-function/data/archived-code/src/dry_lint/sticky.py.txt +384 -0
  861. dry_lint-1.6.0/docs/research/model-function/data/archived-code/src/dry_lint/store.py.txt +228 -0
  862. dry_lint-1.6.0/docs/research/model-function/data/archived-code/src/dry_lint/typescript.py.txt +386 -0
  863. dry_lint-1.6.0/docs/research/model-function/data/archived-code/summarize_experiment.py.txt +127 -0
  864. dry_lint-1.6.0/docs/research/model-function/data/archived-code/uv.lock.txt +1106 -0
  865. dry_lint-1.6.0/docs/research/model-function/data/background-catalog-lookup.json +72 -0
  866. dry_lint-1.6.0/docs/research/model-function/data/expected-replay.json +168 -0
  867. dry_lint-1.6.0/docs/research/model-function/data/frozen-metrics.json +204 -0
  868. dry_lint-1.6.0/docs/research/model-function/data/metrics.json +53 -0
  869. dry_lint-1.6.0/docs/research/model-function/data/private-aggregates.json +1 -0
  870. dry_lint-1.6.0/docs/research/model-function/data/provenance.json +638 -0
  871. dry_lint-1.6.0/docs/research/model-function/data/recordings.json.gz +0 -0
  872. dry_lint-1.6.0/docs/research/model-function/data/selected-source-files.json.gz +0 -0
  873. dry_lint-1.6.0/docs/research/model-function/data/source-manifest.json +1186 -0
  874. dry_lint-1.6.0/docs/research/model-function/data/specifications.json +165 -0
  875. dry_lint-1.6.0/docs/research/model-function/hydrate.py +59 -0
  876. dry_lint-1.6.0/docs/research/model-function/licenses/BerriAI--litellm.txt +26 -0
  877. dry_lint-1.6.0/docs/research/model-function/licenses/OpenHands--software-agent-sdk.txt +21 -0
  878. dry_lint-1.6.0/docs/research/model-function/licenses/anomalyco--opencode.txt +21 -0
  879. dry_lint-1.6.0/docs/research/model-function/licenses/dry-lint-Apache-2.0.txt +202 -0
  880. dry_lint-1.6.0/docs/research/model-function/licenses/pingdotgg--t3code.txt +21 -0
  881. dry_lint-1.6.0/docs/research/model-function/replay.py +142 -0
  882. dry_lint-1.6.0/docs/research/model-function/verify.py +76 -0
  883. dry_lint-1.6.0/docs/research/operation-blocks/CASES.md +120 -0
  884. dry_lint-1.6.0/docs/research/operation-blocks/CORPUS.md +15 -0
  885. dry_lint-1.6.0/docs/research/operation-blocks/FULL-RERUN.json +45 -0
  886. dry_lint-1.6.0/docs/research/operation-blocks/HANDOFF.json +26 -0
  887. dry_lint-1.6.0/docs/research/operation-blocks/PR-body.md +22 -0
  888. dry_lint-1.6.0/docs/research/operation-blocks/PR-title.txt +1 -0
  889. dry_lint-1.6.0/docs/research/operation-blocks/README.md +103 -0
  890. dry_lint-1.6.0/docs/research/operation-blocks/REPRODUCTION.md +46 -0
  891. dry_lint-1.6.0/docs/research/operation-blocks/SHA256SUMS +128 -0
  892. dry_lint-1.6.0/docs/research/operation-blocks/VALIDATION.json +90 -0
  893. dry_lint-1.6.0/docs/research/operation-blocks/audit.py +43 -0
  894. dry_lint-1.6.0/docs/research/operation-blocks/data/background-acquisition.json +72 -0
  895. dry_lint-1.6.0/docs/research/operation-blocks/data/evidence/environment.json +24 -0
  896. dry_lint-1.6.0/docs/research/operation-blocks/data/evidence/full-corpus-followup/span-v2-migration/paired-summary.json +609 -0
  897. dry_lint-1.6.0/docs/research/operation-blocks/data/evidence/funded-rounds/round2/full-source-stage-summary.json +94 -0
  898. dry_lint-1.6.0/docs/research/operation-blocks/data/evidence/funded-rounds/round2/paired-selector-transitions.json +12 -0
  899. dry_lint-1.6.0/docs/research/operation-blocks/data/holds.json +9 -0
  900. dry_lint-1.6.0/docs/research/operation-blocks/data/metrics.json +224 -0
  901. dry_lint-1.6.0/docs/research/operation-blocks/data/original/README.md +17 -0
  902. dry_lint-1.6.0/docs/research/operation-blocks/data/original/lab/EXPERIMENT.json.txt +78 -0
  903. dry_lint-1.6.0/docs/research/operation-blocks/data/original/lab/commands.sh.txt +20 -0
  904. dry_lint-1.6.0/docs/research/operation-blocks/data/original/lab/controls.py.txt +190 -0
  905. dry_lint-1.6.0/docs/research/operation-blocks/data/original/lab/diagnostics.py.txt +232 -0
  906. dry_lint-1.6.0/docs/research/operation-blocks/data/original/lab/environment.json.txt +24 -0
  907. dry_lint-1.6.0/docs/research/operation-blocks/data/original/lab/explicit_policies.py.txt +85 -0
  908. dry_lint-1.6.0/docs/research/operation-blocks/data/original/lab/finalize.py.txt +259 -0
  909. dry_lint-1.6.0/docs/research/operation-blocks/data/original/lab/full-corpus-followup/all_profile_intake.py.txt +119 -0
  910. dry_lint-1.6.0/docs/research/operation-blocks/data/original/lab/full-corpus-followup/audit_proposals.py.txt +102 -0
  911. dry_lint-1.6.0/docs/research/operation-blocks/data/original/lab/full-corpus-followup/audit_spans.py.txt +92 -0
  912. dry_lint-1.6.0/docs/research/operation-blocks/data/original/lab/full-corpus-followup/commands.sh.txt +25 -0
  913. dry_lint-1.6.0/docs/research/operation-blocks/data/original/lab/full-corpus-followup/consume_shared_spans.py.txt +89 -0
  914. dry_lint-1.6.0/docs/research/operation-blocks/data/original/lab/full-corpus-followup/coordinate_audit.py.txt +216 -0
  915. dry_lint-1.6.0/docs/research/operation-blocks/data/original/lab/full-corpus-followup/derive_v2.py.txt +177 -0
  916. dry_lint-1.6.0/docs/research/operation-blocks/data/original/lab/full-corpus-followup/finish.py.txt +160 -0
  917. dry_lint-1.6.0/docs/research/operation-blocks/data/original/lab/full-corpus-followup/intake_outcomes.py.txt +214 -0
  918. dry_lint-1.6.0/docs/research/operation-blocks/data/original/lab/full-corpus-followup/migrate.py.txt +302 -0
  919. dry_lint-1.6.0/docs/research/operation-blocks/data/original/lab/full-corpus-followup/optimized_blocks.py.txt +74 -0
  920. dry_lint-1.6.0/docs/research/operation-blocks/data/original/lab/full-corpus-followup/prepare.py.txt +77 -0
  921. dry_lint-1.6.0/docs/research/operation-blocks/data/original/lab/full-corpus-followup/queue.py.txt +312 -0
  922. dry_lint-1.6.0/docs/research/operation-blocks/data/original/lab/full-corpus-followup/run.py.txt +559 -0
  923. dry_lint-1.6.0/docs/research/operation-blocks/data/original/lab/full-corpus-followup/span-v2-migration/commands.sh.txt +12 -0
  924. dry_lint-1.6.0/docs/research/operation-blocks/data/original/lab/full-corpus-followup/span-v2-migration/shared_resolver_v1.py.txt +248 -0
  925. dry_lint-1.6.0/docs/research/operation-blocks/data/original/lab/full-corpus-followup/summarize.py.txt +490 -0
  926. dry_lint-1.6.0/docs/research/operation-blocks/data/original/lab/full-corpus-followup/validate.py.txt +90 -0
  927. dry_lint-1.6.0/docs/research/operation-blocks/data/original/lab/funded-rounds/finalize_evidence.py.txt +28 -0
  928. dry_lint-1.6.0/docs/research/operation-blocks/data/original/lab/funded-rounds/round1/concept-topup-v1/prepare.py.txt +89 -0
  929. dry_lint-1.6.0/docs/research/operation-blocks/data/original/lab/funded-rounds/round1/outcomes-v1/join.py.txt +79 -0
  930. dry_lint-1.6.0/docs/research/operation-blocks/data/original/lab/funded-rounds/round1/prepare.py.txt +320 -0
  931. dry_lint-1.6.0/docs/research/operation-blocks/data/original/lab/funded-rounds/round2/PREREGISTRATION.json.txt +24 -0
  932. dry_lint-1.6.0/docs/research/operation-blocks/data/original/lab/funded-rounds/round2/default3-rejection-audit-v1/prepare.py.txt +92 -0
  933. dry_lint-1.6.0/docs/research/operation-blocks/data/original/lab/funded-rounds/round2/full_source_audit.py.txt +47 -0
  934. dry_lint-1.6.0/docs/research/operation-blocks/data/original/lab/funded-rounds/round2/prepare.py.txt +123 -0
  935. dry_lint-1.6.0/docs/research/operation-blocks/data/original/lab/funded-rounds/round2/prepare_rejection_audit.py.txt +103 -0
  936. dry_lint-1.6.0/docs/research/operation-blocks/data/original/lab/funded-rounds/round2/residual_blocks.py.txt +62 -0
  937. dry_lint-1.6.0/docs/research/operation-blocks/data/original/lab/funded-rounds/verify_report.py.txt +82 -0
  938. dry_lint-1.6.0/docs/research/operation-blocks/data/original/lab/handoff.py.txt +263 -0
  939. dry_lint-1.6.0/docs/research/operation-blocks/data/original/lab/observations.py.txt +118 -0
  940. dry_lint-1.6.0/docs/research/operation-blocks/data/original/lab/operation_blocks.py.txt +702 -0
  941. dry_lint-1.6.0/docs/research/operation-blocks/data/original/lab/operation_blocks_capture_v1.py.txt +484 -0
  942. dry_lint-1.6.0/docs/research/operation-blocks/data/original/lab/promotion/commands.sh.txt +16 -0
  943. dry_lint-1.6.0/docs/research/operation-blocks/data/original/lab/promotion/compare_frozen.py.txt +226 -0
  944. dry_lint-1.6.0/docs/research/operation-blocks/data/original/lab/prompt_cost_compatibility.py.txt +157 -0
  945. dry_lint-1.6.0/docs/research/operation-blocks/data/original/lab/validate.py.txt +158 -0
  946. dry_lint-1.6.0/docs/research/operation-blocks/data/original/product/pyproject.toml.txt +71 -0
  947. dry_lint-1.6.0/docs/research/operation-blocks/data/original/product/src/dry_lint/__init__.py.txt +3 -0
  948. dry_lint-1.6.0/docs/research/operation-blocks/data/original/product/src/dry_lint/__main__.py.txt +5 -0
  949. dry_lint-1.6.0/docs/research/operation-blocks/data/original/product/src/dry_lint/action.py.txt +717 -0
  950. dry_lint-1.6.0/docs/research/operation-blocks/data/original/product/src/dry_lint/baseline.py.txt +370 -0
  951. dry_lint-1.6.0/docs/research/operation-blocks/data/original/product/src/dry_lint/bench.py.txt +274 -0
  952. dry_lint-1.6.0/docs/research/operation-blocks/data/original/product/src/dry_lint/bench_background.py.txt +88 -0
  953. dry_lint-1.6.0/docs/research/operation-blocks/data/original/product/src/dry_lint/cli.py.txt +1009 -0
  954. dry_lint-1.6.0/docs/research/operation-blocks/data/original/product/src/dry_lint/commits.py.txt +161 -0
  955. dry_lint-1.6.0/docs/research/operation-blocks/data/original/product/src/dry_lint/comparers.py.txt +62 -0
  956. dry_lint-1.6.0/docs/research/operation-blocks/data/original/product/src/dry_lint/comparison.py.txt +288 -0
  957. dry_lint-1.6.0/docs/research/operation-blocks/data/original/product/src/dry_lint/comparison_helpers.py.txt +85 -0
  958. dry_lint-1.6.0/docs/research/operation-blocks/data/original/product/src/dry_lint/costs.py.txt +152 -0
  959. dry_lint-1.6.0/docs/research/operation-blocks/data/original/product/src/dry_lint/detector.py.txt +363 -0
  960. dry_lint-1.6.0/docs/research/operation-blocks/data/original/product/src/dry_lint/discovery.py.txt +160 -0
  961. dry_lint-1.6.0/docs/research/operation-blocks/data/original/product/src/dry_lint/dryer.py.txt +96 -0
  962. dry_lint-1.6.0/docs/research/operation-blocks/data/original/product/src/dry_lint/evidence.py.txt +65 -0
  963. dry_lint-1.6.0/docs/research/operation-blocks/data/original/product/src/dry_lint/extractors.py.txt +81 -0
  964. dry_lint-1.6.0/docs/research/operation-blocks/data/original/product/src/dry_lint/feedback.py.txt +50 -0
  965. dry_lint-1.6.0/docs/research/operation-blocks/data/original/product/src/dry_lint/function_index.py.txt +203 -0
  966. dry_lint-1.6.0/docs/research/operation-blocks/data/original/product/src/dry_lint/functions.py.txt +386 -0
  967. dry_lint-1.6.0/docs/research/operation-blocks/data/original/product/src/dry_lint/git.py.txt +25 -0
  968. dry_lint-1.6.0/docs/research/operation-blocks/data/original/product/src/dry_lint/github.py.txt +11 -0
  969. dry_lint-1.6.0/docs/research/operation-blocks/data/original/product/src/dry_lint/index.py.txt +44 -0
  970. dry_lint-1.6.0/docs/research/operation-blocks/data/original/product/src/dry_lint/index_github.py.txt +183 -0
  971. dry_lint-1.6.0/docs/research/operation-blocks/data/original/product/src/dry_lint/judges/__init__.py.txt +30 -0
  972. dry_lint-1.6.0/docs/research/operation-blocks/data/original/product/src/dry_lint/judges/anthropic.py.txt +102 -0
  973. dry_lint-1.6.0/docs/research/operation-blocks/data/original/product/src/dry_lint/judges/command.py.txt +263 -0
  974. dry_lint-1.6.0/docs/research/operation-blocks/data/original/product/src/dry_lint/judges/gemini.py.txt +25 -0
  975. dry_lint-1.6.0/docs/research/operation-blocks/data/original/product/src/dry_lint/judges/http.py.txt +54 -0
  976. dry_lint-1.6.0/docs/research/operation-blocks/data/original/product/src/dry_lint/judges/jev.py.txt +224 -0
  977. dry_lint-1.6.0/docs/research/operation-blocks/data/original/product/src/dry_lint/judges/model_jev.py.txt +114 -0
  978. dry_lint-1.6.0/docs/research/operation-blocks/data/original/product/src/dry_lint/judges/subscription.py.txt +76 -0
  979. dry_lint-1.6.0/docs/research/operation-blocks/data/original/product/src/dry_lint/judging.py.txt +289 -0
  980. dry_lint-1.6.0/docs/research/operation-blocks/data/original/product/src/dry_lint/labelling.py.txt +402 -0
  981. dry_lint-1.6.0/docs/research/operation-blocks/data/original/product/src/dry_lint/ledger.py.txt +573 -0
  982. dry_lint-1.6.0/docs/research/operation-blocks/data/original/product/src/dry_lint/model_review.py.txt +123 -0
  983. dry_lint-1.6.0/docs/research/operation-blocks/data/original/product/src/dry_lint/model_shapes.py.txt +307 -0
  984. dry_lint-1.6.0/docs/research/operation-blocks/data/original/product/src/dry_lint/models.py.txt +270 -0
  985. dry_lint-1.6.0/docs/research/operation-blocks/data/original/product/src/dry_lint/operation_blocks.py.txt +242 -0
  986. dry_lint-1.6.0/docs/research/operation-blocks/data/original/product/src/dry_lint/plugins.py.txt +121 -0
  987. dry_lint-1.6.0/docs/research/operation-blocks/data/original/product/src/dry_lint/policies.py.txt +63 -0
  988. dry_lint-1.6.0/docs/research/operation-blocks/data/original/product/src/dry_lint/presets.py.txt +149 -0
  989. dry_lint-1.6.0/docs/research/operation-blocks/data/original/product/src/dry_lint/python_schemas.py.txt +113 -0
  990. dry_lint-1.6.0/docs/research/operation-blocks/data/original/product/src/dry_lint/ranking.py.txt +43 -0
  991. dry_lint-1.6.0/docs/research/operation-blocks/data/original/product/src/dry_lint/replay.py.txt +174 -0
  992. dry_lint-1.6.0/docs/research/operation-blocks/data/original/product/src/dry_lint/report.py.txt +848 -0
  993. dry_lint-1.6.0/docs/research/operation-blocks/data/original/product/src/dry_lint/schema_policy.py.txt +235 -0
  994. dry_lint-1.6.0/docs/research/operation-blocks/data/original/product/src/dry_lint/settings.py.txt +205 -0
  995. dry_lint-1.6.0/docs/research/operation-blocks/data/original/product/src/dry_lint/source_context.py.txt +69 -0
  996. dry_lint-1.6.0/docs/research/operation-blocks/data/original/product/src/dry_lint/sticky.py.txt +384 -0
  997. dry_lint-1.6.0/docs/research/operation-blocks/data/original/product/src/dry_lint/store.py.txt +228 -0
  998. dry_lint-1.6.0/docs/research/operation-blocks/data/original/product/src/dry_lint/typescript.py.txt +386 -0
  999. dry_lint-1.6.0/docs/research/operation-blocks/data/original/product/uv.lock.txt +1106 -0
  1000. dry_lint-1.6.0/docs/research/operation-blocks/data/paired-round2.json +1307 -0
  1001. dry_lint-1.6.0/docs/research/operation-blocks/data/provenance.json +728 -0
  1002. dry_lint-1.6.0/docs/research/operation-blocks/data/recordings.json +1485 -0
  1003. dry_lint-1.6.0/docs/research/operation-blocks/data/selected-original-regions.json +1492 -0
  1004. dry_lint-1.6.0/docs/research/operation-blocks/data/source-files.json.gz +0 -0
  1005. dry_lint-1.6.0/docs/research/operation-blocks/data/source-pins.json +9 -0
  1006. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/README.md +65 -0
  1007. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/balanced/LICENSE-litellm +26 -0
  1008. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/balanced/LICENSE-runtime +202 -0
  1009. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/balanced/LICENSE-software-agent-sdk +21 -0
  1010. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/balanced/MANIFEST.json +22 -0
  1011. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/balanced/README.md +51 -0
  1012. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/balanced/input-provenance.json +1082 -0
  1013. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/balanced/jev-truncation.json +130 -0
  1014. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/balanced/native-deltas.json +1058 -0
  1015. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/balanced/native-snapshots.zip +0 -0
  1016. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/balanced/recordings.json.gz +0 -0
  1017. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/balanced/reproduce.py +367 -0
  1018. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/balanced/requirements.txt +2 -0
  1019. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/balanced/runtime.zip +0 -0
  1020. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/balanced/selected-cases.json +938 -0
  1021. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/balanced/summary.json +63 -0
  1022. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/balanced/test_reproduce.py +54 -0
  1023. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/balanced/tests.txt +2 -0
  1024. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/balanced/verification.txt +64 -0
  1025. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/performance/README.md +42 -0
  1026. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/performance/SAFETY-ARGUMENT.txt +10 -0
  1027. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/performance/bench.py +161 -0
  1028. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/performance/inputs.json +87 -0
  1029. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/performance/metrics.json +973 -0
  1030. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/performance/novel_edits.py +105 -0
  1031. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/performance/origin.json +9 -0
  1032. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/performance/parity.py +305 -0
  1033. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/production-evidence.json +378 -0
  1034. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/production-parity-runtime.md +57 -0
  1035. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/HANDOFF.json +27 -0
  1036. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/MANIFEST.json +619 -0
  1037. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/NATIVE-RERUN.md +41 -0
  1038. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/README.md +47 -0
  1039. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/TABLES.md +59 -0
  1040. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/build_package.py +313 -0
  1041. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/data/blocks-regression.jsonl +115 -0
  1042. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/data/contexts.jsonl +14 -0
  1043. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/data/cpu-regression.jsonl +115 -0
  1044. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/data/labels.jsonl +75 -0
  1045. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/expected/direction-table.jsonl +348 -0
  1046. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/expected/floor-samefile.csv +23 -0
  1047. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/expected/floor-samefile.jsonl +22 -0
  1048. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/expected/regression-table.csv +45 -0
  1049. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/expected/regression-table.jsonl +44 -0
  1050. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/expected/stage-counts.jsonl +132 -0
  1051. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/blocks.py +234 -0
  1052. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/checks.py +119 -0
  1053. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/common.py +66 -0
  1054. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/cpu.py +247 -0
  1055. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/final_check.py +66 -0
  1056. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/freeze_inputs.py +50 -0
  1057. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/frozen-pr109/src/dry_lint/__init__.py +3 -0
  1058. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/frozen-pr109/src/dry_lint/__main__.py +5 -0
  1059. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/frozen-pr109/src/dry_lint/action.py +717 -0
  1060. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/frozen-pr109/src/dry_lint/baseline.py +370 -0
  1061. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/frozen-pr109/src/dry_lint/bench.py +274 -0
  1062. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/frozen-pr109/src/dry_lint/bench_background.py +88 -0
  1063. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/frozen-pr109/src/dry_lint/cli.py +1009 -0
  1064. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/frozen-pr109/src/dry_lint/commits.py +161 -0
  1065. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/frozen-pr109/src/dry_lint/comparers.py +62 -0
  1066. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/frozen-pr109/src/dry_lint/comparison.py +288 -0
  1067. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/frozen-pr109/src/dry_lint/comparison_helpers.py +85 -0
  1068. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/frozen-pr109/src/dry_lint/costs.py +152 -0
  1069. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/frozen-pr109/src/dry_lint/cpu_embedding.py +243 -0
  1070. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/frozen-pr109/src/dry_lint/detector.py +367 -0
  1071. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/frozen-pr109/src/dry_lint/discovery.py +160 -0
  1072. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/frozen-pr109/src/dry_lint/dryer.py +96 -0
  1073. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/frozen-pr109/src/dry_lint/evidence.py +65 -0
  1074. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/frozen-pr109/src/dry_lint/extractors.py +81 -0
  1075. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/frozen-pr109/src/dry_lint/feedback.py +50 -0
  1076. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/frozen-pr109/src/dry_lint/function_index.py +203 -0
  1077. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/frozen-pr109/src/dry_lint/functions.py +386 -0
  1078. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/frozen-pr109/src/dry_lint/git.py +25 -0
  1079. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/frozen-pr109/src/dry_lint/github.py +11 -0
  1080. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/frozen-pr109/src/dry_lint/index.py +44 -0
  1081. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/frozen-pr109/src/dry_lint/index_github.py +183 -0
  1082. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/frozen-pr109/src/dry_lint/judges/__init__.py +30 -0
  1083. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/frozen-pr109/src/dry_lint/judges/anthropic.py +102 -0
  1084. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/frozen-pr109/src/dry_lint/judges/command.py +263 -0
  1085. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/frozen-pr109/src/dry_lint/judges/gemini.py +25 -0
  1086. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/frozen-pr109/src/dry_lint/judges/http.py +54 -0
  1087. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/frozen-pr109/src/dry_lint/judges/jev.py +224 -0
  1088. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/frozen-pr109/src/dry_lint/judges/model_jev.py +114 -0
  1089. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/frozen-pr109/src/dry_lint/judges/subscription.py +76 -0
  1090. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/frozen-pr109/src/dry_lint/judging.py +289 -0
  1091. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/frozen-pr109/src/dry_lint/labelling.py +402 -0
  1092. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/frozen-pr109/src/dry_lint/ledger.py +573 -0
  1093. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/frozen-pr109/src/dry_lint/model_review.py +123 -0
  1094. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/frozen-pr109/src/dry_lint/model_shapes.py +307 -0
  1095. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/frozen-pr109/src/dry_lint/models.py +270 -0
  1096. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/frozen-pr109/src/dry_lint/operation_blocks.py +242 -0
  1097. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/frozen-pr109/src/dry_lint/plugins.py +122 -0
  1098. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/frozen-pr109/src/dry_lint/policies.py +63 -0
  1099. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/frozen-pr109/src/dry_lint/presets.py +149 -0
  1100. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/frozen-pr109/src/dry_lint/python_schemas.py +113 -0
  1101. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/frozen-pr109/src/dry_lint/ranking.py +43 -0
  1102. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/frozen-pr109/src/dry_lint/replay.py +174 -0
  1103. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/frozen-pr109/src/dry_lint/report.py +848 -0
  1104. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/frozen-pr109/src/dry_lint/schema_policy.py +235 -0
  1105. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/frozen-pr109/src/dry_lint/settings.py +205 -0
  1106. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/frozen-pr109/src/dry_lint/source_context.py +69 -0
  1107. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/frozen-pr109/src/dry_lint/sticky.py +384 -0
  1108. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/frozen-pr109/src/dry_lint/store.py +228 -0
  1109. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/frozen-pr109/src/dry_lint/typescript.py +386 -0
  1110. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/harness.py +146 -0
  1111. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/helper_fallback_v1.py +109 -0
  1112. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/materialize.py +204 -0
  1113. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/reproduce.sh +11 -0
  1114. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/run-python +7 -0
  1115. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/summarize.py +329 -0
  1116. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/trace.py +20 -0
  1117. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/verify_contract.py +23 -0
  1118. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/harness/views.py +64 -0
  1119. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/historical-output-snapshot.json +4860 -0
  1120. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/licenses/dry-lint-LICENSE.txt +202 -0
  1121. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/licenses/provenance.json +34 -0
  1122. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/licenses/pytest-obligation-389c5bb8-LICENSE.txt +202 -0
  1123. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/licenses/pytest-obligation-d39f77ea-LICENSE.txt +202 -0
  1124. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/licenses/pytest-selective-ae130637-LICENSE.txt +202 -0
  1125. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/native_rerun.py +110 -0
  1126. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/provenance/checks.json +14 -0
  1127. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/provenance/cpu-contract-check.json +91 -0
  1128. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/provenance/cpu-replay-parity.json +5 -0
  1129. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/provenance/dependencies.json +16 -0
  1130. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/provenance/export.json +111 -0
  1131. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/provenance/final-check.json +27 -0
  1132. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/provenance/frozen-source-manifest.json +343 -0
  1133. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/provenance/input-proofs.json +88 -0
  1134. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/provenance/policies.json +75 -0
  1135. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/provenance/runtime-summary.json +6 -0
  1136. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/replay.py +248 -0
  1137. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/test_replay.py +87 -0
  1138. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/validation/historical-immutability.json +7 -0
  1139. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/validation/lint-final.txt +1 -0
  1140. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/validation/native-preflight.txt +1 -0
  1141. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/validation/replay-tests.json +16 -0
  1142. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/verify.py +46 -0
  1143. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/worked-cases/manifest.json +116 -0
  1144. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/worked-cases/pytest-obligation/389c5bb8/1034-function.txt +4 -0
  1145. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/worked-cases/pytest-obligation/389c5bb8/1622-function.txt +13 -0
  1146. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/worked-cases/pytest-obligation/389c5bb8/969-function.txt +2 -0
  1147. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/worked-cases/pytest-obligation/389c5bb8/package/src/pytest_obligation/integrations/mongodb.py +208 -0
  1148. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/worked-cases/pytest-obligation/389c5bb8/package/src/pytest_obligation/integrations/redis.py +212 -0
  1149. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/worked-cases/pytest-obligation/389c5bb8/package/src/pytest_obligation/worker_death.py +93 -0
  1150. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/worked-cases/pytest-obligation/d39f77ea/1037-function.txt +10 -0
  1151. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/worked-cases/pytest-obligation/d39f77ea/971-function.txt +8 -0
  1152. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/worked-cases/pytest-obligation/d39f77ea/package/src/pytest_obligation/integrations/mongodb.py +213 -0
  1153. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/worked-cases/pytest-obligation/d39f77ea/package/src/pytest_obligation/integrations/redis.py +217 -0
  1154. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/worked-cases/pytest-selective/ae130637/237-function.txt +14 -0
  1155. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/worked-cases/pytest-selective/ae130637/271-function.txt +34 -0
  1156. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/worked-cases/pytest-selective/ae130637/src/pytest_selective/pytest_expansion.py +535 -0
  1157. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/public-extension/worked-cases/pytest-selective/ae130637/src/pytest_selective/working_tree.py +43 -0
  1158. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/r1/LiteLLM-LICENSE.txt +26 -0
  1159. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/r1/OpenHands-LICENSE.txt +21 -0
  1160. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/r1/README.md +46 -0
  1161. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/r1/SHA256SUMS.json +23 -0
  1162. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/r1/admissions.jsonl.gz +0 -0
  1163. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/r1/answers.jsonl.gz +0 -0
  1164. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/r1/baseline_operation_blocks.py +242 -0
  1165. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/r1/cases.jsonl.gz +0 -0
  1166. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/r1/concept-prompt.txt +22 -0
  1167. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/r1/configuration.json +37 -0
  1168. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/r1/dry-lint-LICENSE.txt +202 -0
  1169. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/r1/helper_fallback_v1.py +109 -0
  1170. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/r1/input-audit.json +357 -0
  1171. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/r1/questions.jsonl.gz +0 -0
  1172. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/r1/recipe.json +23 -0
  1173. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/r1/replay-result.json +41 -0
  1174. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/r1/replay.py +148 -0
  1175. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/r1/retrieval-recordings.jsonl.gz +0 -0
  1176. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/r1/shared-operations-prompt.txt +46 -0
  1177. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/r1/source-decisions.jsonl.gz +0 -0
  1178. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/r1/test_replay_policy.py +25 -0
  1179. dry_lint-1.6.0/docs/research/operation-blocks/helper-recovery/r1/verify_hashes.py +8 -0
  1180. dry_lint-1.6.0/docs/research/operation-blocks/hydrate.py +37 -0
  1181. dry_lint-1.6.0/docs/research/operation-blocks/licenses/BerriAI--litellm.txt +26 -0
  1182. dry_lint-1.6.0/docs/research/operation-blocks/licenses/dry-lint.txt +202 -0
  1183. dry_lint-1.6.0/docs/research/operation-blocks/materialize.py +21 -0
  1184. dry_lint-1.6.0/docs/research/operation-blocks/native.py +36 -0
  1185. dry_lint-1.6.0/docs/research/operation-blocks/reproduce.py +186 -0
  1186. dry_lint-1.6.0/docs/research/signal-ensemble/DATA-CONTRACT.json +74 -0
  1187. dry_lint-1.6.0/docs/research/signal-ensemble/HANDOFF.json +32 -0
  1188. dry_lint-1.6.0/docs/research/signal-ensemble/PR-body.md +24 -0
  1189. dry_lint-1.6.0/docs/research/signal-ensemble/PR-title.txt +1 -0
  1190. dry_lint-1.6.0/docs/research/signal-ensemble/README.md +113 -0
  1191. dry_lint-1.6.0/docs/research/signal-ensemble/SHA256SUMS +132 -0
  1192. dry_lint-1.6.0/docs/research/signal-ensemble/VALIDATION.md +11 -0
  1193. dry_lint-1.6.0/docs/research/signal-ensemble/algorithm.py +36 -0
  1194. dry_lint-1.6.0/docs/research/signal-ensemble/backgrounds.py +37 -0
  1195. dry_lint-1.6.0/docs/research/signal-ensemble/cases/ENS-L2002/case.json +323 -0
  1196. dry_lint-1.6.0/docs/research/signal-ensemble/cases/ENS-L2002/claude-answer.json +51 -0
  1197. dry_lint-1.6.0/docs/research/signal-ensemble/cases/ENS-L2002/claude-request.txt +214 -0
  1198. dry_lint-1.6.0/docs/research/signal-ensemble/cases/ENS-L2002/jev-answer.json +25 -0
  1199. dry_lint-1.6.0/docs/research/signal-ensemble/cases/ENS-L2002/jev-request.txt +1 -0
  1200. dry_lint-1.6.0/docs/research/signal-ensemble/cases/SE-R2-001/case.json +391 -0
  1201. dry_lint-1.6.0/docs/research/signal-ensemble/cases/SE-R2-001/claude-answer.json +51 -0
  1202. dry_lint-1.6.0/docs/research/signal-ensemble/cases/SE-R2-001/claude-request.txt +138 -0
  1203. dry_lint-1.6.0/docs/research/signal-ensemble/cases/SE-R2-001/jev-answer.json +25 -0
  1204. dry_lint-1.6.0/docs/research/signal-ensemble/cases/SE-R2-001/jev-request.txt +1 -0
  1205. dry_lint-1.6.0/docs/research/signal-ensemble/cases/SE-R2-016/case.json +386 -0
  1206. dry_lint-1.6.0/docs/research/signal-ensemble/cases/SE-R2-016/claude-answer.json +51 -0
  1207. dry_lint-1.6.0/docs/research/signal-ensemble/cases/SE-R2-016/claude-request.txt +156 -0
  1208. dry_lint-1.6.0/docs/research/signal-ensemble/cases/SE-R2-016/jev-answer.json +25 -0
  1209. dry_lint-1.6.0/docs/research/signal-ensemble/cases/SE-R2-016/jev-request.txt +1 -0
  1210. dry_lint-1.6.0/docs/research/signal-ensemble/data/algorithm-input.json +198 -0
  1211. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/LICENSE.txt +202 -0
  1212. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/experiment.py.txt +731 -0
  1213. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/full-corpus/resolver.py.txt +243 -0
  1214. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/full-corpus/run.py.txt +892 -0
  1215. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/funded-rounds/round1/build_canonical_plans.py.txt +41 -0
  1216. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/funded-rounds/round1/prepare.py.txt +168 -0
  1217. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/funded-rounds/round1/validate_active.py.txt +62 -0
  1218. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/funded-rounds/round2/build_canonical_plans.py.txt +41 -0
  1219. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/funded-rounds/round2/gold_regression.py.txt +97 -0
  1220. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/funded-rounds/round2/operation_gate.py.txt +13 -0
  1221. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/funded-rounds/round2/prepare.py.txt +187 -0
  1222. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/funded-rounds/round2/validate_active.py.txt +62 -0
  1223. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/learned-ensemble-v1/audit_fixed.py.txt +26 -0
  1224. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/learned-ensemble-v1/complementarity_receipt.py.txt +41 -0
  1225. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/learned-ensemble-v1/evaluate.py.txt +80 -0
  1226. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/learned-ensemble-v1/finalize.py.txt +36 -0
  1227. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/learned-ensemble-v1/fit_oof.py.txt +67 -0
  1228. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/learned-ensemble-v1/prepare_features.py.txt +147 -0
  1229. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/learned-ensemble-v1/summarize.py.txt +59 -0
  1230. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/learned-ensemble-v1/verify.py.txt +43 -0
  1231. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/make_queue.py.txt +214 -0
  1232. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/promotion-combination/native-order-v2/answers_and_intake.py.txt +71 -0
  1233. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/promotion-combination/native-order-v2/run.py.txt +176 -0
  1234. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/promotion-combination/product_selection.py.txt +45 -0
  1235. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/promotion-combination/reconcile_block1.py.txt +59 -0
  1236. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/promotion-combination/run.py.txt +156 -0
  1237. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/pyproject.toml.txt +71 -0
  1238. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/register.py.txt +115 -0
  1239. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/span-resolution-original-run.py.txt +909 -0
  1240. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/src/dry_lint/__init__.py.txt +3 -0
  1241. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/src/dry_lint/__main__.py.txt +5 -0
  1242. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/src/dry_lint/action.py.txt +717 -0
  1243. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/src/dry_lint/baseline.py.txt +370 -0
  1244. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/src/dry_lint/bench.py.txt +274 -0
  1245. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/src/dry_lint/bench_background.py.txt +88 -0
  1246. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/src/dry_lint/cli.py.txt +1009 -0
  1247. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/src/dry_lint/commits.py.txt +161 -0
  1248. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/src/dry_lint/comparers.py.txt +62 -0
  1249. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/src/dry_lint/comparison.py.txt +288 -0
  1250. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/src/dry_lint/comparison_helpers.py.txt +85 -0
  1251. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/src/dry_lint/costs.py.txt +152 -0
  1252. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/src/dry_lint/detector.py.txt +354 -0
  1253. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/src/dry_lint/discovery.py.txt +160 -0
  1254. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/src/dry_lint/dryer.py.txt +96 -0
  1255. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/src/dry_lint/evidence.py.txt +65 -0
  1256. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/src/dry_lint/extractors.py.txt +81 -0
  1257. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/src/dry_lint/feedback.py.txt +50 -0
  1258. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/src/dry_lint/function_index.py.txt +203 -0
  1259. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/src/dry_lint/functions.py.txt +386 -0
  1260. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/src/dry_lint/git.py.txt +25 -0
  1261. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/src/dry_lint/github.py.txt +11 -0
  1262. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/src/dry_lint/index.py.txt +44 -0
  1263. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/src/dry_lint/index_github.py.txt +183 -0
  1264. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/src/dry_lint/judges/__init__.py.txt +30 -0
  1265. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/src/dry_lint/judges/anthropic.py.txt +102 -0
  1266. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/src/dry_lint/judges/command.py.txt +263 -0
  1267. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/src/dry_lint/judges/gemini.py.txt +25 -0
  1268. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/src/dry_lint/judges/http.py.txt +54 -0
  1269. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/src/dry_lint/judges/jev.py.txt +224 -0
  1270. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/src/dry_lint/judges/model_jev.py.txt +114 -0
  1271. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/src/dry_lint/judges/subscription.py.txt +76 -0
  1272. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/src/dry_lint/judging.py.txt +289 -0
  1273. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/src/dry_lint/labelling.py.txt +402 -0
  1274. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/src/dry_lint/ledger.py.txt +573 -0
  1275. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/src/dry_lint/model_review.py.txt +123 -0
  1276. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/src/dry_lint/model_shapes.py.txt +307 -0
  1277. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/src/dry_lint/models.py.txt +270 -0
  1278. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/src/dry_lint/plugins.py.txt +120 -0
  1279. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/src/dry_lint/policies.py.txt +63 -0
  1280. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/src/dry_lint/presets.py.txt +149 -0
  1281. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/src/dry_lint/python_schemas.py.txt +113 -0
  1282. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/src/dry_lint/ranking.py.txt +43 -0
  1283. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/src/dry_lint/replay.py.txt +174 -0
  1284. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/src/dry_lint/report.py.txt +848 -0
  1285. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/src/dry_lint/schema_policy.py.txt +235 -0
  1286. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/src/dry_lint/settings.py.txt +205 -0
  1287. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/src/dry_lint/source_context.py.txt +69 -0
  1288. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/src/dry_lint/sticky.py.txt +384 -0
  1289. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/src/dry_lint/store.py.txt +228 -0
  1290. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/src/dry_lint/typescript.py.txt +386 -0
  1291. dry_lint-1.6.0/docs/research/signal-ensemble/data/archived-code/uv.lock.txt +1106 -0
  1292. dry_lint-1.6.0/docs/research/signal-ensemble/data/background-catalog-lookup.json +72 -0
  1293. dry_lint-1.6.0/docs/research/signal-ensemble/data/block-cap-comparison-rows.jsonl.gz +0 -0
  1294. dry_lint-1.6.0/docs/research/signal-ensemble/data/block-cap-comparison.json +149 -0
  1295. dry_lint-1.6.0/docs/research/signal-ensemble/data/expected-replay.json +121 -0
  1296. dry_lint-1.6.0/docs/research/signal-ensemble/data/learned-comparison.json +176 -0
  1297. dry_lint-1.6.0/docs/research/signal-ensemble/data/matched-regression-rows.jsonl.gz +0 -0
  1298. dry_lint-1.6.0/docs/research/signal-ensemble/data/metrics.json +128 -0
  1299. dry_lint-1.6.0/docs/research/signal-ensemble/data/private-aggregates.json +8 -0
  1300. dry_lint-1.6.0/docs/research/signal-ensemble/data/provenance.json +725 -0
  1301. dry_lint-1.6.0/docs/research/signal-ensemble/data/recommended-config.json +36 -0
  1302. dry_lint-1.6.0/docs/research/signal-ensemble/data/recordings.json.gz +0 -0
  1303. dry_lint-1.6.0/docs/research/signal-ensemble/data/regression-scope-rows.jsonl.gz +0 -0
  1304. dry_lint-1.6.0/docs/research/signal-ensemble/data/reviewed-writeback-case.json +14 -0
  1305. dry_lint-1.6.0/docs/research/signal-ensemble/data/runtime.json +102 -0
  1306. dry_lint-1.6.0/docs/research/signal-ensemble/data/selected-source-files.json.gz +0 -0
  1307. dry_lint-1.6.0/docs/research/signal-ensemble/data/source-manifest.json +842 -0
  1308. dry_lint-1.6.0/docs/research/signal-ensemble/data/specifications.json +474 -0
  1309. dry_lint-1.6.0/docs/research/signal-ensemble/data/static-publication-boundary.json +149 -0
  1310. dry_lint-1.6.0/docs/research/signal-ensemble/data/supported-regression.json +113 -0
  1311. dry_lint-1.6.0/docs/research/signal-ensemble/hydrate.py +59 -0
  1312. dry_lint-1.6.0/docs/research/signal-ensemble/licenses/BerriAI--litellm.txt +26 -0
  1313. dry_lint-1.6.0/docs/research/signal-ensemble/licenses/OpenHands--software-agent-sdk.txt +21 -0
  1314. dry_lint-1.6.0/docs/research/signal-ensemble/licenses/anomalyco--opencode.txt +21 -0
  1315. dry_lint-1.6.0/docs/research/signal-ensemble/licenses/dry-lint-Apache-2.0.txt +202 -0
  1316. dry_lint-1.6.0/docs/research/signal-ensemble/licenses/pingdotgg--t3code.txt +21 -0
  1317. dry_lint-1.6.0/docs/research/signal-ensemble/raw-rank-followup/README.md +42 -0
  1318. dry_lint-1.6.0/docs/research/signal-ensemble/raw-rank-followup/audit-summary.json +59 -0
  1319. dry_lint-1.6.0/docs/research/signal-ensemble/replay.py +142 -0
  1320. dry_lint-1.6.0/docs/research/signal-ensemble/verify.py +76 -0
  1321. dry_lint-1.6.0/docs/research/token-hygiene/.gitignore +2 -0
  1322. dry_lint-1.6.0/docs/research/token-hygiene/CHECKS.json +215 -0
  1323. dry_lint-1.6.0/docs/research/token-hygiene/CORPUS.json +838 -0
  1324. dry_lint-1.6.0/docs/research/token-hygiene/HANDOFF.json +15 -0
  1325. dry_lint-1.6.0/docs/research/token-hygiene/PR-body.md +20 -0
  1326. dry_lint-1.6.0/docs/research/token-hygiene/PR-title.txt +1 -0
  1327. dry_lint-1.6.0/docs/research/token-hygiene/PROVENANCE.json +86 -0
  1328. dry_lint-1.6.0/docs/research/token-hygiene/README.md +73 -0
  1329. dry_lint-1.6.0/docs/research/token-hygiene/SHA256SUMS +41 -0
  1330. dry_lint-1.6.0/docs/research/token-hygiene/acquire.py +22 -0
  1331. dry_lint-1.6.0/docs/research/token-hygiene/data/evidence/DECISION.md +3 -0
  1332. dry_lint-1.6.0/docs/research/token-hygiene/data/evidence/MANIFEST.json +69 -0
  1333. dry_lint-1.6.0/docs/research/token-hygiene/data/evidence/README.md +35 -0
  1334. dry_lint-1.6.0/docs/research/token-hygiene/data/evidence/default-four-losses.jsonl +4 -0
  1335. dry_lint-1.6.0/docs/research/token-hygiene/data/evidence/metrics.json +1 -0
  1336. dry_lint-1.6.0/docs/research/token-hygiene/data/evidence/novel-outcomes.jsonl +96 -0
  1337. dry_lint-1.6.0/docs/research/token-hygiene/data/evidence/paired-rows.jsonl.gz +0 -0
  1338. dry_lint-1.6.0/docs/research/token-hygiene/data/evidence/source-outcomes.jsonl +2 -0
  1339. dry_lint-1.6.0/docs/research/token-hygiene/data/evidence/verify_evidence.py +44 -0
  1340. dry_lint-1.6.0/docs/research/token-hygiene/data/feed-provenance.json +10 -0
  1341. dry_lint-1.6.0/docs/research/token-hygiene/data/final-source-decisions.json +34 -0
  1342. dry_lint-1.6.0/docs/research/token-hygiene/data/held-request-templates.json +6032 -0
  1343. dry_lint-1.6.0/docs/research/token-hygiene/data/implementation.json.gz +0 -0
  1344. dry_lint-1.6.0/docs/research/token-hygiene/data/observations.jsonl +192 -0
  1345. dry_lint-1.6.0/docs/research/token-hygiene/data/policy-admissions.jsonl +96 -0
  1346. dry_lint-1.6.0/docs/research/token-hygiene/data/recorded-replay.json +140 -0
  1347. dry_lint-1.6.0/docs/research/token-hygiene/data/selected-cases.json.gz +0 -0
  1348. dry_lint-1.6.0/docs/research/token-hygiene/data/source-files.json.gz +0 -0
  1349. dry_lint-1.6.0/docs/research/token-hygiene/data/source-manifest.json +4667 -0
  1350. dry_lint-1.6.0/docs/research/token-hygiene/data/source-pins.json +36 -0
  1351. dry_lint-1.6.0/docs/research/token-hygiene/data/transform-inputs.json +351 -0
  1352. dry_lint-1.6.0/docs/research/token-hygiene/hydrate.py +31 -0
  1353. dry_lint-1.6.0/docs/research/token-hygiene/implementation/README.md +1 -0
  1354. dry_lint-1.6.0/docs/research/token-hygiene/implementation/lab--funded-rounds--round2--evaluate.py.txt +134 -0
  1355. dry_lint-1.6.0/docs/research/token-hygiene/implementation/lab--token-hygiene--experiment.py.txt +515 -0
  1356. dry_lint-1.6.0/docs/research/token-hygiene/licenses/BerriAI--litellm.txt +26 -0
  1357. dry_lint-1.6.0/docs/research/token-hygiene/licenses/OpenHands--software-agent-sdk.txt +21 -0
  1358. dry_lint-1.6.0/docs/research/token-hygiene/licenses/anomalyco--opencode.txt +21 -0
  1359. dry_lint-1.6.0/docs/research/token-hygiene/licenses/dry-lint.txt +202 -0
  1360. dry_lint-1.6.0/docs/research/token-hygiene/licenses/pingdotgg--t3code.txt +21 -0
  1361. dry_lint-1.6.0/docs/research/token-hygiene/reproduce.py +133 -0
  1362. dry_lint-1.6.0/docs/research/token-hygiene/transform.py +47 -0
  1363. dry_lint-1.6.0/docs/research/vector-expansion/.gitignore +2 -0
  1364. dry_lint-1.6.0/docs/research/vector-expansion/CHECKS.json +354 -0
  1365. dry_lint-1.6.0/docs/research/vector-expansion/CORPUS.json +838 -0
  1366. dry_lint-1.6.0/docs/research/vector-expansion/HANDOFF.json +15 -0
  1367. dry_lint-1.6.0/docs/research/vector-expansion/PR-body.md +20 -0
  1368. dry_lint-1.6.0/docs/research/vector-expansion/PR-title.txt +1 -0
  1369. dry_lint-1.6.0/docs/research/vector-expansion/PROVENANCE.json +51 -0
  1370. dry_lint-1.6.0/docs/research/vector-expansion/README.md +101 -0
  1371. dry_lint-1.6.0/docs/research/vector-expansion/SHA256SUMS +40 -0
  1372. dry_lint-1.6.0/docs/research/vector-expansion/acquire.py +22 -0
  1373. dry_lint-1.6.0/docs/research/vector-expansion/aggregate.py +16 -0
  1374. dry_lint-1.6.0/docs/research/vector-expansion/data/evidence/CLAIM-EVIDENCE.json +30 -0
  1375. dry_lint-1.6.0/docs/research/vector-expansion/data/evidence/DECISION.md +46 -0
  1376. dry_lint-1.6.0/docs/research/vector-expansion/data/evidence/FINAL-METRICS.json +1 -0
  1377. dry_lint-1.6.0/docs/research/vector-expansion/data/evidence/SOURCE-D-RECEIPT.json +229 -0
  1378. dry_lint-1.6.0/docs/research/vector-expansion/data/feed-provenance.json +15 -0
  1379. dry_lint-1.6.0/docs/research/vector-expansion/data/final-source-decisions.json +600 -0
  1380. dry_lint-1.6.0/docs/research/vector-expansion/data/held-request-templates.json +1 -0
  1381. dry_lint-1.6.0/docs/research/vector-expansion/data/implementation.json.gz +0 -0
  1382. dry_lint-1.6.0/docs/research/vector-expansion/data/observations.jsonl +254 -0
  1383. dry_lint-1.6.0/docs/research/vector-expansion/data/paired-records.json.gz +0 -0
  1384. dry_lint-1.6.0/docs/research/vector-expansion/data/policy-admissions.jsonl +128 -0
  1385. dry_lint-1.6.0/docs/research/vector-expansion/data/recorded-replay.json +168 -0
  1386. dry_lint-1.6.0/docs/research/vector-expansion/data/selected-cases.json.gz +0 -0
  1387. dry_lint-1.6.0/docs/research/vector-expansion/data/source-files.json.gz +0 -0
  1388. dry_lint-1.6.0/docs/research/vector-expansion/data/source-manifest.json +5336 -0
  1389. dry_lint-1.6.0/docs/research/vector-expansion/data/source-pins.json +16 -0
  1390. dry_lint-1.6.0/docs/research/vector-expansion/data/supplemental-observations.jsonl +12 -0
  1391. dry_lint-1.6.0/docs/research/vector-expansion/data/transform-inputs.json +926 -0
  1392. dry_lint-1.6.0/docs/research/vector-expansion/hydrate.py +31 -0
  1393. dry_lint-1.6.0/docs/research/vector-expansion/implementation/README.md +1 -0
  1394. dry_lint-1.6.0/docs/research/vector-expansion/implementation/lab--full-corpus--vector_engine.py.txt +103 -0
  1395. dry_lint-1.6.0/docs/research/vector-expansion/implementation/lab--funded-rounds--round2--source_pmi.py.txt +83 -0
  1396. dry_lint-1.6.0/docs/research/vector-expansion/licenses/BerriAI--litellm.txt +26 -0
  1397. dry_lint-1.6.0/docs/research/vector-expansion/licenses/OpenHands--software-agent-sdk.txt +21 -0
  1398. dry_lint-1.6.0/docs/research/vector-expansion/licenses/anomalyco--opencode.txt +21 -0
  1399. dry_lint-1.6.0/docs/research/vector-expansion/licenses/dry-lint.txt +202 -0
  1400. dry_lint-1.6.0/docs/research/vector-expansion/licenses/pingdotgg--t3code.txt +21 -0
  1401. dry_lint-1.6.0/docs/research/vector-expansion/reproduce.py +139 -0
  1402. dry_lint-1.6.0/docs/research/vector-expansion/run_original.py +38 -0
  1403. dry_lint-1.6.0/docs/research/vector-expansion/transform.py +54 -0
  1404. dry_lint-1.6.0/docs/research-plan.md +171 -0
  1405. dry_lint-1.6.0/docs/research-results.md +24 -0
  1406. dry_lint-1.6.0/docs/retrieval-presets.md +162 -0
  1407. dry_lint-1.6.0/docs/semantic-signal-trial.md +131 -0
  1408. dry_lint-1.6.0/docs/sweeps.md +153 -0
  1409. dry_lint-1.6.0/docs/tfidf-enrichment-research.md +561 -0
  1410. dry_lint-1.6.0/docs/typescript.md +100 -0
  1411. dry_lint-1.6.0/docs/work-in-progress/tickets/codex-agent-feedback-judging-test-plan.md +27 -0
  1412. dry_lint-1.6.0/docs/work-in-progress/tickets/codex-budgeted-discovery-test-plan.md +29 -0
  1413. dry_lint-1.6.0/docs/work-in-progress/tickets/codex-consolidation-context-test-plan.md +28 -0
  1414. dry_lint-1.6.0/docs/work-in-progress/tickets/codex-coverage-exploration-test-plan.md +22 -0
  1415. dry_lint-1.6.0/docs/work-in-progress/tickets/codex-model-policy-discovery-test-plan.md +61 -0
  1416. dry_lint-1.6.0/docs/work-in-progress/tickets/codex-production-discovery-test-plan.md +17 -0
  1417. dry_lint-1.6.0/docs/work-in-progress/tickets/codex-protected-shared-operations-test-plan.md +24 -0
  1418. dry_lint-1.6.0/docs/work-in-progress/tickets/codex-versioned-function-index-test-plan.md +12 -0
  1419. dry_lint-1.6.0/docs/work-in-progress/tickets/language-adapters-test-plan.md +38 -0
  1420. dry_lint-1.6.0/docs/work-in-progress/tickets/shallow-single-sticky-test-plan.md +15 -0
  1421. dry_lint-1.6.0/docs/work-in-progress/tickets/sticky-comparison-test-plan.md +8 -0
  1422. dry_lint-1.6.0/docs/workspaces.md +148 -0
  1423. dry_lint-1.6.0/examples/backgrounds/due/33857688849a481a794b46295f4080dca853cc0f.json.gz +0 -0
  1424. dry_lint-1.6.0/examples/backgrounds/due/6a68131774a25b6a7b6a192ca578be9b7ab5e1d4.json.gz +0 -0
  1425. dry_lint-1.6.0/examples/backgrounds/due/701d2167dc7ca192bfd2c9c5e98e1c377a5f23a0.json.gz +0 -0
  1426. dry_lint-1.6.0/examples/backgrounds/due/8d4d100b3a9ffb2ef259931508f0ccde87a968dd.json.gz +0 -0
  1427. dry_lint-1.6.0/examples/backgrounds/due/d45977a85f1804d8c6cbc3b35d02fd61438f7531.json.gz +0 -0
  1428. dry_lint-1.6.0/examples/backgrounds/due/manifest.json +95 -0
  1429. dry_lint-1.6.0/examples/backgrounds/pytest-obligation/389c5bb84f7ab186fa9c7815c2e15cb9332b67a4.json.gz +0 -0
  1430. dry_lint-1.6.0/examples/backgrounds/pytest-obligation/d39f77ea343a25bf0a065376ea7a50ed38c7b2f6.json.gz +0 -0
  1431. dry_lint-1.6.0/examples/backgrounds/pytest-obligation/manifest.json +233 -0
  1432. dry_lint-1.6.0/examples/backgrounds/pytest-selective/4ab22f35385bb0e3225cf9d40877b559d45c23dc.json.gz +0 -0
  1433. dry_lint-1.6.0/examples/backgrounds/pytest-selective/ae1306377dda82d1d0a6fa0b43dbb612d69d72b2.json.gz +0 -0
  1434. dry_lint-1.6.0/examples/backgrounds/pytest-selective/manifest.json +197 -0
  1435. dry_lint-1.6.0/examples/comment-report.json +94 -0
  1436. dry_lint-1.6.0/examples/dry-lint-audit.yml +117 -0
  1437. dry_lint-1.6.0/examples/dry-lint-judge.yml +26 -0
  1438. dry_lint-1.6.0/examples/dry-lint.yml +39 -0
  1439. dry_lint-1.6.0/examples/due-consolidation-gold.toml +755 -0
  1440. dry_lint-1.6.0/examples/fake_judge.py +11 -0
  1441. dry_lint-1.6.0/examples/gold.toml +891 -0
  1442. dry_lint-1.6.0/examples/pre-commit-config.yaml +15 -0
  1443. dry_lint-1.6.0/examples/pytest-obligation-gold.toml +574 -0
  1444. dry_lint-1.6.0/examples/pytest-selective-gold.toml +481 -0
  1445. dry_lint-1.6.0/examples/research/budget-family-proof/LITELLM-LICENSE +26 -0
  1446. dry_lint-1.6.0/examples/research/budget-family-proof/README.md +174 -0
  1447. dry_lint-1.6.0/examples/research/budget-family-proof/detect.py +80 -0
  1448. dry_lint-1.6.0/examples/research/budget-family-proof/extraction.patch +252 -0
  1449. dry_lint-1.6.0/examples/research/budget-family-proof/family-tfidf-diagnostic.py +114 -0
  1450. dry_lint-1.6.0/examples/research/budget-family-proof/reproduce.py +53 -0
  1451. dry_lint-1.6.0/examples/research/budget-family-proof/study.py +442 -0
  1452. dry_lint-1.6.0/examples/research/budget-family-proof/test_equivalence.py +547 -0
  1453. dry_lint-1.6.0/examples/research/grounded-operation-claims/README.md +117 -0
  1454. dry_lint-1.6.0/examples/research/grounded-operation-claims/policy.py +82 -0
  1455. dry_lint-1.6.0/examples/research/grounded-operation-claims/reproduce.py +302 -0
  1456. dry_lint-1.6.0/examples/research/residual-budget/README.md +181 -0
  1457. dry_lint-1.6.0/examples/research/residual-budget/recorded_judge.py +202 -0
  1458. dry_lint-1.6.0/examples/research/residual-budget/replay_frozen.py +148 -0
  1459. dry_lint-1.6.0/examples/research/residual-budget/test_portable.py +46 -0
  1460. dry_lint-1.6.0/examples/residual-discovery.toml +13 -0
  1461. dry_lint-1.6.0/pyproject.toml +74 -0
  1462. dry_lint-1.6.0/scripts/audit_history.py +69 -0
  1463. dry_lint-1.6.0/scripts/audit_judging.py +128 -0
  1464. dry_lint-1.6.0/scripts/benchmark_channel_trial.py +228 -0
  1465. dry_lint-1.6.0/scripts/benchmark_semantic_signals.py +104 -0
  1466. dry_lint-1.6.0/scripts/capture_history.py +130 -0
  1467. dry_lint-1.6.0/scripts/channel_trial.py +209 -0
  1468. dry_lint-1.6.0/scripts/compare_detectors.py +141 -0
  1469. dry_lint-1.6.0/scripts/compare_history.py +173 -0
  1470. dry_lint-1.6.0/scripts/freeze_bench_background.py +35 -0
  1471. dry_lint-1.6.0/scripts/install-action.sh +23 -0
  1472. dry_lint-1.6.0/scripts/judge_history.py +492 -0
  1473. dry_lint-1.6.0/scripts/make_assets.py +172 -0
  1474. dry_lint-1.6.0/scripts/model_judge_probe.py +89 -0
  1475. dry_lint-1.6.0/scripts/model_probe.py +71 -0
  1476. dry_lint-1.6.0/scripts/model_retrieval_trial.py +155 -0
  1477. dry_lint-1.6.0/scripts/probe_context.py +130 -0
  1478. dry_lint-1.6.0/scripts/probe_coverage.py +156 -0
  1479. dry_lint-1.6.0/scripts/render_png.py +29 -0
  1480. dry_lint-1.6.0/scripts/replay_coverage.py +237 -0
  1481. dry_lint-1.6.0/scripts/replay_presets.py +685 -0
  1482. dry_lint-1.6.0/scripts/replay_production.py +170 -0
  1483. dry_lint-1.6.0/scripts/research_mining/README.md +140 -0
  1484. dry_lint-1.6.0/scripts/research_mining/__init__.py +1 -0
  1485. dry_lint-1.6.0/scripts/research_mining/__main__.py +66 -0
  1486. dry_lint-1.6.0/scripts/research_mining/audit.py +179 -0
  1487. dry_lint-1.6.0/scripts/research_mining/demo.py +116 -0
  1488. dry_lint-1.6.0/scripts/research_mining/exact_cache.py +125 -0
  1489. dry_lint-1.6.0/scripts/research_mining/source.py +83 -0
  1490. dry_lint-1.6.0/scripts/score_comparison.py +79 -0
  1491. dry_lint-1.6.0/scripts/score_history.py +175 -0
  1492. dry_lint-1.6.0/scripts/semantic_signals.py +212 -0
  1493. dry_lint-1.6.0/scripts/test_action_install.py +98 -0
  1494. dry_lint-1.6.0/src/dry_lint/__init__.py +3 -0
  1495. dry_lint-1.6.0/src/dry_lint/__main__.py +5 -0
  1496. dry_lint-1.6.0/src/dry_lint/action.py +717 -0
  1497. dry_lint-1.6.0/src/dry_lint/baseline.py +370 -0
  1498. dry_lint-1.6.0/src/dry_lint/bench.py +274 -0
  1499. dry_lint-1.6.0/src/dry_lint/bench_background.py +88 -0
  1500. dry_lint-1.6.0/src/dry_lint/cli.py +1009 -0
  1501. dry_lint-1.6.0/src/dry_lint/commits.py +161 -0
  1502. dry_lint-1.6.0/src/dry_lint/comparer_resources.py +31 -0
  1503. dry_lint-1.6.0/src/dry_lint/comparers.py +66 -0
  1504. dry_lint-1.6.0/src/dry_lint/comparison.py +288 -0
  1505. dry_lint-1.6.0/src/dry_lint/comparison_helpers.py +85 -0
  1506. dry_lint-1.6.0/src/dry_lint/costs.py +152 -0
  1507. dry_lint-1.6.0/src/dry_lint/cpu_embedding.py +278 -0
  1508. dry_lint-1.6.0/src/dry_lint/cpu_tail.py +163 -0
  1509. dry_lint-1.6.0/src/dry_lint/detector.py +387 -0
  1510. dry_lint-1.6.0/src/dry_lint/discovery.py +173 -0
  1511. dry_lint-1.6.0/src/dry_lint/dryer.py +103 -0
  1512. dry_lint-1.6.0/src/dry_lint/evidence.py +65 -0
  1513. dry_lint-1.6.0/src/dry_lint/extractors.py +126 -0
  1514. dry_lint-1.6.0/src/dry_lint/feedback.py +50 -0
  1515. dry_lint-1.6.0/src/dry_lint/function_index.py +203 -0
  1516. dry_lint-1.6.0/src/dry_lint/functions.py +386 -0
  1517. dry_lint-1.6.0/src/dry_lint/git.py +25 -0
  1518. dry_lint-1.6.0/src/dry_lint/github.py +11 -0
  1519. dry_lint-1.6.0/src/dry_lint/index.py +44 -0
  1520. dry_lint-1.6.0/src/dry_lint/index_github.py +183 -0
  1521. dry_lint-1.6.0/src/dry_lint/judges/__init__.py +30 -0
  1522. dry_lint-1.6.0/src/dry_lint/judges/anthropic.py +102 -0
  1523. dry_lint-1.6.0/src/dry_lint/judges/command.py +263 -0
  1524. dry_lint-1.6.0/src/dry_lint/judges/gemini.py +25 -0
  1525. dry_lint-1.6.0/src/dry_lint/judges/http.py +54 -0
  1526. dry_lint-1.6.0/src/dry_lint/judges/jev.py +224 -0
  1527. dry_lint-1.6.0/src/dry_lint/judges/model_jev.py +114 -0
  1528. dry_lint-1.6.0/src/dry_lint/judges/subscription.py +76 -0
  1529. dry_lint-1.6.0/src/dry_lint/judging.py +324 -0
  1530. dry_lint-1.6.0/src/dry_lint/labelling.py +402 -0
  1531. dry_lint-1.6.0/src/dry_lint/ledger.py +573 -0
  1532. dry_lint-1.6.0/src/dry_lint/model_review.py +123 -0
  1533. dry_lint-1.6.0/src/dry_lint/model_shapes.py +307 -0
  1534. dry_lint-1.6.0/src/dry_lint/models.py +287 -0
  1535. dry_lint-1.6.0/src/dry_lint/operation_blocks.py +428 -0
  1536. dry_lint-1.6.0/src/dry_lint/plugins.py +123 -0
  1537. dry_lint-1.6.0/src/dry_lint/policies.py +63 -0
  1538. dry_lint-1.6.0/src/dry_lint/presets.py +176 -0
  1539. dry_lint-1.6.0/src/dry_lint/python_schemas.py +113 -0
  1540. dry_lint-1.6.0/src/dry_lint/ranking.py +43 -0
  1541. dry_lint-1.6.0/src/dry_lint/replay.py +174 -0
  1542. dry_lint-1.6.0/src/dry_lint/report.py +848 -0
  1543. dry_lint-1.6.0/src/dry_lint/schema_policy.py +235 -0
  1544. dry_lint-1.6.0/src/dry_lint/settings.py +240 -0
  1545. dry_lint-1.6.0/src/dry_lint/source_context.py +69 -0
  1546. dry_lint-1.6.0/src/dry_lint/statement_views.py +114 -0
  1547. dry_lint-1.6.0/src/dry_lint/sticky.py +384 -0
  1548. dry_lint-1.6.0/src/dry_lint/store.py +228 -0
  1549. dry_lint-1.6.0/src/dry_lint/typescript.py +395 -0
  1550. dry_lint-1.6.0/tests/conftest.py +261 -0
  1551. dry_lint-1.6.0/tests/test_action.py +1406 -0
  1552. dry_lint-1.6.0/tests/test_action_install.py +25 -0
  1553. dry_lint-1.6.0/tests/test_action_sticky.py +502 -0
  1554. dry_lint-1.6.0/tests/test_adopter_keys.py +80 -0
  1555. dry_lint-1.6.0/tests/test_adopter_policies.py +154 -0
  1556. dry_lint-1.6.0/tests/test_audit_judging.py +95 -0
  1557. dry_lint-1.6.0/tests/test_bench.py +245 -0
  1558. dry_lint-1.6.0/tests/test_bench_background.py +93 -0
  1559. dry_lint-1.6.0/tests/test_cascade_history.py +125 -0
  1560. dry_lint-1.6.0/tests/test_channel_trial.py +283 -0
  1561. dry_lint-1.6.0/tests/test_cleanup_gold.py +72 -0
  1562. dry_lint-1.6.0/tests/test_cli.py +523 -0
  1563. dry_lint-1.6.0/tests/test_commits.py +97 -0
  1564. dry_lint-1.6.0/tests/test_comparer_resources.py +216 -0
  1565. dry_lint-1.6.0/tests/test_comparers.py +60 -0
  1566. dry_lint-1.6.0/tests/test_comparison.py +386 -0
  1567. dry_lint-1.6.0/tests/test_comparison_helpers.py +81 -0
  1568. dry_lint-1.6.0/tests/test_consolidation.py +255 -0
  1569. dry_lint-1.6.0/tests/test_costs.py +137 -0
  1570. dry_lint-1.6.0/tests/test_coverage_replay.py +283 -0
  1571. dry_lint-1.6.0/tests/test_cpu_embedding.py +320 -0
  1572. dry_lint-1.6.0/tests/test_cpu_recovery.py +66 -0
  1573. dry_lint-1.6.0/tests/test_cpu_tail.py +214 -0
  1574. dry_lint-1.6.0/tests/test_detector.py +504 -0
  1575. dry_lint-1.6.0/tests/test_discovery.py +337 -0
  1576. dry_lint-1.6.0/tests/test_example_workflows.py +27 -0
  1577. dry_lint-1.6.0/tests/test_examples.py +162 -0
  1578. dry_lint-1.6.0/tests/test_function_index.py +176 -0
  1579. dry_lint-1.6.0/tests/test_functions.py +257 -0
  1580. dry_lint-1.6.0/tests/test_history_judging.py +325 -0
  1581. dry_lint-1.6.0/tests/test_history_replay.py +70 -0
  1582. dry_lint-1.6.0/tests/test_index.py +31 -0
  1583. dry_lint-1.6.0/tests/test_index_github.py +329 -0
  1584. dry_lint-1.6.0/tests/test_judges.py +378 -0
  1585. dry_lint-1.6.0/tests/test_judging.py +383 -0
  1586. dry_lint-1.6.0/tests/test_labelling.py +385 -0
  1587. dry_lint-1.6.0/tests/test_language_analysis.py +323 -0
  1588. dry_lint-1.6.0/tests/test_ledger.py +474 -0
  1589. dry_lint-1.6.0/tests/test_model_adoption.py +373 -0
  1590. dry_lint-1.6.0/tests/test_model_discovery.py +82 -0
  1591. dry_lint-1.6.0/tests/test_model_judge.py +142 -0
  1592. dry_lint-1.6.0/tests/test_model_shapes.py +285 -0
  1593. dry_lint-1.6.0/tests/test_models.py +35 -0
  1594. dry_lint-1.6.0/tests/test_operation_blocks.py +487 -0
  1595. dry_lint-1.6.0/tests/test_operation_blocks_preparation.py +153 -0
  1596. dry_lint-1.6.0/tests/test_plugins.py +71 -0
  1597. dry_lint-1.6.0/tests/test_pre_commit_hook.py +51 -0
  1598. dry_lint-1.6.0/tests/test_presets.py +158 -0
  1599. dry_lint-1.6.0/tests/test_protected_history.py +137 -0
  1600. dry_lint-1.6.0/tests/test_release.py +25 -0
  1601. dry_lint-1.6.0/tests/test_replay.py +170 -0
  1602. dry_lint-1.6.0/tests/test_replay_presets.py +432 -0
  1603. dry_lint-1.6.0/tests/test_report.py +580 -0
  1604. dry_lint-1.6.0/tests/test_reporting_lanes.py +247 -0
  1605. dry_lint-1.6.0/tests/test_research_mining.py +524 -0
  1606. dry_lint-1.6.0/tests/test_residual_discovery.py +306 -0
  1607. dry_lint-1.6.0/tests/test_schema_policy.py +231 -0
  1608. dry_lint-1.6.0/tests/test_semantic_signals.py +163 -0
  1609. dry_lint-1.6.0/tests/test_settings.py +56 -0
  1610. dry_lint-1.6.0/tests/test_shared_operations.py +90 -0
  1611. dry_lint-1.6.0/tests/test_sources.py +215 -0
  1612. dry_lint-1.6.0/tests/test_store.py +295 -0
  1613. dry_lint-1.6.0/tests/test_sweep.py +526 -0
  1614. dry_lint-1.6.0/tests/test_typescript.py +346 -0
  1615. dry_lint-1.6.0/tests/test_workspace.py +153 -0
  1616. dry_lint-1.6.0/uv.lock +1348 -0
@@ -0,0 +1,11 @@
1
+ __pycache__/
2
+ *.egg-info/
3
+ .venv/
4
+ dist/
5
+ .coverage
6
+ .pytest_cache/
7
+ .ruff_cache/
8
+
9
+ # Documentation build
10
+ .venv-docs/
11
+ site/
@@ -0,0 +1,32 @@
1
+ # For the coding agent committing the change: it checks each finding itself, so the hook reports at the agent preset's
2
+ # low threshold. `args: [--preset, auto]` puts a person's precision-first judging back.
3
+ - id: dry-lint
4
+ name: dry-lint
5
+ description: Flag staged function duplication and model consolidation candidates. Use --no-models to opt out of models.
6
+ entry: dry-lint check --staged --preset agent --env-file .env
7
+ language: python
8
+ additional_dependencies: ["anthropic>=1.0", "python-dotenv>=1,<2"] # the `hooks` extra: Claude judges, and .env
9
+ types_or: [python, javascript, jsx, ts, tsx]
10
+ stages: [pre-commit]
11
+ pass_filenames: false
12
+ require_serial: true
13
+ # What the hook above saw fixed or dismissed before the commit, written into the commit's message as trailers so
14
+ # the pull request's comment counts it. Install its stage once: `pre-commit install -t prepare-commit-msg`.
15
+ - id: dry-lint-schema-policy
16
+ name: dry-lint schema ownership
17
+ description: Enforce explicitly configured Python structured-output schema boundaries.
18
+ entry: dry-lint schema-check --staged
19
+ language: python
20
+ additional_dependencies: ["anthropic>=1.0", "python-dotenv>=1,<2"] # share the other hooks' environment
21
+ pass_filenames: false
22
+ always_run: true
23
+ stages: [pre-commit]
24
+
25
+ - id: dry-lint-trailers
26
+ name: dry-lint trailers
27
+ description: Record in the commit message the duplicates dry-lint's hook kept out before the commit.
28
+ entry: dry-lint trailers
29
+ language: python
30
+ additional_dependencies: ["anthropic>=1.0", "python-dotenv>=1,<2"] # the same environment as the hook above
31
+ stages: [prepare-commit-msg]
32
+ always_run: true
@@ -0,0 +1,26 @@
1
+ # Working on dry-lint
2
+
3
+ Follow [CONTRIBUTING.md](CONTRIBUTING.md) to set up, lint and test. Read [docs/design.md](docs/design.md) before
4
+ changing the pipeline, a file format or the store, and [docs/plugins.md](docs/plugins.md) before adding a plugin.
5
+
6
+ - **Adopters bring their own keys, always.** dry-lint is open source and never ships, holds, proxies or pays for an
7
+ API key, a model, or judge execution. Every judge runs on credentials the adopting repository passes in (action
8
+ inputs, its own environment), at its own cost; with none, dry-lint judges nothing and only lists look-alikes. No
9
+ input defaults to a credential other than the run's own `github.token`, and no code path calls a model on an
10
+ account or endpoint dry-lint operates. The only service dry-lint runs is the opt-out counter, which receives
11
+ anonymous counts, never credentials or code. No change that breaks this is accepted, whatever it would enable;
12
+ `tests/test_adopter_keys.py` guards it. See [docs/design.md](docs/design.md#adopters-bring-their-own-keys).
13
+ - The pipeline, the file formats, the reuse rules and the reports are core; extractors, comparers, judges and store
14
+ backends are plugins. A new way to compare or judge is a plugin, not a branch in core.
15
+ - Keep the detector stateless and model-free, and the judge separate. Anything slow belongs behind the verdict
16
+ store. Change a file format only with a `schema` bump.
17
+ - A stored verdict may be reused only when the answer cannot have changed. Any rule that reuses more verdicts needs
18
+ an argument, and a test, that the answer still holds.
19
+ - Decisions made by people go in code (`# dry-lint: distinct-from`) or in configuration (`patterns`), never in the
20
+ verdict store.
21
+ - dry-lint should pass on its own code: run `uv run dry-lint check` before you push.
22
+
23
+ ## GitHub Actions versions
24
+
25
+ - ALWAYS use published major-version tags for established GitHub Actions, for example `actions/checkout@v7` and `actions/upload-artifact@v7`, so compatible fixes arrive without per-commit maintenance. NEVER replace those tags with commit hashes unless the user explicitly requests that exact exception. If a publisher has no major-version tag, use its published release tag rather than inventing a ref or substituting a hash.
26
+ - ALWAYS use the `v1` major-version tag for dry-lint: `gigaverse-app/dry-lint@v1` for Actions, `@v1` for CLI installs, and `rev: v1` for pre-commit hooks. Do not use commit SHAs or minor/patch release pins. Apply the same ref in workflow examples and adoption instructions.
@@ -0,0 +1,24 @@
1
+ # Contributing
2
+
3
+ Install Python 3.11+ and [uv](https://docs.astral.sh/uv/), then:
4
+
5
+ ```bash
6
+ uv sync --locked
7
+ uvx pre-commit install
8
+ uv run ruff check .
9
+ uv run ruff format .
10
+ uv run pytest -q --cov
11
+ uv build
12
+ ```
13
+
14
+ When changing the action installer, also run `uv run python scripts/test_action_install.py` with Bash and uv
15
+ on PATH. It performs real installs in temporary Python and Node repositories; CI runs it on Linux, macOS and
16
+ Windows. The ordinary pytest suite stays offline.
17
+
18
+ - **Tests use real objects.** A temporary git repository stands in for a pull request; judges run as real
19
+ subprocesses, or against `httpx.MockTransport`. New code needs full coverage, and a bug fix needs a test of the
20
+ invariant it broke.
21
+ - **Thresholds and judge wording come from measurements.** If you change them, re-measure and update
22
+ [docs/benchmark.md](docs/benchmark.md). If you change the Jev questions, bump `PROMPT_VERSION`.
23
+ - **Assets.** Regenerate them from `docs/assets/lint.png` with `uv run --with pillow python scripts/make_assets.py`, then
24
+ `uv run --with playwright==1.58.0 python scripts/render_png.py`.
dry_lint-1.6.0/LICENSE ADDED
@@ -0,0 +1,202 @@
1
+
2
+ Apache License
3
+ Version 2.0, January 2004
4
+ http://www.apache.org/licenses/
5
+
6
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
7
+
8
+ 1. Definitions.
9
+
10
+ "License" shall mean the terms and conditions for use, reproduction,
11
+ and distribution as defined by Sections 1 through 9 of this document.
12
+
13
+ "Licensor" shall mean the copyright owner or entity authorized by
14
+ the copyright owner that is granting the License.
15
+
16
+ "Legal Entity" shall mean the union of the acting entity and all
17
+ other entities that control, are controlled by, or are under common
18
+ control with that entity. For the purposes of this definition,
19
+ "control" means (i) the power, direct or indirect, to cause the
20
+ direction or management of such entity, whether by contract or
21
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
22
+ outstanding shares, or (iii) beneficial ownership of such entity.
23
+
24
+ "You" (or "Your") shall mean an individual or Legal Entity
25
+ exercising permissions granted by this License.
26
+
27
+ "Source" form shall mean the preferred form for making modifications,
28
+ including but not limited to software source code, documentation
29
+ source, and configuration files.
30
+
31
+ "Object" form shall mean any form resulting from mechanical
32
+ transformation or translation of a Source form, including but
33
+ not limited to compiled object code, generated documentation,
34
+ and conversions to other media types.
35
+
36
+ "Work" shall mean the work of authorship, whether in Source or
37
+ Object form, made available under the License, as indicated by a
38
+ copyright notice that is included in or attached to the work
39
+ (an example is provided in the Appendix below).
40
+
41
+ "Derivative Works" shall mean any work, whether in Source or Object
42
+ form, that is based on (or derived from) the Work and for which the
43
+ editorial revisions, annotations, elaborations, or other modifications
44
+ represent, as a whole, an original work of authorship. For the purposes
45
+ of this License, Derivative Works shall not include works that remain
46
+ separable from, or merely link (or bind by name) to the interfaces of,
47
+ the Work and Derivative Works thereof.
48
+
49
+ "Contribution" shall mean any work of authorship, including
50
+ the original version of the Work and any modifications or additions
51
+ to that Work or Derivative Works thereof, that is intentionally
52
+ submitted to Licensor for inclusion in the Work by the copyright owner
53
+ or by an individual or Legal Entity authorized to submit on behalf of
54
+ the copyright owner. For the purposes of this definition, "submitted"
55
+ means any form of electronic, verbal, or written communication sent
56
+ to the Licensor or its representatives, including but not limited to
57
+ communication on electronic mailing lists, source code control systems,
58
+ and issue tracking systems that are managed by, or on behalf of, the
59
+ Licensor for the purpose of discussing and improving the Work, but
60
+ excluding communication that is conspicuously marked or otherwise
61
+ designated in writing by the copyright owner as "Not a Contribution."
62
+
63
+ "Contributor" shall mean Licensor and any individual or Legal Entity
64
+ on behalf of whom a Contribution has been received by Licensor and
65
+ subsequently incorporated within the Work.
66
+
67
+ 2. Grant of Copyright License. Subject to the terms and conditions of
68
+ this License, each Contributor hereby grants to You a perpetual,
69
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
70
+ copyright license to reproduce, prepare Derivative Works of,
71
+ publicly display, publicly perform, sublicense, and distribute the
72
+ Work and such Derivative Works in Source or Object form.
73
+
74
+ 3. Grant of Patent License. Subject to the terms and conditions of
75
+ this License, each Contributor hereby grants to You a perpetual,
76
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
77
+ (except as stated in this section) patent license to make, have made,
78
+ use, offer to sell, sell, import, and otherwise transfer the Work,
79
+ where such license applies only to those patent claims licensable
80
+ by such Contributor that are necessarily infringed by their
81
+ Contribution(s) alone or by combination of their Contribution(s)
82
+ with the Work to which such Contribution(s) was submitted. If You
83
+ institute patent litigation against any entity (including a
84
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
85
+ or a Contribution incorporated within the Work constitutes direct
86
+ or contributory patent infringement, then any patent licenses
87
+ granted to You under this License for that Work shall terminate
88
+ as of the date such litigation is filed.
89
+
90
+ 4. Redistribution. You may reproduce and distribute copies of the
91
+ Work or Derivative Works thereof in any medium, with or without
92
+ modifications, and in Source or Object form, provided that You
93
+ meet the following conditions:
94
+
95
+ (a) You must give any other recipients of the Work or
96
+ Derivative Works a copy of this License; and
97
+
98
+ (b) You must cause any modified files to carry prominent notices
99
+ stating that You changed the files; and
100
+
101
+ (c) You must retain, in the Source form of any Derivative Works
102
+ that You distribute, all copyright, patent, trademark, and
103
+ attribution notices from the Source form of the Work,
104
+ excluding those notices that do not pertain to any part of
105
+ the Derivative Works; and
106
+
107
+ (d) If the Work includes a "NOTICE" text file as part of its
108
+ distribution, then any Derivative Works that You distribute must
109
+ include a readable copy of the attribution notices contained
110
+ within such NOTICE file, excluding those notices that do not
111
+ pertain to any part of the Derivative Works, in at least one
112
+ of the following places: within a NOTICE text file distributed
113
+ as part of the Derivative Works; within the Source form or
114
+ documentation, if provided along with the Derivative Works; or,
115
+ within a display generated by the Derivative Works, if and
116
+ wherever such third-party notices normally appear. The contents
117
+ of the NOTICE file are for informational purposes only and
118
+ do not modify the License. You may add Your own attribution
119
+ notices within Derivative Works that You distribute, alongside
120
+ or as an addendum to the NOTICE text from the Work, provided
121
+ that such additional attribution notices cannot be construed
122
+ as modifying the License.
123
+
124
+ You may add Your own copyright statement to Your modifications and
125
+ may provide additional or different license terms and conditions
126
+ for use, reproduction, or distribution of Your modifications, or
127
+ for any such Derivative Works as a whole, provided Your use,
128
+ reproduction, and distribution of the Work otherwise complies with
129
+ the conditions stated in this License.
130
+
131
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
132
+ any Contribution intentionally submitted for inclusion in the Work
133
+ by You to the Licensor shall be under the terms and conditions of
134
+ this License, without any additional terms or conditions.
135
+ Notwithstanding the above, nothing herein shall supersede or modify
136
+ the terms of any separate license agreement you may have executed
137
+ with Licensor regarding such Contributions.
138
+
139
+ 6. Trademarks. This License does not grant permission to use the trade
140
+ names, trademarks, service marks, or product names of the Licensor,
141
+ except as required for reasonable and customary use in describing the
142
+ origin of the Work and reproducing the content of the NOTICE file.
143
+
144
+ 7. Disclaimer of Warranty. Unless required by applicable law or
145
+ agreed to in writing, Licensor provides the Work (and each
146
+ Contributor provides its Contributions) on an "AS IS" BASIS,
147
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
148
+ implied, including, without limitation, any warranties or conditions
149
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
150
+ PARTICULAR PURPOSE. You are solely responsible for determining the
151
+ appropriateness of using or redistributing the Work and assume any
152
+ risks associated with Your exercise of permissions under this License.
153
+
154
+ 8. Limitation of Liability. In no event and under no legal theory,
155
+ whether in tort (including negligence), contract, or otherwise,
156
+ unless required by applicable law (such as deliberate and grossly
157
+ negligent acts) or agreed to in writing, shall any Contributor be
158
+ liable to You for damages, including any direct, indirect, special,
159
+ incidental, or consequential damages of any character arising as a
160
+ result of this License or out of the use or inability to use the
161
+ Work (including but not limited to damages for loss of goodwill,
162
+ work stoppage, computer failure or malfunction, or any and all
163
+ other commercial damages or losses), even if such Contributor
164
+ has been advised of the possibility of such damages.
165
+
166
+ 9. Accepting Warranty or Additional Liability. While redistributing
167
+ the Work or Derivative Works thereof, You may choose to offer,
168
+ and charge a fee for, acceptance of support, warranty, indemnity,
169
+ or other liability obligations and/or rights consistent with this
170
+ License. However, in accepting such obligations, You may act only
171
+ on Your own behalf and on Your sole responsibility, not on behalf
172
+ of any other Contributor, and only if You agree to indemnify,
173
+ defend, and hold each Contributor harmless for any liability
174
+ incurred by, or claims asserted against, such Contributor by reason
175
+ of your accepting any such warranty or additional liability.
176
+
177
+ END OF TERMS AND CONDITIONS
178
+
179
+ APPENDIX: How to apply the Apache License to your work.
180
+
181
+ To apply the Apache License to your work, attach the following
182
+ boilerplate notice, with the fields enclosed by brackets "[]"
183
+ replaced with your own identifying information. (Don't include
184
+ the brackets!) The text should be enclosed in the appropriate
185
+ comment syntax for the file format. We also recommend that a
186
+ file or class name and description of purpose be included on the
187
+ same "printed page" as the copyright notice for easier
188
+ identification within third-party archives.
189
+
190
+ Copyright [yyyy] [name of copyright owner]
191
+
192
+ Licensed under the Apache License, Version 2.0 (the "License");
193
+ you may not use this file except in compliance with the License.
194
+ You may obtain a copy of the License at
195
+
196
+ http://www.apache.org/licenses/LICENSE-2.0
197
+
198
+ Unless required by applicable law or agreed to in writing, software
199
+ distributed under the License is distributed on an "AS IS" BASIS,
200
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
201
+ See the License for the specific language governing permissions and
202
+ limitations under the License.
@@ -0,0 +1,349 @@
1
+ Metadata-Version: 2.5
2
+ Name: dry-lint
3
+ Version: 1.6.0
4
+ Summary: Find code that re-implements what your codebase already does, judge it, and say so on the pull request
5
+ Project-URL: Homepage, https://github.com/gigaverse-app/dry-lint
6
+ Project-URL: Documentation, https://github.com/gigaverse-app/dry-lint/tree/main/docs
7
+ Project-URL: Repository, https://github.com/gigaverse-app/dry-lint
8
+ Project-URL: Issues, https://github.com/gigaverse-app/dry-lint/issues
9
+ Author: Gigaverse
10
+ License-Expression: Apache-2.0
11
+ License-File: LICENSE
12
+ Keywords: code-duplication,code-review,dry,duplication,github-actions,linter,llm,pre-commit
13
+ Classifier: Development Status :: 3 - Alpha
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Topic :: Software Development :: Quality Assurance
17
+ Classifier: Typing :: Typed
18
+ Requires-Python: >=3.11
19
+ Requires-Dist: httpx<1,>=0.28
20
+ Requires-Dist: pydantic<3,>=2.11
21
+ Requires-Dist: tree-sitter-typescript<0.24,>=0.23
22
+ Requires-Dist: tree-sitter<0.26,>=0.25
23
+ Provides-Extra: anthropic
24
+ Requires-Dist: anthropic>=1.0; extra == 'anthropic'
25
+ Provides-Extra: cpu-embedding
26
+ Requires-Dist: numpy<3,>=2.2; extra == 'cpu-embedding'
27
+ Requires-Dist: onnxruntime<1.32,>=1.31.1; extra == 'cpu-embedding'
28
+ Requires-Dist: tokenizers<0.24,>=0.23.3; extra == 'cpu-embedding'
29
+ Provides-Extra: hooks
30
+ Requires-Dist: anthropic>=1.0; extra == 'hooks'
31
+ Requires-Dist: python-dotenv<2,>=1; extra == 'hooks'
32
+ Provides-Extra: s3
33
+ Requires-Dist: boto3>=1.35; extra == 's3'
34
+ Description-Content-Type: text/markdown
35
+
36
+ <p align="center">
37
+ <picture>
38
+ <source media="(prefers-color-scheme: dark)" srcset="docs/assets/readme-hero-dark.svg">
39
+ <img alt="dry-lint: one concept, one implementation" src="docs/assets/readme-hero-light.svg" width="100%">
40
+ </picture>
41
+ </p>
42
+
43
+ <p align="center">
44
+ <a href="https://github.com/gigaverse-app/dry-lint/actions/workflows/ci.yml"><img alt="CI" src="https://img.shields.io/github/actions/workflow/status/gigaverse-app/dry-lint/ci.yml?branch=main&label=CI&logo=githubactions&logoColor=white&labelColor=24292F"></a>
45
+ <a href="#the-counter"><img alt="Duplicates kept out" src="https://img.shields.io/endpoint?url=https%3A%2F%2Fdry-lint-counter.gigaverse-oss.workers.dev%2Fv1%2Fbadge%3Fmetric%3Dkept-out"></a>
46
+ <a href="pyproject.toml"><img alt="Python 3.11+" src="https://img.shields.io/badge/python-3.11%2B-7E4FC9?logo=python&logoColor=white&labelColor=24292F"></a>
47
+ <a href="docs/typescript.md"><img alt="TypeScript" src="https://img.shields.io/badge/typescript-supported-7E4FC9?logo=typescript&logoColor=white&labelColor=24292F"></a>
48
+ <a href="LICENSE"><img alt="Apache 2.0" src="https://img.shields.io/badge/license-Apache--2.0-7E4FC9?labelColor=24292F"></a>
49
+ <a href="https://dry-lint.readthedocs.io/en/latest/"><img alt="Documentation" src="https://readthedocs.org/projects/dry-lint/badge/?version=latest"></a>
50
+ </p>
51
+
52
+ <p align="center"><a href="https://dry-lint.readthedocs.io/en/latest/">Read the documentation</a> · <a href="https://dry-lint.readthedocs.io/en/latest/ecosystem/">Related tools</a></p>
53
+
54
+ Coding agents rarely copy and paste. They write *new* code for a job the codebase already does: a second
55
+ `truncate`, another pagination loop, a fresh Mongo query helper, each slightly different. Copy-paste detectors
56
+ (pylint's `duplicate-code`, jscpd) look for repeated lines, so they miss this. Every rewrite is also a chance to
57
+ drift: one version rounds, the other truncates, and callers get different answers to the same question.
58
+
59
+ dry-lint finds functions in a pull request that look like they re-implement something that already exists. A
60
+ judge decides whether each pair really is one concept, and the result goes back as PR annotations and one comment
61
+ ([see one](docs/comment-preview.md)):
62
+
63
+ ```text
64
+ src/widgets/caption.py:1: preview_caption_text looks like src/text.py::shorten_text (drifted)
65
+ judge 0.91; the two already behave differently; call the existing function;
66
+ similarity 0.71; if they are different concepts, add
67
+ `# dry-lint: distinct-from src/text.py::shorten_text`
68
+ ```
69
+
70
+ **You bring your own keys.** dry-lint never provides API keys, models or judge execution: judges run on the
71
+ credentials your repository passes in, at your cost, and without any it only lists look-alikes
72
+ ([design](docs/design.md#adopters-bring-their-own-keys)).
73
+
74
+ <a href="#the-counter">
75
+ <picture>
76
+ <source media="(prefers-color-scheme: dark)" srcset="https://dry-lint-counter.gigaverse-oss.workers.dev/v1/sign.svg?theme=dark">
77
+ <img alt="Duplicate functions dry-lint has kept out of codebases" src="https://dry-lint-counter.gigaverse-oss.workers.dev/v1/sign.svg" width="100%">
78
+ </picture>
79
+ </a>
80
+
81
+ ## Quick start
82
+
83
+ Python, TypeScript and TSX work out of the box. TypeScript repositories need no Python project, `bun install`,
84
+ Node or build step: dry-lint installs its own tools and parses source without executing your code
85
+ ([TypeScript and Bun](docs/typescript.md) covers monorepos).
86
+
87
+ ### Try it locally, without an API key
88
+
89
+ Install [uv](https://docs.astral.sh/uv/getting-started/installation/), open a terminal in your Git repository,
90
+ and run:
91
+
92
+ ```bash
93
+ uvx --no-config --python 3.13 --from git+https://github.com/gigaverse-app/dry-lint dry-lint scan --judge none --limit 30
94
+ ```
95
+
96
+ uv downloads Python and runs dry-lint in its own environment, so nothing is added to your project. This lists
97
+ look-alikes without calling a model or failing on findings. To inspect just your branch, replace
98
+ `scan --judge none --limit 30` with `check --judge none --base origin/main` (use your default branch's name).
99
+
100
+ For a permanent `dry-lint` command, then open a new terminal:
101
+
102
+ ```bash
103
+ uv tool install --no-config --python 3.13 git+https://github.com/gigaverse-app/dry-lint
104
+ uv tool update-shell
105
+ ```
106
+
107
+ ### Add it to GitHub Actions
108
+
109
+ Save this as `.github/workflows/dry-lint.yml`. It works without a secret; add a `TYPESAFE_AI_API_KEY`
110
+ repository secret when you want judged findings.
111
+
112
+ ```yaml
113
+ name: dry-lint
114
+ on: [pull_request]
115
+ permissions:
116
+ contents: read
117
+ pull-requests: write
118
+ concurrency:
119
+ group: dry-lint-${{ github.event.pull_request.number }}
120
+ cancel-in-progress: true
121
+ jobs:
122
+ dry-lint:
123
+ runs-on: ubuntu-latest
124
+ steps:
125
+ - uses: actions/checkout@v7
126
+ with:
127
+ ref: ${{ github.event.pull_request.head.sha || github.sha }}
128
+ fetch-depth: 1
129
+ - uses: gigaverse-app/dry-lint@v1
130
+ with:
131
+ typesafe-api-key: ${{ secrets.TYPESAFE_AI_API_KEY }}
132
+ ```
133
+
134
+ The action installs its own Python and dependencies; your project's Python version, uv configuration and
135
+ virtual environment do not change, and no `setup-python`, `pip install` or build step is needed. It annotates
136
+ the changed functions, keeps one sticky PR comment up to date and caches verdicts between runs. The comment
137
+ links both functions at the analyzed commit, shows the review workload, and folds evidence and pair-specific
138
+ suppression instructions under each summary. A clean pull request gets a green sticky with what was checked
139
+ (`comment-on-clean: "false"` to opt out), and every sticky keeps a running account of what each push cost and
140
+ each duplicate kept out ([the ledger](docs/github-action.md#the-ledger)).
141
+
142
+ A reported duplicate fails the check at the preset's threshold (98% of them are real duplicates with
143
+ `jev+opus`); `fail-at` raises or lowers it, and the `dry-lint: override` label lets one through. That precision
144
+ is for people. A coding agent can check findings itself, so for agents a cheap judge at a lower threshold catches
145
+ more for less ([who reads the findings](docs/judges.md#who-reads-the-findings-people-or-coding-agents)). Pull
146
+ requests from forks get no secrets, so the default `mode: auto` runs dry-lint as two jobs for them: `detect` on the pull
147
+ request, and `judge` in [a `workflow_run` job](examples/dry-lint-judge.yml) that keeps the key away from pull
148
+ request code ([design](docs/design.md#two-jobs-in-ci)). For default-branch runs and rechecks when override
149
+ labels change, use the [extended workflow](examples/dry-lint.yml); the [action guide](docs/github-action.md)
150
+ lists every option.
151
+
152
+ ### pre-commit
153
+
154
+ ```yaml
155
+ default_install_hook_types: [pre-commit, prepare-commit-msg]
156
+ repos:
157
+ - repo: https://github.com/gigaverse-app/dry-lint
158
+ rev: v1
159
+ hooks:
160
+ - id: dry-lint
161
+ - id: dry-lint-trailers # optional: the pull request's comment counts what the hook kept out
162
+ ```
163
+
164
+ The hook checks the staged Python, JavaScript and TypeScript for the coding agent making the commit. An agent checks
165
+ each finding itself, then reuses the existing function or records why the two differ, so the hook judges for
166
+ recall: preset `agent`, Jev on every pair, blocking from 0.6. That keeps 92% to 100% recall on four gold sets, with
167
+ about one finding in two real, for about $0.0002 a commit. Set `TYPESAFE_AI_API_KEY` in the environment or in an
168
+ untracked `.env`; nothing else is needed. `args: [--preset, agent+haiku]` adds Claude Haiku on Jev's uncertain
169
+ scores, for higher precision and some lost recall on TypeScript; `args: [--preset, auto]` gives a person committing
170
+ by hand the same precision-first judging as CI
171
+ ([who reads the findings](docs/judges.md#who-reads-the-findings-people-or-coding-agents)).
172
+
173
+ A blocked commit names the pair. Fix it by reusing the existing function, or record an intentional difference with
174
+ `# dry-lint: distinct-from path::name` or `dry-lint feedback dismiss PAIR --reason ...`. For wider exploration with a
175
+ persistent campaign budget, see [`balanced`](docs/production-discovery.md).
176
+
177
+ A duplicate the hook blocks and the agent fixes never reaches a push, so CI alone would never count it. The hook
178
+ remembers what it blocked; `dry-lint-trailers` writes what was then fixed or dismissed into the commit message,
179
+ `Dry-Lint-Kept-Out: ab7719f1ec3f9b70 repository_counter_name ≈ counter_key (3 lines)`, and the pull request's
180
+ sticky, the repository's ledger and the [global counter](#the-counter) count it
181
+ ([the ledger](docs/github-action.md#the-ledger)). Run `pre-commit install` once more after adding it.
182
+
183
+ ## Commands
184
+
185
+ | Command | Does |
186
+ | --- | --- |
187
+ | `check [--base REF \| --staged]` | detect, judge and report the functions a change touched (base: `origin/HEAD`) |
188
+ | `scan [--limit N] [--refresh] [--repo OWNER/NAME=PATH ...]` | the repository's backlog, or cross-repository pairs from a combined workspace |
189
+ | `sweep [--init \| --update]` | audit the configured repository; explicitly initialize or shrink its accepted backlog and README progress |
190
+ | `config` | which judges, thresholds and budget would run, and what they cost |
191
+ | `explain A B` | why a pair is, or is not, reported |
192
+ | `detect --out candidates.json` | CI job 1: propose pairs; no judge, no secrets, no store |
193
+ | `judge --candidates candidates.json` | CI job 2: judge them, store the verdicts, report |
194
+ | `report --from report.json --format F` | render a report as `text`, `github`, `markdown`, `json`, `sarif` or `check-run` |
195
+ | `bench --gold gold.jsonl [--comparer]` | measure the judge, or the comparer, on a gold set |
196
+ | `bench --replay N [--preset P] [--fail-at X] [--label K]` | what `check` would have done on each of the last N commits of the default branch; with `--label`, what it would have caught, missed and blocked wrongly |
197
+
198
+ `--report report.json` and `--output comment.md` write the report and the PR comment from any command that
199
+ judges. Without a judge, dry-lint lists the candidate pairs and never fails. With `TYPESAFE_AI_API_KEY` set, Jev
200
+ judges them; to use another judge, pass `--judge command --judge-command "your-llm-cli"`
201
+ ([judges](docs/judges.md)).
202
+
203
+ | To | Read |
204
+ | --- | --- |
205
+ | Fully adopt hooks, PR/README stickies and a shrinking backlog | [Adoption playbook](docs/adoption-playbook.md) |
206
+ | Set it up with an agent | [skills/dry-lint/SKILL.md](skills/dry-lint/SKILL.md) |
207
+ | See the PR comment before installing | [Example report](docs/comment-preview.md) |
208
+ | Put judged findings on pull requests | [GitHub Action setup](docs/github-action.md) |
209
+ | Add structural matching | [The optional Dryer comparer](docs/detectors.md) ([compared on gigaverse-backend](docs/dryer-comparison.md)) |
210
+ | Find copies across related repositories | [Workspace scans and shared ownership](docs/workspaces.md) |
211
+ | Avoid cloning peer repositories in CI | [Versioned function indexes](docs/function-indexes.md) |
212
+ | Audit existing duplication, shrink its baseline and show cleanup in your README | [Repository sweeps and ratchets](docs/sweeps.md) |
213
+
214
+ ## How it works
215
+
216
+ dry-lint is a fixed core (the pipeline, the file formats, the verdict store's rules and the reports) with four
217
+ plugin slots: how functions are found, how they are compared, how a pair is judged, and where verdicts are kept
218
+ ([design](docs/design.md), [plugins](docs/plugins.md)).
219
+
220
+ 1. **Detector** (local, no model, about 4.5 s on 10,000 functions). It finds the functions the diff touched. The
221
+ **comparer** proposes each one's nearest look-alikes in other files; the built-in one is a TF-IDF fingerprint
222
+ of what a function *does*: the names it calls, the attributes it touches, the words in its identifiers, its
223
+ loops, `try` blocks and `await`s. One shared policy consumes language-adapter facts: Python special methods, recognized forwarding wrappers,
224
+ a function that calls the other (resolved within the file), declared patterns and inline `distinct-from`.
225
+ Inheritance alone does not exclude repeated logic.
226
+ 2. **Judge** (separate and pluggable). [Jev](docs/judges.md) answers three typed questions per pair in about 0.3 s:
227
+ - Is it one concept?
228
+ - Do the two already behave differently?
229
+ - Which side should own the single implementation?
230
+
231
+ Any LLM CLI, or any program, can be the judge instead, and a second judge can take the scores the first is
232
+ least sure about.
233
+ 3. **Verdict store** (a cache, not a reviewed file). Each verdict is kept per pair with a *structure hash* of each
234
+ function, which comments and formatting do not change. Python also normalizes local renames; TypeScript
235
+ conservatively re-judges them to preserve binding semantics. Most cosmetic pushes cost zero judge calls.
236
+
237
+ Research on profiles, judging budgets and discovery across repeated runs is in
238
+ [Discovery over time](docs/coverage-exploration.md) and the [four-cent discovery trial](docs/four-cent-discovery.md).
239
+
240
+ ## When it is right not to merge them
241
+
242
+ Some look-alikes are deliberate. Silence them where the decision belongs:
243
+
244
+ - **Inline**: put `# dry-lint: distinct-from src/text.py::shorten_text` in the new function. The reason sits next
245
+ to the code it explains, and moves or disappears with it.
246
+ - **A whole function**: put `# dry-lint: ignore` in it (generated code, a deliberate copy). It is left out of
247
+ every pair, on either side.
248
+ - **Families**: declare a pattern of deliberate per-resource instances in `pyproject.toml`:
249
+
250
+ ```toml
251
+ [tool.dry-lint]
252
+ exclude = ["*/tests/*", "tests/*", "*/migrations/*"]
253
+
254
+ [[tool.dry-lint.patterns]]
255
+ members = "src/*/api/*_api.py::create_router"
256
+ reason = "one router per resource"
257
+ ```
258
+
259
+ Machine "not a duplicate" verdicts stay in the store and do not need to be checked in.
260
+
261
+ ## Measured
262
+
263
+ On 600 gigaverse-ai pull requests, against a 250-pair gold set labelled blind by three vendors' models ([docs/benchmark.md](docs/benchmark.md)):
264
+
265
+ | | |
266
+ | --- | --- |
267
+ | Changed functions per commit | median 1, p90 13 |
268
+ | Judge calls per PR (uncached) | 2.5 |
269
+ | Findings per PR at the default threshold | about 0.2 |
270
+ | Jev `reuse-v2`: ranking quality | AUC 0.97 |
271
+ | preset `jev+opus`, failing at 0.55, within $0.04 a pull request | 98% precision, 85% recall; about $0.005 per pull request on average |
272
+ | preset `jev+sonnet`, failing at 0.7 | 97% precision, 84% recall; about $0.0035 per pull request |
273
+ | preset `jev+codex` (ChatGPT subscription), failing at 0.7 | 96% precision, 85% recall; no per-call cost |
274
+ | preset `jev`, failing at 0.8 | 94% precision, 73% recall; 15% of pull requests fail |
275
+ | Known duplicates found and scored ≥ 0.8 | 11 of 13 |
276
+ | Verdict store for the whole repository | about 1,900 pairs, 0.75 MB |
277
+
278
+ ## Settings
279
+
280
+ All settings live under `[tool.dry-lint]` in `pyproject.toml` or in a `.dry-lint.toml` file. Judges and
281
+ thresholds come from the preset ([docs/judges.md](docs/judges.md)); anything set here wins over it:
282
+
283
+ | Setting | Default | |
284
+ | --- | --- | --- |
285
+ | `include` / `exclude` | everything / tests, migrations, scripts | fnmatch over tracked paths |
286
+ | `neighbours` | 3 | candidates per changed function |
287
+ | `preset` | `"auto"` | judges and their measured thresholds together: `jev+opus`, `jev+claude-code`, `jev+sonnet`, `jev+claude-code-sonnet`, `jev+codex`, `sonnet`, `claude-code`, `jev`, `none`; auto picks by the credentials present |
288
+ | `drop_below` / `report_at` / `fail_at` | from the preset | separate below, reported at, failing at (`--fail-at` overrides it); `jev+opus` is 0.5 / 0.55 / 0.55, with Jev's answers that Opus did not see held to Jev's 0.8 |
289
+ | `drift_at` | 0.8 | a duplicate whose `behaves_differently` reaches this is drifted |
290
+ | `budget` | `{ usd = 0.04, subscription_calls = 20 }` | most judging spends on a pull request across all its pushes, at list price, subscriptions included (`--budget-usd`); and calls per run to subscription judges |
291
+ | `prices` | built-in table | USD per million input and output tokens, by model |
292
+ | `reopen_margin` | 0.05 | for a comparer that permits similarity reuse (no built-in one does), how much closer a "separate" pair must get before it is judged again |
293
+ | `max_findings` | 10 | rows in the PR comment |
294
+ | `extractors` | `["python", "typescript"]` | `.py`, `.ts`, `.tsx`, `.mts`, `.cts` |
295
+ | `comparer` | `"tfidf"` | options `min_similarity` (0.5), `min_similarity_small` (0.3) under `small_function_lines` (6) |
296
+ | `judge` / `escalate` | from the preset | name your own judge to run it alone, or `escalate = "none"` to turn the second judge off |
297
+ | `store` | `"dir"` | `.git/dry-lint/verdicts/`, or `{ use = "s3", uri = "s3://bucket/prefix" }` |
298
+
299
+ A plugin slot takes a name, or a table with `use` and the plugin's options:
300
+ `comparer = { use = "tfidf", min_similarity = 0.45 }`.
301
+
302
+
303
+ ## The counter
304
+
305
+ The sign at the top counts every duplicate dry-lint has kept out of a codebase: a duplicate a pull request
306
+ introduced, dry-lint reported, and a later push removed before merging. A *rewrite* is one whose structure differs
307
+ from the function it duplicates, so a copy-paste checker would not see it; a *drifted* copy already behaved
308
+ differently; a *re-check skipped* is a verdict the store already held. Actions from November 2026 on measure these;
309
+ until a pull request they measured has merged, the sign shows them as "–", never as zero.
310
+
311
+ When a pull request merges, the action's run on the default branch sends its counts to a
312
+ [Cloudflare Worker](counter): duplicates kept out (how many had drifted, how many were rewrites, and their lines),
313
+ caught and dismissed, pushes, functions checked, look-alikes compared, verdicts reused, judgments, judging spend
314
+ and the dry-lint version. No code, names, paths or people are sent. The repository is **pseudonymous**: it is sent
315
+ as its counter key, the SHA-256 of its numeric GitHub id, which ties its pull requests together but which its name
316
+ does not lead to; a private repository's id is visible only to people who can see the repository. Each pull
317
+ request is counted once. Opt out with `share-totals: "false"`.
318
+
319
+ A repository whose audit keeps a [README block](docs/sweeps.md#readme-sticky-and-shieldsio-badge) gets its sign
320
+ there automatically, beside the old duplicates it has cleaned up and still has. To show it anywhere else, take its counter key from the
321
+ log of a dry-lint run on your default branch
322
+ (`dry-lint: this repository's counter key is ...`). `name` only labels the sign; the counter never looks a name up:
323
+
324
+ ```html
325
+ <picture>
326
+ <source media="(prefers-color-scheme: dark)" srcset="https://dry-lint-counter.gigaverse-oss.workers.dev/v1/sign.svg?theme=dark&key=KEY&name=OWNER/NAME">
327
+ <img alt="Duplicates dry-lint kept out of OWNER/NAME" src="https://dry-lint-counter.gigaverse-oss.workers.dev/v1/sign.svg?key=KEY&name=OWNER/NAME" width="100%">
328
+ </picture>
329
+ ```
330
+
331
+ or a badge, with `metric=kept-out`, `drifted`, `lines`, `pulls`, `functions` or `repositories`:
332
+
333
+ ```markdown
334
+ ![duplicates kept out](https://img.shields.io/endpoint?url=https%3A%2F%2Fdry-lint-counter.gigaverse-oss.workers.dev%2Fv1%2Fbadge%3Fkey%3DKEY%26metric%3Dkept-out)
335
+ ```
336
+
337
+ ## Lint
338
+
339
+ <img src="docs/assets/avatar.png" alt="Lint, the dry-lint mascot: a purple ball of dryer lint holding a mint-green hair dryer" width="120" align="right">
340
+
341
+ Lint is what is left behind when you dry things. It carries a hair dryer for blowing duplicated code away.
342
+ `uv run --with pillow python scripts/make_assets.py` rebuilds the avatar, the mark, the banners and the README
343
+ hero from [docs/assets/lint.png](docs/assets/lint.png).
344
+
345
+ <br clear="right">
346
+
347
+ ## License
348
+
349
+ Apache 2.0. See [CONTRIBUTING.md](CONTRIBUTING.md) to work on dry-lint itself.