devlyn-cli 3.2.1 → 3.3.1

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 (423) hide show
  1. package/AGENTS.md +2 -2
  2. package/CLAUDE.md +2 -2
  3. package/README.md +12 -102
  4. package/bin/devlyn.js +13 -225
  5. package/bin/instruction-templates.json +8 -0
  6. package/config/skills/_shared/adapters/grok.md +1 -2
  7. package/config/skills/_shared/archive_run.py +15 -3
  8. package/config/skills/_shared/judge-role-evidence.py +21 -1
  9. package/config/skills/_shared/runtime-principles.md +1 -1
  10. package/config/skills/_shared/spec-verify-check.py +0 -653
  11. package/config/skills/_shared/state-phase-write.py +351 -25
  12. package/config/skills/_shared/task-complete.py +660 -150
  13. package/config/skills/_shared/terminal-claim-check.py +229 -4
  14. package/config/skills/_shared/verify-merge-findings.py +93 -2
  15. package/config/skills/devlyn:ideate/SKILL.md +3 -4
  16. package/config/skills/devlyn:ideate/references/elicitation.md +2 -35
  17. package/config/skills/devlyn:ideate/references/from-spec-mode.md +3 -18
  18. package/config/skills/devlyn:ideate/references/project-mode.md +1 -16
  19. package/config/skills/devlyn:ideate/references/spec-template.md +0 -2
  20. package/config/skills/devlyn:queue/SKILL.md +6 -4
  21. package/config/skills/devlyn:resolve/SKILL.md +16 -25
  22. package/config/skills/devlyn:resolve/references/free-form-mode.md +0 -14
  23. package/config/skills/devlyn:resolve/references/outer-loop.md +1 -1
  24. package/config/skills/devlyn:resolve/references/phases/build-gate.md +1 -1
  25. package/config/skills/devlyn:resolve/references/phases/cleanup.md +3 -3
  26. package/config/skills/devlyn:resolve/references/phases/implement.md +1 -1
  27. package/config/skills/devlyn:resolve/references/phases/probe-derive.md +1 -16
  28. package/config/skills/devlyn:resolve/references/phases/verify.md +4 -9
  29. package/config/skills/devlyn:resolve/references/state-schema.md +9 -7
  30. package/config/skills/devlyn:resolve/references/task-completion.md +47 -38
  31. package/{config/skills → optional-skills}/code-health-standards/SKILL.md +4 -13
  32. package/{config/skills → optional-skills}/code-review-standards/SKILL.md +4 -12
  33. package/{config/skills → optional-skills}/root-cause-analysis/SKILL.md +4 -12
  34. package/{config/skills → optional-skills}/ui-implementation-standards/SKILL.md +4 -14
  35. package/package.json +1 -57
  36. package/benchmark/auto-resolve/BENCHMARK-DESIGN.md +0 -289
  37. package/benchmark/auto-resolve/BENCHMARK-RESULTS.md +0 -341
  38. package/benchmark/auto-resolve/README.md +0 -696
  39. package/benchmark/auto-resolve/RUBRIC.md +0 -177
  40. package/benchmark/auto-resolve/fixtures/F1-cli-trivial-flag/NOTES.md +0 -34
  41. package/benchmark/auto-resolve/fixtures/F1-cli-trivial-flag/expected.json +0 -68
  42. package/benchmark/auto-resolve/fixtures/F1-cli-trivial-flag/metadata.json +0 -10
  43. package/benchmark/auto-resolve/fixtures/F1-cli-trivial-flag/setup.sh +0 -4
  44. package/benchmark/auto-resolve/fixtures/F1-cli-trivial-flag/spec.md +0 -44
  45. package/benchmark/auto-resolve/fixtures/F1-cli-trivial-flag/task.ko.txt +0 -8
  46. package/benchmark/auto-resolve/fixtures/F1-cli-trivial-flag/task.txt +0 -8
  47. package/benchmark/auto-resolve/fixtures/F10-persist-write-collision/NOTES.md +0 -68
  48. package/benchmark/auto-resolve/fixtures/F10-persist-write-collision/expected.json +0 -60
  49. package/benchmark/auto-resolve/fixtures/F10-persist-write-collision/metadata.json +0 -10
  50. package/benchmark/auto-resolve/fixtures/F10-persist-write-collision/setup.sh +0 -17
  51. package/benchmark/auto-resolve/fixtures/F10-persist-write-collision/spec.md +0 -51
  52. package/benchmark/auto-resolve/fixtures/F10-persist-write-collision/task.txt +0 -9
  53. package/benchmark/auto-resolve/fixtures/F10-persist-write-collision/verifiers/invalid.js +0 -29
  54. package/benchmark/auto-resolve/fixtures/F10-persist-write-collision/verifiers/parallel.js +0 -50
  55. package/benchmark/auto-resolve/fixtures/F11-batch-import-all-or-nothing/NOTES.md +0 -75
  56. package/benchmark/auto-resolve/fixtures/F11-batch-import-all-or-nothing/expected.json +0 -52
  57. package/benchmark/auto-resolve/fixtures/F11-batch-import-all-or-nothing/metadata.json +0 -10
  58. package/benchmark/auto-resolve/fixtures/F11-batch-import-all-or-nothing/setup.sh +0 -171
  59. package/benchmark/auto-resolve/fixtures/F11-batch-import-all-or-nothing/spec.md +0 -50
  60. package/benchmark/auto-resolve/fixtures/F11-batch-import-all-or-nothing/task.txt +0 -9
  61. package/benchmark/auto-resolve/fixtures/F12-webhook-raw-body-signature/NOTES.md +0 -89
  62. package/benchmark/auto-resolve/fixtures/F12-webhook-raw-body-signature/expected.json +0 -74
  63. package/benchmark/auto-resolve/fixtures/F12-webhook-raw-body-signature/metadata.json +0 -10
  64. package/benchmark/auto-resolve/fixtures/F12-webhook-raw-body-signature/setup.sh +0 -251
  65. package/benchmark/auto-resolve/fixtures/F12-webhook-raw-body-signature/spec.md +0 -57
  66. package/benchmark/auto-resolve/fixtures/F12-webhook-raw-body-signature/task.txt +0 -13
  67. package/benchmark/auto-resolve/fixtures/F12-webhook-raw-body-signature/verifiers/replay-malformed-body.js +0 -64
  68. package/benchmark/auto-resolve/fixtures/F15-frozen-diff-race-review/NOTES.md +0 -104
  69. package/benchmark/auto-resolve/fixtures/F15-frozen-diff-race-review/expected.json +0 -46
  70. package/benchmark/auto-resolve/fixtures/F15-frozen-diff-race-review/metadata.json +0 -10
  71. package/benchmark/auto-resolve/fixtures/F15-frozen-diff-race-review/setup.sh +0 -336
  72. package/benchmark/auto-resolve/fixtures/F15-frozen-diff-race-review/spec.md +0 -51
  73. package/benchmark/auto-resolve/fixtures/F15-frozen-diff-race-review/task.txt +0 -9
  74. package/benchmark/auto-resolve/fixtures/F16-cli-quote-tax-rules/NOTES.md +0 -38
  75. package/benchmark/auto-resolve/fixtures/F16-cli-quote-tax-rules/expected.json +0 -64
  76. package/benchmark/auto-resolve/fixtures/F16-cli-quote-tax-rules/metadata.json +0 -10
  77. package/benchmark/auto-resolve/fixtures/F16-cli-quote-tax-rules/setup.sh +0 -32
  78. package/benchmark/auto-resolve/fixtures/F16-cli-quote-tax-rules/spec.md +0 -63
  79. package/benchmark/auto-resolve/fixtures/F16-cli-quote-tax-rules/task.txt +0 -7
  80. package/benchmark/auto-resolve/fixtures/F16-cli-quote-tax-rules/verifiers/exact-success.js +0 -54
  81. package/benchmark/auto-resolve/fixtures/F16-cli-quote-tax-rules/verifiers/no-hardcoded-pricing.js +0 -47
  82. package/benchmark/auto-resolve/fixtures/F16-cli-quote-tax-rules/verifiers/stock-error.js +0 -45
  83. package/benchmark/auto-resolve/fixtures/F2-cli-medium-subcommand/NOTES.md +0 -57
  84. package/benchmark/auto-resolve/fixtures/F2-cli-medium-subcommand/expected-pair-plan-registry.json +0 -170
  85. package/benchmark/auto-resolve/fixtures/F2-cli-medium-subcommand/expected.json +0 -84
  86. package/benchmark/auto-resolve/fixtures/F2-cli-medium-subcommand/metadata.json +0 -21
  87. package/benchmark/auto-resolve/fixtures/F2-cli-medium-subcommand/pair-plan.sample-fail.json +0 -214
  88. package/benchmark/auto-resolve/fixtures/F2-cli-medium-subcommand/pair-plan.sample-pass.json +0 -223
  89. package/benchmark/auto-resolve/fixtures/F2-cli-medium-subcommand/setup.sh +0 -5
  90. package/benchmark/auto-resolve/fixtures/F2-cli-medium-subcommand/spec.md +0 -55
  91. package/benchmark/auto-resolve/fixtures/F2-cli-medium-subcommand/task.txt +0 -14
  92. package/benchmark/auto-resolve/fixtures/F21-cli-scheduler-priority/NOTES.md +0 -39
  93. package/benchmark/auto-resolve/fixtures/F21-cli-scheduler-priority/expected.json +0 -62
  94. package/benchmark/auto-resolve/fixtures/F21-cli-scheduler-priority/metadata.json +0 -10
  95. package/benchmark/auto-resolve/fixtures/F21-cli-scheduler-priority/setup.sh +0 -2
  96. package/benchmark/auto-resolve/fixtures/F21-cli-scheduler-priority/spec.md +0 -67
  97. package/benchmark/auto-resolve/fixtures/F21-cli-scheduler-priority/task.txt +0 -7
  98. package/benchmark/auto-resolve/fixtures/F21-cli-scheduler-priority/verifiers/error-order.js +0 -55
  99. package/benchmark/auto-resolve/fixtures/F21-cli-scheduler-priority/verifiers/priority-blocked.js +0 -48
  100. package/benchmark/auto-resolve/fixtures/F22-cli-ledger-close/NOTES.md +0 -35
  101. package/benchmark/auto-resolve/fixtures/F22-cli-ledger-close/expected.json +0 -56
  102. package/benchmark/auto-resolve/fixtures/F22-cli-ledger-close/metadata.json +0 -10
  103. package/benchmark/auto-resolve/fixtures/F22-cli-ledger-close/setup.sh +0 -2
  104. package/benchmark/auto-resolve/fixtures/F22-cli-ledger-close/spec.md +0 -64
  105. package/benchmark/auto-resolve/fixtures/F22-cli-ledger-close/task.txt +0 -7
  106. package/benchmark/auto-resolve/fixtures/F22-cli-ledger-close/verifiers/conflicting-duplicate.js +0 -34
  107. package/benchmark/auto-resolve/fixtures/F22-cli-ledger-close/verifiers/idempotent-close.js +0 -41
  108. package/benchmark/auto-resolve/fixtures/F23-cli-fulfillment-wave/NOTES.md +0 -39
  109. package/benchmark/auto-resolve/fixtures/F23-cli-fulfillment-wave/expected.json +0 -56
  110. package/benchmark/auto-resolve/fixtures/F23-cli-fulfillment-wave/metadata.json +0 -10
  111. package/benchmark/auto-resolve/fixtures/F23-cli-fulfillment-wave/setup.sh +0 -2
  112. package/benchmark/auto-resolve/fixtures/F23-cli-fulfillment-wave/spec.md +0 -76
  113. package/benchmark/auto-resolve/fixtures/F23-cli-fulfillment-wave/task.txt +0 -7
  114. package/benchmark/auto-resolve/fixtures/F23-cli-fulfillment-wave/verifiers/priority-rollback.js +0 -64
  115. package/benchmark/auto-resolve/fixtures/F23-cli-fulfillment-wave/verifiers/single-warehouse-fefo.js +0 -66
  116. package/benchmark/auto-resolve/fixtures/F25-cli-cart-promotion-rules/NOTES.md +0 -40
  117. package/benchmark/auto-resolve/fixtures/F25-cli-cart-promotion-rules/expected.json +0 -66
  118. package/benchmark/auto-resolve/fixtures/F25-cli-cart-promotion-rules/metadata.json +0 -10
  119. package/benchmark/auto-resolve/fixtures/F25-cli-cart-promotion-rules/setup.sh +0 -36
  120. package/benchmark/auto-resolve/fixtures/F25-cli-cart-promotion-rules/spec.md +0 -71
  121. package/benchmark/auto-resolve/fixtures/F25-cli-cart-promotion-rules/task.txt +0 -7
  122. package/benchmark/auto-resolve/fixtures/F25-cli-cart-promotion-rules/verifiers/catalog-source.js +0 -57
  123. package/benchmark/auto-resolve/fixtures/F25-cli-cart-promotion-rules/verifiers/exact-success.js +0 -63
  124. package/benchmark/auto-resolve/fixtures/F25-cli-cart-promotion-rules/verifiers/stock-error.js +0 -34
  125. package/benchmark/auto-resolve/fixtures/F26-cli-payout-ledger-rules/NOTES.md +0 -31
  126. package/benchmark/auto-resolve/fixtures/F26-cli-payout-ledger-rules/expected.json +0 -68
  127. package/benchmark/auto-resolve/fixtures/F26-cli-payout-ledger-rules/metadata.json +0 -10
  128. package/benchmark/auto-resolve/fixtures/F26-cli-payout-ledger-rules/setup.sh +0 -17
  129. package/benchmark/auto-resolve/fixtures/F26-cli-payout-ledger-rules/spec.md +0 -68
  130. package/benchmark/auto-resolve/fixtures/F26-cli-payout-ledger-rules/task.txt +0 -7
  131. package/benchmark/auto-resolve/fixtures/F26-cli-payout-ledger-rules/verifiers/conflicting-duplicate.js +0 -29
  132. package/benchmark/auto-resolve/fixtures/F26-cli-payout-ledger-rules/verifiers/exact-payout.js +0 -58
  133. package/benchmark/auto-resolve/fixtures/F26-cli-payout-ledger-rules/verifiers/rules-source.js +0 -56
  134. package/benchmark/auto-resolve/fixtures/F3-backend-contract-risk/NOTES.md +0 -35
  135. package/benchmark/auto-resolve/fixtures/F3-backend-contract-risk/expected-pair-plan-registry.json +0 -162
  136. package/benchmark/auto-resolve/fixtures/F3-backend-contract-risk/expected.json +0 -67
  137. package/benchmark/auto-resolve/fixtures/F3-backend-contract-risk/metadata.json +0 -19
  138. package/benchmark/auto-resolve/fixtures/F3-backend-contract-risk/setup.sh +0 -4
  139. package/benchmark/auto-resolve/fixtures/F3-backend-contract-risk/spec.md +0 -55
  140. package/benchmark/auto-resolve/fixtures/F3-backend-contract-risk/task.txt +0 -9
  141. package/benchmark/auto-resolve/fixtures/F31-cli-seat-rebalance/NOTES.md +0 -34
  142. package/benchmark/auto-resolve/fixtures/F31-cli-seat-rebalance/expected.json +0 -57
  143. package/benchmark/auto-resolve/fixtures/F31-cli-seat-rebalance/metadata.json +0 -10
  144. package/benchmark/auto-resolve/fixtures/F31-cli-seat-rebalance/setup.sh +0 -2
  145. package/benchmark/auto-resolve/fixtures/F31-cli-seat-rebalance/spec.md +0 -67
  146. package/benchmark/auto-resolve/fixtures/F31-cli-seat-rebalance/task.txt +0 -7
  147. package/benchmark/auto-resolve/fixtures/F31-cli-seat-rebalance/verifiers/duplicate-event-error.js +0 -35
  148. package/benchmark/auto-resolve/fixtures/F31-cli-seat-rebalance/verifiers/priority-transfer-rollback.js +0 -53
  149. package/benchmark/auto-resolve/fixtures/F32-cli-subscription-renewal/NOTES.md +0 -38
  150. package/benchmark/auto-resolve/fixtures/F32-cli-subscription-renewal/expected.json +0 -57
  151. package/benchmark/auto-resolve/fixtures/F32-cli-subscription-renewal/metadata.json +0 -10
  152. package/benchmark/auto-resolve/fixtures/F32-cli-subscription-renewal/setup.sh +0 -2
  153. package/benchmark/auto-resolve/fixtures/F32-cli-subscription-renewal/spec.md +0 -70
  154. package/benchmark/auto-resolve/fixtures/F32-cli-subscription-renewal/task.txt +0 -3
  155. package/benchmark/auto-resolve/fixtures/F32-cli-subscription-renewal/verifiers/duplicate-renewal-error.js +0 -42
  156. package/benchmark/auto-resolve/fixtures/F32-cli-subscription-renewal/verifiers/priority-credit-rollback.js +0 -70
  157. package/benchmark/auto-resolve/fixtures/F4-web-browser-design/NOTES.md +0 -47
  158. package/benchmark/auto-resolve/fixtures/F4-web-browser-design/expected.json +0 -57
  159. package/benchmark/auto-resolve/fixtures/F4-web-browser-design/metadata.json +0 -10
  160. package/benchmark/auto-resolve/fixtures/F4-web-browser-design/setup.sh +0 -6
  161. package/benchmark/auto-resolve/fixtures/F4-web-browser-design/spec.md +0 -48
  162. package/benchmark/auto-resolve/fixtures/F4-web-browser-design/task.txt +0 -9
  163. package/benchmark/auto-resolve/fixtures/F5-fix-loop-red-green/NOTES.md +0 -45
  164. package/benchmark/auto-resolve/fixtures/F5-fix-loop-red-green/expected.json +0 -65
  165. package/benchmark/auto-resolve/fixtures/F5-fix-loop-red-green/metadata.json +0 -10
  166. package/benchmark/auto-resolve/fixtures/F5-fix-loop-red-green/setup.sh +0 -55
  167. package/benchmark/auto-resolve/fixtures/F5-fix-loop-red-green/spec.md +0 -48
  168. package/benchmark/auto-resolve/fixtures/F5-fix-loop-red-green/task.txt +0 -7
  169. package/benchmark/auto-resolve/fixtures/F6-dep-audit-native-module/NOTES.md +0 -43
  170. package/benchmark/auto-resolve/fixtures/F6-dep-audit-native-module/expected.json +0 -77
  171. package/benchmark/auto-resolve/fixtures/F6-dep-audit-native-module/metadata.json +0 -10
  172. package/benchmark/auto-resolve/fixtures/F6-dep-audit-native-module/setup.sh +0 -4
  173. package/benchmark/auto-resolve/fixtures/F6-dep-audit-native-module/spec.md +0 -48
  174. package/benchmark/auto-resolve/fixtures/F6-dep-audit-native-module/task.txt +0 -10
  175. package/benchmark/auto-resolve/fixtures/F7-out-of-scope-trap/NOTES.md +0 -57
  176. package/benchmark/auto-resolve/fixtures/F7-out-of-scope-trap/expected.json +0 -76
  177. package/benchmark/auto-resolve/fixtures/F7-out-of-scope-trap/metadata.json +0 -10
  178. package/benchmark/auto-resolve/fixtures/F7-out-of-scope-trap/setup.sh +0 -36
  179. package/benchmark/auto-resolve/fixtures/F7-out-of-scope-trap/spec.md +0 -45
  180. package/benchmark/auto-resolve/fixtures/F7-out-of-scope-trap/task.txt +0 -7
  181. package/benchmark/auto-resolve/fixtures/F8-known-limit-ambiguous/NOTES.md +0 -53
  182. package/benchmark/auto-resolve/fixtures/F8-known-limit-ambiguous/expected.json +0 -63
  183. package/benchmark/auto-resolve/fixtures/F8-known-limit-ambiguous/metadata.json +0 -10
  184. package/benchmark/auto-resolve/fixtures/F8-known-limit-ambiguous/setup.sh +0 -4
  185. package/benchmark/auto-resolve/fixtures/F8-known-limit-ambiguous/spec.md +0 -48
  186. package/benchmark/auto-resolve/fixtures/F8-known-limit-ambiguous/task.txt +0 -1
  187. package/benchmark/auto-resolve/fixtures/F9-e2e-ideate-to-resolve/NOTES.md +0 -105
  188. package/benchmark/auto-resolve/fixtures/F9-e2e-ideate-to-resolve/expected.json +0 -74
  189. package/benchmark/auto-resolve/fixtures/F9-e2e-ideate-to-resolve/metadata.json +0 -10
  190. package/benchmark/auto-resolve/fixtures/F9-e2e-ideate-to-resolve/setup.sh +0 -28
  191. package/benchmark/auto-resolve/fixtures/F9-e2e-ideate-to-resolve/spec.md +0 -59
  192. package/benchmark/auto-resolve/fixtures/F9-e2e-ideate-to-resolve/task.txt +0 -5
  193. package/benchmark/auto-resolve/fixtures/SCHEMA.md +0 -188
  194. package/benchmark/auto-resolve/fixtures/retired/F27-cli-subscription-proration/NOTES.md +0 -37
  195. package/benchmark/auto-resolve/fixtures/retired/F27-cli-subscription-proration/RETIRED.md +0 -13
  196. package/benchmark/auto-resolve/fixtures/retired/F27-cli-subscription-proration/expected.json +0 -56
  197. package/benchmark/auto-resolve/fixtures/retired/F27-cli-subscription-proration/metadata.json +0 -10
  198. package/benchmark/auto-resolve/fixtures/retired/F27-cli-subscription-proration/setup.sh +0 -18
  199. package/benchmark/auto-resolve/fixtures/retired/F27-cli-subscription-proration/spec.md +0 -69
  200. package/benchmark/auto-resolve/fixtures/retired/F27-cli-subscription-proration/task.txt +0 -7
  201. package/benchmark/auto-resolve/fixtures/retired/F27-cli-subscription-proration/verifiers/exact-proration.js +0 -48
  202. package/benchmark/auto-resolve/fixtures/retired/F27-cli-subscription-proration/verifiers/rules-source-and-conflict.js +0 -79
  203. package/benchmark/auto-resolve/fixtures/retired/F28-cli-return-authorization/NOTES.md +0 -54
  204. package/benchmark/auto-resolve/fixtures/retired/F28-cli-return-authorization/RETIRED.md +0 -7
  205. package/benchmark/auto-resolve/fixtures/retired/F28-cli-return-authorization/expected.json +0 -67
  206. package/benchmark/auto-resolve/fixtures/retired/F28-cli-return-authorization/metadata.json +0 -10
  207. package/benchmark/auto-resolve/fixtures/retired/F28-cli-return-authorization/setup.sh +0 -2
  208. package/benchmark/auto-resolve/fixtures/retired/F28-cli-return-authorization/spec.md +0 -67
  209. package/benchmark/auto-resolve/fixtures/retired/F28-cli-return-authorization/task.txt +0 -5
  210. package/benchmark/auto-resolve/fixtures/retired/F28-cli-return-authorization/verifiers/policy-precedence.js +0 -72
  211. package/benchmark/auto-resolve/fixtures/retired/F28-cli-return-authorization/verifiers/validation-and-immutability.js +0 -43
  212. package/benchmark/auto-resolve/fixtures/retired/F28-cli-return-authorization/verifiers/validation-boundary.js +0 -116
  213. package/benchmark/auto-resolve/fixtures/retired/F30-cli-credit-hold-settlement/NOTES.md +0 -35
  214. package/benchmark/auto-resolve/fixtures/retired/F30-cli-credit-hold-settlement/RETIRED.md +0 -12
  215. package/benchmark/auto-resolve/fixtures/retired/F30-cli-credit-hold-settlement/expected.json +0 -58
  216. package/benchmark/auto-resolve/fixtures/retired/F30-cli-credit-hold-settlement/metadata.json +0 -10
  217. package/benchmark/auto-resolve/fixtures/retired/F30-cli-credit-hold-settlement/setup.sh +0 -2
  218. package/benchmark/auto-resolve/fixtures/retired/F30-cli-credit-hold-settlement/spec.md +0 -73
  219. package/benchmark/auto-resolve/fixtures/retired/F30-cli-credit-hold-settlement/task.txt +0 -17
  220. package/benchmark/auto-resolve/fixtures/retired/F30-cli-credit-hold-settlement/verifiers/mixed-idempotent-settlement.js +0 -53
  221. package/benchmark/auto-resolve/fixtures/retired/F30-cli-credit-hold-settlement/verifiers/rejection-boundaries.js +0 -74
  222. package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/NOTES.md +0 -28
  223. package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/RETIRED.md +0 -15
  224. package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/expected.json +0 -57
  225. package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/metadata.json +0 -10
  226. package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/setup.sh +0 -50
  227. package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/spec.md +0 -59
  228. package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/task.txt +0 -9
  229. package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/verifiers/ordered-settlement.js +0 -88
  230. package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/verifiers/reject-invalid.js +0 -45
  231. package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/NOTES.md +0 -30
  232. package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/RETIRED.md +0 -16
  233. package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/expected.json +0 -64
  234. package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/metadata.json +0 -10
  235. package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/setup.sh +0 -21
  236. package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/spec.md +0 -58
  237. package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/task.txt +0 -9
  238. package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/verifiers/dup-op.js +0 -54
  239. package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/verifiers/priority-apply.js +0 -82
  240. package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/verifiers/rollback.js +0 -77
  241. package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/NOTES.md +0 -99
  242. package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/RETIRED.md +0 -18
  243. package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/expected.json +0 -64
  244. package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/metadata.json +0 -10
  245. package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/setup.sh +0 -4
  246. package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/spec.md +0 -61
  247. package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/task.txt +0 -9
  248. package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/verifiers/correctness-small.js +0 -135
  249. package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/verifiers/scale.js +0 -100
  250. package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/verifiers/validation.js +0 -75
  251. package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/NOTES.md +0 -93
  252. package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/RETIRED.md +0 -16
  253. package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/expected.json +0 -65
  254. package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/metadata.json +0 -10
  255. package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/setup.sh +0 -18
  256. package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/spec.md +0 -66
  257. package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/task.txt +0 -9
  258. package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/verifiers/correctness-small.js +0 -84
  259. package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/verifiers/scale.js +0 -184
  260. package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/verifiers/validation.js +0 -74
  261. package/benchmark/auto-resolve/fixtures/retired/F9-e2e-ideate-to-preflight/NOTES.md +0 -60
  262. package/benchmark/auto-resolve/fixtures/retired/F9-e2e-ideate-to-preflight/RETIRED.md +0 -29
  263. package/benchmark/auto-resolve/fixtures/retired/F9-e2e-ideate-to-preflight/expected.json +0 -73
  264. package/benchmark/auto-resolve/fixtures/retired/F9-e2e-ideate-to-preflight/metadata.json +0 -10
  265. package/benchmark/auto-resolve/fixtures/retired/F9-e2e-ideate-to-preflight/setup.sh +0 -28
  266. package/benchmark/auto-resolve/fixtures/retired/F9-e2e-ideate-to-preflight/spec.md +0 -58
  267. package/benchmark/auto-resolve/fixtures/retired/F9-e2e-ideate-to-preflight/task.txt +0 -5
  268. package/benchmark/auto-resolve/fixtures/test-repo/README.md +0 -12
  269. package/benchmark/auto-resolve/fixtures/test-repo/bin/cli.js +0 -63
  270. package/benchmark/auto-resolve/fixtures/test-repo/package-lock.json +0 -823
  271. package/benchmark/auto-resolve/fixtures/test-repo/package.json +0 -22
  272. package/benchmark/auto-resolve/fixtures/test-repo/playwright.config.js +0 -17
  273. package/benchmark/auto-resolve/fixtures/test-repo/server/index.js +0 -37
  274. package/benchmark/auto-resolve/fixtures/test-repo/tests/cli.test.js +0 -25
  275. package/benchmark/auto-resolve/fixtures/test-repo/tests/server.test.js +0 -58
  276. package/benchmark/auto-resolve/fixtures/test-repo/web/index.html +0 -37
  277. package/benchmark/auto-resolve/results/20260507-f10-f11-tier1-full-pipeline/headroom-gate.json +0 -25
  278. package/benchmark/auto-resolve/results/20260507-f10-f11-tier1-full-pipeline/headroom-gate.md +0 -10
  279. package/benchmark/auto-resolve/results/20260508-f22-exact-error-headroom/headroom-gate.json +0 -18
  280. package/benchmark/auto-resolve/results/20260508-f22-exact-error-headroom/headroom-gate.md +0 -9
  281. package/benchmark/auto-resolve/results/20260508-f26-headroom/headroom-gate.json +0 -18
  282. package/benchmark/auto-resolve/results/20260508-f26-headroom/headroom-gate.md +0 -9
  283. package/benchmark/auto-resolve/results/20260510-f16-f23-f25-combined-proof/F16-cli-quote-tax-rules/l2_risk_probes/result.json +0 -28
  284. package/benchmark/auto-resolve/results/20260510-f16-f23-f25-combined-proof/F23-cli-fulfillment-wave/l2_risk_probes/result.json +0 -28
  285. package/benchmark/auto-resolve/results/20260510-f16-f23-f25-combined-proof/F25-cli-cart-promotion-rules/l2_risk_probes/result.json +0 -30
  286. package/benchmark/auto-resolve/results/20260510-f16-f23-f25-combined-proof/full-pipeline-pair-gate.json +0 -82
  287. package/benchmark/auto-resolve/results/20260510-f16-f23-f25-combined-proof/full-pipeline-pair-gate.md +0 -18
  288. package/benchmark/auto-resolve/results/20260510-f16-f23-f25-combined-proof/headroom-gate.json +0 -46
  289. package/benchmark/auto-resolve/results/20260510-f16-f23-f25-combined-proof/headroom-gate.md +0 -17
  290. package/benchmark/auto-resolve/results/20260511-f12-webhook-headroom/headroom-gate.json +0 -28
  291. package/benchmark/auto-resolve/results/20260511-f12-webhook-headroom/headroom-gate.md +0 -15
  292. package/benchmark/auto-resolve/results/20260511-f15-concurrency-headroom/headroom-gate.json +0 -28
  293. package/benchmark/auto-resolve/results/20260511-f15-concurrency-headroom/headroom-gate.md +0 -15
  294. package/benchmark/auto-resolve/results/20260511-f21-current-riskprobes-v1/F21-cli-scheduler-priority/l2_risk_probes/result.json +0 -32
  295. package/benchmark/auto-resolve/results/20260511-f21-current-riskprobes-v1/full-pipeline-pair-gate.json +0 -44
  296. package/benchmark/auto-resolve/results/20260511-f21-current-riskprobes-v1/full-pipeline-pair-gate.md +0 -16
  297. package/benchmark/auto-resolve/results/20260511-f21-current-riskprobes-v1/headroom-gate.json +0 -18
  298. package/benchmark/auto-resolve/results/20260511-f21-current-riskprobes-v1/headroom-gate.md +0 -9
  299. package/benchmark/auto-resolve/results/20260511-f3-http-error-headroom/headroom-gate.json +0 -28
  300. package/benchmark/auto-resolve/results/20260511-f3-http-error-headroom/headroom-gate.md +0 -15
  301. package/benchmark/auto-resolve/results/20260512-f2-medium-headroom/headroom-gate.json +0 -28
  302. package/benchmark/auto-resolve/results/20260512-f2-medium-headroom/headroom-gate.md +0 -15
  303. package/benchmark/auto-resolve/results/20260512-f31-seat-rebalance-headroom/headroom-gate.json +0 -28
  304. package/benchmark/auto-resolve/results/20260512-f31-seat-rebalance-headroom/headroom-gate.md +0 -15
  305. package/benchmark/auto-resolve/results/20260512-f32-subscription-renewal-headroom/headroom-gate.json +0 -28
  306. package/benchmark/auto-resolve/results/20260512-f32-subscription-renewal-headroom/headroom-gate.md +0 -15
  307. package/benchmark/auto-resolve/results/20260512-f4-web-headroom/headroom-gate.json +0 -28
  308. package/benchmark/auto-resolve/results/20260512-f4-web-headroom/headroom-gate.md +0 -15
  309. package/benchmark/auto-resolve/results/20260512-f5-fixloop-headroom/headroom-gate.json +0 -28
  310. package/benchmark/auto-resolve/results/20260512-f5-fixloop-headroom/headroom-gate.md +0 -15
  311. package/benchmark/auto-resolve/results/20260512-f6-checksum-headroom/headroom-gate.json +0 -28
  312. package/benchmark/auto-resolve/results/20260512-f6-checksum-headroom/headroom-gate.md +0 -15
  313. package/benchmark/auto-resolve/results/20260512-f7-scope-headroom/headroom-gate.json +0 -28
  314. package/benchmark/auto-resolve/results/20260512-f7-scope-headroom/headroom-gate.md +0 -15
  315. package/benchmark/auto-resolve/results/20260512-f9-e2e-headroom/headroom-gate.json +0 -28
  316. package/benchmark/auto-resolve/results/20260512-f9-e2e-headroom/headroom-gate.md +0 -15
  317. package/benchmark/auto-resolve/run-real-benchmark.md +0 -303
  318. package/benchmark/auto-resolve/scripts/audit-headroom-rejections.py +0 -441
  319. package/benchmark/auto-resolve/scripts/audit-pair-evidence.py +0 -1256
  320. package/benchmark/auto-resolve/scripts/build-pair-eligible-manifest.py +0 -306
  321. package/benchmark/auto-resolve/scripts/check-f9-artifacts.py +0 -268
  322. package/benchmark/auto-resolve/scripts/collect-swebench-predictions.py +0 -108
  323. package/benchmark/auto-resolve/scripts/compile-report.py +0 -493
  324. package/benchmark/auto-resolve/scripts/fetch-swebench-instances.py +0 -129
  325. package/benchmark/auto-resolve/scripts/frozen-verify-gate.py +0 -434
  326. package/benchmark/auto-resolve/scripts/full-pipeline-pair-gate.py +0 -612
  327. package/benchmark/auto-resolve/scripts/headroom-gate.py +0 -378
  328. package/benchmark/auto-resolve/scripts/iter-0033c-compare.py +0 -683
  329. package/benchmark/auto-resolve/scripts/iter-0033c-l1-summary.py +0 -97
  330. package/benchmark/auto-resolve/scripts/judge-opus-pass.sh +0 -542
  331. package/benchmark/auto-resolve/scripts/judge.sh +0 -565
  332. package/benchmark/auto-resolve/scripts/oracle-scope-tier-a.py +0 -256
  333. package/benchmark/auto-resolve/scripts/oracle-scope-tier-b.py +0 -287
  334. package/benchmark/auto-resolve/scripts/oracle-test-fidelity.py +0 -328
  335. package/benchmark/auto-resolve/scripts/pair-candidate-frontier.py +0 -469
  336. package/benchmark/auto-resolve/scripts/pair-plan-idgen.py +0 -401
  337. package/benchmark/auto-resolve/scripts/pair-plan-lint.py +0 -475
  338. package/benchmark/auto-resolve/scripts/pair-rejected-fixtures.sh +0 -103
  339. package/benchmark/auto-resolve/scripts/pair_evidence_contract.py +0 -270
  340. package/benchmark/auto-resolve/scripts/prepare-swebench-frozen-case.py +0 -273
  341. package/benchmark/auto-resolve/scripts/prepare-swebench-frozen-corpus.py +0 -148
  342. package/benchmark/auto-resolve/scripts/prepare-swebench-solver-worktree.py +0 -210
  343. package/benchmark/auto-resolve/scripts/recent-benchmark-summary.py +0 -232
  344. package/benchmark/auto-resolve/scripts/run-fixture.sh +0 -1024
  345. package/benchmark/auto-resolve/scripts/run-frozen-verify-pair.sh +0 -683
  346. package/benchmark/auto-resolve/scripts/run-full-pipeline-pair-candidate.sh +0 -458
  347. package/benchmark/auto-resolve/scripts/run-headroom-candidate.sh +0 -336
  348. package/benchmark/auto-resolve/scripts/run-iter-0033c.sh +0 -208
  349. package/benchmark/auto-resolve/scripts/run-suite.sh +0 -251
  350. package/benchmark/auto-resolve/scripts/run-swebench-frozen-corpus.sh +0 -310
  351. package/benchmark/auto-resolve/scripts/run-swebench-solver-batch.sh +0 -257
  352. package/benchmark/auto-resolve/scripts/ship-gate.py +0 -391
  353. package/benchmark/auto-resolve/scripts/solo-ceiling-avoidance.py +0 -53
  354. package/benchmark/auto-resolve/scripts/solo-headroom-hypothesis.py +0 -77
  355. package/benchmark/auto-resolve/scripts/swebench-frozen-matrix.py +0 -478
  356. package/benchmark/auto-resolve/scripts/test-audit-headroom-rejections.sh +0 -288
  357. package/benchmark/auto-resolve/scripts/test-audit-pair-evidence.sh +0 -1672
  358. package/benchmark/auto-resolve/scripts/test-benchmark-arg-parsing.sh +0 -1015
  359. package/benchmark/auto-resolve/scripts/test-build-pair-eligible-manifest.sh +0 -491
  360. package/benchmark/auto-resolve/scripts/test-check-f9-artifacts.sh +0 -91
  361. package/benchmark/auto-resolve/scripts/test-frozen-verify-gate.sh +0 -517
  362. package/benchmark/auto-resolve/scripts/test-full-pipeline-pair-gate.sh +0 -610
  363. package/benchmark/auto-resolve/scripts/test-headroom-gate.sh +0 -401
  364. package/benchmark/auto-resolve/scripts/test-iter-0033c-compare.sh +0 -525
  365. package/benchmark/auto-resolve/scripts/test-iter-0033c-l1-summary.sh +0 -254
  366. package/benchmark/auto-resolve/scripts/test-lint-fixtures.sh +0 -580
  367. package/benchmark/auto-resolve/scripts/test-pair-candidate-frontier.sh +0 -591
  368. package/benchmark/auto-resolve/scripts/test-run-full-pipeline-pair-candidate.sh +0 -497
  369. package/benchmark/auto-resolve/scripts/test-run-headroom-candidate.sh +0 -401
  370. package/benchmark/auto-resolve/scripts/test-run-swebench-solver-batch.sh +0 -111
  371. package/benchmark/auto-resolve/scripts/test-ship-gate.sh +0 -1189
  372. package/benchmark/auto-resolve/scripts/test-swebench-frozen-case.sh +0 -1221
  373. package/benchmark/auto-resolve/shadow-fixtures/S1-cli-lang-flag/NOTES.md +0 -28
  374. package/benchmark/auto-resolve/shadow-fixtures/S1-cli-lang-flag/expected.json +0 -63
  375. package/benchmark/auto-resolve/shadow-fixtures/S1-cli-lang-flag/metadata.json +0 -10
  376. package/benchmark/auto-resolve/shadow-fixtures/S1-cli-lang-flag/setup.sh +0 -3
  377. package/benchmark/auto-resolve/shadow-fixtures/S1-cli-lang-flag/spec.md +0 -47
  378. package/benchmark/auto-resolve/shadow-fixtures/S1-cli-lang-flag/task.txt +0 -1
  379. package/benchmark/auto-resolve/shadow-fixtures/S2-cli-inventory-reservation/NOTES.md +0 -34
  380. package/benchmark/auto-resolve/shadow-fixtures/S2-cli-inventory-reservation/expected.json +0 -53
  381. package/benchmark/auto-resolve/shadow-fixtures/S2-cli-inventory-reservation/metadata.json +0 -10
  382. package/benchmark/auto-resolve/shadow-fixtures/S2-cli-inventory-reservation/setup.sh +0 -3
  383. package/benchmark/auto-resolve/shadow-fixtures/S2-cli-inventory-reservation/spec.md +0 -50
  384. package/benchmark/auto-resolve/shadow-fixtures/S2-cli-inventory-reservation/task.txt +0 -1
  385. package/benchmark/auto-resolve/shadow-fixtures/S2-cli-inventory-reservation/verifiers/duplicate-order-error.js +0 -27
  386. package/benchmark/auto-resolve/shadow-fixtures/S2-cli-inventory-reservation/verifiers/priority-stock-reservation.js +0 -44
  387. package/benchmark/auto-resolve/shadow-fixtures/S3-cli-ticket-assignment/NOTES.md +0 -34
  388. package/benchmark/auto-resolve/shadow-fixtures/S3-cli-ticket-assignment/expected.json +0 -55
  389. package/benchmark/auto-resolve/shadow-fixtures/S3-cli-ticket-assignment/metadata.json +0 -10
  390. package/benchmark/auto-resolve/shadow-fixtures/S3-cli-ticket-assignment/setup.sh +0 -3
  391. package/benchmark/auto-resolve/shadow-fixtures/S3-cli-ticket-assignment/spec.md +0 -52
  392. package/benchmark/auto-resolve/shadow-fixtures/S3-cli-ticket-assignment/task.txt +0 -1
  393. package/benchmark/auto-resolve/shadow-fixtures/S3-cli-ticket-assignment/verifiers/duplicate-ticket-error.js +0 -29
  394. package/benchmark/auto-resolve/shadow-fixtures/S3-cli-ticket-assignment/verifiers/priority-agent-assignment.js +0 -48
  395. package/benchmark/auto-resolve/shadow-fixtures/S4-cli-return-routing/NOTES.md +0 -34
  396. package/benchmark/auto-resolve/shadow-fixtures/S4-cli-return-routing/expected.json +0 -55
  397. package/benchmark/auto-resolve/shadow-fixtures/S4-cli-return-routing/metadata.json +0 -10
  398. package/benchmark/auto-resolve/shadow-fixtures/S4-cli-return-routing/setup.sh +0 -3
  399. package/benchmark/auto-resolve/shadow-fixtures/S4-cli-return-routing/spec.md +0 -55
  400. package/benchmark/auto-resolve/shadow-fixtures/S4-cli-return-routing/task.txt +0 -1
  401. package/benchmark/auto-resolve/shadow-fixtures/S4-cli-return-routing/verifiers/duplicate-return-error.js +0 -43
  402. package/benchmark/auto-resolve/shadow-fixtures/S4-cli-return-routing/verifiers/priority-return-routing.js +0 -70
  403. package/benchmark/auto-resolve/shadow-fixtures/S5-cli-credit-grant-ledger/NOTES.md +0 -37
  404. package/benchmark/auto-resolve/shadow-fixtures/S5-cli-credit-grant-ledger/expected.json +0 -54
  405. package/benchmark/auto-resolve/shadow-fixtures/S5-cli-credit-grant-ledger/metadata.json +0 -10
  406. package/benchmark/auto-resolve/shadow-fixtures/S5-cli-credit-grant-ledger/setup.sh +0 -3
  407. package/benchmark/auto-resolve/shadow-fixtures/S5-cli-credit-grant-ledger/spec.md +0 -59
  408. package/benchmark/auto-resolve/shadow-fixtures/S5-cli-credit-grant-ledger/task.txt +0 -1
  409. package/benchmark/auto-resolve/shadow-fixtures/S5-cli-credit-grant-ledger/verifiers/credit-ledger-priority.js +0 -98
  410. package/benchmark/auto-resolve/shadow-fixtures/S5-cli-credit-grant-ledger/verifiers/duplicate-charge-error.js +0 -38
  411. package/benchmark/auto-resolve/shadow-fixtures/S6-cli-refund-window-ledger/NOTES.md +0 -36
  412. package/benchmark/auto-resolve/shadow-fixtures/S6-cli-refund-window-ledger/expected.json +0 -56
  413. package/benchmark/auto-resolve/shadow-fixtures/S6-cli-refund-window-ledger/metadata.json +0 -10
  414. package/benchmark/auto-resolve/shadow-fixtures/S6-cli-refund-window-ledger/setup.sh +0 -3
  415. package/benchmark/auto-resolve/shadow-fixtures/S6-cli-refund-window-ledger/spec.md +0 -59
  416. package/benchmark/auto-resolve/shadow-fixtures/S6-cli-refund-window-ledger/task.txt +0 -1
  417. package/benchmark/auto-resolve/shadow-fixtures/S6-cli-refund-window-ledger/verifiers/duplicate-refund-error.js +0 -41
  418. package/benchmark/auto-resolve/shadow-fixtures/S6-cli-refund-window-ledger/verifiers/priority-refund-ledger.js +0 -65
  419. package/config/skills/_shared/pair-plan-schema.md +0 -298
  420. package/scripts/lint-fixtures.sh +0 -352
  421. package/scripts/lint-shadow-fixtures.sh +0 -58
  422. package/scripts/lint-skills.sh +0 -4265
  423. package/scripts/test-owner-phases.py +0 -238
