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,517 +0,0 @@
1
- #!/usr/bin/env bash
2
- # Regression tests for frozen-verify-gate.py evidence guards.
3
-
4
- set -euo pipefail
5
-
6
- SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
7
- GATE="$SCRIPT_DIR/frozen-verify-gate.py"
8
- TMP_DIR="$(mktemp -d /tmp/frozen-verify-gate-test.XXXXXX)"
9
- FIXTURES_DIR="$TMP_DIR/fixtures"
10
- trap 'rm -rf "$TMP_DIR"' EXIT
11
- mkdir -p "$FIXTURES_DIR"
12
-
13
- write_run() {
14
- local run_id="$1"
15
- local fixture_id="${2:-}"
16
- local solo_verdict="$3"
17
- local pair_verdict="$4"
18
- local lift="$5"
19
- local internal_lift="${6:-false}"
20
- local pair_primary="${7:-$pair_verdict}"
21
- local pair_judge="${8:-$pair_verdict}"
22
- mkdir -p "$TMP_DIR/$run_id/pair"
23
- if [ -n "$fixture_id" ]; then
24
- cat > "$TMP_DIR/$run_id/pair/input.md" <<EOF
25
- Use /devlyn:resolve --verify-only --spec docs/roadmap/phase-1/$fixture_id.md.
26
- EOF
27
- fi
28
- cat > "$TMP_DIR/$run_id/compare.json" <<EOF
29
- {
30
- "solo": {"invoke_exit": 0, "timed_out": false, "verify_verdict": "$solo_verdict", "elapsed_seconds": 100},
31
- "pair": {
32
- "invoke_exit": 0,
33
- "timed_out": false,
34
- "verify_verdict": "$pair_verdict",
35
- "pair_mode": true,
36
- "pair_trigger": {"eligible": true, "reasons": ["mode.verify-only"], "skipped_reason": null},
37
- "elapsed_seconds": 200
38
- },
39
- "comparison": {
40
- "pair_trigger_missed": false,
41
- "pair_verdict_lift": $lift,
42
- "pair_internal_verdict_lift": $internal_lift,
43
- "solo_verdict": "$solo_verdict",
44
- "pair_verdict": "$pair_verdict",
45
- "pair_primary_verdict": "$pair_primary",
46
- "pair_judge_verdict": "$pair_judge"
47
- }
48
- }
49
- EOF
50
- }
51
-
52
- expect_fail_contains() {
53
- local label="$1"
54
- local needle="$2"
55
- shift 2
56
- local out="$TMP_DIR/$label.out"
57
- if "$@" > "$out" 2>&1; then
58
- echo "expected failure for $label" >&2
59
- cat "$out" >&2
60
- exit 1
61
- fi
62
- if ! grep -Fq "$needle" "$out"; then
63
- echo "missing expected text for $label: $needle" >&2
64
- cat "$out" >&2
65
- exit 1
66
- fi
67
- }
68
-
69
- write_run pass-a F10-persist-write-collision PASS_WITH_ISSUES NEEDS_WORK true
70
- write_run pass-b F12-webhook-raw-body-signature PASS_WITH_ISSUES NEEDS_WORK true
71
- mkdir -p "$FIXTURES_DIR/F10-persist-write-collision" "$FIXTURES_DIR/F12-webhook-raw-body-signature"
72
- python3 "$GATE" --results-root "$TMP_DIR" --fixtures-root "$FIXTURES_DIR" \
73
- --run-id pass-a --run-id pass-b --min-runs 2 --max-pair-solo-wall-ratio 3 \
74
- --out-md "$TMP_DIR/pass.md" \
75
- > "$TMP_DIR/pass.out"
76
- grep -Fq '"verdict": "PASS"' "$TMP_DIR/pass.out"
77
- grep -Fq '"avg_pair_solo_wall_ratio": 2.0' "$TMP_DIR/pass.out"
78
- grep -Fq '"pair_solo_wall_ratio": 2.0' "$TMP_DIR/pass.out"
79
- grep -Fq '"pair_trigger_reasons": [' "$TMP_DIR/pass.out"
80
- grep -Fq '"mode.verify-only"' "$TMP_DIR/pass.out"
81
- grep -Fq '"pair_trigger_has_canonical_reason": true' "$TMP_DIR/pass.out"
82
- grep -Fq '| Run | Fixture | Solo VERIFY | Pair VERIFY | Pair mode | Triggers | Wall ratio | External lift | Internal lift | Status | Reason |' "$TMP_DIR/pass.md"
83
- grep -Fq '| pass-a | F10-persist-write-collision | PASS_WITH_ISSUES | NEEDS_WORK | true | mode.verify-only | 2.00x | true | false | PASS | ok |' "$TMP_DIR/pass.md"
84
-
85
- expect_fail_contains invalid-min-runs "value must be > 0" \
86
- python3 "$GATE" --results-root "$TMP_DIR" --fixtures-root "$FIXTURES_DIR" \
87
- --run-id pass-a --min-runs 0
88
-
89
- expect_fail_contains invalid-wall-ratio "value must be > 0" \
90
- python3 "$GATE" --results-root "$TMP_DIR" --fixtures-root "$FIXTURES_DIR" \
91
- --run-id pass-a --max-pair-solo-wall-ratio 0
92
-
93
- mkdir -p "$TMP_DIR/summary-verdicts/pair"
94
- cat > "$TMP_DIR/summary-verdicts/pair/input.md" <<'EOF'
95
- Use /devlyn:resolve --verify-only --spec docs/roadmap/phase-1/F13-summary-verdict-fallback.md.
96
- EOF
97
- cat > "$TMP_DIR/summary-verdicts/compare.json" <<'EOF'
98
- {
99
- "solo": {"invoke_exit": 0, "timed_out": false, "verify_verdict": "PASS_WITH_ISSUES", "elapsed_seconds": 100},
100
- "pair": {
101
- "invoke_exit": 0,
102
- "timed_out": false,
103
- "verify_verdict": "NEEDS_WORK",
104
- "pair_mode": true,
105
- "pair_trigger": {"eligible": true, "reasons": ["mode.verify-only"], "skipped_reason": null},
106
- "elapsed_seconds": 200
107
- },
108
- "comparison": {"pair_trigger_missed": false, "pair_verdict_lift": true, "pair_internal_verdict_lift": false}
109
- }
110
- EOF
111
- mkdir -p "$FIXTURES_DIR/F13-summary-verdict-fallback"
112
- python3 "$GATE" --results-root "$TMP_DIR" --fixtures-root "$FIXTURES_DIR" \
113
- --run-id summary-verdicts --min-runs 1 \
114
- > "$TMP_DIR/summary-verdicts.out"
115
- grep -Fq '"verdict": "PASS"' "$TMP_DIR/summary-verdicts.out"
116
-
117
- mkdir -p "$TMP_DIR/string-pair-mode/pair"
118
- cat > "$TMP_DIR/string-pair-mode/pair/input.md" <<'EOF'
119
- Use /devlyn:resolve --verify-only --spec docs/roadmap/phase-1/F13-string-pair-mode.md.
120
- EOF
121
- cat > "$TMP_DIR/string-pair-mode/compare.json" <<'EOF'
122
- {
123
- "solo": {"invoke_exit": 0, "timed_out": false, "verify_verdict": "PASS_WITH_ISSUES", "elapsed_seconds": 100},
124
- "pair": {
125
- "invoke_exit": 0,
126
- "timed_out": false,
127
- "verify_verdict": "NEEDS_WORK",
128
- "pair_mode": "true",
129
- "pair_trigger": {"eligible": true, "reasons": ["mode.verify-only"], "skipped_reason": null},
130
- "elapsed_seconds": 200
131
- },
132
- "comparison": {"pair_trigger_missed": false, "pair_verdict_lift": true, "pair_internal_verdict_lift": false}
133
- }
134
- EOF
135
- mkdir -p "$FIXTURES_DIR/F13-string-pair-mode"
136
- expect_fail_contains string-pair-mode "pair_mode false" \
137
- python3 "$GATE" --results-root "$TMP_DIR" --fixtures-root "$FIXTURES_DIR" \
138
- --run-id string-pair-mode --min-runs 1
139
-
140
- write_run malformed-pair-trigger F13-malformed-pair-trigger PASS_WITH_ISSUES NEEDS_WORK true
141
- mkdir -p "$FIXTURES_DIR/F13-malformed-pair-trigger"
142
- python3 - "$TMP_DIR/malformed-pair-trigger/compare.json" <<'PY'
143
- import json
144
- import sys
145
- path = sys.argv[1]
146
- with open(path) as f:
147
- data = json.load(f)
148
- data["pair"]["pair_trigger"] = {"eligible": True, "reasons": "forced_pair", "skipped_reason": None}
149
- with open(path, "w") as f:
150
- json.dump(data, f)
151
- PY
152
- expect_fail_contains malformed-pair-trigger "pair_trigger.reasons malformed" \
153
- python3 "$GATE" --results-root "$TMP_DIR" --fixtures-root "$FIXTURES_DIR" \
154
- --run-id malformed-pair-trigger --min-runs 1
155
-
156
- write_run unknown-pair-trigger F13-unknown-pair-trigger PASS_WITH_ISSUES NEEDS_WORK true
157
- mkdir -p "$FIXTURES_DIR/F13-unknown-pair-trigger"
158
- python3 - "$TMP_DIR/unknown-pair-trigger/compare.json" <<'PY'
159
- import json
160
- import sys
161
- path = sys.argv[1]
162
- with open(path) as f:
163
- data = json.load(f)
164
- data["pair"]["pair_trigger"] = {"eligible": True, "reasons": ["looks-hard"], "skipped_reason": None}
165
- with open(path, "w") as f:
166
- json.dump(data, f)
167
- PY
168
- expect_fail_contains unknown-pair-trigger "pair_trigger reasons missing known trigger reason" \
169
- python3 "$GATE" --results-root "$TMP_DIR" --fixtures-root "$FIXTURES_DIR" \
170
- --run-id unknown-pair-trigger --min-runs 1
171
-
172
- write_run mixed-unknown-pair-trigger F13-mixed-unknown-pair-trigger PASS_WITH_ISSUES NEEDS_WORK true
173
- mkdir -p "$FIXTURES_DIR/F13-mixed-unknown-pair-trigger"
174
- python3 - "$TMP_DIR/mixed-unknown-pair-trigger/compare.json" <<'PY'
175
- import json
176
- import sys
177
- path = sys.argv[1]
178
- with open(path) as f:
179
- data = json.load(f)
180
- data["pair"]["pair_trigger"] = {"eligible": True, "reasons": ["mode.verify-only", "looks-hard"], "skipped_reason": None}
181
- with open(path, "w") as f:
182
- json.dump(data, f)
183
- PY
184
- expect_fail_contains mixed-unknown-pair-trigger "pair_trigger reasons contain unknown trigger reason" \
185
- python3 "$GATE" --results-root "$TMP_DIR" --fixtures-root "$FIXTURES_DIR" \
186
- --run-id mixed-unknown-pair-trigger --min-runs 1
187
-
188
- write_run normalized-canonical-pair-trigger F13-normalized-canonical-pair-trigger PASS_WITH_ISSUES NEEDS_WORK true
189
- mkdir -p "$FIXTURES_DIR/F13-normalized-canonical-pair-trigger"
190
- python3 - "$TMP_DIR/normalized-canonical-pair-trigger/compare.json" <<'PY'
191
- import json
192
- import sys
193
- path = sys.argv[1]
194
- with open(path) as f:
195
- data = json.load(f)
196
- data["pair"]["pair_trigger"] = {"eligible": True, "reasons": ["risk high"], "skipped_reason": None}
197
- with open(path, "w") as f:
198
- json.dump(data, f)
199
- PY
200
- expect_fail_contains normalized-canonical-pair-trigger "pair_trigger reasons missing known trigger reason" \
201
- python3 "$GATE" --results-root "$TMP_DIR" --fixtures-root "$FIXTURES_DIR" \
202
- --run-id normalized-canonical-pair-trigger --min-runs 1
203
-
204
- write_run historical-only-pair-trigger F13-historical-only-pair-trigger PASS_WITH_ISSUES NEEDS_WORK true
205
- mkdir -p "$FIXTURES_DIR/F13-historical-only-pair-trigger"
206
- python3 - "$TMP_DIR/historical-only-pair-trigger/compare.json" <<'PY'
207
- import json
208
- import sys
209
- path = sys.argv[1]
210
- with open(path) as f:
211
- data = json.load(f)
212
- data["pair"]["pair_trigger"] = {"eligible": True, "reasons": ["risk_profile.high_risk"], "skipped_reason": None}
213
- with open(path, "w") as f:
214
- json.dump(data, f)
215
- PY
216
- expect_fail_contains historical-only-pair-trigger "pair_trigger reasons missing canonical trigger reason" \
217
- python3 "$GATE" --results-root "$TMP_DIR" --fixtures-root "$FIXTURES_DIR" \
218
- --run-id historical-only-pair-trigger --min-runs 1
219
-
220
- write_run missing-hypothesis-trigger F13-missing-hypothesis-trigger PASS_WITH_ISSUES NEEDS_WORK true
221
- mkdir -p "$FIXTURES_DIR/F13-missing-hypothesis-trigger"
222
- cat > "$FIXTURES_DIR/F13-missing-hypothesis-trigger/spec.md" <<'EOF'
223
- ## Verification
224
-
225
- - Solo-headroom hypothesis: `solo_claude` is expected to miss the refund-window defect; observable miss command: `npm test -- --runInBand`.
226
- EOF
227
- expect_fail_contains missing-hypothesis-trigger "pair_trigger missing spec.solo_headroom_hypothesis" \
228
- python3 "$GATE" --results-root "$TMP_DIR" --fixtures-root "$FIXTURES_DIR" \
229
- --run-id missing-hypothesis-trigger --min-runs 1 --require-hypothesis-trigger
230
- python3 - "$TMP_DIR/missing-hypothesis-trigger/compare.json" <<'PY'
231
- import json
232
- import sys
233
- path = sys.argv[1]
234
- with open(path) as f:
235
- data = json.load(f)
236
- data["pair"]["pair_trigger"]["reasons"] = [
237
- "mode.verify-only",
238
- "spec.solo_headroom_hypothesis",
239
- ]
240
- with open(path, "w") as f:
241
- json.dump(data, f)
242
- PY
243
- python3 "$GATE" --results-root "$TMP_DIR" --fixtures-root "$FIXTURES_DIR" \
244
- --run-id missing-hypothesis-trigger --min-runs 1 --require-hypothesis-trigger \
245
- > "$TMP_DIR/hypothesis-trigger-pass.out"
246
- grep -Fq '"verdict": "PASS"' "$TMP_DIR/hypothesis-trigger-pass.out"
247
-
248
- write_run dup-a F12-webhook-raw-body-signature PASS_WITH_ISSUES NEEDS_WORK true
249
- write_run dup-b F12-webhook-raw-body-signature PASS_WITH_ISSUES NEEDS_WORK true
250
- expect_fail_contains duplicate-fixture "duplicate fixture_id=F12-webhook-raw-body-signature" \
251
- python3 "$GATE" --results-root "$TMP_DIR" --fixtures-root "$FIXTURES_DIR" \
252
- --run-id dup-a --run-id dup-b --min-runs 2
253
-
254
- write_run missing-fixture "" PASS_WITH_ISSUES NEEDS_WORK true
255
- expect_fail_contains missing-fixture "fixture_id missing" \
256
- python3 "$GATE" --results-root "$TMP_DIR" --fixtures-root "$FIXTURES_DIR" \
257
- --run-id missing-fixture --min-runs 1
258
-
259
- write_run unknown-fixture F99-not-a-real-fixture PASS_WITH_ISSUES NEEDS_WORK true
260
- expect_fail_contains unknown-fixture "fixture_id not found: F99-not-a-real-fixture" \
261
- python3 "$GATE" --results-root "$TMP_DIR" --fixtures-root "$FIXTURES_DIR" \
262
- --run-id unknown-fixture --min-runs 1
263
-
264
- write_run recall-only F11-batch-import-all-or-nothing PASS PASS_WITH_ISSUES false
265
- mkdir -p "$FIXTURES_DIR/F11-batch-import-all-or-nothing"
266
- expect_fail_contains recall-only "pair verdict PASS_WITH_ISSUES is not verdict-binding" \
267
- python3 "$GATE" --results-root "$TMP_DIR" --fixtures-root "$FIXTURES_DIR" \
268
- --run-id recall-only --min-runs 1
269
-
270
- write_run internal-lift F14-internal-pair-lift NEEDS_WORK NEEDS_WORK false true PASS_WITH_ISSUES NEEDS_WORK
271
- mkdir -p "$FIXTURES_DIR/F14-internal-pair-lift"
272
- python3 "$GATE" --results-root "$TMP_DIR" --fixtures-root "$FIXTURES_DIR" \
273
- --run-id internal-lift --min-runs 1 \
274
- > "$TMP_DIR/internal-lift.out"
275
- grep -Fq '"verdict": "PASS"' "$TMP_DIR/internal-lift.out"
276
-
277
- write_run slow-pair F15-slow-pair PASS_WITH_ISSUES NEEDS_WORK true
278
- mkdir -p "$FIXTURES_DIR/F15-slow-pair"
279
- python3 - "$TMP_DIR/slow-pair/compare.json" <<'PY'
280
- import json
281
- import sys
282
- path = sys.argv[1]
283
- with open(path) as f:
284
- data = json.load(f)
285
- data["pair"]["elapsed_seconds"] = 401
286
- with open(path, "w") as f:
287
- json.dump(data, f)
288
- PY
289
- expect_fail_contains slow-pair "pair/solo wall ratio 4.01 exceeds 3.00" \
290
- python3 "$GATE" --results-root "$TMP_DIR" --fixtures-root "$FIXTURES_DIR" \
291
- --run-id slow-pair --min-runs 1 --max-pair-solo-wall-ratio 3
292
-
293
- mkdir -p "$TMP_DIR/missing-elapsed/pair"
294
- cat > "$TMP_DIR/missing-elapsed/pair/input.md" <<'EOF'
295
- Use /devlyn:resolve --verify-only --spec docs/roadmap/phase-1/F16-missing-elapsed.md.
296
- EOF
297
- cat > "$TMP_DIR/missing-elapsed/compare.json" <<'EOF'
298
- {
299
- "solo": {"invoke_exit": 0, "timed_out": false, "verify_verdict": "PASS_WITH_ISSUES"},
300
- "pair": {
301
- "invoke_exit": 0,
302
- "timed_out": false,
303
- "verify_verdict": "NEEDS_WORK",
304
- "pair_mode": true,
305
- "pair_trigger": {"eligible": true, "reasons": ["mode.verify-only"], "skipped_reason": null}
306
- },
307
- "comparison": {
308
- "pair_trigger_missed": false,
309
- "pair_verdict_lift": true,
310
- "pair_internal_verdict_lift": false,
311
- "solo_verdict": "PASS_WITH_ISSUES",
312
- "pair_verdict": "NEEDS_WORK",
313
- "pair_primary_verdict": "NEEDS_WORK",
314
- "pair_judge_verdict": "NEEDS_WORK"
315
- }
316
- }
317
- EOF
318
- mkdir -p "$FIXTURES_DIR/F16-missing-elapsed"
319
- expect_fail_contains missing-elapsed "pair/solo wall ratio missing" \
320
- python3 "$GATE" --results-root "$TMP_DIR" --fixtures-root "$FIXTURES_DIR" \
321
- --run-id missing-elapsed --min-runs 1 --max-pair-solo-wall-ratio 3
322
-
323
- mkdir -p "$TMP_DIR/missing-compare/pair"
324
- cat > "$TMP_DIR/missing-compare/pair/input.md" <<'EOF'
325
- Use /devlyn:resolve --verify-only --spec docs/roadmap/phase-1/F17-missing-compare.md.
326
- EOF
327
- mkdir -p "$FIXTURES_DIR/F17-missing-compare"
328
- expect_fail_contains missing-compare "missing compare.json for missing-compare" \
329
- python3 "$GATE" --results-root "$TMP_DIR" --fixtures-root "$FIXTURES_DIR" \
330
- --run-id missing-compare --min-runs 1
331
-
332
- mkdir -p "$TMP_DIR/malformed-compare/pair"
333
- cat > "$TMP_DIR/malformed-compare/pair/input.md" <<'EOF'
334
- Use /devlyn:resolve --verify-only --spec docs/roadmap/phase-1/F17-malformed-compare.md.
335
- EOF
336
- printf '["not", "a", "dict"]\n' > "$TMP_DIR/malformed-compare/compare.json"
337
- mkdir -p "$FIXTURES_DIR/F17-malformed-compare"
338
- expect_fail_contains malformed-compare "malformed compare.json for malformed-compare: expected object" \
339
- python3 "$GATE" --results-root "$TMP_DIR" --fixtures-root "$FIXTURES_DIR" \
340
- --run-id malformed-compare --min-runs 1
341
-
342
- mkdir -p "$TMP_DIR/nan-compare/pair"
343
- cat > "$TMP_DIR/nan-compare/pair/input.md" <<'EOF'
344
- Use /devlyn:resolve --verify-only --spec docs/roadmap/phase-1/F17-nan-compare.md.
345
- EOF
346
- cat > "$TMP_DIR/nan-compare/compare.json" <<'EOF'
347
- {
348
- "solo": {"invoke_exit": 0, "timed_out": false, "verify_verdict": "PASS_WITH_ISSUES", "elapsed_seconds": 100},
349
- "pair": {
350
- "invoke_exit": 0,
351
- "timed_out": false,
352
- "verify_verdict": "NEEDS_WORK",
353
- "pair_mode": true,
354
- "pair_trigger": {"eligible": true, "reasons": ["mode.verify-only"], "skipped_reason": null},
355
- "elapsed_seconds": NaN
356
- },
357
- "comparison": {"pair_trigger_missed": false, "pair_verdict_lift": true, "pair_internal_verdict_lift": false}
358
- }
359
- EOF
360
- mkdir -p "$FIXTURES_DIR/F17-nan-compare"
361
- expect_fail_contains nan-compare "malformed compare.json for nan-compare: invalid JSON" \
362
- python3 "$GATE" --results-root "$TMP_DIR" --fixtures-root "$FIXTURES_DIR" \
363
- --run-id nan-compare --min-runs 1
364
-
365
- mkdir -p "$TMP_DIR/malformed-compare-sections/pair"
366
- cat > "$TMP_DIR/malformed-compare-sections/pair/input.md" <<'EOF'
367
- Use /devlyn:resolve --verify-only --spec docs/roadmap/phase-1/F17-malformed-compare-sections.md.
368
- EOF
369
- cat > "$TMP_DIR/malformed-compare-sections/compare.json" <<'EOF'
370
- {
371
- "solo": ["not", "a", "dict"],
372
- "pair": ["not", "a", "dict"],
373
- "comparison": ["not", "a", "dict"]
374
- }
375
- EOF
376
- mkdir -p "$FIXTURES_DIR/F17-malformed-compare-sections"
377
- expect_fail_contains malformed-compare-sections "pair_mode false" \
378
- python3 "$GATE" --results-root "$TMP_DIR" --fixtures-root "$FIXTURES_DIR" \
379
- --run-id malformed-compare-sections --min-runs 1
380
-
381
- mkdir -p "$TMP_DIR/malformed-verdict-fields/pair"
382
- cat > "$TMP_DIR/malformed-verdict-fields/pair/input.md" <<'EOF'
383
- Use /devlyn:resolve --verify-only --spec docs/roadmap/phase-1/F17-malformed-verdict-fields.md.
384
- EOF
385
- cat > "$TMP_DIR/malformed-verdict-fields/compare.json" <<'EOF'
386
- {
387
- "solo": {"invoke_exit": 0, "timed_out": false, "verify_verdict": ["bad"], "elapsed_seconds": 100},
388
- "pair": {
389
- "invoke_exit": 0,
390
- "timed_out": false,
391
- "verify_verdict": ["bad"],
392
- "pair_mode": true,
393
- "pair_trigger": {"eligible": true, "reasons": ["mode.verify-only"], "skipped_reason": null},
394
- "elapsed_seconds": 200
395
- },
396
- "comparison": {
397
- "pair_trigger_missed": false,
398
- "pair_verdict_lift": true,
399
- "pair_internal_verdict_lift": true,
400
- "solo_verdict": ["bad"],
401
- "pair_verdict": ["bad"],
402
- "pair_primary_verdict": ["bad"],
403
- "pair_judge_verdict": ["bad"]
404
- }
405
- }
406
- EOF
407
- mkdir -p "$FIXTURES_DIR/F17-malformed-verdict-fields"
408
- expect_fail_contains malformed-verdict-fields "pair verdict missing or malformed" \
409
- python3 "$GATE" --results-root "$TMP_DIR" --fixtures-root "$FIXTURES_DIR" \
410
- --run-id malformed-verdict-fields --min-runs 1
411
-
412
- mkdir -p "$TMP_DIR/malformed-elapsed-fields/pair"
413
- cat > "$TMP_DIR/malformed-elapsed-fields/pair/input.md" <<'EOF'
414
- Use /devlyn:resolve --verify-only --spec docs/roadmap/phase-1/F17-malformed-elapsed-fields.md.
415
- EOF
416
- cat > "$TMP_DIR/malformed-elapsed-fields/compare.json" <<'EOF'
417
- {
418
- "solo": {"invoke_exit": 0, "timed_out": false, "verify_verdict": "PASS_WITH_ISSUES", "elapsed_seconds": true},
419
- "pair": {
420
- "invoke_exit": 0,
421
- "timed_out": false,
422
- "verify_verdict": "NEEDS_WORK",
423
- "pair_mode": true,
424
- "pair_trigger": {"eligible": true, "reasons": ["mode.verify-only"], "skipped_reason": null},
425
- "elapsed_seconds": false
426
- },
427
- "comparison": {
428
- "pair_trigger_missed": false,
429
- "pair_verdict_lift": true,
430
- "pair_internal_verdict_lift": false,
431
- "solo_verdict": "PASS_WITH_ISSUES",
432
- "pair_verdict": "NEEDS_WORK",
433
- "pair_primary_verdict": "NEEDS_WORK",
434
- "pair_judge_verdict": "NEEDS_WORK"
435
- }
436
- }
437
- EOF
438
- mkdir -p "$FIXTURES_DIR/F17-malformed-elapsed-fields"
439
- expect_fail_contains malformed-elapsed-fields "pair/solo wall ratio missing" \
440
- python3 "$GATE" --results-root "$TMP_DIR" --fixtures-root "$FIXTURES_DIR" \
441
- --run-id malformed-elapsed-fields --min-runs 1 --max-pair-solo-wall-ratio 3
442
-
443
- mkdir -p "$TMP_DIR/provider-limit/pair"
444
- cat > "$TMP_DIR/provider-limit/pair/input.md" <<'EOF'
445
- Use /devlyn:resolve --verify-only --spec docs/roadmap/phase-1/F18-provider-limit.md.
446
- EOF
447
- cat > "$TMP_DIR/provider-limit/pair/transcript.txt" <<'EOF'
448
- You've hit your limit · resets 3am (Asia/Seoul)
449
- EOF
450
- cat > "$TMP_DIR/provider-limit/compare.json" <<'EOF'
451
- {
452
- "solo": {"invoke_exit": 0, "timed_out": false, "verify_verdict": "PASS", "elapsed_seconds": 100},
453
- "pair": {"invoke_exit": 1, "timed_out": false, "verify_verdict": null, "pair_mode": false, "elapsed_seconds": 1},
454
- "comparison": {
455
- "pair_trigger_missed": false,
456
- "pair_verdict_lift": false,
457
- "pair_internal_verdict_lift": false,
458
- "solo_verdict": "PASS",
459
- "pair_verdict": null
460
- }
461
- }
462
- EOF
463
- mkdir -p "$FIXTURES_DIR/F18-provider-limit"
464
- expect_fail_contains provider-limit "pair provider limit" \
465
- python3 "$GATE" --results-root "$TMP_DIR" --fixtures-root "$FIXTURES_DIR" \
466
- --run-id provider-limit --min-runs 1
467
-
468
- write_run dirty-pair-env F19-dirty-pair-env PASS_WITH_ISSUES NEEDS_WORK true
469
- mkdir -p "$FIXTURES_DIR/F19-dirty-pair-env"
470
- python3 - "$TMP_DIR/dirty-pair-env/compare.json" <<'PY'
471
- import json
472
- import sys
473
- path = sys.argv[1]
474
- with open(path) as f:
475
- data = json.load(f)
476
- data["pair"]["environment_contamination"] = True
477
- with open(path, "w") as f:
478
- json.dump(data, f)
479
- PY
480
- expect_fail_contains dirty-pair-env "pair environment contamination" \
481
- python3 "$GATE" --results-root "$TMP_DIR" --fixtures-root "$FIXTURES_DIR" \
482
- --run-id dirty-pair-env --min-runs 1
483
-
484
- write_run dirty-solo-disqualifier F20-dirty-solo-disqualifier PASS_WITH_ISSUES NEEDS_WORK true
485
- mkdir -p "$FIXTURES_DIR/F20-dirty-solo-disqualifier"
486
- python3 - "$TMP_DIR/dirty-solo-disqualifier/compare.json" <<'PY'
487
- import json
488
- import sys
489
- path = sys.argv[1]
490
- with open(path) as f:
491
- data = json.load(f)
492
- data["solo"]["disqualifier"] = True
493
- with open(path, "w") as f:
494
- json.dump(data, f)
495
- PY
496
- expect_fail_contains dirty-solo-disqualifier "solo disqualifier" \
497
- python3 "$GATE" --results-root "$TMP_DIR" --fixtures-root "$FIXTURES_DIR" \
498
- --run-id dirty-solo-disqualifier --min-runs 1
499
-
500
- write_run dirty-pair-invoke F21-dirty-pair-invoke PASS_WITH_ISSUES NEEDS_WORK true
501
- mkdir -p "$FIXTURES_DIR/F21-dirty-pair-invoke"
502
- python3 - "$TMP_DIR/dirty-pair-invoke/compare.json" <<'PY'
503
- import json
504
- import sys
505
- path = sys.argv[1]
506
- with open(path) as f:
507
- data = json.load(f)
508
- data["pair"]["invoke_failure"] = True
509
- data["pair"]["invoke_failure_reason"] = "plugin_contamination"
510
- with open(path, "w") as f:
511
- json.dump(data, f)
512
- PY
513
- expect_fail_contains dirty-pair-invoke "pair invoke failure (plugin_contamination)" \
514
- python3 "$GATE" --results-root "$TMP_DIR" --fixtures-root "$FIXTURES_DIR" \
515
- --run-id dirty-pair-invoke --min-runs 1
516
-
517
- echo "✓ test-frozen-verify-gate"