devlyn-cli 3.2.0 → 3.3.0

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 (424) hide show
  1. package/AGENTS.md +2 -2
  2. package/CLAUDE.md +2 -2
  3. package/README.md +22 -113
  4. package/bin/devlyn.js +13 -225
  5. package/bin/instruction-templates.json +752 -1
  6. package/bin/instructions.js +101 -17
  7. package/config/skills/_shared/adapters/grok.md +1 -2
  8. package/config/skills/_shared/archive_run.py +15 -3
  9. package/config/skills/_shared/judge-role-evidence.py +21 -1
  10. package/config/skills/_shared/runtime-principles.md +1 -1
  11. package/config/skills/_shared/spec-verify-check.py +0 -653
  12. package/config/skills/_shared/state-phase-write.py +371 -30
  13. package/config/skills/_shared/task-complete.py +635 -143
  14. package/config/skills/_shared/terminal-claim-check.py +229 -4
  15. package/config/skills/_shared/verify-merge-findings.py +93 -2
  16. package/config/skills/devlyn:ideate/SKILL.md +3 -4
  17. package/config/skills/devlyn:ideate/references/elicitation.md +2 -35
  18. package/config/skills/devlyn:ideate/references/from-spec-mode.md +3 -18
  19. package/config/skills/devlyn:ideate/references/project-mode.md +1 -16
  20. package/config/skills/devlyn:ideate/references/spec-template.md +0 -2
  21. package/config/skills/devlyn:queue/SKILL.md +6 -4
  22. package/config/skills/devlyn:resolve/SKILL.md +16 -25
  23. package/config/skills/devlyn:resolve/references/free-form-mode.md +0 -14
  24. package/config/skills/devlyn:resolve/references/outer-loop.md +1 -1
  25. package/config/skills/devlyn:resolve/references/phases/build-gate.md +1 -1
  26. package/config/skills/devlyn:resolve/references/phases/cleanup.md +3 -3
  27. package/config/skills/devlyn:resolve/references/phases/implement.md +1 -1
  28. package/config/skills/devlyn:resolve/references/phases/probe-derive.md +1 -16
  29. package/config/skills/devlyn:resolve/references/phases/verify.md +4 -9
  30. package/config/skills/devlyn:resolve/references/state-schema.md +9 -7
  31. package/config/skills/devlyn:resolve/references/task-completion.md +46 -37
  32. package/{config/skills → optional-skills}/code-health-standards/SKILL.md +4 -13
  33. package/{config/skills → optional-skills}/code-review-standards/SKILL.md +4 -12
  34. package/{config/skills → optional-skills}/root-cause-analysis/SKILL.md +4 -12
  35. package/{config/skills → optional-skills}/ui-implementation-standards/SKILL.md +4 -14
  36. package/package.json +1 -57
  37. package/benchmark/auto-resolve/BENCHMARK-DESIGN.md +0 -289
  38. package/benchmark/auto-resolve/BENCHMARK-RESULTS.md +0 -341
  39. package/benchmark/auto-resolve/README.md +0 -696
  40. package/benchmark/auto-resolve/RUBRIC.md +0 -177
  41. package/benchmark/auto-resolve/fixtures/F1-cli-trivial-flag/NOTES.md +0 -34
  42. package/benchmark/auto-resolve/fixtures/F1-cli-trivial-flag/expected.json +0 -68
  43. package/benchmark/auto-resolve/fixtures/F1-cli-trivial-flag/metadata.json +0 -10
  44. package/benchmark/auto-resolve/fixtures/F1-cli-trivial-flag/setup.sh +0 -4
  45. package/benchmark/auto-resolve/fixtures/F1-cli-trivial-flag/spec.md +0 -44
  46. package/benchmark/auto-resolve/fixtures/F1-cli-trivial-flag/task.ko.txt +0 -8
  47. package/benchmark/auto-resolve/fixtures/F1-cli-trivial-flag/task.txt +0 -8
  48. package/benchmark/auto-resolve/fixtures/F10-persist-write-collision/NOTES.md +0 -68
  49. package/benchmark/auto-resolve/fixtures/F10-persist-write-collision/expected.json +0 -60
  50. package/benchmark/auto-resolve/fixtures/F10-persist-write-collision/metadata.json +0 -10
  51. package/benchmark/auto-resolve/fixtures/F10-persist-write-collision/setup.sh +0 -17
  52. package/benchmark/auto-resolve/fixtures/F10-persist-write-collision/spec.md +0 -51
  53. package/benchmark/auto-resolve/fixtures/F10-persist-write-collision/task.txt +0 -9
  54. package/benchmark/auto-resolve/fixtures/F10-persist-write-collision/verifiers/invalid.js +0 -29
  55. package/benchmark/auto-resolve/fixtures/F10-persist-write-collision/verifiers/parallel.js +0 -50
  56. package/benchmark/auto-resolve/fixtures/F11-batch-import-all-or-nothing/NOTES.md +0 -75
  57. package/benchmark/auto-resolve/fixtures/F11-batch-import-all-or-nothing/expected.json +0 -52
  58. package/benchmark/auto-resolve/fixtures/F11-batch-import-all-or-nothing/metadata.json +0 -10
  59. package/benchmark/auto-resolve/fixtures/F11-batch-import-all-or-nothing/setup.sh +0 -171
  60. package/benchmark/auto-resolve/fixtures/F11-batch-import-all-or-nothing/spec.md +0 -50
  61. package/benchmark/auto-resolve/fixtures/F11-batch-import-all-or-nothing/task.txt +0 -9
  62. package/benchmark/auto-resolve/fixtures/F12-webhook-raw-body-signature/NOTES.md +0 -89
  63. package/benchmark/auto-resolve/fixtures/F12-webhook-raw-body-signature/expected.json +0 -74
  64. package/benchmark/auto-resolve/fixtures/F12-webhook-raw-body-signature/metadata.json +0 -10
  65. package/benchmark/auto-resolve/fixtures/F12-webhook-raw-body-signature/setup.sh +0 -251
  66. package/benchmark/auto-resolve/fixtures/F12-webhook-raw-body-signature/spec.md +0 -57
  67. package/benchmark/auto-resolve/fixtures/F12-webhook-raw-body-signature/task.txt +0 -13
  68. package/benchmark/auto-resolve/fixtures/F12-webhook-raw-body-signature/verifiers/replay-malformed-body.js +0 -64
  69. package/benchmark/auto-resolve/fixtures/F15-frozen-diff-race-review/NOTES.md +0 -104
  70. package/benchmark/auto-resolve/fixtures/F15-frozen-diff-race-review/expected.json +0 -46
  71. package/benchmark/auto-resolve/fixtures/F15-frozen-diff-race-review/metadata.json +0 -10
  72. package/benchmark/auto-resolve/fixtures/F15-frozen-diff-race-review/setup.sh +0 -336
  73. package/benchmark/auto-resolve/fixtures/F15-frozen-diff-race-review/spec.md +0 -51
  74. package/benchmark/auto-resolve/fixtures/F15-frozen-diff-race-review/task.txt +0 -9
  75. package/benchmark/auto-resolve/fixtures/F16-cli-quote-tax-rules/NOTES.md +0 -38
  76. package/benchmark/auto-resolve/fixtures/F16-cli-quote-tax-rules/expected.json +0 -64
  77. package/benchmark/auto-resolve/fixtures/F16-cli-quote-tax-rules/metadata.json +0 -10
  78. package/benchmark/auto-resolve/fixtures/F16-cli-quote-tax-rules/setup.sh +0 -32
  79. package/benchmark/auto-resolve/fixtures/F16-cli-quote-tax-rules/spec.md +0 -63
  80. package/benchmark/auto-resolve/fixtures/F16-cli-quote-tax-rules/task.txt +0 -7
  81. package/benchmark/auto-resolve/fixtures/F16-cli-quote-tax-rules/verifiers/exact-success.js +0 -54
  82. package/benchmark/auto-resolve/fixtures/F16-cli-quote-tax-rules/verifiers/no-hardcoded-pricing.js +0 -47
  83. package/benchmark/auto-resolve/fixtures/F16-cli-quote-tax-rules/verifiers/stock-error.js +0 -45
  84. package/benchmark/auto-resolve/fixtures/F2-cli-medium-subcommand/NOTES.md +0 -57
  85. package/benchmark/auto-resolve/fixtures/F2-cli-medium-subcommand/expected-pair-plan-registry.json +0 -170
  86. package/benchmark/auto-resolve/fixtures/F2-cli-medium-subcommand/expected.json +0 -84
  87. package/benchmark/auto-resolve/fixtures/F2-cli-medium-subcommand/metadata.json +0 -21
  88. package/benchmark/auto-resolve/fixtures/F2-cli-medium-subcommand/pair-plan.sample-fail.json +0 -214
  89. package/benchmark/auto-resolve/fixtures/F2-cli-medium-subcommand/pair-plan.sample-pass.json +0 -223
  90. package/benchmark/auto-resolve/fixtures/F2-cli-medium-subcommand/setup.sh +0 -5
  91. package/benchmark/auto-resolve/fixtures/F2-cli-medium-subcommand/spec.md +0 -55
  92. package/benchmark/auto-resolve/fixtures/F2-cli-medium-subcommand/task.txt +0 -14
  93. package/benchmark/auto-resolve/fixtures/F21-cli-scheduler-priority/NOTES.md +0 -39
  94. package/benchmark/auto-resolve/fixtures/F21-cli-scheduler-priority/expected.json +0 -62
  95. package/benchmark/auto-resolve/fixtures/F21-cli-scheduler-priority/metadata.json +0 -10
  96. package/benchmark/auto-resolve/fixtures/F21-cli-scheduler-priority/setup.sh +0 -2
  97. package/benchmark/auto-resolve/fixtures/F21-cli-scheduler-priority/spec.md +0 -67
  98. package/benchmark/auto-resolve/fixtures/F21-cli-scheduler-priority/task.txt +0 -7
  99. package/benchmark/auto-resolve/fixtures/F21-cli-scheduler-priority/verifiers/error-order.js +0 -55
  100. package/benchmark/auto-resolve/fixtures/F21-cli-scheduler-priority/verifiers/priority-blocked.js +0 -48
  101. package/benchmark/auto-resolve/fixtures/F22-cli-ledger-close/NOTES.md +0 -35
  102. package/benchmark/auto-resolve/fixtures/F22-cli-ledger-close/expected.json +0 -56
  103. package/benchmark/auto-resolve/fixtures/F22-cli-ledger-close/metadata.json +0 -10
  104. package/benchmark/auto-resolve/fixtures/F22-cli-ledger-close/setup.sh +0 -2
  105. package/benchmark/auto-resolve/fixtures/F22-cli-ledger-close/spec.md +0 -64
  106. package/benchmark/auto-resolve/fixtures/F22-cli-ledger-close/task.txt +0 -7
  107. package/benchmark/auto-resolve/fixtures/F22-cli-ledger-close/verifiers/conflicting-duplicate.js +0 -34
  108. package/benchmark/auto-resolve/fixtures/F22-cli-ledger-close/verifiers/idempotent-close.js +0 -41
  109. package/benchmark/auto-resolve/fixtures/F23-cli-fulfillment-wave/NOTES.md +0 -39
  110. package/benchmark/auto-resolve/fixtures/F23-cli-fulfillment-wave/expected.json +0 -56
  111. package/benchmark/auto-resolve/fixtures/F23-cli-fulfillment-wave/metadata.json +0 -10
  112. package/benchmark/auto-resolve/fixtures/F23-cli-fulfillment-wave/setup.sh +0 -2
  113. package/benchmark/auto-resolve/fixtures/F23-cli-fulfillment-wave/spec.md +0 -76
  114. package/benchmark/auto-resolve/fixtures/F23-cli-fulfillment-wave/task.txt +0 -7
  115. package/benchmark/auto-resolve/fixtures/F23-cli-fulfillment-wave/verifiers/priority-rollback.js +0 -64
  116. package/benchmark/auto-resolve/fixtures/F23-cli-fulfillment-wave/verifiers/single-warehouse-fefo.js +0 -66
  117. package/benchmark/auto-resolve/fixtures/F25-cli-cart-promotion-rules/NOTES.md +0 -40
  118. package/benchmark/auto-resolve/fixtures/F25-cli-cart-promotion-rules/expected.json +0 -66
  119. package/benchmark/auto-resolve/fixtures/F25-cli-cart-promotion-rules/metadata.json +0 -10
  120. package/benchmark/auto-resolve/fixtures/F25-cli-cart-promotion-rules/setup.sh +0 -36
  121. package/benchmark/auto-resolve/fixtures/F25-cli-cart-promotion-rules/spec.md +0 -71
  122. package/benchmark/auto-resolve/fixtures/F25-cli-cart-promotion-rules/task.txt +0 -7
  123. package/benchmark/auto-resolve/fixtures/F25-cli-cart-promotion-rules/verifiers/catalog-source.js +0 -57
  124. package/benchmark/auto-resolve/fixtures/F25-cli-cart-promotion-rules/verifiers/exact-success.js +0 -63
  125. package/benchmark/auto-resolve/fixtures/F25-cli-cart-promotion-rules/verifiers/stock-error.js +0 -34
  126. package/benchmark/auto-resolve/fixtures/F26-cli-payout-ledger-rules/NOTES.md +0 -31
  127. package/benchmark/auto-resolve/fixtures/F26-cli-payout-ledger-rules/expected.json +0 -68
  128. package/benchmark/auto-resolve/fixtures/F26-cli-payout-ledger-rules/metadata.json +0 -10
  129. package/benchmark/auto-resolve/fixtures/F26-cli-payout-ledger-rules/setup.sh +0 -17
  130. package/benchmark/auto-resolve/fixtures/F26-cli-payout-ledger-rules/spec.md +0 -68
  131. package/benchmark/auto-resolve/fixtures/F26-cli-payout-ledger-rules/task.txt +0 -7
  132. package/benchmark/auto-resolve/fixtures/F26-cli-payout-ledger-rules/verifiers/conflicting-duplicate.js +0 -29
  133. package/benchmark/auto-resolve/fixtures/F26-cli-payout-ledger-rules/verifiers/exact-payout.js +0 -58
  134. package/benchmark/auto-resolve/fixtures/F26-cli-payout-ledger-rules/verifiers/rules-source.js +0 -56
  135. package/benchmark/auto-resolve/fixtures/F3-backend-contract-risk/NOTES.md +0 -35
  136. package/benchmark/auto-resolve/fixtures/F3-backend-contract-risk/expected-pair-plan-registry.json +0 -162
  137. package/benchmark/auto-resolve/fixtures/F3-backend-contract-risk/expected.json +0 -67
  138. package/benchmark/auto-resolve/fixtures/F3-backend-contract-risk/metadata.json +0 -19
  139. package/benchmark/auto-resolve/fixtures/F3-backend-contract-risk/setup.sh +0 -4
  140. package/benchmark/auto-resolve/fixtures/F3-backend-contract-risk/spec.md +0 -55
  141. package/benchmark/auto-resolve/fixtures/F3-backend-contract-risk/task.txt +0 -9
  142. package/benchmark/auto-resolve/fixtures/F31-cli-seat-rebalance/NOTES.md +0 -34
  143. package/benchmark/auto-resolve/fixtures/F31-cli-seat-rebalance/expected.json +0 -57
  144. package/benchmark/auto-resolve/fixtures/F31-cli-seat-rebalance/metadata.json +0 -10
  145. package/benchmark/auto-resolve/fixtures/F31-cli-seat-rebalance/setup.sh +0 -2
  146. package/benchmark/auto-resolve/fixtures/F31-cli-seat-rebalance/spec.md +0 -67
  147. package/benchmark/auto-resolve/fixtures/F31-cli-seat-rebalance/task.txt +0 -7
  148. package/benchmark/auto-resolve/fixtures/F31-cli-seat-rebalance/verifiers/duplicate-event-error.js +0 -35
  149. package/benchmark/auto-resolve/fixtures/F31-cli-seat-rebalance/verifiers/priority-transfer-rollback.js +0 -53
  150. package/benchmark/auto-resolve/fixtures/F32-cli-subscription-renewal/NOTES.md +0 -38
  151. package/benchmark/auto-resolve/fixtures/F32-cli-subscription-renewal/expected.json +0 -57
  152. package/benchmark/auto-resolve/fixtures/F32-cli-subscription-renewal/metadata.json +0 -10
  153. package/benchmark/auto-resolve/fixtures/F32-cli-subscription-renewal/setup.sh +0 -2
  154. package/benchmark/auto-resolve/fixtures/F32-cli-subscription-renewal/spec.md +0 -70
  155. package/benchmark/auto-resolve/fixtures/F32-cli-subscription-renewal/task.txt +0 -3
  156. package/benchmark/auto-resolve/fixtures/F32-cli-subscription-renewal/verifiers/duplicate-renewal-error.js +0 -42
  157. package/benchmark/auto-resolve/fixtures/F32-cli-subscription-renewal/verifiers/priority-credit-rollback.js +0 -70
  158. package/benchmark/auto-resolve/fixtures/F4-web-browser-design/NOTES.md +0 -47
  159. package/benchmark/auto-resolve/fixtures/F4-web-browser-design/expected.json +0 -57
  160. package/benchmark/auto-resolve/fixtures/F4-web-browser-design/metadata.json +0 -10
  161. package/benchmark/auto-resolve/fixtures/F4-web-browser-design/setup.sh +0 -6
  162. package/benchmark/auto-resolve/fixtures/F4-web-browser-design/spec.md +0 -48
  163. package/benchmark/auto-resolve/fixtures/F4-web-browser-design/task.txt +0 -9
  164. package/benchmark/auto-resolve/fixtures/F5-fix-loop-red-green/NOTES.md +0 -45
  165. package/benchmark/auto-resolve/fixtures/F5-fix-loop-red-green/expected.json +0 -65
  166. package/benchmark/auto-resolve/fixtures/F5-fix-loop-red-green/metadata.json +0 -10
  167. package/benchmark/auto-resolve/fixtures/F5-fix-loop-red-green/setup.sh +0 -55
  168. package/benchmark/auto-resolve/fixtures/F5-fix-loop-red-green/spec.md +0 -48
  169. package/benchmark/auto-resolve/fixtures/F5-fix-loop-red-green/task.txt +0 -7
  170. package/benchmark/auto-resolve/fixtures/F6-dep-audit-native-module/NOTES.md +0 -43
  171. package/benchmark/auto-resolve/fixtures/F6-dep-audit-native-module/expected.json +0 -77
  172. package/benchmark/auto-resolve/fixtures/F6-dep-audit-native-module/metadata.json +0 -10
  173. package/benchmark/auto-resolve/fixtures/F6-dep-audit-native-module/setup.sh +0 -4
  174. package/benchmark/auto-resolve/fixtures/F6-dep-audit-native-module/spec.md +0 -48
  175. package/benchmark/auto-resolve/fixtures/F6-dep-audit-native-module/task.txt +0 -10
  176. package/benchmark/auto-resolve/fixtures/F7-out-of-scope-trap/NOTES.md +0 -57
  177. package/benchmark/auto-resolve/fixtures/F7-out-of-scope-trap/expected.json +0 -76
  178. package/benchmark/auto-resolve/fixtures/F7-out-of-scope-trap/metadata.json +0 -10
  179. package/benchmark/auto-resolve/fixtures/F7-out-of-scope-trap/setup.sh +0 -36
  180. package/benchmark/auto-resolve/fixtures/F7-out-of-scope-trap/spec.md +0 -45
  181. package/benchmark/auto-resolve/fixtures/F7-out-of-scope-trap/task.txt +0 -7
  182. package/benchmark/auto-resolve/fixtures/F8-known-limit-ambiguous/NOTES.md +0 -53
  183. package/benchmark/auto-resolve/fixtures/F8-known-limit-ambiguous/expected.json +0 -63
  184. package/benchmark/auto-resolve/fixtures/F8-known-limit-ambiguous/metadata.json +0 -10
  185. package/benchmark/auto-resolve/fixtures/F8-known-limit-ambiguous/setup.sh +0 -4
  186. package/benchmark/auto-resolve/fixtures/F8-known-limit-ambiguous/spec.md +0 -48
  187. package/benchmark/auto-resolve/fixtures/F8-known-limit-ambiguous/task.txt +0 -1
  188. package/benchmark/auto-resolve/fixtures/F9-e2e-ideate-to-resolve/NOTES.md +0 -105
  189. package/benchmark/auto-resolve/fixtures/F9-e2e-ideate-to-resolve/expected.json +0 -74
  190. package/benchmark/auto-resolve/fixtures/F9-e2e-ideate-to-resolve/metadata.json +0 -10
  191. package/benchmark/auto-resolve/fixtures/F9-e2e-ideate-to-resolve/setup.sh +0 -28
  192. package/benchmark/auto-resolve/fixtures/F9-e2e-ideate-to-resolve/spec.md +0 -59
  193. package/benchmark/auto-resolve/fixtures/F9-e2e-ideate-to-resolve/task.txt +0 -5
  194. package/benchmark/auto-resolve/fixtures/SCHEMA.md +0 -188
  195. package/benchmark/auto-resolve/fixtures/retired/F27-cli-subscription-proration/NOTES.md +0 -37
  196. package/benchmark/auto-resolve/fixtures/retired/F27-cli-subscription-proration/RETIRED.md +0 -13
  197. package/benchmark/auto-resolve/fixtures/retired/F27-cli-subscription-proration/expected.json +0 -56
  198. package/benchmark/auto-resolve/fixtures/retired/F27-cli-subscription-proration/metadata.json +0 -10
  199. package/benchmark/auto-resolve/fixtures/retired/F27-cli-subscription-proration/setup.sh +0 -18
  200. package/benchmark/auto-resolve/fixtures/retired/F27-cli-subscription-proration/spec.md +0 -69
  201. package/benchmark/auto-resolve/fixtures/retired/F27-cli-subscription-proration/task.txt +0 -7
  202. package/benchmark/auto-resolve/fixtures/retired/F27-cli-subscription-proration/verifiers/exact-proration.js +0 -48
  203. package/benchmark/auto-resolve/fixtures/retired/F27-cli-subscription-proration/verifiers/rules-source-and-conflict.js +0 -79
  204. package/benchmark/auto-resolve/fixtures/retired/F28-cli-return-authorization/NOTES.md +0 -54
  205. package/benchmark/auto-resolve/fixtures/retired/F28-cli-return-authorization/RETIRED.md +0 -7
  206. package/benchmark/auto-resolve/fixtures/retired/F28-cli-return-authorization/expected.json +0 -67
  207. package/benchmark/auto-resolve/fixtures/retired/F28-cli-return-authorization/metadata.json +0 -10
  208. package/benchmark/auto-resolve/fixtures/retired/F28-cli-return-authorization/setup.sh +0 -2
  209. package/benchmark/auto-resolve/fixtures/retired/F28-cli-return-authorization/spec.md +0 -67
  210. package/benchmark/auto-resolve/fixtures/retired/F28-cli-return-authorization/task.txt +0 -5
  211. package/benchmark/auto-resolve/fixtures/retired/F28-cli-return-authorization/verifiers/policy-precedence.js +0 -72
  212. package/benchmark/auto-resolve/fixtures/retired/F28-cli-return-authorization/verifiers/validation-and-immutability.js +0 -43
  213. package/benchmark/auto-resolve/fixtures/retired/F28-cli-return-authorization/verifiers/validation-boundary.js +0 -116
  214. package/benchmark/auto-resolve/fixtures/retired/F30-cli-credit-hold-settlement/NOTES.md +0 -35
  215. package/benchmark/auto-resolve/fixtures/retired/F30-cli-credit-hold-settlement/RETIRED.md +0 -12
  216. package/benchmark/auto-resolve/fixtures/retired/F30-cli-credit-hold-settlement/expected.json +0 -58
  217. package/benchmark/auto-resolve/fixtures/retired/F30-cli-credit-hold-settlement/metadata.json +0 -10
  218. package/benchmark/auto-resolve/fixtures/retired/F30-cli-credit-hold-settlement/setup.sh +0 -2
  219. package/benchmark/auto-resolve/fixtures/retired/F30-cli-credit-hold-settlement/spec.md +0 -73
  220. package/benchmark/auto-resolve/fixtures/retired/F30-cli-credit-hold-settlement/task.txt +0 -17
  221. package/benchmark/auto-resolve/fixtures/retired/F30-cli-credit-hold-settlement/verifiers/mixed-idempotent-settlement.js +0 -53
  222. package/benchmark/auto-resolve/fixtures/retired/F30-cli-credit-hold-settlement/verifiers/rejection-boundaries.js +0 -74
  223. package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/NOTES.md +0 -28
  224. package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/RETIRED.md +0 -15
  225. package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/expected.json +0 -57
  226. package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/metadata.json +0 -10
  227. package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/setup.sh +0 -50
  228. package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/spec.md +0 -59
  229. package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/task.txt +0 -9
  230. package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/verifiers/ordered-settlement.js +0 -88
  231. package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/verifiers/reject-invalid.js +0 -45
  232. package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/NOTES.md +0 -30
  233. package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/RETIRED.md +0 -16
  234. package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/expected.json +0 -64
  235. package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/metadata.json +0 -10
  236. package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/setup.sh +0 -21
  237. package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/spec.md +0 -58
  238. package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/task.txt +0 -9
  239. package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/verifiers/dup-op.js +0 -54
  240. package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/verifiers/priority-apply.js +0 -82
  241. package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/verifiers/rollback.js +0 -77
  242. package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/NOTES.md +0 -99
  243. package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/RETIRED.md +0 -18
  244. package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/expected.json +0 -64
  245. package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/metadata.json +0 -10
  246. package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/setup.sh +0 -4
  247. package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/spec.md +0 -61
  248. package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/task.txt +0 -9
  249. package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/verifiers/correctness-small.js +0 -135
  250. package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/verifiers/scale.js +0 -100
  251. package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/verifiers/validation.js +0 -75
  252. package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/NOTES.md +0 -93
  253. package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/RETIRED.md +0 -16
  254. package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/expected.json +0 -65
  255. package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/metadata.json +0 -10
  256. package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/setup.sh +0 -18
  257. package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/spec.md +0 -66
  258. package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/task.txt +0 -9
  259. package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/verifiers/correctness-small.js +0 -84
  260. package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/verifiers/scale.js +0 -184
  261. package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/verifiers/validation.js +0 -74
  262. package/benchmark/auto-resolve/fixtures/retired/F9-e2e-ideate-to-preflight/NOTES.md +0 -60
  263. package/benchmark/auto-resolve/fixtures/retired/F9-e2e-ideate-to-preflight/RETIRED.md +0 -29
  264. package/benchmark/auto-resolve/fixtures/retired/F9-e2e-ideate-to-preflight/expected.json +0 -73
  265. package/benchmark/auto-resolve/fixtures/retired/F9-e2e-ideate-to-preflight/metadata.json +0 -10
  266. package/benchmark/auto-resolve/fixtures/retired/F9-e2e-ideate-to-preflight/setup.sh +0 -28
  267. package/benchmark/auto-resolve/fixtures/retired/F9-e2e-ideate-to-preflight/spec.md +0 -58
  268. package/benchmark/auto-resolve/fixtures/retired/F9-e2e-ideate-to-preflight/task.txt +0 -5
  269. package/benchmark/auto-resolve/fixtures/test-repo/README.md +0 -12
  270. package/benchmark/auto-resolve/fixtures/test-repo/bin/cli.js +0 -63
  271. package/benchmark/auto-resolve/fixtures/test-repo/package-lock.json +0 -823
  272. package/benchmark/auto-resolve/fixtures/test-repo/package.json +0 -22
  273. package/benchmark/auto-resolve/fixtures/test-repo/playwright.config.js +0 -17
  274. package/benchmark/auto-resolve/fixtures/test-repo/server/index.js +0 -37
  275. package/benchmark/auto-resolve/fixtures/test-repo/tests/cli.test.js +0 -25
  276. package/benchmark/auto-resolve/fixtures/test-repo/tests/server.test.js +0 -58
  277. package/benchmark/auto-resolve/fixtures/test-repo/web/index.html +0 -37
  278. package/benchmark/auto-resolve/results/20260507-f10-f11-tier1-full-pipeline/headroom-gate.json +0 -25
  279. package/benchmark/auto-resolve/results/20260507-f10-f11-tier1-full-pipeline/headroom-gate.md +0 -10
  280. package/benchmark/auto-resolve/results/20260508-f22-exact-error-headroom/headroom-gate.json +0 -18
  281. package/benchmark/auto-resolve/results/20260508-f22-exact-error-headroom/headroom-gate.md +0 -9
  282. package/benchmark/auto-resolve/results/20260508-f26-headroom/headroom-gate.json +0 -18
  283. package/benchmark/auto-resolve/results/20260508-f26-headroom/headroom-gate.md +0 -9
  284. package/benchmark/auto-resolve/results/20260510-f16-f23-f25-combined-proof/F16-cli-quote-tax-rules/l2_risk_probes/result.json +0 -28
  285. package/benchmark/auto-resolve/results/20260510-f16-f23-f25-combined-proof/F23-cli-fulfillment-wave/l2_risk_probes/result.json +0 -28
  286. package/benchmark/auto-resolve/results/20260510-f16-f23-f25-combined-proof/F25-cli-cart-promotion-rules/l2_risk_probes/result.json +0 -30
  287. package/benchmark/auto-resolve/results/20260510-f16-f23-f25-combined-proof/full-pipeline-pair-gate.json +0 -82
  288. package/benchmark/auto-resolve/results/20260510-f16-f23-f25-combined-proof/full-pipeline-pair-gate.md +0 -18
  289. package/benchmark/auto-resolve/results/20260510-f16-f23-f25-combined-proof/headroom-gate.json +0 -46
  290. package/benchmark/auto-resolve/results/20260510-f16-f23-f25-combined-proof/headroom-gate.md +0 -17
  291. package/benchmark/auto-resolve/results/20260511-f12-webhook-headroom/headroom-gate.json +0 -28
  292. package/benchmark/auto-resolve/results/20260511-f12-webhook-headroom/headroom-gate.md +0 -15
  293. package/benchmark/auto-resolve/results/20260511-f15-concurrency-headroom/headroom-gate.json +0 -28
  294. package/benchmark/auto-resolve/results/20260511-f15-concurrency-headroom/headroom-gate.md +0 -15
  295. package/benchmark/auto-resolve/results/20260511-f21-current-riskprobes-v1/F21-cli-scheduler-priority/l2_risk_probes/result.json +0 -32
  296. package/benchmark/auto-resolve/results/20260511-f21-current-riskprobes-v1/full-pipeline-pair-gate.json +0 -44
  297. package/benchmark/auto-resolve/results/20260511-f21-current-riskprobes-v1/full-pipeline-pair-gate.md +0 -16
  298. package/benchmark/auto-resolve/results/20260511-f21-current-riskprobes-v1/headroom-gate.json +0 -18
  299. package/benchmark/auto-resolve/results/20260511-f21-current-riskprobes-v1/headroom-gate.md +0 -9
  300. package/benchmark/auto-resolve/results/20260511-f3-http-error-headroom/headroom-gate.json +0 -28
  301. package/benchmark/auto-resolve/results/20260511-f3-http-error-headroom/headroom-gate.md +0 -15
  302. package/benchmark/auto-resolve/results/20260512-f2-medium-headroom/headroom-gate.json +0 -28
  303. package/benchmark/auto-resolve/results/20260512-f2-medium-headroom/headroom-gate.md +0 -15
  304. package/benchmark/auto-resolve/results/20260512-f31-seat-rebalance-headroom/headroom-gate.json +0 -28
  305. package/benchmark/auto-resolve/results/20260512-f31-seat-rebalance-headroom/headroom-gate.md +0 -15
  306. package/benchmark/auto-resolve/results/20260512-f32-subscription-renewal-headroom/headroom-gate.json +0 -28
  307. package/benchmark/auto-resolve/results/20260512-f32-subscription-renewal-headroom/headroom-gate.md +0 -15
  308. package/benchmark/auto-resolve/results/20260512-f4-web-headroom/headroom-gate.json +0 -28
  309. package/benchmark/auto-resolve/results/20260512-f4-web-headroom/headroom-gate.md +0 -15
  310. package/benchmark/auto-resolve/results/20260512-f5-fixloop-headroom/headroom-gate.json +0 -28
  311. package/benchmark/auto-resolve/results/20260512-f5-fixloop-headroom/headroom-gate.md +0 -15
  312. package/benchmark/auto-resolve/results/20260512-f6-checksum-headroom/headroom-gate.json +0 -28
  313. package/benchmark/auto-resolve/results/20260512-f6-checksum-headroom/headroom-gate.md +0 -15
  314. package/benchmark/auto-resolve/results/20260512-f7-scope-headroom/headroom-gate.json +0 -28
  315. package/benchmark/auto-resolve/results/20260512-f7-scope-headroom/headroom-gate.md +0 -15
  316. package/benchmark/auto-resolve/results/20260512-f9-e2e-headroom/headroom-gate.json +0 -28
  317. package/benchmark/auto-resolve/results/20260512-f9-e2e-headroom/headroom-gate.md +0 -15
  318. package/benchmark/auto-resolve/run-real-benchmark.md +0 -303
  319. package/benchmark/auto-resolve/scripts/audit-headroom-rejections.py +0 -441
  320. package/benchmark/auto-resolve/scripts/audit-pair-evidence.py +0 -1256
  321. package/benchmark/auto-resolve/scripts/build-pair-eligible-manifest.py +0 -306
  322. package/benchmark/auto-resolve/scripts/check-f9-artifacts.py +0 -268
  323. package/benchmark/auto-resolve/scripts/collect-swebench-predictions.py +0 -108
  324. package/benchmark/auto-resolve/scripts/compile-report.py +0 -493
  325. package/benchmark/auto-resolve/scripts/fetch-swebench-instances.py +0 -129
  326. package/benchmark/auto-resolve/scripts/frozen-verify-gate.py +0 -434
  327. package/benchmark/auto-resolve/scripts/full-pipeline-pair-gate.py +0 -612
  328. package/benchmark/auto-resolve/scripts/headroom-gate.py +0 -378
  329. package/benchmark/auto-resolve/scripts/iter-0033c-compare.py +0 -683
  330. package/benchmark/auto-resolve/scripts/iter-0033c-l1-summary.py +0 -97
  331. package/benchmark/auto-resolve/scripts/judge-opus-pass.sh +0 -542
  332. package/benchmark/auto-resolve/scripts/judge.sh +0 -565
  333. package/benchmark/auto-resolve/scripts/oracle-scope-tier-a.py +0 -256
  334. package/benchmark/auto-resolve/scripts/oracle-scope-tier-b.py +0 -287
  335. package/benchmark/auto-resolve/scripts/oracle-test-fidelity.py +0 -328
  336. package/benchmark/auto-resolve/scripts/pair-candidate-frontier.py +0 -469
  337. package/benchmark/auto-resolve/scripts/pair-plan-idgen.py +0 -401
  338. package/benchmark/auto-resolve/scripts/pair-plan-lint.py +0 -475
  339. package/benchmark/auto-resolve/scripts/pair-rejected-fixtures.sh +0 -103
  340. package/benchmark/auto-resolve/scripts/pair_evidence_contract.py +0 -270
  341. package/benchmark/auto-resolve/scripts/prepare-swebench-frozen-case.py +0 -273
  342. package/benchmark/auto-resolve/scripts/prepare-swebench-frozen-corpus.py +0 -148
  343. package/benchmark/auto-resolve/scripts/prepare-swebench-solver-worktree.py +0 -210
  344. package/benchmark/auto-resolve/scripts/recent-benchmark-summary.py +0 -232
  345. package/benchmark/auto-resolve/scripts/run-fixture.sh +0 -1024
  346. package/benchmark/auto-resolve/scripts/run-frozen-verify-pair.sh +0 -683
  347. package/benchmark/auto-resolve/scripts/run-full-pipeline-pair-candidate.sh +0 -458
  348. package/benchmark/auto-resolve/scripts/run-headroom-candidate.sh +0 -336
  349. package/benchmark/auto-resolve/scripts/run-iter-0033c.sh +0 -208
  350. package/benchmark/auto-resolve/scripts/run-suite.sh +0 -251
  351. package/benchmark/auto-resolve/scripts/run-swebench-frozen-corpus.sh +0 -310
  352. package/benchmark/auto-resolve/scripts/run-swebench-solver-batch.sh +0 -257
  353. package/benchmark/auto-resolve/scripts/ship-gate.py +0 -391
  354. package/benchmark/auto-resolve/scripts/solo-ceiling-avoidance.py +0 -53
  355. package/benchmark/auto-resolve/scripts/solo-headroom-hypothesis.py +0 -77
  356. package/benchmark/auto-resolve/scripts/swebench-frozen-matrix.py +0 -478
  357. package/benchmark/auto-resolve/scripts/test-audit-headroom-rejections.sh +0 -288
  358. package/benchmark/auto-resolve/scripts/test-audit-pair-evidence.sh +0 -1672
  359. package/benchmark/auto-resolve/scripts/test-benchmark-arg-parsing.sh +0 -1015
  360. package/benchmark/auto-resolve/scripts/test-build-pair-eligible-manifest.sh +0 -491
  361. package/benchmark/auto-resolve/scripts/test-check-f9-artifacts.sh +0 -91
  362. package/benchmark/auto-resolve/scripts/test-frozen-verify-gate.sh +0 -517
  363. package/benchmark/auto-resolve/scripts/test-full-pipeline-pair-gate.sh +0 -610
  364. package/benchmark/auto-resolve/scripts/test-headroom-gate.sh +0 -401
  365. package/benchmark/auto-resolve/scripts/test-iter-0033c-compare.sh +0 -525
  366. package/benchmark/auto-resolve/scripts/test-iter-0033c-l1-summary.sh +0 -254
  367. package/benchmark/auto-resolve/scripts/test-lint-fixtures.sh +0 -580
  368. package/benchmark/auto-resolve/scripts/test-pair-candidate-frontier.sh +0 -591
  369. package/benchmark/auto-resolve/scripts/test-run-full-pipeline-pair-candidate.sh +0 -497
  370. package/benchmark/auto-resolve/scripts/test-run-headroom-candidate.sh +0 -401
  371. package/benchmark/auto-resolve/scripts/test-run-swebench-solver-batch.sh +0 -111
  372. package/benchmark/auto-resolve/scripts/test-ship-gate.sh +0 -1189
  373. package/benchmark/auto-resolve/scripts/test-swebench-frozen-case.sh +0 -1221
  374. package/benchmark/auto-resolve/shadow-fixtures/S1-cli-lang-flag/NOTES.md +0 -28
  375. package/benchmark/auto-resolve/shadow-fixtures/S1-cli-lang-flag/expected.json +0 -63
  376. package/benchmark/auto-resolve/shadow-fixtures/S1-cli-lang-flag/metadata.json +0 -10
  377. package/benchmark/auto-resolve/shadow-fixtures/S1-cli-lang-flag/setup.sh +0 -3
  378. package/benchmark/auto-resolve/shadow-fixtures/S1-cli-lang-flag/spec.md +0 -47
  379. package/benchmark/auto-resolve/shadow-fixtures/S1-cli-lang-flag/task.txt +0 -1
  380. package/benchmark/auto-resolve/shadow-fixtures/S2-cli-inventory-reservation/NOTES.md +0 -34
  381. package/benchmark/auto-resolve/shadow-fixtures/S2-cli-inventory-reservation/expected.json +0 -53
  382. package/benchmark/auto-resolve/shadow-fixtures/S2-cli-inventory-reservation/metadata.json +0 -10
  383. package/benchmark/auto-resolve/shadow-fixtures/S2-cli-inventory-reservation/setup.sh +0 -3
  384. package/benchmark/auto-resolve/shadow-fixtures/S2-cli-inventory-reservation/spec.md +0 -50
  385. package/benchmark/auto-resolve/shadow-fixtures/S2-cli-inventory-reservation/task.txt +0 -1
  386. package/benchmark/auto-resolve/shadow-fixtures/S2-cli-inventory-reservation/verifiers/duplicate-order-error.js +0 -27
  387. package/benchmark/auto-resolve/shadow-fixtures/S2-cli-inventory-reservation/verifiers/priority-stock-reservation.js +0 -44
  388. package/benchmark/auto-resolve/shadow-fixtures/S3-cli-ticket-assignment/NOTES.md +0 -34
  389. package/benchmark/auto-resolve/shadow-fixtures/S3-cli-ticket-assignment/expected.json +0 -55
  390. package/benchmark/auto-resolve/shadow-fixtures/S3-cli-ticket-assignment/metadata.json +0 -10
  391. package/benchmark/auto-resolve/shadow-fixtures/S3-cli-ticket-assignment/setup.sh +0 -3
  392. package/benchmark/auto-resolve/shadow-fixtures/S3-cli-ticket-assignment/spec.md +0 -52
  393. package/benchmark/auto-resolve/shadow-fixtures/S3-cli-ticket-assignment/task.txt +0 -1
  394. package/benchmark/auto-resolve/shadow-fixtures/S3-cli-ticket-assignment/verifiers/duplicate-ticket-error.js +0 -29
  395. package/benchmark/auto-resolve/shadow-fixtures/S3-cli-ticket-assignment/verifiers/priority-agent-assignment.js +0 -48
  396. package/benchmark/auto-resolve/shadow-fixtures/S4-cli-return-routing/NOTES.md +0 -34
  397. package/benchmark/auto-resolve/shadow-fixtures/S4-cli-return-routing/expected.json +0 -55
  398. package/benchmark/auto-resolve/shadow-fixtures/S4-cli-return-routing/metadata.json +0 -10
  399. package/benchmark/auto-resolve/shadow-fixtures/S4-cli-return-routing/setup.sh +0 -3
  400. package/benchmark/auto-resolve/shadow-fixtures/S4-cli-return-routing/spec.md +0 -55
  401. package/benchmark/auto-resolve/shadow-fixtures/S4-cli-return-routing/task.txt +0 -1
  402. package/benchmark/auto-resolve/shadow-fixtures/S4-cli-return-routing/verifiers/duplicate-return-error.js +0 -43
  403. package/benchmark/auto-resolve/shadow-fixtures/S4-cli-return-routing/verifiers/priority-return-routing.js +0 -70
  404. package/benchmark/auto-resolve/shadow-fixtures/S5-cli-credit-grant-ledger/NOTES.md +0 -37
  405. package/benchmark/auto-resolve/shadow-fixtures/S5-cli-credit-grant-ledger/expected.json +0 -54
  406. package/benchmark/auto-resolve/shadow-fixtures/S5-cli-credit-grant-ledger/metadata.json +0 -10
  407. package/benchmark/auto-resolve/shadow-fixtures/S5-cli-credit-grant-ledger/setup.sh +0 -3
  408. package/benchmark/auto-resolve/shadow-fixtures/S5-cli-credit-grant-ledger/spec.md +0 -59
  409. package/benchmark/auto-resolve/shadow-fixtures/S5-cli-credit-grant-ledger/task.txt +0 -1
  410. package/benchmark/auto-resolve/shadow-fixtures/S5-cli-credit-grant-ledger/verifiers/credit-ledger-priority.js +0 -98
  411. package/benchmark/auto-resolve/shadow-fixtures/S5-cli-credit-grant-ledger/verifiers/duplicate-charge-error.js +0 -38
  412. package/benchmark/auto-resolve/shadow-fixtures/S6-cli-refund-window-ledger/NOTES.md +0 -36
  413. package/benchmark/auto-resolve/shadow-fixtures/S6-cli-refund-window-ledger/expected.json +0 -56
  414. package/benchmark/auto-resolve/shadow-fixtures/S6-cli-refund-window-ledger/metadata.json +0 -10
  415. package/benchmark/auto-resolve/shadow-fixtures/S6-cli-refund-window-ledger/setup.sh +0 -3
  416. package/benchmark/auto-resolve/shadow-fixtures/S6-cli-refund-window-ledger/spec.md +0 -59
  417. package/benchmark/auto-resolve/shadow-fixtures/S6-cli-refund-window-ledger/task.txt +0 -1
  418. package/benchmark/auto-resolve/shadow-fixtures/S6-cli-refund-window-ledger/verifiers/duplicate-refund-error.js +0 -41
  419. package/benchmark/auto-resolve/shadow-fixtures/S6-cli-refund-window-ledger/verifiers/priority-refund-ledger.js +0 -65
  420. package/config/skills/_shared/pair-plan-schema.md +0 -298
  421. package/scripts/lint-fixtures.sh +0 -352
  422. package/scripts/lint-shadow-fixtures.sh +0 -58
  423. package/scripts/lint-skills.sh +0 -4265
  424. package/scripts/test-owner-phases.py +0 -193
@@ -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[@]}"