@@ -1,251 +0,0 @@
1
- #!/usr/bin/env bash
2
- # run-suite.sh — the single-command benchmark entry.
3
- #
4
- # Orchestrates: fixture setup + arm invocations + blind judge + report + ship
5
- # gate. Called by `npx devlyn-cli benchmark` as well as directly.
6
- #
7
- # Usage:
8
- # run-suite.sh # all fixtures, n=1 smoke
9
- # run-suite.sh F2 F5 # specific fixtures only
10
- # run-suite.sh --dry-run # skip model invocations, validate setup
11
- # run-suite.sh --judge-only --run-id X # re-judge an existing run
12
- # run-suite.sh --label v3.6 # tag this run
13
- # run-suite.sh --bless # if ship-gate PASS, promote to baselines/shipped.json
14
- # run-suite.sh --resolve-skill new # invoke /devlyn:resolve --spec (the only supported value post iter-0034 cutover; flag kept as accepted no-op for historical runners)
15
- # run-suite.sh --suite shadow --dry-run # list shadow tasks; shadow suite refuses provider/judge runs
16
- #
17
- # Exits 0 on PASS, 1 on FAIL.
18
-
19
- set -euo pipefail
20
-
21
- BENCH_ROOT="$(cd "$(dirname "$0")/.." && pwd)"
22
- REPO_ROOT="$(cd "$BENCH_ROOT/../.." && pwd)"
23
-
24
- N=1
25
- LABEL=""
26
- DRY_RUN=0
27
- JUDGE_ONLY=0
28
- RUN_ID_ARG=""
29
- BLESS=0
30
- ACCEPT_MISSING=0
31
- SUITE="golden"
32
- RESOLVE_SKILL="new"
33
- FIXTURES=()
34
-
35
- require_value() {
36
- local flag="$1"
37
- local value="${2:-}"
38
- if [ -z "$value" ] || [[ "$value" == --* ]]; then
39
- echo "$flag requires a value" >&2
40
- exit 1
41
- fi
42
- }
43
-
44
- while [ $# -gt 0 ]; do
45
- case "$1" in
46
- --n) require_value "$1" "${2:-}"; N="$2"; shift 2;;
47
- --label) require_value "$1" "${2:-}"; LABEL="$2"; shift 2;;
48
- --dry-run) DRY_RUN=1; shift;;
49
- --judge-only) JUDGE_ONLY=1; shift;;
50
- --run-id) require_value "$1" "${2:-}"; RUN_ID_ARG="$2"; shift 2;;
51
- --bless) BLESS=1; shift;;
52
- --accept-missing) ACCEPT_MISSING=1; shift;;
53
- --suite) require_value "$1" "${2:-}"; SUITE="$2"; shift 2;;
54
- --resolve-skill) require_value "$1" "${2:-}"; RESOLVE_SKILL="$2"; shift 2;;
55
- -h|--help)
56
- head -22 "$0" | sed -n '3,22p'; exit 0;;
57
- [FS][0-9]*) FIXTURES+=("$1"); shift;;
58
- *)
59
- echo "unknown arg: $1" >&2; exit 1;;
60
- esac
61
- done
62
-
63
- # iter-0034 Phase 4 cutover (2026-05-03): OLD `/devlyn:auto-resolve` deleted.
64
- # Only `new` (= /devlyn:resolve --spec) is supported. The flag is retained as
65
- # an accepted no-op so historical runners (e.g. run-iter-0033c.sh) keep working
66
- # without edit. `old` is hard-errored with a pointer at the cutover commit.
67
- if [ "$RESOLVE_SKILL" = "old" ]; then
68
- echo "--resolve-skill old is no longer supported: /devlyn:auto-resolve was deleted in the iter-0034 Phase 4 cutover. Use --resolve-skill new (default) or omit the flag." >&2
69
- exit 1
70
- fi
71
- [ "$RESOLVE_SKILL" = "new" ] || \
72
- { echo "--resolve-skill must be 'new' (got '$RESOLVE_SKILL')" >&2; exit 1; }
73
-
74
- # Suite → fixtures directory + discovery prefix.
75
- case "$SUITE" in
76
- golden) FIXTURES_DIR="$BENCH_ROOT/fixtures"; FIXTURES_GLOB="F*";;
77
- shadow) FIXTURES_DIR="$BENCH_ROOT/shadow-fixtures"; FIXTURES_GLOB="S*";;
78
- *) echo "error: --suite must be 'golden' or 'shadow' (got '$SUITE')" >&2; exit 1;;
79
- esac
80
-
81
- if [ "$SUITE" = "shadow" ] && [ "$DRY_RUN" -eq 0 ]; then
82
- echo "shadow suite run-suite is dry-run only. Use benchmark headroom/pair with explicit S* candidates for real provider measurement." >&2
83
- exit 1
84
- fi
85
-
86
- # n must be 1 while iteration semantics aren't wired through judge/report.
87
- # Remove this block when compile-report.py gains multi-iter aggregation.
88
- case "$N" in ''|*[!0-9]*) echo "error: --n must be an integer" >&2; exit 1;; esac
89
- [ "$N" -gt 0 ] || { echo "error: --n must be > 0" >&2; exit 1; }
90
- if [ "$N" -ne 1 ]; then
91
- echo "error: --n $N not yet supported — judge/report currently expect a single iteration per fixture." >&2
92
- echo " Track progress in benchmark/auto-resolve/BENCHMARK-DESIGN.md (#multi-iter-roadmap)." >&2
93
- exit 2
94
- fi
95
-
96
- # Auto-discover fixtures if none specified
97
- if [ ${#FIXTURES[@]} -eq 0 ]; then
98
- for d in "$FIXTURES_DIR"/$FIXTURES_GLOB/; do
99
- [ -d "$d" ] && FIXTURES+=("$(basename "$d")")
100
- done
101
- fi
102
-
103
- if [ ${#FIXTURES[@]} -eq 0 ]; then
104
- echo "no fixtures found in $FIXTURES_DIR/ — build the suite first" >&2
105
- exit 1
106
- fi
107
-
108
- # RUN_ID
109
- if [ -n "$RUN_ID_ARG" ]; then
110
- RUN_ID="$RUN_ID_ARG"
111
- else
112
- TS=$(date -u +%Y%m%dT%H%M%SZ)
113
- SHA=$(git -C "$REPO_ROOT" rev-parse --short HEAD 2>/dev/null || echo nogit)
114
- RUN_ID="${TS}-${SHA}${LABEL:+-$LABEL}"
115
- fi
116
-
117
- RES_DIR="$BENCH_ROOT/results/$RUN_ID"
118
- mkdir -p "$RES_DIR"
119
-
120
- print_command() {
121
- local cmd=(bash "$0" --n "$N" --suite "$SUITE" --resolve-skill "$RESOLVE_SKILL")
122
- [ -z "$LABEL" ] || cmd+=(--label "$LABEL")
123
- cmd+=(--run-id "$RUN_ID")
124
- [ $DRY_RUN -eq 0 ] || cmd+=(--dry-run)
125
- [ $JUDGE_ONLY -eq 0 ] || cmd+=(--judge-only)
126
- [ $BLESS -eq 0 ] || cmd+=(--bless)
127
- [ $ACCEPT_MISSING -eq 0 ] || cmd+=(--accept-missing)
128
- if [ ${#FIXTURES[@]} -gt 0 ]; then
129
- cmd+=("${FIXTURES[@]}")
130
- fi
131
- printf 'Command: '
132
- printf '%q ' "${cmd[@]}"
133
- printf '\n'
134
- }
135
-
136
- echo ""
137
- echo "═══ Benchmark Suite Run ═══"
138
- echo "Run-id: $RUN_ID"
139
- echo "Label: ${LABEL:-(unlabeled)}"
140
- echo "Suite: $SUITE ($FIXTURES_DIR)"
141
- echo "Fixtures: ${FIXTURES[*]}"
142
- echo "n: $N"
143
- echo "Resolve skill: $RESOLVE_SKILL"
144
- [ $DRY_RUN -eq 1 ] && echo "Mode: DRY RUN (no model invocations)"
145
- [ $JUDGE_ONLY -eq 1 ] && echo "Mode: JUDGE ONLY (re-judging existing artifacts)"
146
- print_command
147
- echo ""
148
-
149
- # ---- Mirror committed skills into .claude/skills (iter-0017) --------------
150
- # The variant arm reads $REPO_ROOT/.claude/skills/, but iteration commits land
151
- # in config/skills/. Without this step every checkout/revert that touches
152
- # SKILL.md or phase prompts requires a manual `node bin/devlyn.js -y` or
153
- # surgical cp; forgetting it silently runs the suite against stale skills.
154
- # Replicates the clean-then-copy semantics of bin/devlyn.js
155
- # (cleanManagedSkillDirs ~L313 + copyRecursive ~L274). Per-skill staging dir
156
- # + atomic mv keeps a Ctrl-C window from leaving a managed skill missing.
157
- # UNSHIPPED list mirrors bin/devlyn.js:299-304 — keep them in sync.
158
- # Skipped only in --judge-only (no model invocations); runs in --dry-run.
159
- if [ $JUDGE_ONLY -eq 0 ]; then
160
- SRC_SKILLS="$REPO_ROOT/config/skills"
161
- DST_SKILLS="$REPO_ROOT/.claude/skills"
162
- mkdir -p "$DST_SKILLS"
163
- mirrored=0
164
- for src_dir in "$SRC_SKILLS"/*/; do
165
- [ -d "$src_dir" ] || continue
166
- name=$(basename "$src_dir")
167
- case "$name" in
168
- devlyn:auto-resolve-workspace|devlyn:ideate-workspace|preflight-workspace|roadmap-archival-workspace)
169
- continue ;;
170
- esac
171
- staging="$DST_SKILLS/.${name}.staging"
172
- rm -rf "$staging"
173
- cp -R "$src_dir" "$staging"
174
- rm -rf "$DST_SKILLS/$name"
175
- mv "$staging" "$DST_SKILLS/$name"
176
- mirrored=$((mirrored + 1))
177
- done
178
- echo "[suite] mirrored $mirrored committed skill(s): config/skills/ -> .claude/skills/"
179
- fi
180
-
181
- # Prereq checks
182
- if [ $DRY_RUN -eq 0 ] && [ $JUDGE_ONLY -eq 0 ]; then
183
- command -v claude >/dev/null 2>&1 || { echo "claude CLI missing; install Claude Code first"; exit 1; }
184
- fi
185
- if [ $JUDGE_ONLY -eq 0 ]; then
186
- command -v codex >/dev/null 2>&1 || echo "warning: codex CLI missing — judge will fail"
187
- fi
188
- command -v python3 >/dev/null 2>&1 || { echo "python3 missing"; exit 1; }
189
-
190
- # Install test-repo deps once per suite run (shared cache)
191
- if [ $DRY_RUN -eq 0 ] && [ $JUDGE_ONLY -eq 0 ]; then
192
- TEST_REPO="$BENCH_ROOT/fixtures/test-repo"
193
- if [ ! -d "$TEST_REPO/node_modules" ]; then
194
- echo "[suite] installing test-repo deps (one-time)"
195
- if ! (cd "$TEST_REPO" && npm install --no-audit --no-fund --loglevel=error); then
196
- echo "[suite] ✗ npm install in test-repo failed — check network/npm auth. Aborting." >&2
197
- exit 1
198
- fi
199
- fi
200
- fi
201
-
202
- # ---- Run arms ---------------------------------------------------------------
203
- if [ $JUDGE_ONLY -eq 0 ]; then
204
- for fid in "${FIXTURES[@]}"; do
205
- [ -d "$FIXTURES_DIR/$fid" ] || { echo "[suite] skip $fid (missing)"; continue; }
206
- for arm in variant solo_claude bare; do
207
- echo "[suite] ► $fid / $arm (resolve-skill=$RESOLVE_SKILL)"
208
- extra=""
209
- [ $DRY_RUN -eq 1 ] && extra="--dry-run"
210
- bash "$BENCH_ROOT/scripts/run-fixture.sh" \
211
- --fixture "$fid" --arm "$arm" --run-id "$RUN_ID" \
212
- --resolve-skill "$RESOLVE_SKILL" $extra \
213
- || echo "[suite] ✗ $fid / $arm (arm failure tolerated; artifacts still captured)"
214
- done
215
- done
216
- fi
217
-
218
- # ---- Judge ------------------------------------------------------------------
219
- for fid in "${FIXTURES[@]}"; do
220
- if [ ! -d "$BENCH_ROOT/results/$RUN_ID/$fid" ]; then
221
- echo "[suite] skip judge for $fid (no results)"
222
- continue
223
- fi
224
- if [ $DRY_RUN -eq 1 ]; then
225
- echo "[suite] DRY RUN — skipping judge for $fid"
226
- continue
227
- fi
228
- echo "[suite] ► judge $fid"
229
- bash "$BENCH_ROOT/scripts/judge.sh" --fixture "$fid" --run-id "$RUN_ID" \
230
- || echo "[suite] ✗ judge failed for $fid (will appear as NO_JUDGE in report)"
231
- done
232
-
233
- # ---- Compile report + ship gate --------------------------------------------
234
- if [ $DRY_RUN -eq 1 ]; then
235
- echo ""
236
- echo "[suite] DRY RUN complete — results in $RES_DIR"
237
- if [ "$SUITE" = "shadow" ]; then
238
- echo "Use benchmark headroom/pair with explicit S* candidates for real provider measurement."
239
- else
240
- echo "Run without --dry-run to invoke models."
241
- fi
242
- exit 0
243
- fi
244
-
245
- echo ""
246
- python3 "$BENCH_ROOT/scripts/compile-report.py" --run-id "$RUN_ID" ${LABEL:+--label "$LABEL"}
247
-
248
- extra_flag=""
249
- [ $BLESS -eq 1 ] && extra_flag="$extra_flag --bless"
250
- [ $ACCEPT_MISSING -eq 1 ] && extra_flag="$extra_flag --accept-missing"
251
- python3 "$BENCH_ROOT/scripts/ship-gate.py" --run-id "$RUN_ID" $extra_flag
@@ -1,310 +0,0 @@
1
- #!/usr/bin/env bash
2
- # Run a prepared SWE-bench frozen VERIFY corpus and gate the result set.
3
- set -euo pipefail
4
-
5
- usage() {
6
- cat >&2 <<EOF
7
- usage: $0 --manifest <path> [--run-prefix ID] [--pair-mode forced|gated]
8
- [--min-runs N] [--out-json <path>] [--out-md <path>]
9
- [--max-pair-solo-wall-ratio N] [--timeout-seconds N]
10
- [--run-ids-out <path>] [--resume-completed-arms]
11
- [--prepare-only] [--gate-only-run-ids <path>]
12
-
13
- Reads the manifest from prepare-swebench-frozen-corpus.py, runs each prepared
14
- case through run-frozen-verify-pair.sh, then applies frozen-verify-gate.py to
15
- the resulting run ids. --prepare-only validates patch application without
16
- provider calls and skips the gate. --gate-only-run-ids reruns the gate over an
17
- existing newline-delimited run-id file without invoking providers.
18
- EOF
19
- exit "${1:-1}"
20
- }
21
-
22
- require_value() {
23
- local flag="$1"
24
- local value="${2:-}"
25
- if [ -z "$value" ] || [[ "$value" == --* ]]; then
26
- echo "$flag requires a value" >&2
27
- exit 1
28
- fi
29
- }
30
-
31
- MANIFEST=""
32
- RUN_PREFIX=""
33
- PAIR_MODE="gated"
34
- MIN_RUNS=2
35
- OUT_JSON=""
36
- OUT_MD=""
37
- MAX_PAIR_SOLO_WALL_RATIO=""
38
- PREPARE_ONLY=0
39
- GATE_ONLY_RUN_IDS=""
40
- TIMEOUT_SECONDS=""
41
- RUN_IDS_OUT=""
42
- RESUME_COMPLETED_ARMS=0
43
- while [ $# -gt 0 ]; do
44
- case "$1" in
45
- --manifest) require_value "$1" "${2:-}"; MANIFEST="$2"; shift 2;;
46
- --run-prefix) require_value "$1" "${2:-}"; RUN_PREFIX="$2"; shift 2;;
47
- --pair-mode) require_value "$1" "${2:-}"; PAIR_MODE="$2"; shift 2;;
48
- --min-runs) require_value "$1" "${2:-}"; MIN_RUNS="$2"; shift 2;;
49
- --out-json) require_value "$1" "${2:-}"; OUT_JSON="$2"; shift 2;;
50
- --out-md) require_value "$1" "${2:-}"; OUT_MD="$2"; shift 2;;
51
- --max-pair-solo-wall-ratio) require_value "$1" "${2:-}"; MAX_PAIR_SOLO_WALL_RATIO="$2"; shift 2;;
52
- --timeout-seconds) require_value "$1" "${2:-}"; TIMEOUT_SECONDS="$2"; shift 2;;
53
- --run-ids-out) require_value "$1" "${2:-}"; RUN_IDS_OUT="$2"; shift 2;;
54
- --resume-completed-arms) RESUME_COMPLETED_ARMS=1; shift;;
55
- --prepare-only) PREPARE_ONLY=1; shift;;
56
- --gate-only-run-ids) require_value "$1" "${2:-}"; GATE_ONLY_RUN_IDS="$2"; shift 2;;
57
- -h|--help) usage 0;;
58
- *) echo "unknown arg: $1" >&2; usage 1;;
59
- esac
60
- done
61
-
62
- [ -n "$MANIFEST" ] || usage 1
63
- [ -f "$MANIFEST" ] || { echo "manifest not found: $MANIFEST" >&2; exit 1; }
64
- [ "$PAIR_MODE" = "forced" ] || [ "$PAIR_MODE" = "gated" ] || { echo "--pair-mode must be forced|gated" >&2; exit 1; }
65
- case "$MIN_RUNS" in ''|*[!0-9]*) echo "--min-runs must be an integer" >&2; exit 1;; esac
66
- [ "$MIN_RUNS" -gt 0 ] || { echo "--min-runs must be > 0" >&2; exit 1; }
67
- if [ -n "$TIMEOUT_SECONDS" ]; then
68
- case "$TIMEOUT_SECONDS" in ''|*[!0-9]*) echo "--timeout-seconds must be an integer" >&2; exit 1;; esac
69
- [ "$TIMEOUT_SECONDS" -gt 0 ] || { echo "--timeout-seconds must be > 0" >&2; exit 1; }
70
- fi
71
- if [ -n "$MAX_PAIR_SOLO_WALL_RATIO" ]; then
72
- python3 - "$MAX_PAIR_SOLO_WALL_RATIO" <<'PY' || { echo "--max-pair-solo-wall-ratio must be a positive number" >&2; exit 1; }
73
- import sys
74
- try:
75
- value = float(sys.argv[1])
76
- except ValueError:
77
- raise SystemExit(1)
78
- if value <= 0:
79
- raise SystemExit(1)
80
- PY
81
- fi
82
- [ -z "$GATE_ONLY_RUN_IDS" ] || [ -f "$GATE_ONLY_RUN_IDS" ] || { echo "run ids file not found: $GATE_ONLY_RUN_IDS" >&2; exit 1; }
83
- [ "$PREPARE_ONLY" -eq 0 ] || [ -z "$GATE_ONLY_RUN_IDS" ] || { echo "--prepare-only and --gate-only-run-ids are mutually exclusive" >&2; exit 1; }
84
-
85
- SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
86
- BENCH_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
87
- if [ -z "$RUN_PREFIX" ]; then
88
- RUN_PREFIX="$(date -u +%Y%m%dT%H%M%SZ)-swebench-frozen"
89
- fi
90
-
91
- print_command() {
92
- local cmd=(bash "$0" --manifest "$MANIFEST" --run-prefix "$RUN_PREFIX")
93
- cmd+=(--pair-mode "$PAIR_MODE")
94
- cmd+=(--min-runs "$MIN_RUNS")
95
- [ -z "$OUT_JSON" ] || cmd+=(--out-json "$OUT_JSON")
96
- [ -z "$OUT_MD" ] || cmd+=(--out-md "$OUT_MD")
97
- [ -z "$MAX_PAIR_SOLO_WALL_RATIO" ] || cmd+=(--max-pair-solo-wall-ratio "$MAX_PAIR_SOLO_WALL_RATIO")
98
- [ -z "$TIMEOUT_SECONDS" ] || cmd+=(--timeout-seconds "$TIMEOUT_SECONDS")
99
- [ -z "$RUN_IDS_OUT" ] || cmd+=(--run-ids-out "$RUN_IDS_OUT")
100
- [ "$RESUME_COMPLETED_ARMS" -eq 0 ] || cmd+=(--resume-completed-arms)
101
- [ "$PREPARE_ONLY" -eq 0 ] || cmd+=(--prepare-only)
102
- [ -z "$GATE_ONLY_RUN_IDS" ] || cmd+=(--gate-only-run-ids "$GATE_ONLY_RUN_IDS")
103
- printf 'Command: '
104
- printf '%q ' "${cmd[@]}"
105
- printf '\n'
106
- }
107
-
108
- echo ""
109
- echo "═══ SWE-bench Frozen VERIFY Corpus Run ═══"
110
- echo "Run-prefix: $RUN_PREFIX"
111
- echo "Pair mode: $PAIR_MODE"
112
- echo "Min runs: $MIN_RUNS"
113
- [ -z "$MAX_PAIR_SOLO_WALL_RATIO" ] || echo "Wall cap: pair/solo <= ${MAX_PAIR_SOLO_WALL_RATIO}x"
114
- print_command
115
- echo ""
116
-
117
- TMP_RUN_IDS="$(mktemp)"
118
- trap 'rm -f "$TMP_RUN_IDS"' EXIT
119
- ROW_FAILURES=0
120
-
121
- python3 - "$MANIFEST" "$GATE_ONLY_RUN_IDS" "$SCRIPT_DIR" <<'PY'
122
- import pathlib
123
- import sys
124
-
125
- sys.path.insert(0, sys.argv[3])
126
- from pair_evidence_contract import loads_strict_json_object
127
-
128
- manifest_path = pathlib.Path(sys.argv[1])
129
- gate_only_run_ids = sys.argv[2]
130
- try:
131
- manifest = loads_strict_json_object(manifest_path.read_text())
132
- except ValueError as exc:
133
- if str(exc) == "top-level JSON value must be an object":
134
- raise SystemExit("manifest malformed: expected JSON object") from exc
135
- raise
136
- if not isinstance(manifest, dict):
137
- raise SystemExit("manifest malformed: expected JSON object")
138
- cases_root = manifest.get("cases_root")
139
- if not isinstance(cases_root, str) or not cases_root.strip():
140
- raise SystemExit("manifest malformed: missing non-empty cases_root")
141
- if gate_only_run_ids:
142
- raise SystemExit(0)
143
- prepared = manifest.get("prepared")
144
- if not isinstance(prepared, list) or not prepared:
145
- raise SystemExit("manifest malformed: prepared must be a non-empty array")
146
- for index, row in enumerate(prepared, start=1):
147
- if not isinstance(row, dict):
148
- raise SystemExit(f"manifest malformed: prepared[{index}] expected JSON object")
149
- for key in ("instance_id", "case_dir", "repo_dir"):
150
- value = row.get(key)
151
- if not isinstance(value, str) or not value.strip():
152
- raise SystemExit(f"manifest malformed: prepared[{index}] missing non-empty {key}")
153
- PY
154
-
155
- if [ -n "$GATE_ONLY_RUN_IDS" ]; then
156
- python3 - "$GATE_ONLY_RUN_IDS" "$TMP_RUN_IDS" <<'PY'
157
- import pathlib
158
- import re
159
- import sys
160
-
161
- source = pathlib.Path(sys.argv[1])
162
- dest = pathlib.Path(sys.argv[2])
163
- safe = re.compile(r"^[A-Za-z0-9_.-]+$")
164
- run_ids: list[str] = []
165
- for line_no, line in enumerate(source.read_text(encoding="utf8").splitlines(), start=1):
166
- run_id = line.strip()
167
- if not run_id:
168
- raise SystemExit(f"run ids malformed: line {line_no} is empty")
169
- if not safe.match(run_id):
170
- raise SystemExit(f"run ids malformed: line {line_no} has unsafe run id")
171
- run_ids.append(run_id)
172
- if not run_ids:
173
- raise SystemExit("run ids malformed: no run ids")
174
- dest.write_text("\n".join(run_ids) + "\n", encoding="utf8")
175
- PY
176
- else
177
- while IFS=$'\t' read -r index instance_id cases_root repo_dir diff_path; do
178
- [ -n "$instance_id" ] || continue
179
- run_id="${RUN_PREFIX}-${index}-${instance_id}"
180
- safe_run_id="$(printf '%s' "$run_id" | tr -c 'A-Za-z0-9_.-' '-')"
181
- echo "[swebench-frozen-corpus] ${index}: ${instance_id} -> ${safe_run_id}"
182
- cmd=(
183
- bash "$SCRIPT_DIR/run-frozen-verify-pair.sh"
184
- --fixture "$instance_id"
185
- --fixtures-root "$cases_root"
186
- --base-repo "$repo_dir"
187
- --diff "$diff_path"
188
- --run-id "$safe_run_id"
189
- --pair-mode "$PAIR_MODE"
190
- )
191
- if [ -n "$TIMEOUT_SECONDS" ]; then
192
- cmd+=(--timeout-seconds "$TIMEOUT_SECONDS")
193
- fi
194
- if [ "$PREPARE_ONLY" -eq 1 ]; then
195
- cmd+=(--prepare-only)
196
- fi
197
- if [ "$RESUME_COMPLETED_ARMS" -eq 1 ]; then
198
- cmd+=(--resume-completed-arms)
199
- fi
200
- set +e
201
- "${cmd[@]}" </dev/null
202
- row_exit=$?
203
- set -e
204
- if [ "$row_exit" -ne 0 ]; then
205
- echo "[swebench-frozen-corpus] row failed: ${safe_run_id} exit=${row_exit}" >&2
206
- ROW_FAILURES=$((ROW_FAILURES + 1))
207
- python3 - "$BENCH_ROOT/results/$safe_run_id" "$instance_id" "$row_exit" <<'PY'
208
- import json
209
- import pathlib
210
- import sys
211
-
212
- run_root = pathlib.Path(sys.argv[1])
213
- instance_id = sys.argv[2]
214
- row_exit = int(sys.argv[3])
215
- run_root.mkdir(parents=True, exist_ok=True)
216
- for arm in ("solo", "pair"):
217
- arm_root = run_root / arm
218
- arm_root.mkdir(parents=True, exist_ok=True)
219
- input_path = arm_root / "input.md"
220
- if not input_path.exists():
221
- input_path.write_text(
222
- f"Use /devlyn:resolve --verify-only --spec docs/roadmap/phase-1/{instance_id}.md.\n",
223
- encoding="utf8",
224
- )
225
- compare_path = run_root / "compare.json"
226
- if not compare_path.exists():
227
- compare_path.write_text(
228
- json.dumps(
229
- {
230
- "solo": {"invoke_exit": row_exit, "timed_out": False},
231
- "pair": {"invoke_exit": row_exit, "timed_out": False, "pair_mode": False},
232
- "comparison": {
233
- "pair_trigger_missed": False,
234
- "pair_verdict_lift": False,
235
- "pair_internal_verdict_lift": False,
236
- "row_failed_before_compare": True,
237
- "row_exit": row_exit,
238
- },
239
- },
240
- indent=2,
241
- )
242
- + "\n",
243
- encoding="utf8",
244
- )
245
- PY
246
- fi
247
- printf '%s\n' "$safe_run_id" >> "$TMP_RUN_IDS"
248
- done < <(python3 - "$MANIFEST" "$SCRIPT_DIR" <<'PY'
249
- import pathlib, sys
250
-
251
- sys.path.insert(0, sys.argv[2])
252
- from pair_evidence_contract import loads_strict_json_object
253
-
254
- manifest = loads_strict_json_object(pathlib.Path(sys.argv[1]).read_text())
255
- for index, row in enumerate(manifest["prepared"], start=1):
256
- instance_id = row["instance_id"]
257
- case_dir = pathlib.Path(row["case_dir"])
258
- repo_dir = pathlib.Path(row["repo_dir"])
259
- print("\t".join([
260
- str(index),
261
- instance_id,
262
- str(case_dir.parent),
263
- str(repo_dir),
264
- str(case_dir / "model.patch"),
265
- ]))
266
- PY
267
- )
268
- fi
269
-
270
- if [ -n "$RUN_IDS_OUT" ]; then
271
- mkdir -p "$(dirname "$RUN_IDS_OUT")"
272
- cp "$TMP_RUN_IDS" "$RUN_IDS_OUT"
273
- fi
274
-
275
- if [ "$PREPARE_ONLY" -eq 1 ]; then
276
- echo "[swebench-frozen-corpus] prepare-only complete; gate skipped"
277
- if [ "$ROW_FAILURES" -gt 0 ]; then
278
- echo "[swebench-frozen-corpus] row failures: $ROW_FAILURES" >&2
279
- exit 1
280
- fi
281
- exit 0
282
- fi
283
-
284
- run_count="$(wc -l < "$TMP_RUN_IDS" | tr -d ' ')"
285
- [ "$run_count" -gt 0 ] || { echo "manifest prepared no runs" >&2; exit 1; }
286
-
287
- fixtures_root="$(python3 - "$MANIFEST" "$SCRIPT_DIR" <<'PY'
288
- import pathlib, sys
289
-
290
- sys.path.insert(0, sys.argv[2])
291
- from pair_evidence_contract import loads_strict_json_object
292
-
293
- manifest = loads_strict_json_object(pathlib.Path(sys.argv[1]).read_text())
294
- print(manifest["cases_root"])
295
- PY
296
- )"
297
- gate_args=(
298
- python3 "$SCRIPT_DIR/frozen-verify-gate.py"
299
- --fixtures-root "$fixtures_root"
300
- --min-runs "$MIN_RUNS"
301
- --require-hypothesis-trigger
302
- )
303
- [ -z "$OUT_JSON" ] || gate_args+=(--out-json "$OUT_JSON")
304
- [ -z "$OUT_MD" ] || gate_args+=(--out-md "$OUT_MD")
305
- [ -z "$MAX_PAIR_SOLO_WALL_RATIO" ] || gate_args+=(--max-pair-solo-wall-ratio "$MAX_PAIR_SOLO_WALL_RATIO")
306
- while IFS= read -r run_id; do
307
- gate_args+=(--run-id "$run_id")
308
- done < "$TMP_RUN_IDS"
309
-
310
- "${gate_args[@]}"