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,696 +0,0 @@
1
- # devlyn-cli resolve Benchmark Suite
2
-
3
- One-command resolve benchmark that gates every harness change with a ship/rollback decision.
4
-
5
- ## Quick start
6
-
7
- ```bash
8
- npx devlyn-cli benchmark # n=1 smoke, all fixtures × 3 arms, judge, report, ship-gate
9
- npx devlyn-cli benchmark F2 # specific fixture only
10
- npx devlyn-cli benchmark headroom F16-cli-quote-tax-rules F23-cli-fulfillment-wave F25-cli-cart-promotion-rules
11
- npx devlyn-cli benchmark pair --min-fixtures 3 --max-pair-solo-wall-ratio 3 F16-cli-quote-tax-rules F23-cli-fulfillment-wave F25-cli-cart-promotion-rules
12
- npx devlyn-cli benchmark --dry-run # validate suite wiring without model invocation
13
- npx devlyn-cli benchmark --bless # if ship-gate PASSes, promote this run as the shipped baseline
14
- npx devlyn-cli benchmark --judge-only --run-id <ID> # re-judge an existing run's artifacts
15
- ```
16
-
17
- Exit code 0 = PASS, 1 = FAIL.
18
-
19
- ## What it does
20
-
21
- 1. For every fixture × arm (`variant` / `solo_claude` / `bare`):
22
- - Prepare a fresh temp copy of `fixtures/test-repo/`.
23
- - Commit baseline + apply `setup.sh` + commit bench scaffolding.
24
- - Invoke the arm via an isolated `claude -p` subprocess.
25
- - Capture `diff.patch`, `transcript.txt`, `timing.json`, run `expected.json::verification_commands`.
26
- 2. For every fixture, invoke isolated Codex as a blind judge with randomized slots using the 4-axis rubric in `RUBRIC.md`.
27
- 3. Aggregate into `results/<run-id>/report.md` + `summary.json`.
28
- 4. Apply ship-gate thresholds (`scripts/ship-gate.py`). Print verdict.
29
- 5. Append immutable record to `history/runs/<run-id>.json`.
30
-
31
- ## Directory layout
32
-
33
- ```
34
- benchmark/auto-resolve/
35
- ├── BENCHMARK-DESIGN.md # full design rationale
36
- ├── README.md # this file
37
- ├── RUBRIC.md # 4-axis scoring + ship gates
38
- │
39
- ├── fixtures/
40
- │ ├── SCHEMA.md # fixture file format
41
- │ ├── test-repo/ # bootstrap Node project — base for all arms
42
- │ ├── F2-cli-medium-subcommand/
43
- │ └── F1,F3-F9/ # add per Stage 2-3
44
- │
45
- ├── scripts/
46
- │ ├── run-suite.sh # single entry — called by `npx devlyn-cli benchmark`
47
- │ ├── run-fixture.sh # one fixture × one arm, self-contained
48
- │ ├── judge.sh # Codex blind judge for one fixture
49
- │ ├── compile-report.py # aggregates into report.md + summary.json
50
- │ ├── ship-gate.py # applies thresholds + writes history record
51
- │ ├── test-benchmark-arg-parsing.sh
52
- │ ├── test-ship-gate.sh
53
- │ ├── run-headroom-candidate.sh
54
- │ ├── headroom-gate.py # blocks pair measurement without headroom set
55
- │ ├── test-headroom-gate.sh
56
- │ ├── test-run-headroom-candidate.sh
57
- │ ├── run-full-pipeline-pair-candidate.sh
58
- │ ├── test-run-full-pipeline-pair-candidate.sh
59
- │ ├── full-pipeline-pair-gate.py
60
- │ ├── test-full-pipeline-pair-gate.sh
61
- │ ├── pair-candidate-frontier.py
62
- │ ├── test-pair-candidate-frontier.sh
63
- │ ├── audit-pair-evidence.py
64
- │ ├── test-audit-pair-evidence.sh
65
- │ ├── audit-headroom-rejections.py
66
- │ ├── test-audit-headroom-rejections.sh
67
- │ ├── test-check-f9-artifacts.sh
68
- │ ├── iter-0033c-l1-summary.py
69
- │ ├── test-iter-0033c-l1-summary.sh
70
- │ ├── run-frozen-verify-pair.sh
71
- │ ├── fetch-swebench-instances.py
72
- │ ├── collect-swebench-predictions.py
73
- │ ├── run-swebench-solver-batch.sh
74
- │ ├── test-run-swebench-solver-batch.sh
75
- │ ├── prepare-swebench-frozen-case.py
76
- │ ├── prepare-swebench-frozen-corpus.py
77
- │ ├── run-swebench-frozen-corpus.sh
78
- │ ├── swebench-frozen-matrix.py
79
- │ ├── test-swebench-frozen-case.sh
80
- │ ├── frozen-verify-gate.py # gates frozen VERIFY pair-lift evidence
81
- │ └── test-frozen-verify-gate.sh
82
- │
83
- ├── external/swebench/ # ignored local imports of SWE-bench cases/repos
84
- ├── results/<run-id>/ # per-run artifacts (overwritten)
85
- └── history/
86
- ├── runs/ # append-only, one JSON per run
87
- ├── latest.json # pointer to most recent run
88
- └── baselines/shipped.json # last blessed version, used for regression floor
89
- ```
90
-
91
- ## Prerequisites
92
-
93
- - `claude` CLI on PATH (Claude Code, used to invoke each arm).
94
- - `codex` CLI on PATH (used by the blind judge). Install from https://platform.openai.com/docs/codex.
95
- - `python3`, `node`, `git`, `timeout`.
96
-
97
- ## Adding a fixture
98
-
99
- Follow `fixtures/SCHEMA.md`. Six files per fixture: `metadata.json`, `spec.md`, `task.txt`, `expected.json`, `NOTES.md`, `setup.sh`. Common workflow:
100
-
101
- 1. Copy an existing fixture directory as a template.
102
- 2. Rewrite `metadata.json::intent` with the new task's plain-language intent.
103
- 3. Write `spec.md` (resolve-ready) and `task.txt` (plain prompt) both derived from the intent.
104
- 4. Fill `expected.json` with concrete verification commands and forbidden patterns.
105
- 5. Document purpose + failure mode in `NOTES.md`.
106
- 6. Add `setup.sh` if the task needs the base `test-repo` modified before either arm starts.
107
- 7. Run `bash scripts/lint-fixtures.sh`.
108
-
109
- For draft pair candidates, start in `shadow-fixtures/S*` and run
110
- `bash scripts/lint-shadow-fixtures.sh`. The headroom and pair candidate runners
111
- accept explicitly named `S*` ids for dry-run checks and candidate measurement,
112
- but shadow results are read-only signals. Promote a validated task to an active
113
- `F*` fixture before counting it as golden pair evidence.
114
- Use `run-suite.sh --suite shadow` only with `--dry-run`; the suite path refuses
115
- provider and judge runs for shadow fixtures so rejected/smoke controls do not
116
- spend benchmark budget accidentally.
117
- Before spending provider calls, write a solo-headroom hypothesis into the
118
- candidate's `spec.md`: name the visible behavior a capable `solo_claude`
119
- baseline is expected to miss, and the observable command from `expected.json`
120
- that would expose that miss. A hypothesis of only "the task is hard" is not
121
- enough; rework the candidate before measurement. `lint-shadow-fixtures.sh` and
122
- the candidate runners enforce this as an actionable hypothesis: the fixture
123
- `spec.md` must contain `solo-headroom hypothesis`, `solo_claude`, `miss`, and a
124
- backticked observable command matching `expected.json`, with the backticked line
125
- itself containing `miss` and framed as the command/observable that exposes it.
126
- For unmeasured high-risk shadow candidates, `NOTES.md` must also include
127
- `## Solo ceiling avoidance` naming how the candidate differs from the
128
- solo-saturated `S2`-`S6` controls and why that difference should preserve
129
- `solo_claude` headroom. If that distinction is not concrete, rework the
130
- candidate before measurement.
131
- If a real shadow headroom run fails because the fixture is solo-saturated, record
132
- the run and score in the fixture's `NOTES.md` and add the fixture to
133
- `scripts/pair-rejected-fixtures.sh`; `lint-shadow-fixtures.sh` enforces that
134
- calibrated shadow `FAIL` entries are registered before future provider spend.
135
-
136
- For L2/pair candidate fixtures, also run:
137
-
138
- ```bash
139
- bash benchmark/auto-resolve/scripts/run-headroom-candidate.sh \
140
- --bare-max 60 \
141
- --solo-max 80 \
142
- --min-fixtures 3 \
143
- F16-cli-quote-tax-rules F23-cli-fulfillment-wave F25-cli-cart-promotion-rules
144
- ```
145
-
146
- The same runner is available through `npx devlyn-cli benchmark headroom ...`.
147
- This runs only the arms needed for calibration (`bare` and `solo_claude`),
148
- blind-judges them, and applies `headroom-gate.py`. A candidate set is not
149
- usable for pair measurement unless at least two fixtures pass and each fixture
150
- has evidence-complete `bare <= 60` and `solo_claude <= 80` scores with the
151
- default minimum 5-point `bare`/`solo_claude` headroom margin.
152
- The runner prints the headroom gate markdown report to stdout, including the
153
- startup `Gate:` line and the fixture score table with bare score, bare
154
- headroom, solo_claude score, solo_claude headroom, status, and reason columns. When launched
155
- through `npx devlyn-cli benchmark headroom`, the replay `Command:` uses the
156
- same package CLI path.
157
- For passing sets, the report also prints average and minimum `bare`/`solo_claude`
158
- headroom plus the fixture pass count, so ceiling-near, threshold-fragile, or
159
- under-count candidate sets are visible before spending pair arms.
160
- It explicitly reports whether the candidate set was accepted or rejected.
161
- Evidence-clean means the measured arm has complete artifacts, no deterministic
162
- or judge disqualifier, all expected verification commands pass, and any
163
- skill-pipeline verdict is non-blocking (`PASS` or `PASS_WITH_ISSUES`). A
164
- one-fixture calibration run can show useful scores but does not satisfy the set
165
- gate. Add `--dry-run` to validate args, fixture ids, minimum fixture count, and
166
- the replay command without running arms or judges.
167
- Known rejected or ceiling-saturated fixtures are refused by default in the
168
- headroom runner; use `--allow-rejected-fixtures` only for diagnostics of
169
- rejected fixtures or calibrated shadow controls, not for new pair-evidence
170
- candidate selection. Retired fixtures are preserved for historical artifact replay
171
- and are not rerun by the pair-candidate runners.
172
- Before spending new provider calls, inspect the active candidate frontier:
173
-
174
- ```bash
175
- python3 benchmark/auto-resolve/scripts/pair-candidate-frontier.py \
176
- --out-md /tmp/devlyn-pair-frontier.md
177
- npx devlyn-cli benchmark recent
178
- npx devlyn-cli benchmark recent --out-md /tmp/devlyn-recent-benchmark.md
179
- npx devlyn-cli benchmark frontier --out-md /tmp/devlyn-pair-frontier.md
180
- ```
181
-
182
- `benchmark recent` is the reader-facing version of the current evidence set: it
183
- prints a compact, wrap-safe status block, pair-lift aggregates, and one card per
184
- passing pair-evidence fixture. Use it for PR comments and release notes when a
185
- wide frontier table would wrap poorly.
186
- The frontier report lists active fixtures as `rejected`,
187
- `pair_evidence_passed`, or `candidate_unmeasured`, using the same rejected
188
- fixture registry and local full-pipeline gate artifacts. It also prints stdout
189
- summary rows with `bare`, `solo_claude`, `pair`, pair arm, margin, wall ratio, run id, verdict, and trigger reasons for
190
- fixtures that already have complete pair evidence rows, plus average/minimum pair margin and wall ratio,
191
- even when writing `--out-md` or `--out-json`. The markdown artifact also carries
192
- the overall verdict plus row-level verdict, pair-arm, and trigger-reason columns.
193
- Full-pipeline pair gate artifacts record `require_hypothesis_trigger` in JSON
194
- and the report includes a Markdown `Hypothesis trigger` column, so strict regenerated
195
- evidence shows whether each row carried `spec.solo_headroom_hypothesis`.
196
- After a headroom run fails, audit that any active failed fixture without passing
197
- pair evidence is either rejected or reworked before more provider spend. The
198
- same audit also rejects active registry entries whose reason cites a run id or
199
- score that is not backed by a matching local headroom artifact:
200
-
201
- ```bash
202
- python3 benchmark/auto-resolve/scripts/audit-headroom-rejections.py
203
- npx devlyn-cli benchmark audit-headroom --out-json /tmp/devlyn-headroom-audit.json
204
- ```
205
-
206
- For release or handoff checks where open candidates are not acceptable, add
207
- `--fail-on-unmeasured` to the frontier command so any active
208
- `candidate_unmeasured` fixture becomes a nonzero exit.
209
- The package CLI exposes that release/handoff guard as one command:
210
-
211
- ```bash
212
- npx devlyn-cli benchmark audit --out-dir /tmp/devlyn-benchmark-audit
213
- npx devlyn-cli benchmark audit --require-hypothesis-trigger --out-dir /tmp/devlyn-benchmark-audit-strict
214
- ```
215
-
216
- It writes `audit.json` with the frontier summary and an artifact map (`artifacts`), plus
217
- `frontier.json`, `frontier.stdout`, `frontier.stderr`, `headroom-audit.json`, and child stdout/stderr logs, prints the same frontier score rows for existing complete pair
218
- evidence rows, and embeds those compact trigger-backed verdict-bearing score rows in
219
- `audit.json` as `pair_evidence_rows` (each row carries `pair_trigger_eligible: true`, non-empty `pair_trigger_reasons`, `pair_trigger_has_canonical_reason: true`, and `pair_trigger_has_hypothesis_reason`; the audit fails rows missing trigger reasons or missing actionable solo-headroom hypotheses in fixture `spec.md` whose observable command matches `expected.json`). It fails if either active unmeasured pair candidates or unrecorded
220
- headroom failures remain. By default it also revalidates frontier `verdict: PASS`
221
- and zero unmeasured candidates, requires at least four active fixtures with passing pair evidence,
222
- and requires each counted evidence row to satisfy `pair_mode: true`, the default 5-point pair margin, and 3x pair/solo wall ratio.
223
- The audit stdout also prints `headroom_rejections=...`,
224
- `pair_evidence_quality=...`, `pair_trigger_reasons=...`, and
225
- `pair_evidence_hypotheses=...` and
226
- `pair_evidence_hypothesis_triggers=...` handoff rows, plus
227
- `pair_trigger_historical_aliases=...` when archived evidence includes legacy
228
- trigger aliases and `pair_evidence_hypothesis_trigger_gaps=...` when documented
229
- hypotheses have not yet propagated into trigger reasons, with rejected-fixture
230
- coverage counts plus actual minimum pair margin, maximum pair/solo wall ratio,
231
- and canonical trigger reason coverage plus row-match status. The compact evidence row count must match the frontier evidence count, so incomplete local score
232
- artifacts cannot inflate the claim. `checks.frontier_stdout` records summary,
233
- aggregate, final-verdict, expected, printed score-row, trigger-visible row, and hypothesis-trigger-visible row counts, `checks.pair_evidence_quality`
234
- records the same quality thresholds from the compact rows,
235
- `checks.pair_trigger_reasons` records canonical/historical-alias/exposed/total trigger-reason row counts, fixture-level historical alias details, summary count, and row-match status
236
- for handoff review, `checks.pair_evidence_hypotheses` records documented/total pair-evidence hypothesis row counts, and `checks.pair_evidence_hypothesis_triggers` records whether documented hypotheses also appear as `spec.solo_headroom_hypothesis` trigger reasons plus fixture-level gap details.
237
- Add `--require-hypothesis-trigger` to turn those hypothesis-trigger gaps from
238
- archived-evidence WARN rows into release-blocking FAIL rows for newly
239
- regenerated pair evidence.
240
- Historical trigger aliases are only reported for archived artifact review; new
241
- current pair-evidence gates fail historical-only or unknown trigger reasons and
242
- require at least one canonical `pair_trigger.reasons` entry.
243
- `checks.headroom_rejections` records the child verdict plus unrecorded and
244
- unsupported registry-rejection counts, so handoff review can see rejected-fixture
245
- coverage without opening the child artifact first.
246
- Override `--min-pair-evidence`, `--min-pair-margin`, or
247
- `--max-pair-solo-wall-ratio` only for narrower diagnostics.
248
-
249
- When changing the calibration/pair evidence gates, run:
250
-
251
- ```bash
252
- bash scripts/lint-fixtures.sh
253
- bash benchmark/auto-resolve/scripts/test-ship-gate.sh
254
- bash benchmark/auto-resolve/scripts/test-build-pair-eligible-manifest.sh
255
- bash benchmark/auto-resolve/scripts/test-benchmark-arg-parsing.sh
256
- bash benchmark/auto-resolve/scripts/test-pair-candidate-frontier.sh
257
- bash benchmark/auto-resolve/scripts/test-audit-pair-evidence.sh
258
- bash benchmark/auto-resolve/scripts/test-audit-headroom-rejections.sh
259
- bash benchmark/auto-resolve/scripts/test-headroom-gate.sh
260
- bash benchmark/auto-resolve/scripts/test-run-headroom-candidate.sh
261
- bash benchmark/auto-resolve/scripts/test-check-f9-artifacts.sh
262
- bash benchmark/auto-resolve/scripts/test-lint-fixtures.sh
263
- bash benchmark/auto-resolve/scripts/test-run-full-pipeline-pair-candidate.sh
264
- bash benchmark/auto-resolve/scripts/test-full-pipeline-pair-gate.sh
265
- bash benchmark/auto-resolve/scripts/test-iter-0033c-l1-summary.sh
266
- bash benchmark/auto-resolve/scripts/test-iter-0033c-compare.sh
267
- bash benchmark/auto-resolve/scripts/test-run-swebench-solver-batch.sh
268
- bash benchmark/auto-resolve/scripts/test-swebench-frozen-case.sh
269
- bash benchmark/auto-resolve/scripts/test-frozen-verify-gate.sh
270
- ```
271
-
272
- `build-pair-eligible-manifest.py` writes `selection_rule.rejected_excluded`
273
- with the rejected fixture ids removed from Gate 3, and
274
- `selection_rule.rejected_excluded_reasons` with the exact registry reason for
275
- each removed id. This keeps the manifest self-explaining when F31/F32-style
276
- solo-ceiling controls are excluded from pair-lift evidence.
277
-
278
- After a full-pipeline pair run has the calibrated arms (`bare`, `solo_claude`,
279
- and the selected pair arm, default `l2_risk_probes`) plus a blind `judge.json`,
280
- gate it separately:
281
-
282
- ```bash
283
- bash benchmark/auto-resolve/scripts/run-full-pipeline-pair-candidate.sh \
284
- --min-fixtures 3 \
285
- --max-pair-solo-wall-ratio 3 \
286
- F16-cli-quote-tax-rules F23-cli-fulfillment-wave F25-cli-cart-promotion-rules
287
- ```
288
-
289
- The same runner is available through `npx devlyn-cli benchmark pair ...`.
290
- The runner executes `bare` + `solo_claude`, applies `headroom-gate.py`, and
291
- only then spends the selected pair arm. Pair arms are limited to current
292
- proof (`l2_risk_probes`) or diagnostic replay (`l2_gated`); `l2_forced` is
293
- retired and rejected. It prints the exact replay command plus each gate's
294
- markdown report to stdout, including startup `Headroom:` / `Pair:` lines,
295
- fixture pass count, average pair margin, and the fixture score table with bare,
296
- solo_claude, pair, margin, pair-mode, trigger-reason, and wall-ratio columns; if headroom or pair
297
- evidence fails, the report is printed before the runner exits non-zero. If
298
- headroom fails, the runner explicitly says the pair arm was not executed; if
299
- the final pair gate fails, it explicitly says pair evidence was rejected. When
300
- both gates pass, it explicitly says the selected pair arm is being executed and
301
- then that pair evidence was accepted. When launched through
302
- `npx devlyn-cli benchmark pair`, the replay `Command:` uses
303
- the same package CLI path. Add `--dry-run` to
304
- validate args, fixture ids, minimum fixture count, and the replay command
305
- without running arms or judges. Known rejected or ceiling-saturated fixtures
306
- are refused by default here too; use `--allow-rejected-fixtures` only for
307
- diagnostics of rejected fixtures or calibrated shadow controls. Retired fixtures
308
- remain historical replay artifacts and are not rerun by this candidate runner.
309
- To gate already-existing artifacts:
310
-
311
- When a prompt-only pair change needs a fresh `l2_risk_probes` measurement but
312
- the calibrated `bare` + `solo_claude` arms are already evidence-complete, reuse
313
- them into a new run id:
314
-
315
- ```bash
316
- bash benchmark/auto-resolve/scripts/run-full-pipeline-pair-candidate.sh \
317
- --run-id <new-run-id> \
318
- --reuse-calibrated-from <prior-headroom-run-id> \
319
- --min-fixtures 3 \
320
- --max-pair-solo-wall-ratio 3 \
321
- F16-cli-quote-tax-rules F23-cli-fulfillment-wave F25-cli-cart-promotion-rules
322
- ```
323
-
324
- ```bash
325
- python3 benchmark/auto-resolve/scripts/full-pipeline-pair-gate.py \
326
- --run-id <full-pipeline-run-id> \
327
- --min-fixtures 3 \
328
- --min-pair-margin 5 \
329
- --max-pair-solo-wall-ratio 3 \
330
- --out-json benchmark/auto-resolve/results/<full-pipeline-run-id>/full-pipeline-pair-gate.json \
331
- --out-md benchmark/auto-resolve/results/<full-pipeline-run-id>/full-pipeline-pair-gate.md
332
- ```
333
-
334
- This is the full-pipeline claim gate: each counted fixture must satisfy the
335
- headroom precondition (`bare <= 60`, `solo_claude <= 80`, default 5-point `bare`/`solo_claude` headroom margins), the selected pair arm must be evidence-clean,
336
- `pair_mode` must be true in the captured resolve state, the pair trigger must be
337
- eligible with non-empty reasons and at least one canonical reason, fixtures with an actionable solo-headroom hypothesis must include `spec.solo_headroom_hypothesis` in the trigger reasons, the pair/solo wall-time
338
- ratio must stay within the default 3x limit, and the blind judge must score the
339
- pair arm at least `--min-pair-margin` above `solo_claude`. The report separates
340
- the allowed pair/solo wall ratio from the maximum observed pair/solo wall ratio,
341
- records `require_hypothesis_trigger` in JSON, and includes a Markdown
342
- `Hypothesis trigger` column for each fixture row.
343
- The judge
344
- file must also map `bare`, `solo_claude`, and the selected pair arm in
345
- `_blind_mapping`; `scores_by_arm` alone is not evidence.
346
- `l2_risk_probes` is the current measured pair arm for the
347
- F16/F23/F25 gate: `20260510-f16-f23-f25-combined-proof` passed with margins
348
- +21, +31, and +24, average pair margin +25.3, and average pair/solo wall ratio
349
- 1.73x. Earlier F16/F25 evidence also passes the current gate in
350
- `20260509-f16-f25-combined-cartprobe-v2`.
351
- Additional focused F21 evidence: `20260511-f21-current-riskprobes-v1` passed
352
- with `bare` 33, `solo_claude` 66, `l2_risk_probes` 99, margin +33, pair mode true, and
353
- pair/solo wall ratio 1.47x, and is counted by `benchmark audit` as the fourth passing pair-evidence row. Do not count ceiling/control fixtures as pair
354
- evidence: F22 and F26 are
355
- currently rejected because existing headroom runs put `solo_claude` at 98. F27
356
- subscription proration is also rejected in its first headroom smoke:
357
- `20260511-f27-headroom-smoke-061401` measured bare 33 / solo_claude 94, with bare
358
- verification passing only 1 of 3 commands. Rework or rotate F27 before spending
359
- a pair arm on it. F28 return authorization is rejected as pair-lift evidence:
360
- earlier unstable runs `20260511-f28-headroom-smoke-085307` and
361
- `20260511-f28-pair-smoke-091021` were superseded after a hidden-oracle bug was
362
- found. The oracle had expected a defective item to bypass expiration, which the
363
- visible spec does not require. After re-verifying the same provider diffs
364
- against the corrected oracle, `20260511-f28-policy-oraclefix-reverified-pair`
365
- scored bare 50 / solo_claude 98 / `l2_risk_probes` 96, margin -2, and failed headroom.
366
- Rework or rotate F28 before spending more pair arms.
367
- F30 credit hold settlement is also rejected: `20260511-f30-headroom-v1` scored
368
- bare 33 / solo_claude 98, so it failed the `solo_claude` headroom precondition before any pair
369
- arm should be spent. F15 frozen-diff race review is now a ceiling/control
370
- fixture too: `20260511-f15-concurrency-headroom` scored bare 99 / solo_claude 94, so
371
- it failed both headroom preconditions. F3 backend contract risk is also
372
- rejected after tightening its HTTP error-body verifier:
373
- `20260511-f3-http-error-headroom` scored bare 97 / solo_claude 99. F2 medium CLI is
374
- rejected by `20260512-f2-medium-headroom`: bare 83 / solo_claude 95, so both baseline
375
- scores exceed headroom ceilings. F4 web browser design is rejected by
376
- `20260512-f4-web-headroom`: bare 70 / solo_claude 92 with bare disqualifiers, so it
377
- needs rework before pair arms. F5 fix-loop is rejected by
378
- `20260512-f5-fixloop-headroom`: bare 99 / solo_claude 99, with `bare` and `solo_claude` each
379
- passing 5/5 verification commands. F6 dep-audit checksum is rejected by
380
- `20260512-f6-checksum-headroom`: bare 97 / solo_claude 96, with `bare` and `solo_claude` each
381
- passing 6/6 verification commands. F7 scope discipline is rejected by
382
- `20260512-f7-scope-headroom`: bare 99 / solo_claude 100, with `bare` and `solo_claude` each
383
- passing 6/6 verification commands. F9 ideate-to-resolve remains the novice-flow
384
- anchor but is rejected as pair evidence by `20260512-f9-e2e-headroom`: bare 60 /
385
- solo_claude 90 with bare headroom 0 and a bare judge disqualifier, despite passing F9
386
- artifact checks. Rework it before spending pair arms. F1 and F8 are rejected by
387
- design as calibration/known-limit controls, not pair-lift evidence candidates.
388
- F10/F11 are also rejected by `20260507-f10-f11-tier1-full-pipeline`: F10 scored
389
- bare 75 / solo_claude 94, and F11 scored bare 98 / solo_claude 97. F12 webhook signature/replay is rejected by
390
- `20260511-f12-webhook-headroom`: bare 85 / solo_claude 99.
391
- F31 seat rebalance is rejected by `20260512-f31-seat-rebalance-headroom`: bare
392
- 33 / solo_claude 98, with bare judge/result/verify disqualifiers. Rework it before
393
- spending pair arms. F32 subscription renewal is rejected by
394
- `20260512-f32-subscription-renewal-headroom`: bare 33 / solo_claude 98, so it is a
395
- solo-ceiling billing rollback/shape control rather than pair-lift evidence.
396
-
397
- Commands that reference `BENCH_FIXTURE_DIR` are hidden post-run oracles: they
398
- are not staged into BUILD_GATE's `.devlyn/spec-verify.json`.
399
-
400
- To compare pair VERIFY against solo VERIFY on a frozen implementation diff,
401
- run:
402
-
403
- ```bash
404
- bash benchmark/auto-resolve/scripts/run-frozen-verify-pair.sh \
405
- --fixture F16-cli-quote-tax-rules \
406
- --diff benchmark/auto-resolve/results/<run-id>/F16-cli-quote-tax-rules/solo_claude/diff.patch \
407
- --pair-mode gated
408
- ```
409
-
410
- This applies the diff before `/devlyn:resolve` starts, then runs verify-only
411
- solo and pair arms against the same committed work tree. `--pair-mode gated`
412
- tests the product trigger policy; `--pair-mode forced` adds `--pair-verify` for
413
- diagnostics. Use non-empty diffs only; empty diffs fail fast because they are
414
- not valid pair evidence.
415
- Hidden verifier context is available during VERIFY, so this runner prevents
416
- IMPLEMENT contamination but is not an oracle-blind judge setup.
417
- The runner writes `compare.json` and `compare.md`; `pair_verdict_lift: true`
418
- means pair VERIFY actually ran and found a verdict-binding issue that solo
419
- VERIFY did not. It also prints a replay `Command:` block before invoking
420
- providers and a final solo/pair summary table.
421
- If an imported case has no deterministic `verification_commands`, the runner
422
- does not create `.devlyn/spec-verify.json`; an empty carrier is malformed by the
423
- normal real-user contract and must not block qualitative frozen review.
424
-
425
- To gate a set of frozen VERIFY results mechanically:
426
-
427
- ```bash
428
- python3 benchmark/auto-resolve/scripts/frozen-verify-gate.py \
429
- --run-id 20260505T173913Z-9986cd3-frozen-verify \
430
- --run-id 20260505T230215Z-9986cd3-frozen-verify \
431
- --require-hypothesis-trigger \
432
- --max-pair-solo-wall-ratio 3 \
433
- --out-json benchmark/auto-resolve/results/frozen-verify-gate-20260505.json \
434
- --out-md benchmark/auto-resolve/results/frozen-verify-gate-20260505.md
435
- ```
436
-
437
- When changing the gate itself, run its regression test:
438
-
439
- ```bash
440
- bash benchmark/auto-resolve/scripts/test-frozen-verify-gate.sh
441
- ```
442
-
443
- This is deliberately narrower than `headroom-gate.py`: it does not claim
444
- full-pipeline pair superiority. It proves only that, after the implementation
445
- diff is frozen, gated pair VERIFY fires and returns a stricter verdict-binding
446
- result than solo VERIFY on the same diff. Each supplied run must cover a
447
- distinct fixture; repeated runs of the same fixture do not count as independent
448
- evidence. For new measurements, pass `--require-hypothesis-trigger` so any
449
- fixture spec with an actionable solo-headroom hypothesis must also expose
450
- `spec.solo_headroom_hypothesis` in `pair_trigger.reasons`; omit it only when
451
- re-gating historical artifacts that predate that trigger reason.
452
- corpus growth. `--max-pair-solo-wall-ratio` is optional, but use it for
453
- ship-style evidence so quality lift is not accepted without a reasonable
454
- wall-time bound. The gate infers the fixture id from the runner input metadata;
455
- artifacts without that metadata, or with a fixture id absent from
456
- the selected `--fixtures-root`, fail instead of being counted as anonymous or
457
- fake evidence. JSON rows expose `pair_trigger_reasons` and
458
- `pair_trigger_has_canonical_reason`; Markdown output includes a `Triggers`
459
- column so reviewers can see which canonical pair trigger made the evidence
460
- eligible.
461
-
462
- ### SWE-bench fixed-diff review pilot
463
-
464
- SWE-bench is useful here as an external, widely known corpus, but the first
465
- measurement surface should remain frozen VERIFY rather than full-pipeline
466
- generation. The official dataset fields include `instance_id`, `repo`,
467
- `base_commit`, `problem_statement`, `patch`, and `test_patch`; SWE-bench Lite is
468
- the smaller subset and SWE-bench Verified is the human-validated subset.
469
- See:
470
-
471
- - https://www.swebench.com/SWE-bench/guides/datasets/
472
- - https://www.swebench.com/lite.html
473
- - https://www.swebench.com/verified.html
474
-
475
- Fetch a small official Lite/Verified instance file without installing the
476
- Hugging Face Python stack:
477
-
478
- ```bash
479
- python3 benchmark/auto-resolve/scripts/fetch-swebench-instances.py \
480
- --dataset lite \
481
- --limit 5 \
482
- --out benchmark/auto-resolve/external/swebench/instances-lite.jsonl
483
- ```
484
-
485
- Prepare one case from an instance JSON and a candidate patch produced by a solo
486
- run or another external solver:
487
-
488
- ```bash
489
- python3 benchmark/auto-resolve/scripts/prepare-swebench-frozen-case.py \
490
- --instance-json /path/to/swebench-instance.json \
491
- --model-patch /path/to/solo-candidate.patch
492
- ```
493
-
494
- Or prepare a small corpus from the official SWE-bench prediction JSONL shape
495
- (`instance_id`, `model_name_or_path`, `model_patch`):
496
-
497
- ```bash
498
- python3 benchmark/auto-resolve/scripts/collect-swebench-predictions.py \
499
- --patch-root /path/to/logs \
500
- --instances-jsonl benchmark/auto-resolve/external/swebench/instances-lite.jsonl \
501
- --model-name external-solo \
502
- --out benchmark/auto-resolve/external/swebench/solo-predictions.jsonl
503
- ```
504
-
505
- The collector expects `/path/to/logs/<instance_id>/patch.diff`; it is useful
506
- when another solver or a downloaded SWE-bench log bundle provides per-instance
507
- patch files rather than prediction JSONL.
508
-
509
- ```bash
510
- python3 benchmark/auto-resolve/scripts/prepare-swebench-frozen-corpus.py \
511
- --instances-jsonl benchmark/auto-resolve/external/swebench/instances-lite.jsonl \
512
- --predictions-jsonl /path/to/solo-predictions.jsonl \
513
- --limit 5 \
514
- --out-manifest benchmark/auto-resolve/external/swebench/manifest.json
515
- ```
516
-
517
- Then run the command written to
518
- `benchmark/auto-resolve/external/swebench/cases/<instance_id>/run-command.txt`.
519
- For a one-off case, the command uses:
520
-
521
- ```bash
522
- bash benchmark/auto-resolve/scripts/run-frozen-verify-pair.sh \
523
- --fixture <instance_id> \
524
- --fixtures-root benchmark/auto-resolve/external/swebench/cases \
525
- --base-repo benchmark/auto-resolve/external/swebench/repos/<repo-cache> \
526
- --diff benchmark/auto-resolve/external/swebench/cases/<instance_id>/model.patch \
527
- --pair-mode gated
528
- ```
529
-
530
- For a prepared corpus manifest, run the whole set and gate it:
531
-
532
- ```bash
533
- bash benchmark/auto-resolve/scripts/run-swebench-frozen-corpus.sh \
534
- --manifest benchmark/auto-resolve/external/swebench/manifest.json \
535
- --min-runs 2 \
536
- --max-pair-solo-wall-ratio 3 \
537
- --timeout-seconds 900 \
538
- --resume-completed-arms \
539
- --run-ids-out benchmark/auto-resolve/results/swebench-frozen-run-ids.txt \
540
- --out-json benchmark/auto-resolve/results/swebench-frozen-gate.json \
541
- --out-md benchmark/auto-resolve/results/swebench-frozen-gate.md
542
- ```
543
-
544
- The corpus runner prints a replay `Command:` block before invoking providers or
545
- gating existing run ids, so frozen VERIFY score runs can be reproduced from the
546
- captured stdout.
547
-
548
- To re-gate existing run ids without re-invoking providers, write one run id per
549
- line and pass `--gate-only-run-ids <file>` with the same manifest. For large
550
- tranches, keep `--run-ids-out` and use `--resume-completed-arms` on retries:
551
- successful solo/pair arms are reused, while failed or provider-limited arms run
552
- again. The run ids file is the durable handle for gate-only reruns and matrix
553
- rendering after a bounded run finishes.
554
-
555
- To produce local candidate patches for a bounded pilot, prepare a solver
556
- worktree from the same instance JSONL. The generated spec contains only the
557
- visible SWE-bench problem statement; do not read the instance's gold `patch` or
558
- `test_patch` while solving.
559
-
560
- ```bash
561
- python3 benchmark/auto-resolve/scripts/prepare-swebench-solver-worktree.py \
562
- --instances-jsonl benchmark/auto-resolve/external/swebench/instances-lite.jsonl \
563
- --instance-id django__django-11019 \
564
- --copy-devlyn-context
565
- ```
566
-
567
- Run the prompt in `<worktree>/solve-prompt.txt`, save the resulting diff as
568
- `<patch-root>/<instance_id>/patch.diff`, then use
569
- `collect-swebench-predictions.py` to create prediction JSONL.
570
-
571
- For a bounded local pilot, the batch runner performs those steps
572
- sequentially and collects prediction JSONL. It redirects provider stdin away
573
- from the manifest stream so later rows cannot be consumed by a child process.
574
- The generated solver worktrees and repo caches can become large; once
575
- `predictions-out` is written and cases are prepared, remove ignored local cache
576
- directories such as `external/swebench/worktrees/` and
577
- `external/swebench/repos-solver/` if disk pressure would otherwise interrupt
578
- the frozen corpus run. Use `--timeout-seconds` and `--resume` for large
579
- tranches; long-tail solver rows should be recorded as throughput failures
580
- instead of letting one row hold the whole suite open.
581
-
582
- ```bash
583
- bash benchmark/auto-resolve/scripts/run-swebench-solver-batch.sh \
584
- --instances-jsonl benchmark/auto-resolve/external/swebench/instances-lite.jsonl \
585
- --instance-id django__django-11039 \
586
- --instance-id django__django-11049 \
587
- --predictions-out benchmark/auto-resolve/external/swebench/predictions-lite.jsonl \
588
- --copy-devlyn-context
589
- ```
590
-
591
- Gate a SWE-bench review pilot by pointing the existing frozen gate at the
592
- external case root:
593
-
594
- ```bash
595
- python3 benchmark/auto-resolve/scripts/frozen-verify-gate.py \
596
- --fixtures-root benchmark/auto-resolve/external/swebench/cases \
597
- --run-id <swebench-frozen-run-1> \
598
- --run-id <swebench-frozen-run-2> \
599
- --run-id <swebench-frozen-run-3> \
600
- --min-runs 3 \
601
- --require-hypothesis-trigger \
602
- --max-pair-solo-wall-ratio 3 \
603
- --out-json benchmark/auto-resolve/results/swebench-frozen-gate.json \
604
- --out-md benchmark/auto-resolve/results/swebench-frozen-gate.md
605
- ```
606
-
607
- This gives evidence for "pair review catches solo-missed verdict-binding issues
608
- on real SWE-bench patches." The gate accepts either external solo-vs-pair
609
- verdict lift or internal pair lift (`pair_judge` stricter than the pair run's
610
- primary judge), because separate solo and pair primary judges are stochastic.
611
- For evidence intended to support shipping policy, also set a wall-ratio cap and
612
- inspect `avg_pair_solo_wall_ratio` plus each row's `pair_solo_wall_ratio`.
613
- For selection-bias control, render every run in the attempted pilot, not just
614
- gate rows. The matrix reports verdict-lift rows separately from recall-only
615
- rows where pair found additional findings but did not change the binding
616
- verdict. It also reports pair-trigger eligibility/contract failures,
617
- trigger reasons, canonical-trigger coverage, classification counts, gate rate,
618
- and trailing non-gate rows. Its Markdown table includes a `Triggers` column.
619
- For new measurements, pass `--fixtures-root` with
620
- `--require-hypothesis-trigger` so matrix rows classify any missing
621
- `spec.solo_headroom_hypothesis` trigger reason as a pair-trigger contract
622
- failure instead of leaving it to the gate artifact alone.
623
- Use the optional yield thresholds when the matrix is meant to
624
- fail closed instead of only documenting that additional rows are adding
625
- controls without strengthening the proof gate:
626
-
627
- ```bash
628
- python3 benchmark/auto-resolve/scripts/swebench-frozen-matrix.py \
629
- --title "SWE-bench Lite Frozen VERIFY Matrix" \
630
- --verdict MIXED_WITH_GATE_PASS \
631
- --fixtures-root benchmark/auto-resolve/external/swebench/cases \
632
- --gate-json benchmark/auto-resolve/results/swebench-frozen-gate.json \
633
- --run-id <swebench-frozen-run-1> \
634
- --run-id <swebench-frozen-run-2> \
635
- --require-hypothesis-trigger \
636
- --min-gate-rate 0.25 \
637
- --max-trailing-non-gate 10 \
638
- --out-json benchmark/auto-resolve/results/swebench-frozen-matrix.json \
639
- --out-md benchmark/auto-resolve/results/swebench-frozen-matrix.md
640
- ```
641
-
642
- It does not measure official SWE-bench solve rate; run the official SWE-bench
643
- evaluator separately for that metric. When changing the importer or
644
- external-base runner path, run:
645
-
646
- ```bash
647
- bash benchmark/auto-resolve/scripts/test-swebench-frozen-case.sh
648
- ```
649
-
650
- Do not use the retired full-pipeline `l2_forced` arm as pair evidence. It puts
651
- `--pair-verify` in the initial prompt, so IMPLEMENT can become pair-aware before
652
- the diff is frozen.
653
-
654
- ## LLM-upgrade resilience
655
-
656
- - **No model hardcoding.** Judge runs Codex without `-m`, inheriting whichever flagship the CLI currently ships. The call is isolated from user config/rules/hooks so local agent instructions cannot contaminate the blind judgment. Each run captures `_judge_model` for historical provenance.
657
- - **Margin-based gates.** Ship thresholds use pairwise margins, not absolute score. `solo_claude`-`bare` measures solo harness value; pair-`solo_claude` measures pair value on pair-eligible fixtures. As models improve, margin remains the meaningful harness-added signal.
658
- - **Saturation rotation.** When all compared gated arms exceed 95 on a fixture for two shipped versions, rotate it (see `RUBRIC.md::Fixture Rotation Policy`).
659
-
660
- ## Ship gates (summary — see `RUBRIC.md` for full spec)
661
-
662
- Hard floors (any one fails → block):
663
-
664
- - Zero variant disqualifier (silent catch, fabricated verification, extra deps beyond `max_deps_added`, etc.).
665
- - `F9-e2e-ideate-to-resolve` must PASS (novice-flow contract).
666
- - ≥ 7 gated, headroom-available fixtures have margin ≥ +5.
667
- - No per-fixture regression worse than −5 vs last shipped baseline.
668
-
669
- Soft gates (warning, not block): suite-margin drop > 3, fixture losing its margin, critical-finding catch-rate regression vs last shipped variant.
670
-
671
- ## Running the full suite (real)
672
-
673
- Full real benchmarks usually take 2-3 minutes per arm for simple fixtures and
674
- up to 15 minutes per arm for strict-route fixtures. A full n=1 run time depends
675
- on the selected fixture count; the historical 9-fixture core suite was roughly
676
- 45 min - 3 hrs for 3 arms, while the current extended suite can take longer.
677
-
678
- ```bash
679
- # Smoke run before ship decisions
680
- npx devlyn-cli benchmark
681
-
682
- # Ship-decision run
683
- npx devlyn-cli benchmark --label v3.7 --bless
684
- ```
685
-
686
- ## Dry-run
687
-
688
- `--dry-run` skips model invocation. It still:
689
-
690
- - Prepares each fresh work dir.
691
- - Writes arm-specific prompts.
692
- - Commits the baseline.
693
- - Applies `setup.sh`.
694
- - Runs verification commands (which will mostly fail since no implementation was added).
695
-
696
- Use it to sanity-check new fixtures or runner changes before burning model tokens.