devlyn-cli 3.2.1 → 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 (423) hide show
  1. package/AGENTS.md +2 -2
  2. package/CLAUDE.md +2 -2
  3. package/README.md +12 -102
  4. package/bin/devlyn.js +13 -225
  5. package/bin/instruction-templates.json +6 -0
  6. package/config/skills/_shared/adapters/grok.md +1 -2
  7. package/config/skills/_shared/archive_run.py +15 -3
  8. package/config/skills/_shared/judge-role-evidence.py +21 -1
  9. package/config/skills/_shared/runtime-principles.md +1 -1
  10. package/config/skills/_shared/spec-verify-check.py +0 -653
  11. package/config/skills/_shared/state-phase-write.py +351 -25
  12. package/config/skills/_shared/task-complete.py +635 -143
  13. package/config/skills/_shared/terminal-claim-check.py +229 -4
  14. package/config/skills/_shared/verify-merge-findings.py +93 -2
  15. package/config/skills/devlyn:ideate/SKILL.md +3 -4
  16. package/config/skills/devlyn:ideate/references/elicitation.md +2 -35
  17. package/config/skills/devlyn:ideate/references/from-spec-mode.md +3 -18
  18. package/config/skills/devlyn:ideate/references/project-mode.md +1 -16
  19. package/config/skills/devlyn:ideate/references/spec-template.md +0 -2
  20. package/config/skills/devlyn:queue/SKILL.md +6 -4
  21. package/config/skills/devlyn:resolve/SKILL.md +16 -25
  22. package/config/skills/devlyn:resolve/references/free-form-mode.md +0 -14
  23. package/config/skills/devlyn:resolve/references/outer-loop.md +1 -1
  24. package/config/skills/devlyn:resolve/references/phases/build-gate.md +1 -1
  25. package/config/skills/devlyn:resolve/references/phases/cleanup.md +3 -3
  26. package/config/skills/devlyn:resolve/references/phases/implement.md +1 -1
  27. package/config/skills/devlyn:resolve/references/phases/probe-derive.md +1 -16
  28. package/config/skills/devlyn:resolve/references/phases/verify.md +4 -9
  29. package/config/skills/devlyn:resolve/references/state-schema.md +9 -7
  30. package/config/skills/devlyn:resolve/references/task-completion.md +46 -37
  31. package/{config/skills → optional-skills}/code-health-standards/SKILL.md +4 -13
  32. package/{config/skills → optional-skills}/code-review-standards/SKILL.md +4 -12
  33. package/{config/skills → optional-skills}/root-cause-analysis/SKILL.md +4 -12
  34. package/{config/skills → optional-skills}/ui-implementation-standards/SKILL.md +4 -14
  35. package/package.json +1 -57
  36. package/benchmark/auto-resolve/BENCHMARK-DESIGN.md +0 -289
  37. package/benchmark/auto-resolve/BENCHMARK-RESULTS.md +0 -341
  38. package/benchmark/auto-resolve/README.md +0 -696
  39. package/benchmark/auto-resolve/RUBRIC.md +0 -177
  40. package/benchmark/auto-resolve/fixtures/F1-cli-trivial-flag/NOTES.md +0 -34
  41. package/benchmark/auto-resolve/fixtures/F1-cli-trivial-flag/expected.json +0 -68
  42. package/benchmark/auto-resolve/fixtures/F1-cli-trivial-flag/metadata.json +0 -10
  43. package/benchmark/auto-resolve/fixtures/F1-cli-trivial-flag/setup.sh +0 -4
  44. package/benchmark/auto-resolve/fixtures/F1-cli-trivial-flag/spec.md +0 -44
  45. package/benchmark/auto-resolve/fixtures/F1-cli-trivial-flag/task.ko.txt +0 -8
  46. package/benchmark/auto-resolve/fixtures/F1-cli-trivial-flag/task.txt +0 -8
  47. package/benchmark/auto-resolve/fixtures/F10-persist-write-collision/NOTES.md +0 -68
  48. package/benchmark/auto-resolve/fixtures/F10-persist-write-collision/expected.json +0 -60
  49. package/benchmark/auto-resolve/fixtures/F10-persist-write-collision/metadata.json +0 -10
  50. package/benchmark/auto-resolve/fixtures/F10-persist-write-collision/setup.sh +0 -17
  51. package/benchmark/auto-resolve/fixtures/F10-persist-write-collision/spec.md +0 -51
  52. package/benchmark/auto-resolve/fixtures/F10-persist-write-collision/task.txt +0 -9
  53. package/benchmark/auto-resolve/fixtures/F10-persist-write-collision/verifiers/invalid.js +0 -29
  54. package/benchmark/auto-resolve/fixtures/F10-persist-write-collision/verifiers/parallel.js +0 -50
  55. package/benchmark/auto-resolve/fixtures/F11-batch-import-all-or-nothing/NOTES.md +0 -75
  56. package/benchmark/auto-resolve/fixtures/F11-batch-import-all-or-nothing/expected.json +0 -52
  57. package/benchmark/auto-resolve/fixtures/F11-batch-import-all-or-nothing/metadata.json +0 -10
  58. package/benchmark/auto-resolve/fixtures/F11-batch-import-all-or-nothing/setup.sh +0 -171
  59. package/benchmark/auto-resolve/fixtures/F11-batch-import-all-or-nothing/spec.md +0 -50
  60. package/benchmark/auto-resolve/fixtures/F11-batch-import-all-or-nothing/task.txt +0 -9
  61. package/benchmark/auto-resolve/fixtures/F12-webhook-raw-body-signature/NOTES.md +0 -89
  62. package/benchmark/auto-resolve/fixtures/F12-webhook-raw-body-signature/expected.json +0 -74
  63. package/benchmark/auto-resolve/fixtures/F12-webhook-raw-body-signature/metadata.json +0 -10
  64. package/benchmark/auto-resolve/fixtures/F12-webhook-raw-body-signature/setup.sh +0 -251
  65. package/benchmark/auto-resolve/fixtures/F12-webhook-raw-body-signature/spec.md +0 -57
  66. package/benchmark/auto-resolve/fixtures/F12-webhook-raw-body-signature/task.txt +0 -13
  67. package/benchmark/auto-resolve/fixtures/F12-webhook-raw-body-signature/verifiers/replay-malformed-body.js +0 -64
  68. package/benchmark/auto-resolve/fixtures/F15-frozen-diff-race-review/NOTES.md +0 -104
  69. package/benchmark/auto-resolve/fixtures/F15-frozen-diff-race-review/expected.json +0 -46
  70. package/benchmark/auto-resolve/fixtures/F15-frozen-diff-race-review/metadata.json +0 -10
  71. package/benchmark/auto-resolve/fixtures/F15-frozen-diff-race-review/setup.sh +0 -336
  72. package/benchmark/auto-resolve/fixtures/F15-frozen-diff-race-review/spec.md +0 -51
  73. package/benchmark/auto-resolve/fixtures/F15-frozen-diff-race-review/task.txt +0 -9
  74. package/benchmark/auto-resolve/fixtures/F16-cli-quote-tax-rules/NOTES.md +0 -38
  75. package/benchmark/auto-resolve/fixtures/F16-cli-quote-tax-rules/expected.json +0 -64
  76. package/benchmark/auto-resolve/fixtures/F16-cli-quote-tax-rules/metadata.json +0 -10
  77. package/benchmark/auto-resolve/fixtures/F16-cli-quote-tax-rules/setup.sh +0 -32
  78. package/benchmark/auto-resolve/fixtures/F16-cli-quote-tax-rules/spec.md +0 -63
  79. package/benchmark/auto-resolve/fixtures/F16-cli-quote-tax-rules/task.txt +0 -7
  80. package/benchmark/auto-resolve/fixtures/F16-cli-quote-tax-rules/verifiers/exact-success.js +0 -54
  81. package/benchmark/auto-resolve/fixtures/F16-cli-quote-tax-rules/verifiers/no-hardcoded-pricing.js +0 -47
  82. package/benchmark/auto-resolve/fixtures/F16-cli-quote-tax-rules/verifiers/stock-error.js +0 -45
  83. package/benchmark/auto-resolve/fixtures/F2-cli-medium-subcommand/NOTES.md +0 -57
  84. package/benchmark/auto-resolve/fixtures/F2-cli-medium-subcommand/expected-pair-plan-registry.json +0 -170
  85. package/benchmark/auto-resolve/fixtures/F2-cli-medium-subcommand/expected.json +0 -84
  86. package/benchmark/auto-resolve/fixtures/F2-cli-medium-subcommand/metadata.json +0 -21
  87. package/benchmark/auto-resolve/fixtures/F2-cli-medium-subcommand/pair-plan.sample-fail.json +0 -214
  88. package/benchmark/auto-resolve/fixtures/F2-cli-medium-subcommand/pair-plan.sample-pass.json +0 -223
  89. package/benchmark/auto-resolve/fixtures/F2-cli-medium-subcommand/setup.sh +0 -5
  90. package/benchmark/auto-resolve/fixtures/F2-cli-medium-subcommand/spec.md +0 -55
  91. package/benchmark/auto-resolve/fixtures/F2-cli-medium-subcommand/task.txt +0 -14
  92. package/benchmark/auto-resolve/fixtures/F21-cli-scheduler-priority/NOTES.md +0 -39
  93. package/benchmark/auto-resolve/fixtures/F21-cli-scheduler-priority/expected.json +0 -62
  94. package/benchmark/auto-resolve/fixtures/F21-cli-scheduler-priority/metadata.json +0 -10
  95. package/benchmark/auto-resolve/fixtures/F21-cli-scheduler-priority/setup.sh +0 -2
  96. package/benchmark/auto-resolve/fixtures/F21-cli-scheduler-priority/spec.md +0 -67
  97. package/benchmark/auto-resolve/fixtures/F21-cli-scheduler-priority/task.txt +0 -7
  98. package/benchmark/auto-resolve/fixtures/F21-cli-scheduler-priority/verifiers/error-order.js +0 -55
  99. package/benchmark/auto-resolve/fixtures/F21-cli-scheduler-priority/verifiers/priority-blocked.js +0 -48
  100. package/benchmark/auto-resolve/fixtures/F22-cli-ledger-close/NOTES.md +0 -35
  101. package/benchmark/auto-resolve/fixtures/F22-cli-ledger-close/expected.json +0 -56
  102. package/benchmark/auto-resolve/fixtures/F22-cli-ledger-close/metadata.json +0 -10
  103. package/benchmark/auto-resolve/fixtures/F22-cli-ledger-close/setup.sh +0 -2
  104. package/benchmark/auto-resolve/fixtures/F22-cli-ledger-close/spec.md +0 -64
  105. package/benchmark/auto-resolve/fixtures/F22-cli-ledger-close/task.txt +0 -7
  106. package/benchmark/auto-resolve/fixtures/F22-cli-ledger-close/verifiers/conflicting-duplicate.js +0 -34
  107. package/benchmark/auto-resolve/fixtures/F22-cli-ledger-close/verifiers/idempotent-close.js +0 -41
  108. package/benchmark/auto-resolve/fixtures/F23-cli-fulfillment-wave/NOTES.md +0 -39
  109. package/benchmark/auto-resolve/fixtures/F23-cli-fulfillment-wave/expected.json +0 -56
  110. package/benchmark/auto-resolve/fixtures/F23-cli-fulfillment-wave/metadata.json +0 -10
  111. package/benchmark/auto-resolve/fixtures/F23-cli-fulfillment-wave/setup.sh +0 -2
  112. package/benchmark/auto-resolve/fixtures/F23-cli-fulfillment-wave/spec.md +0 -76
  113. package/benchmark/auto-resolve/fixtures/F23-cli-fulfillment-wave/task.txt +0 -7
  114. package/benchmark/auto-resolve/fixtures/F23-cli-fulfillment-wave/verifiers/priority-rollback.js +0 -64
  115. package/benchmark/auto-resolve/fixtures/F23-cli-fulfillment-wave/verifiers/single-warehouse-fefo.js +0 -66
  116. package/benchmark/auto-resolve/fixtures/F25-cli-cart-promotion-rules/NOTES.md +0 -40
  117. package/benchmark/auto-resolve/fixtures/F25-cli-cart-promotion-rules/expected.json +0 -66
  118. package/benchmark/auto-resolve/fixtures/F25-cli-cart-promotion-rules/metadata.json +0 -10
  119. package/benchmark/auto-resolve/fixtures/F25-cli-cart-promotion-rules/setup.sh +0 -36
  120. package/benchmark/auto-resolve/fixtures/F25-cli-cart-promotion-rules/spec.md +0 -71
  121. package/benchmark/auto-resolve/fixtures/F25-cli-cart-promotion-rules/task.txt +0 -7
  122. package/benchmark/auto-resolve/fixtures/F25-cli-cart-promotion-rules/verifiers/catalog-source.js +0 -57
  123. package/benchmark/auto-resolve/fixtures/F25-cli-cart-promotion-rules/verifiers/exact-success.js +0 -63
  124. package/benchmark/auto-resolve/fixtures/F25-cli-cart-promotion-rules/verifiers/stock-error.js +0 -34
  125. package/benchmark/auto-resolve/fixtures/F26-cli-payout-ledger-rules/NOTES.md +0 -31
  126. package/benchmark/auto-resolve/fixtures/F26-cli-payout-ledger-rules/expected.json +0 -68
  127. package/benchmark/auto-resolve/fixtures/F26-cli-payout-ledger-rules/metadata.json +0 -10
  128. package/benchmark/auto-resolve/fixtures/F26-cli-payout-ledger-rules/setup.sh +0 -17
  129. package/benchmark/auto-resolve/fixtures/F26-cli-payout-ledger-rules/spec.md +0 -68
  130. package/benchmark/auto-resolve/fixtures/F26-cli-payout-ledger-rules/task.txt +0 -7
  131. package/benchmark/auto-resolve/fixtures/F26-cli-payout-ledger-rules/verifiers/conflicting-duplicate.js +0 -29
  132. package/benchmark/auto-resolve/fixtures/F26-cli-payout-ledger-rules/verifiers/exact-payout.js +0 -58
  133. package/benchmark/auto-resolve/fixtures/F26-cli-payout-ledger-rules/verifiers/rules-source.js +0 -56
  134. package/benchmark/auto-resolve/fixtures/F3-backend-contract-risk/NOTES.md +0 -35
  135. package/benchmark/auto-resolve/fixtures/F3-backend-contract-risk/expected-pair-plan-registry.json +0 -162
  136. package/benchmark/auto-resolve/fixtures/F3-backend-contract-risk/expected.json +0 -67
  137. package/benchmark/auto-resolve/fixtures/F3-backend-contract-risk/metadata.json +0 -19
  138. package/benchmark/auto-resolve/fixtures/F3-backend-contract-risk/setup.sh +0 -4
  139. package/benchmark/auto-resolve/fixtures/F3-backend-contract-risk/spec.md +0 -55
  140. package/benchmark/auto-resolve/fixtures/F3-backend-contract-risk/task.txt +0 -9
  141. package/benchmark/auto-resolve/fixtures/F31-cli-seat-rebalance/NOTES.md +0 -34
  142. package/benchmark/auto-resolve/fixtures/F31-cli-seat-rebalance/expected.json +0 -57
  143. package/benchmark/auto-resolve/fixtures/F31-cli-seat-rebalance/metadata.json +0 -10
  144. package/benchmark/auto-resolve/fixtures/F31-cli-seat-rebalance/setup.sh +0 -2
  145. package/benchmark/auto-resolve/fixtures/F31-cli-seat-rebalance/spec.md +0 -67
  146. package/benchmark/auto-resolve/fixtures/F31-cli-seat-rebalance/task.txt +0 -7
  147. package/benchmark/auto-resolve/fixtures/F31-cli-seat-rebalance/verifiers/duplicate-event-error.js +0 -35
  148. package/benchmark/auto-resolve/fixtures/F31-cli-seat-rebalance/verifiers/priority-transfer-rollback.js +0 -53
  149. package/benchmark/auto-resolve/fixtures/F32-cli-subscription-renewal/NOTES.md +0 -38
  150. package/benchmark/auto-resolve/fixtures/F32-cli-subscription-renewal/expected.json +0 -57
  151. package/benchmark/auto-resolve/fixtures/F32-cli-subscription-renewal/metadata.json +0 -10
  152. package/benchmark/auto-resolve/fixtures/F32-cli-subscription-renewal/setup.sh +0 -2
  153. package/benchmark/auto-resolve/fixtures/F32-cli-subscription-renewal/spec.md +0 -70
  154. package/benchmark/auto-resolve/fixtures/F32-cli-subscription-renewal/task.txt +0 -3
  155. package/benchmark/auto-resolve/fixtures/F32-cli-subscription-renewal/verifiers/duplicate-renewal-error.js +0 -42
  156. package/benchmark/auto-resolve/fixtures/F32-cli-subscription-renewal/verifiers/priority-credit-rollback.js +0 -70
  157. package/benchmark/auto-resolve/fixtures/F4-web-browser-design/NOTES.md +0 -47
  158. package/benchmark/auto-resolve/fixtures/F4-web-browser-design/expected.json +0 -57
  159. package/benchmark/auto-resolve/fixtures/F4-web-browser-design/metadata.json +0 -10
  160. package/benchmark/auto-resolve/fixtures/F4-web-browser-design/setup.sh +0 -6
  161. package/benchmark/auto-resolve/fixtures/F4-web-browser-design/spec.md +0 -48
  162. package/benchmark/auto-resolve/fixtures/F4-web-browser-design/task.txt +0 -9
  163. package/benchmark/auto-resolve/fixtures/F5-fix-loop-red-green/NOTES.md +0 -45
  164. package/benchmark/auto-resolve/fixtures/F5-fix-loop-red-green/expected.json +0 -65
  165. package/benchmark/auto-resolve/fixtures/F5-fix-loop-red-green/metadata.json +0 -10
  166. package/benchmark/auto-resolve/fixtures/F5-fix-loop-red-green/setup.sh +0 -55
  167. package/benchmark/auto-resolve/fixtures/F5-fix-loop-red-green/spec.md +0 -48
  168. package/benchmark/auto-resolve/fixtures/F5-fix-loop-red-green/task.txt +0 -7
  169. package/benchmark/auto-resolve/fixtures/F6-dep-audit-native-module/NOTES.md +0 -43
  170. package/benchmark/auto-resolve/fixtures/F6-dep-audit-native-module/expected.json +0 -77
  171. package/benchmark/auto-resolve/fixtures/F6-dep-audit-native-module/metadata.json +0 -10
  172. package/benchmark/auto-resolve/fixtures/F6-dep-audit-native-module/setup.sh +0 -4
  173. package/benchmark/auto-resolve/fixtures/F6-dep-audit-native-module/spec.md +0 -48
  174. package/benchmark/auto-resolve/fixtures/F6-dep-audit-native-module/task.txt +0 -10
  175. package/benchmark/auto-resolve/fixtures/F7-out-of-scope-trap/NOTES.md +0 -57
  176. package/benchmark/auto-resolve/fixtures/F7-out-of-scope-trap/expected.json +0 -76
  177. package/benchmark/auto-resolve/fixtures/F7-out-of-scope-trap/metadata.json +0 -10
  178. package/benchmark/auto-resolve/fixtures/F7-out-of-scope-trap/setup.sh +0 -36
  179. package/benchmark/auto-resolve/fixtures/F7-out-of-scope-trap/spec.md +0 -45
  180. package/benchmark/auto-resolve/fixtures/F7-out-of-scope-trap/task.txt +0 -7
  181. package/benchmark/auto-resolve/fixtures/F8-known-limit-ambiguous/NOTES.md +0 -53
  182. package/benchmark/auto-resolve/fixtures/F8-known-limit-ambiguous/expected.json +0 -63
  183. package/benchmark/auto-resolve/fixtures/F8-known-limit-ambiguous/metadata.json +0 -10
  184. package/benchmark/auto-resolve/fixtures/F8-known-limit-ambiguous/setup.sh +0 -4
  185. package/benchmark/auto-resolve/fixtures/F8-known-limit-ambiguous/spec.md +0 -48
  186. package/benchmark/auto-resolve/fixtures/F8-known-limit-ambiguous/task.txt +0 -1
  187. package/benchmark/auto-resolve/fixtures/F9-e2e-ideate-to-resolve/NOTES.md +0 -105
  188. package/benchmark/auto-resolve/fixtures/F9-e2e-ideate-to-resolve/expected.json +0 -74
  189. package/benchmark/auto-resolve/fixtures/F9-e2e-ideate-to-resolve/metadata.json +0 -10
  190. package/benchmark/auto-resolve/fixtures/F9-e2e-ideate-to-resolve/setup.sh +0 -28
  191. package/benchmark/auto-resolve/fixtures/F9-e2e-ideate-to-resolve/spec.md +0 -59
  192. package/benchmark/auto-resolve/fixtures/F9-e2e-ideate-to-resolve/task.txt +0 -5
  193. package/benchmark/auto-resolve/fixtures/SCHEMA.md +0 -188
  194. package/benchmark/auto-resolve/fixtures/retired/F27-cli-subscription-proration/NOTES.md +0 -37
  195. package/benchmark/auto-resolve/fixtures/retired/F27-cli-subscription-proration/RETIRED.md +0 -13
  196. package/benchmark/auto-resolve/fixtures/retired/F27-cli-subscription-proration/expected.json +0 -56
  197. package/benchmark/auto-resolve/fixtures/retired/F27-cli-subscription-proration/metadata.json +0 -10
  198. package/benchmark/auto-resolve/fixtures/retired/F27-cli-subscription-proration/setup.sh +0 -18
  199. package/benchmark/auto-resolve/fixtures/retired/F27-cli-subscription-proration/spec.md +0 -69
  200. package/benchmark/auto-resolve/fixtures/retired/F27-cli-subscription-proration/task.txt +0 -7
  201. package/benchmark/auto-resolve/fixtures/retired/F27-cli-subscription-proration/verifiers/exact-proration.js +0 -48
  202. package/benchmark/auto-resolve/fixtures/retired/F27-cli-subscription-proration/verifiers/rules-source-and-conflict.js +0 -79
  203. package/benchmark/auto-resolve/fixtures/retired/F28-cli-return-authorization/NOTES.md +0 -54
  204. package/benchmark/auto-resolve/fixtures/retired/F28-cli-return-authorization/RETIRED.md +0 -7
  205. package/benchmark/auto-resolve/fixtures/retired/F28-cli-return-authorization/expected.json +0 -67
  206. package/benchmark/auto-resolve/fixtures/retired/F28-cli-return-authorization/metadata.json +0 -10
  207. package/benchmark/auto-resolve/fixtures/retired/F28-cli-return-authorization/setup.sh +0 -2
  208. package/benchmark/auto-resolve/fixtures/retired/F28-cli-return-authorization/spec.md +0 -67
  209. package/benchmark/auto-resolve/fixtures/retired/F28-cli-return-authorization/task.txt +0 -5
  210. package/benchmark/auto-resolve/fixtures/retired/F28-cli-return-authorization/verifiers/policy-precedence.js +0 -72
  211. package/benchmark/auto-resolve/fixtures/retired/F28-cli-return-authorization/verifiers/validation-and-immutability.js +0 -43
  212. package/benchmark/auto-resolve/fixtures/retired/F28-cli-return-authorization/verifiers/validation-boundary.js +0 -116
  213. package/benchmark/auto-resolve/fixtures/retired/F30-cli-credit-hold-settlement/NOTES.md +0 -35
  214. package/benchmark/auto-resolve/fixtures/retired/F30-cli-credit-hold-settlement/RETIRED.md +0 -12
  215. package/benchmark/auto-resolve/fixtures/retired/F30-cli-credit-hold-settlement/expected.json +0 -58
  216. package/benchmark/auto-resolve/fixtures/retired/F30-cli-credit-hold-settlement/metadata.json +0 -10
  217. package/benchmark/auto-resolve/fixtures/retired/F30-cli-credit-hold-settlement/setup.sh +0 -2
  218. package/benchmark/auto-resolve/fixtures/retired/F30-cli-credit-hold-settlement/spec.md +0 -73
  219. package/benchmark/auto-resolve/fixtures/retired/F30-cli-credit-hold-settlement/task.txt +0 -17
  220. package/benchmark/auto-resolve/fixtures/retired/F30-cli-credit-hold-settlement/verifiers/mixed-idempotent-settlement.js +0 -53
  221. package/benchmark/auto-resolve/fixtures/retired/F30-cli-credit-hold-settlement/verifiers/rejection-boundaries.js +0 -74
  222. package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/NOTES.md +0 -28
  223. package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/RETIRED.md +0 -15
  224. package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/expected.json +0 -57
  225. package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/metadata.json +0 -10
  226. package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/setup.sh +0 -50
  227. package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/spec.md +0 -59
  228. package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/task.txt +0 -9
  229. package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/verifiers/ordered-settlement.js +0 -88
  230. package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/verifiers/reject-invalid.js +0 -45
  231. package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/NOTES.md +0 -30
  232. package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/RETIRED.md +0 -16
  233. package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/expected.json +0 -64
  234. package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/metadata.json +0 -10
  235. package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/setup.sh +0 -21
  236. package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/spec.md +0 -58
  237. package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/task.txt +0 -9
  238. package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/verifiers/dup-op.js +0 -54
  239. package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/verifiers/priority-apply.js +0 -82
  240. package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/verifiers/rollback.js +0 -77
  241. package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/NOTES.md +0 -99
  242. package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/RETIRED.md +0 -18
  243. package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/expected.json +0 -64
  244. package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/metadata.json +0 -10
  245. package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/setup.sh +0 -4
  246. package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/spec.md +0 -61
  247. package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/task.txt +0 -9
  248. package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/verifiers/correctness-small.js +0 -135
  249. package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/verifiers/scale.js +0 -100
  250. package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/verifiers/validation.js +0 -75
  251. package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/NOTES.md +0 -93
  252. package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/RETIRED.md +0 -16
  253. package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/expected.json +0 -65
  254. package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/metadata.json +0 -10
  255. package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/setup.sh +0 -18
  256. package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/spec.md +0 -66
  257. package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/task.txt +0 -9
  258. package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/verifiers/correctness-small.js +0 -84
  259. package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/verifiers/scale.js +0 -184
  260. package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/verifiers/validation.js +0 -74
  261. package/benchmark/auto-resolve/fixtures/retired/F9-e2e-ideate-to-preflight/NOTES.md +0 -60
  262. package/benchmark/auto-resolve/fixtures/retired/F9-e2e-ideate-to-preflight/RETIRED.md +0 -29
  263. package/benchmark/auto-resolve/fixtures/retired/F9-e2e-ideate-to-preflight/expected.json +0 -73
  264. package/benchmark/auto-resolve/fixtures/retired/F9-e2e-ideate-to-preflight/metadata.json +0 -10
  265. package/benchmark/auto-resolve/fixtures/retired/F9-e2e-ideate-to-preflight/setup.sh +0 -28
  266. package/benchmark/auto-resolve/fixtures/retired/F9-e2e-ideate-to-preflight/spec.md +0 -58
  267. package/benchmark/auto-resolve/fixtures/retired/F9-e2e-ideate-to-preflight/task.txt +0 -5
  268. package/benchmark/auto-resolve/fixtures/test-repo/README.md +0 -12
  269. package/benchmark/auto-resolve/fixtures/test-repo/bin/cli.js +0 -63
  270. package/benchmark/auto-resolve/fixtures/test-repo/package-lock.json +0 -823
  271. package/benchmark/auto-resolve/fixtures/test-repo/package.json +0 -22
  272. package/benchmark/auto-resolve/fixtures/test-repo/playwright.config.js +0 -17
  273. package/benchmark/auto-resolve/fixtures/test-repo/server/index.js +0 -37
  274. package/benchmark/auto-resolve/fixtures/test-repo/tests/cli.test.js +0 -25
  275. package/benchmark/auto-resolve/fixtures/test-repo/tests/server.test.js +0 -58
  276. package/benchmark/auto-resolve/fixtures/test-repo/web/index.html +0 -37
  277. package/benchmark/auto-resolve/results/20260507-f10-f11-tier1-full-pipeline/headroom-gate.json +0 -25
  278. package/benchmark/auto-resolve/results/20260507-f10-f11-tier1-full-pipeline/headroom-gate.md +0 -10
  279. package/benchmark/auto-resolve/results/20260508-f22-exact-error-headroom/headroom-gate.json +0 -18
  280. package/benchmark/auto-resolve/results/20260508-f22-exact-error-headroom/headroom-gate.md +0 -9
  281. package/benchmark/auto-resolve/results/20260508-f26-headroom/headroom-gate.json +0 -18
  282. package/benchmark/auto-resolve/results/20260508-f26-headroom/headroom-gate.md +0 -9
  283. package/benchmark/auto-resolve/results/20260510-f16-f23-f25-combined-proof/F16-cli-quote-tax-rules/l2_risk_probes/result.json +0 -28
  284. package/benchmark/auto-resolve/results/20260510-f16-f23-f25-combined-proof/F23-cli-fulfillment-wave/l2_risk_probes/result.json +0 -28
  285. package/benchmark/auto-resolve/results/20260510-f16-f23-f25-combined-proof/F25-cli-cart-promotion-rules/l2_risk_probes/result.json +0 -30
  286. package/benchmark/auto-resolve/results/20260510-f16-f23-f25-combined-proof/full-pipeline-pair-gate.json +0 -82
  287. package/benchmark/auto-resolve/results/20260510-f16-f23-f25-combined-proof/full-pipeline-pair-gate.md +0 -18
  288. package/benchmark/auto-resolve/results/20260510-f16-f23-f25-combined-proof/headroom-gate.json +0 -46
  289. package/benchmark/auto-resolve/results/20260510-f16-f23-f25-combined-proof/headroom-gate.md +0 -17
  290. package/benchmark/auto-resolve/results/20260511-f12-webhook-headroom/headroom-gate.json +0 -28
  291. package/benchmark/auto-resolve/results/20260511-f12-webhook-headroom/headroom-gate.md +0 -15
  292. package/benchmark/auto-resolve/results/20260511-f15-concurrency-headroom/headroom-gate.json +0 -28
  293. package/benchmark/auto-resolve/results/20260511-f15-concurrency-headroom/headroom-gate.md +0 -15
  294. package/benchmark/auto-resolve/results/20260511-f21-current-riskprobes-v1/F21-cli-scheduler-priority/l2_risk_probes/result.json +0 -32
  295. package/benchmark/auto-resolve/results/20260511-f21-current-riskprobes-v1/full-pipeline-pair-gate.json +0 -44
  296. package/benchmark/auto-resolve/results/20260511-f21-current-riskprobes-v1/full-pipeline-pair-gate.md +0 -16
  297. package/benchmark/auto-resolve/results/20260511-f21-current-riskprobes-v1/headroom-gate.json +0 -18
  298. package/benchmark/auto-resolve/results/20260511-f21-current-riskprobes-v1/headroom-gate.md +0 -9
  299. package/benchmark/auto-resolve/results/20260511-f3-http-error-headroom/headroom-gate.json +0 -28
  300. package/benchmark/auto-resolve/results/20260511-f3-http-error-headroom/headroom-gate.md +0 -15
  301. package/benchmark/auto-resolve/results/20260512-f2-medium-headroom/headroom-gate.json +0 -28
  302. package/benchmark/auto-resolve/results/20260512-f2-medium-headroom/headroom-gate.md +0 -15
  303. package/benchmark/auto-resolve/results/20260512-f31-seat-rebalance-headroom/headroom-gate.json +0 -28
  304. package/benchmark/auto-resolve/results/20260512-f31-seat-rebalance-headroom/headroom-gate.md +0 -15
  305. package/benchmark/auto-resolve/results/20260512-f32-subscription-renewal-headroom/headroom-gate.json +0 -28
  306. package/benchmark/auto-resolve/results/20260512-f32-subscription-renewal-headroom/headroom-gate.md +0 -15
  307. package/benchmark/auto-resolve/results/20260512-f4-web-headroom/headroom-gate.json +0 -28
  308. package/benchmark/auto-resolve/results/20260512-f4-web-headroom/headroom-gate.md +0 -15
  309. package/benchmark/auto-resolve/results/20260512-f5-fixloop-headroom/headroom-gate.json +0 -28
  310. package/benchmark/auto-resolve/results/20260512-f5-fixloop-headroom/headroom-gate.md +0 -15
  311. package/benchmark/auto-resolve/results/20260512-f6-checksum-headroom/headroom-gate.json +0 -28
  312. package/benchmark/auto-resolve/results/20260512-f6-checksum-headroom/headroom-gate.md +0 -15
  313. package/benchmark/auto-resolve/results/20260512-f7-scope-headroom/headroom-gate.json +0 -28
  314. package/benchmark/auto-resolve/results/20260512-f7-scope-headroom/headroom-gate.md +0 -15
  315. package/benchmark/auto-resolve/results/20260512-f9-e2e-headroom/headroom-gate.json +0 -28
  316. package/benchmark/auto-resolve/results/20260512-f9-e2e-headroom/headroom-gate.md +0 -15
  317. package/benchmark/auto-resolve/run-real-benchmark.md +0 -303
  318. package/benchmark/auto-resolve/scripts/audit-headroom-rejections.py +0 -441
  319. package/benchmark/auto-resolve/scripts/audit-pair-evidence.py +0 -1256
  320. package/benchmark/auto-resolve/scripts/build-pair-eligible-manifest.py +0 -306
  321. package/benchmark/auto-resolve/scripts/check-f9-artifacts.py +0 -268
  322. package/benchmark/auto-resolve/scripts/collect-swebench-predictions.py +0 -108
  323. package/benchmark/auto-resolve/scripts/compile-report.py +0 -493
  324. package/benchmark/auto-resolve/scripts/fetch-swebench-instances.py +0 -129
  325. package/benchmark/auto-resolve/scripts/frozen-verify-gate.py +0 -434
  326. package/benchmark/auto-resolve/scripts/full-pipeline-pair-gate.py +0 -612
  327. package/benchmark/auto-resolve/scripts/headroom-gate.py +0 -378
  328. package/benchmark/auto-resolve/scripts/iter-0033c-compare.py +0 -683
  329. package/benchmark/auto-resolve/scripts/iter-0033c-l1-summary.py +0 -97
  330. package/benchmark/auto-resolve/scripts/judge-opus-pass.sh +0 -542
  331. package/benchmark/auto-resolve/scripts/judge.sh +0 -565
  332. package/benchmark/auto-resolve/scripts/oracle-scope-tier-a.py +0 -256
  333. package/benchmark/auto-resolve/scripts/oracle-scope-tier-b.py +0 -287
  334. package/benchmark/auto-resolve/scripts/oracle-test-fidelity.py +0 -328
  335. package/benchmark/auto-resolve/scripts/pair-candidate-frontier.py +0 -469
  336. package/benchmark/auto-resolve/scripts/pair-plan-idgen.py +0 -401
  337. package/benchmark/auto-resolve/scripts/pair-plan-lint.py +0 -475
  338. package/benchmark/auto-resolve/scripts/pair-rejected-fixtures.sh +0 -103
  339. package/benchmark/auto-resolve/scripts/pair_evidence_contract.py +0 -270
  340. package/benchmark/auto-resolve/scripts/prepare-swebench-frozen-case.py +0 -273
  341. package/benchmark/auto-resolve/scripts/prepare-swebench-frozen-corpus.py +0 -148
  342. package/benchmark/auto-resolve/scripts/prepare-swebench-solver-worktree.py +0 -210
  343. package/benchmark/auto-resolve/scripts/recent-benchmark-summary.py +0 -232
  344. package/benchmark/auto-resolve/scripts/run-fixture.sh +0 -1024
  345. package/benchmark/auto-resolve/scripts/run-frozen-verify-pair.sh +0 -683
  346. package/benchmark/auto-resolve/scripts/run-full-pipeline-pair-candidate.sh +0 -458
  347. package/benchmark/auto-resolve/scripts/run-headroom-candidate.sh +0 -336
  348. package/benchmark/auto-resolve/scripts/run-iter-0033c.sh +0 -208
  349. package/benchmark/auto-resolve/scripts/run-suite.sh +0 -251
  350. package/benchmark/auto-resolve/scripts/run-swebench-frozen-corpus.sh +0 -310
  351. package/benchmark/auto-resolve/scripts/run-swebench-solver-batch.sh +0 -257
  352. package/benchmark/auto-resolve/scripts/ship-gate.py +0 -391
  353. package/benchmark/auto-resolve/scripts/solo-ceiling-avoidance.py +0 -53
  354. package/benchmark/auto-resolve/scripts/solo-headroom-hypothesis.py +0 -77
  355. package/benchmark/auto-resolve/scripts/swebench-frozen-matrix.py +0 -478
  356. package/benchmark/auto-resolve/scripts/test-audit-headroom-rejections.sh +0 -288
  357. package/benchmark/auto-resolve/scripts/test-audit-pair-evidence.sh +0 -1672
  358. package/benchmark/auto-resolve/scripts/test-benchmark-arg-parsing.sh +0 -1015
  359. package/benchmark/auto-resolve/scripts/test-build-pair-eligible-manifest.sh +0 -491
  360. package/benchmark/auto-resolve/scripts/test-check-f9-artifacts.sh +0 -91
  361. package/benchmark/auto-resolve/scripts/test-frozen-verify-gate.sh +0 -517
  362. package/benchmark/auto-resolve/scripts/test-full-pipeline-pair-gate.sh +0 -610
  363. package/benchmark/auto-resolve/scripts/test-headroom-gate.sh +0 -401
  364. package/benchmark/auto-resolve/scripts/test-iter-0033c-compare.sh +0 -525
  365. package/benchmark/auto-resolve/scripts/test-iter-0033c-l1-summary.sh +0 -254
  366. package/benchmark/auto-resolve/scripts/test-lint-fixtures.sh +0 -580
  367. package/benchmark/auto-resolve/scripts/test-pair-candidate-frontier.sh +0 -591
  368. package/benchmark/auto-resolve/scripts/test-run-full-pipeline-pair-candidate.sh +0 -497
  369. package/benchmark/auto-resolve/scripts/test-run-headroom-candidate.sh +0 -401
  370. package/benchmark/auto-resolve/scripts/test-run-swebench-solver-batch.sh +0 -111
  371. package/benchmark/auto-resolve/scripts/test-ship-gate.sh +0 -1189
  372. package/benchmark/auto-resolve/scripts/test-swebench-frozen-case.sh +0 -1221
  373. package/benchmark/auto-resolve/shadow-fixtures/S1-cli-lang-flag/NOTES.md +0 -28
  374. package/benchmark/auto-resolve/shadow-fixtures/S1-cli-lang-flag/expected.json +0 -63
  375. package/benchmark/auto-resolve/shadow-fixtures/S1-cli-lang-flag/metadata.json +0 -10
  376. package/benchmark/auto-resolve/shadow-fixtures/S1-cli-lang-flag/setup.sh +0 -3
  377. package/benchmark/auto-resolve/shadow-fixtures/S1-cli-lang-flag/spec.md +0 -47
  378. package/benchmark/auto-resolve/shadow-fixtures/S1-cli-lang-flag/task.txt +0 -1
  379. package/benchmark/auto-resolve/shadow-fixtures/S2-cli-inventory-reservation/NOTES.md +0 -34
  380. package/benchmark/auto-resolve/shadow-fixtures/S2-cli-inventory-reservation/expected.json +0 -53
  381. package/benchmark/auto-resolve/shadow-fixtures/S2-cli-inventory-reservation/metadata.json +0 -10
  382. package/benchmark/auto-resolve/shadow-fixtures/S2-cli-inventory-reservation/setup.sh +0 -3
  383. package/benchmark/auto-resolve/shadow-fixtures/S2-cli-inventory-reservation/spec.md +0 -50
  384. package/benchmark/auto-resolve/shadow-fixtures/S2-cli-inventory-reservation/task.txt +0 -1
  385. package/benchmark/auto-resolve/shadow-fixtures/S2-cli-inventory-reservation/verifiers/duplicate-order-error.js +0 -27
  386. package/benchmark/auto-resolve/shadow-fixtures/S2-cli-inventory-reservation/verifiers/priority-stock-reservation.js +0 -44
  387. package/benchmark/auto-resolve/shadow-fixtures/S3-cli-ticket-assignment/NOTES.md +0 -34
  388. package/benchmark/auto-resolve/shadow-fixtures/S3-cli-ticket-assignment/expected.json +0 -55
  389. package/benchmark/auto-resolve/shadow-fixtures/S3-cli-ticket-assignment/metadata.json +0 -10
  390. package/benchmark/auto-resolve/shadow-fixtures/S3-cli-ticket-assignment/setup.sh +0 -3
  391. package/benchmark/auto-resolve/shadow-fixtures/S3-cli-ticket-assignment/spec.md +0 -52
  392. package/benchmark/auto-resolve/shadow-fixtures/S3-cli-ticket-assignment/task.txt +0 -1
  393. package/benchmark/auto-resolve/shadow-fixtures/S3-cli-ticket-assignment/verifiers/duplicate-ticket-error.js +0 -29
  394. package/benchmark/auto-resolve/shadow-fixtures/S3-cli-ticket-assignment/verifiers/priority-agent-assignment.js +0 -48
  395. package/benchmark/auto-resolve/shadow-fixtures/S4-cli-return-routing/NOTES.md +0 -34
  396. package/benchmark/auto-resolve/shadow-fixtures/S4-cli-return-routing/expected.json +0 -55
  397. package/benchmark/auto-resolve/shadow-fixtures/S4-cli-return-routing/metadata.json +0 -10
  398. package/benchmark/auto-resolve/shadow-fixtures/S4-cli-return-routing/setup.sh +0 -3
  399. package/benchmark/auto-resolve/shadow-fixtures/S4-cli-return-routing/spec.md +0 -55
  400. package/benchmark/auto-resolve/shadow-fixtures/S4-cli-return-routing/task.txt +0 -1
  401. package/benchmark/auto-resolve/shadow-fixtures/S4-cli-return-routing/verifiers/duplicate-return-error.js +0 -43
  402. package/benchmark/auto-resolve/shadow-fixtures/S4-cli-return-routing/verifiers/priority-return-routing.js +0 -70
  403. package/benchmark/auto-resolve/shadow-fixtures/S5-cli-credit-grant-ledger/NOTES.md +0 -37
  404. package/benchmark/auto-resolve/shadow-fixtures/S5-cli-credit-grant-ledger/expected.json +0 -54
  405. package/benchmark/auto-resolve/shadow-fixtures/S5-cli-credit-grant-ledger/metadata.json +0 -10
  406. package/benchmark/auto-resolve/shadow-fixtures/S5-cli-credit-grant-ledger/setup.sh +0 -3
  407. package/benchmark/auto-resolve/shadow-fixtures/S5-cli-credit-grant-ledger/spec.md +0 -59
  408. package/benchmark/auto-resolve/shadow-fixtures/S5-cli-credit-grant-ledger/task.txt +0 -1
  409. package/benchmark/auto-resolve/shadow-fixtures/S5-cli-credit-grant-ledger/verifiers/credit-ledger-priority.js +0 -98
  410. package/benchmark/auto-resolve/shadow-fixtures/S5-cli-credit-grant-ledger/verifiers/duplicate-charge-error.js +0 -38
  411. package/benchmark/auto-resolve/shadow-fixtures/S6-cli-refund-window-ledger/NOTES.md +0 -36
  412. package/benchmark/auto-resolve/shadow-fixtures/S6-cli-refund-window-ledger/expected.json +0 -56
  413. package/benchmark/auto-resolve/shadow-fixtures/S6-cli-refund-window-ledger/metadata.json +0 -10
  414. package/benchmark/auto-resolve/shadow-fixtures/S6-cli-refund-window-ledger/setup.sh +0 -3
  415. package/benchmark/auto-resolve/shadow-fixtures/S6-cli-refund-window-ledger/spec.md +0 -59
  416. package/benchmark/auto-resolve/shadow-fixtures/S6-cli-refund-window-ledger/task.txt +0 -1
  417. package/benchmark/auto-resolve/shadow-fixtures/S6-cli-refund-window-ledger/verifiers/duplicate-refund-error.js +0 -41
  418. package/benchmark/auto-resolve/shadow-fixtures/S6-cli-refund-window-ledger/verifiers/priority-refund-ledger.js +0 -65
  419. package/config/skills/_shared/pair-plan-schema.md +0 -298
  420. package/scripts/lint-fixtures.sh +0 -352
  421. package/scripts/lint-shadow-fixtures.sh +0 -58
  422. package/scripts/lint-skills.sh +0 -4265
  423. package/scripts/test-owner-phases.py +0 -238
@@ -1,591 +0,0 @@
1
- #!/usr/bin/env bash
2
- # Regression tests for pair-candidate-frontier.py.
3
-
4
- set -euo pipefail
5
-
6
- SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
7
- SCRIPT="$SCRIPT_DIR/pair-candidate-frontier.py"
8
- TMP_DIR="$(mktemp -d /tmp/pair-candidate-frontier-test.XXXXXX)"
9
- trap 'rm -rf "$TMP_DIR"' EXIT
10
-
11
- expect_fail_contains() {
12
- local label="$1"
13
- local needle="$2"
14
- shift 2
15
- local out="$TMP_DIR/$label.out"
16
- if "$@" > "$out" 2>&1; then
17
- echo "expected failure for $label" >&2
18
- cat "$out" >&2
19
- exit 1
20
- fi
21
- if ! grep -Fq -- "$needle" "$out"; then
22
- echo "missing expected text for $label: $needle" >&2
23
- cat "$out" >&2
24
- exit 1
25
- fi
26
- }
27
-
28
- fixtures="$TMP_DIR/fixtures"
29
- results="$TMP_DIR/results"
30
- mkdir -p "$fixtures/F2-cli-medium-subcommand" \
31
- "$fixtures/F16-cli-quote-tax-rules" \
32
- "$fixtures/F21-cli-scheduler-priority" \
33
- "$fixtures/F22-cli-low-margin" \
34
- "$fixtures/F23-cli-high-wall" \
35
- "$fixtures/retired/F99-retired"
36
-
37
- cat > "$TMP_DIR/pair-rejected-fixtures.sh" <<'SH'
38
- rejected_pair_fixture_reason() {
39
- local fid="$1"
40
- case "$fid" in
41
- F2-*|F2)
42
- echo "measured ceiling"
43
- ;;
44
- *)
45
- return 1
46
- ;;
47
- esac
48
- }
49
- SH
50
-
51
- mkdir -p "$results/pass-run"
52
- cat > "$results/pass-run/full-pipeline-pair-gate.json" <<'JSON'
53
- {
54
- "run_id": "pass-run",
55
- "verdict": "PASS",
56
- "pair_arm": "l2_risk_probes",
57
- "rows": [
58
- {
59
- "fixture": "F16-cli-quote-tax-rules",
60
- "status": "PASS",
61
- "bare_score": 50,
62
- "solo_score": 75,
63
- "pair_score": 96,
64
- "pair_margin": 21,
65
- "pair_mode": true,
66
- "pair_trigger_eligible": true,
67
- "pair_trigger_reasons": ["complexity.high"],
68
- "pair_trigger_has_canonical_reason": true,
69
- "pair_solo_wall_ratio": 1.28
70
- }
71
- ]
72
- }
73
- JSON
74
-
75
- mkdir -p "$results/incomplete-high-run"
76
- cat > "$results/incomplete-high-run/full-pipeline-pair-gate.json" <<'JSON'
77
- {
78
- "run_id": "incomplete-high-run",
79
- "verdict": "PASS",
80
- "rows": [
81
- {
82
- "fixture": "F16-cli-quote-tax-rules",
83
- "status": "PASS",
84
- "bare_score": 50,
85
- "solo_score": 75,
86
- "pair_score": 98,
87
- "pair_margin": 23,
88
- "pair_mode": true,
89
- "pair_trigger_eligible": true,
90
- "pair_solo_wall_ratio": 1.32
91
- }
92
- ]
93
- }
94
- JSON
95
-
96
- mkdir -p "$results/low-margin-run"
97
- cat > "$results/low-margin-run/full-pipeline-pair-gate.json" <<'JSON'
98
- {
99
- "run_id": "low-margin-run",
100
- "verdict": "PASS",
101
- "pair_arm": "l2_risk_probes",
102
- "rows": [
103
- {
104
- "fixture": "F22-cli-low-margin",
105
- "status": "PASS",
106
- "bare_score": 50,
107
- "solo_score": 80,
108
- "pair_score": 84,
109
- "pair_margin": 4,
110
- "pair_mode": true,
111
- "pair_trigger_eligible": true,
112
- "pair_trigger_reasons": ["complexity.high"],
113
- "pair_trigger_has_canonical_reason": true,
114
- "pair_solo_wall_ratio": 1.1
115
- }
116
- ]
117
- }
118
- JSON
119
-
120
- mkdir -p "$results/high-wall-run"
121
- cat > "$results/high-wall-run/full-pipeline-pair-gate.json" <<'JSON'
122
- {
123
- "run_id": "high-wall-run",
124
- "verdict": "PASS",
125
- "pair_arm": "l2_risk_probes",
126
- "rows": [
127
- {
128
- "fixture": "F23-cli-high-wall",
129
- "status": "PASS",
130
- "bare_score": 45,
131
- "solo_score": 70,
132
- "pair_score": 91,
133
- "pair_margin": 21,
134
- "pair_mode": true,
135
- "pair_trigger_eligible": true,
136
- "pair_trigger_reasons": ["complexity.high"],
137
- "pair_trigger_has_canonical_reason": true,
138
- "pair_solo_wall_ratio": 3.5
139
- }
140
- ]
141
- }
142
- JSON
143
-
144
- mkdir -p "$results/nan-wall-run"
145
- cat > "$results/nan-wall-run/full-pipeline-pair-gate.json" <<'JSON'
146
- {
147
- "run_id": "nan-wall-run",
148
- "verdict": "PASS",
149
- "pair_arm": "l2_risk_probes",
150
- "rows": [
151
- {
152
- "fixture": "F21-cli-scheduler-priority",
153
- "status": "PASS",
154
- "bare_score": 45,
155
- "solo_score": 70,
156
- "pair_score": 91,
157
- "pair_margin": 21,
158
- "pair_mode": true,
159
- "pair_trigger_eligible": true,
160
- "pair_solo_wall_ratio": NaN
161
- }
162
- ]
163
- }
164
- JSON
165
- expect_fail_contains nan-json-constant "pair evidence artifact malformed" \
166
- python3 "$SCRIPT" \
167
- --fixtures-root "$fixtures" \
168
- --registry "$TMP_DIR/pair-rejected-fixtures.sh" \
169
- --results-root "$results"
170
- rm -rf "$results/nan-wall-run"
171
-
172
- mkdir -p "$results/inflated-margin-run"
173
- cat > "$results/inflated-margin-run/full-pipeline-pair-gate.json" <<'JSON'
174
- {
175
- "run_id": "inflated-margin-run",
176
- "verdict": "PASS",
177
- "pair_arm": "l2_risk_probes",
178
- "rows": [
179
- {
180
- "fixture": "F21-cli-scheduler-priority",
181
- "status": "PASS",
182
- "bare_score": 45,
183
- "solo_score": 70,
184
- "pair_score": 71,
185
- "pair_margin": 21,
186
- "pair_mode": true,
187
- "pair_trigger_eligible": true,
188
- "pair_solo_wall_ratio": 1.2
189
- }
190
- ]
191
- }
192
- JSON
193
-
194
- mkdir -p "$results/overrange-score-run"
195
- cat > "$results/overrange-score-run/full-pipeline-pair-gate.json" <<'JSON'
196
- {
197
- "run_id": "overrange-score-run",
198
- "verdict": "PASS",
199
- "pair_arm": "l2_risk_probes",
200
- "rows": [
201
- {
202
- "fixture": "F21-cli-scheduler-priority",
203
- "status": "PASS",
204
- "bare_score": 45,
205
- "solo_score": 70,
206
- "pair_score": 101,
207
- "pair_margin": 31,
208
- "pair_mode": true,
209
- "pair_trigger_eligible": true,
210
- "pair_solo_wall_ratio": 1.2
211
- }
212
- ]
213
- }
214
- JSON
215
-
216
- mkdir -p "$results/invalid-arm-run"
217
- cat > "$results/invalid-arm-run/full-pipeline-pair-gate.json" <<'JSON'
218
- {
219
- "run_id": "invalid-arm-run",
220
- "verdict": "PASS",
221
- "pair_arm": "bare",
222
- "rows": [
223
- {
224
- "fixture": "F21-cli-scheduler-priority",
225
- "status": "PASS",
226
- "bare_score": 45,
227
- "solo_score": 70,
228
- "pair_score": 91,
229
- "pair_margin": 21,
230
- "pair_mode": true,
231
- "pair_trigger_eligible": true,
232
- "pair_solo_wall_ratio": 1.2
233
- }
234
- ]
235
- }
236
- JSON
237
-
238
- mkdir -p "$results/false-pair-mode-run"
239
- cat > "$results/false-pair-mode-run/full-pipeline-pair-gate.json" <<'JSON'
240
- {
241
- "run_id": "false-pair-mode-run",
242
- "verdict": "PASS",
243
- "pair_arm": "l2_risk_probes",
244
- "rows": [
245
- {
246
- "fixture": "F21-cli-scheduler-priority",
247
- "status": "PASS",
248
- "bare_score": 45,
249
- "solo_score": 70,
250
- "pair_score": 91,
251
- "pair_margin": 21,
252
- "pair_mode": false,
253
- "pair_solo_wall_ratio": 1.2
254
- }
255
- ]
256
- }
257
- JSON
258
-
259
- mkdir -p "$results/zero-wall-run"
260
- cat > "$results/zero-wall-run/full-pipeline-pair-gate.json" <<'JSON'
261
- {
262
- "run_id": "zero-wall-run",
263
- "verdict": "PASS",
264
- "pair_arm": "l2_risk_probes",
265
- "rows": [
266
- {
267
- "fixture": "F21-cli-scheduler-priority",
268
- "status": "PASS",
269
- "bare_score": 45,
270
- "solo_score": 70,
271
- "pair_score": 91,
272
- "pair_margin": 21,
273
- "pair_mode": true,
274
- "pair_trigger_eligible": true,
275
- "pair_solo_wall_ratio": 0
276
- }
277
- ]
278
- }
279
- JSON
280
-
281
- expect_fail_contains missing-registry "rejected fixture registry missing" \
282
- python3 "$SCRIPT" \
283
- --fixtures-root "$fixtures" \
284
- --registry "$TMP_DIR/missing.sh" \
285
- --results-root "$results"
286
-
287
- empty_registry="$TMP_DIR/empty-registry.sh"
288
- : > "$empty_registry"
289
- expect_fail_contains empty-registry "rejected fixture registry has no fixture entries" \
290
- python3 "$SCRIPT" \
291
- --fixtures-root "$fixtures" \
292
- --registry "$empty_registry" \
293
- --results-root "$results"
294
-
295
- s_only_registry="$TMP_DIR/s-only-registry.sh"
296
- cat > "$s_only_registry" <<'SH'
297
- rejected_pair_fixture_reason() {
298
- local fid="$1"
299
- case "$fid" in
300
- S3-*|S3)
301
- echo "shadow solo ceiling"
302
- ;;
303
- *)
304
- return 1
305
- ;;
306
- esac
307
- }
308
- SH
309
- python3 - "$SCRIPT" "$s_only_registry" <<'PY'
310
- import importlib.util
311
- import pathlib
312
- import sys
313
-
314
- spec = importlib.util.spec_from_file_location("pair_candidate_frontier", sys.argv[1])
315
- module = importlib.util.module_from_spec(spec)
316
- assert spec.loader is not None
317
- spec.loader.exec_module(module)
318
- assert module.registry_short_ids(pathlib.Path(sys.argv[2])) == {"S3"}
319
- PY
320
-
321
- mkdir -p "$results/bad-json-run"
322
- printf '{not-json\n' > "$results/bad-json-run/full-pipeline-pair-gate.json"
323
- expect_fail_contains bad-pair-evidence-json "pair evidence artifact malformed" \
324
- python3 "$SCRIPT" \
325
- --fixtures-root "$fixtures" \
326
- --registry "$TMP_DIR/pair-rejected-fixtures.sh" \
327
- --results-root "$results"
328
- rm -rf "$results/bad-json-run"
329
-
330
- mkdir -p "$results/bad-rows-run"
331
- cat > "$results/bad-rows-run/full-pipeline-pair-gate.json" <<'JSON'
332
- {
333
- "run_id": "bad-rows-run",
334
- "verdict": "PASS",
335
- "pair_arm": "l2_risk_probes",
336
- "rows": []
337
- }
338
- JSON
339
- expect_fail_contains bad-pair-evidence-rows "pair evidence artifact rows malformed" \
340
- python3 "$SCRIPT" \
341
- --fixtures-root "$fixtures" \
342
- --registry "$TMP_DIR/pair-rejected-fixtures.sh" \
343
- --results-root "$results"
344
- rm -rf "$results/bad-rows-run"
345
-
346
- mkdir -p "$results/direct-trigger-run/F16-cli-quote-tax-rules/l2_risk_probes"
347
- cat > "$results/direct-trigger-run/F16-cli-quote-tax-rules/l2_risk_probes/result.json" <<'JSON'
348
- {
349
- "pair_trigger": {
350
- "eligible": true,
351
- "reasons": ["complexity.high", "looks-hard"],
352
- "skipped_reason": null
353
- }
354
- }
355
- JSON
356
- python3 - "$SCRIPT" "$results" <<'PY'
357
- import importlib.util
358
- import pathlib
359
- import sys
360
-
361
- spec = importlib.util.spec_from_file_location("pair_candidate_frontier", sys.argv[1])
362
- module = importlib.util.module_from_spec(spec)
363
- assert spec.loader is not None
364
- spec.loader.exec_module(module)
365
- results_root = pathlib.Path(sys.argv[2])
366
- kwargs = {
367
- "results_root": results_root,
368
- "run_id": "direct-trigger-run",
369
- "fixture": "F16-cli-quote-tax-rules",
370
- "pair_arm": "l2_risk_probes",
371
- }
372
- assert module.pair_result_trigger_reasons(**kwargs) == []
373
- path = (
374
- results_root
375
- / "direct-trigger-run"
376
- / "F16-cli-quote-tax-rules"
377
- / "l2_risk_probes"
378
- / "result.json"
379
- )
380
- path.write_text(
381
- '{"pair_trigger":{"eligible":true,"reasons":["complexity.high","risk_profile.high_risk"],"skipped_reason":null}}\n',
382
- encoding="utf8",
383
- )
384
- assert module.pair_result_trigger_reasons(**kwargs) == [
385
- "complexity.high",
386
- "risk_profile.high_risk",
387
- ]
388
- path.write_text(
389
- '{"pair_trigger":{"eligible":true,"reasons":["risk high"],"skipped_reason":null}}\n',
390
- encoding="utf8",
391
- )
392
- assert module.pair_result_trigger_reasons(**kwargs) == []
393
- PY
394
-
395
- python3 "$SCRIPT" \
396
- --fixtures-root "$fixtures" \
397
- --registry "$TMP_DIR/pair-rejected-fixtures.sh" \
398
- --results-root "$results" \
399
- --out-json "$TMP_DIR/frontier.json" \
400
- --out-md "$TMP_DIR/frontier.md" \
401
- > "$TMP_DIR/frontier.stdout"
402
-
403
- python3 - "$TMP_DIR/frontier.json" <<'PY'
404
- import json
405
- import sys
406
-
407
- report = json.load(open(sys.argv[1], encoding="utf8"))
408
- assert report["verdict"] == "FAIL"
409
- assert report["min_pair_margin"] == 5
410
- assert report["max_pair_solo_wall_ratio"] == 3.0
411
- assert report["fixtures_total"] == 5
412
- assert report["rejected_total"] == 1
413
- assert report["candidate_total"] == 4
414
- assert report["pair_evidence_total"] == 1
415
- assert report["unmeasured_candidate_total"] == 3
416
- assert report["rejected_count"] == 1
417
- assert report["candidate_count"] == 4
418
- assert report["pair_evidence_count"] == 1
419
- assert report["unmeasured_count"] == 3
420
- assert report["pair_margin_avg"] == 21
421
- assert report["pair_margin_min"] == 21
422
- assert report["pair_solo_wall_ratio_avg"] == 1.28
423
- assert report["pair_solo_wall_ratio_max"] == 1.28
424
- rows = {row["fixture"]: row for row in report["rows"]}
425
- assert rows["F2-cli-medium-subcommand"]["status"] == "rejected"
426
- assert rows["F2-cli-medium-subcommand"]["rejected_reason"] == "measured ceiling"
427
- assert rows["F16-cli-quote-tax-rules"]["status"] == "pair_evidence_passed"
428
- assert len(rows["F16-cli-quote-tax-rules"]["passing_pair_evidence"]) == 1
429
- assert rows["F16-cli-quote-tax-rules"]["passing_pair_evidence"][0]["run_id"] == "pass-run"
430
- assert rows["F21-cli-scheduler-priority"]["status"] == "candidate_unmeasured"
431
- assert rows["F22-cli-low-margin"]["status"] == "candidate_unmeasured"
432
- assert rows["F23-cli-high-wall"]["status"] == "candidate_unmeasured"
433
- PY
434
-
435
- grep -Fq 'fixtures=5 rejected=1 candidates=4 pair_evidence=1 unmeasured=3 verdict=FAIL' "$TMP_DIR/frontier.stdout"
436
- grep -Fq 'pair_margin_avg=+21.00 pair_margin_min=+21 wall_avg=1.28x wall_max=1.28x' "$TMP_DIR/frontier.stdout"
437
- grep -Fq 'F16-cli-quote-tax-rules: bare=50 solo_claude=75 pair=96 arm=l2_risk_probes margin=+21 wall=1.28x run=pass-run verdict=pair_evidence_passed triggers=complexity.high hypothesis_trigger=false' "$TMP_DIR/frontier.stdout"
438
- grep -Fq 'FAIL pair-candidate-frontier' "$TMP_DIR/frontier.stdout"
439
-
440
- grep -Fq 'Average pair margin: +21.00' "$TMP_DIR/frontier.md"
441
- grep -Fq 'Verdict: FAIL' "$TMP_DIR/frontier.md"
442
- grep -Fq 'Minimum pair margin required: +5' "$TMP_DIR/frontier.md"
443
- grep -Fq 'Maximum pair/solo wall ratio allowed: 3.00x' "$TMP_DIR/frontier.md"
444
- grep -Fq 'Maximum pair/solo wall ratio: 1.28x' "$TMP_DIR/frontier.md"
445
- grep -Fq '| Fixture | Status | Verdict | Evidence | Pair arm | Triggers | Hypothesis trigger | Bare | Solo_claude | Pair | Margin | Wall ratio | Rejected reason |' "$TMP_DIR/frontier.md"
446
- grep -Fq '| F2-cli-medium-subcommand | rejected | rejected | | | | | | | | | | measured ceiling |' "$TMP_DIR/frontier.md"
447
- grep -Fq '| F16-cli-quote-tax-rules | pair_evidence_passed | pair_evidence_passed | pass-run | l2_risk_probes | complexity.high | false | 50 | 75 | 96 | +21 | 1.28x | |' "$TMP_DIR/frontier.md"
448
- grep -Fq '| F21-cli-scheduler-priority | candidate_unmeasured | candidate_unmeasured | | | | | | | | | | |' "$TMP_DIR/frontier.md"
449
-
450
- expect_fail_contains fail-on-unmeasured "unmeasured candidate fixture(s): F21-cli-scheduler-priority" \
451
- python3 "$SCRIPT" \
452
- --fixtures-root "$fixtures" \
453
- --registry "$TMP_DIR/pair-rejected-fixtures.sh" \
454
- --results-root "$results" \
455
- --fail-on-unmeasured
456
- grep -Fq 'FAIL pair-candidate-frontier' "$TMP_DIR/fail-on-unmeasured.out"
457
-
458
- set +e
459
- python3 "$SCRIPT" \
460
- --fixtures-root "$fixtures" \
461
- --registry "$TMP_DIR/pair-rejected-fixtures.sh" \
462
- --results-root "$results" \
463
- --fail-on-unmeasured \
464
- > "$TMP_DIR/fail-on-unmeasured.json" \
465
- 2> "$TMP_DIR/fail-on-unmeasured.stderr"
466
- fail_on_unmeasured_status=$?
467
- set -e
468
- if [ "$fail_on_unmeasured_status" -eq 0 ]; then
469
- echo "expected pure JSON fail-on-unmeasured path to fail" >&2
470
- exit 1
471
- fi
472
- grep -Fq 'unmeasured candidate fixture(s): F21-cli-scheduler-priority' "$TMP_DIR/fail-on-unmeasured.stderr"
473
- grep -Fq 'FAIL pair-candidate-frontier' "$TMP_DIR/fail-on-unmeasured.stderr"
474
- if grep -Fq 'FAIL pair-candidate-frontier' "$TMP_DIR/fail-on-unmeasured.json"; then
475
- echo "pure JSON stdout must not include final text verdict" >&2
476
- cat "$TMP_DIR/fail-on-unmeasured.json" >&2
477
- exit 1
478
- fi
479
- python3 - "$TMP_DIR/fail-on-unmeasured.json" <<'PY'
480
- import json
481
- import sys
482
-
483
- report = json.load(open(sys.argv[1], encoding="utf8"))
484
- assert report["verdict"] == "FAIL"
485
- assert report["unmeasured_candidate_total"] == 3
486
- PY
487
-
488
- python3 "$SCRIPT" \
489
- --fixtures-root "$fixtures" \
490
- --registry "$TMP_DIR/pair-rejected-fixtures.sh" \
491
- --results-root "$results" \
492
- --min-pair-margin 4 \
493
- --out-json "$TMP_DIR/frontier-margin4.json" \
494
- > "$TMP_DIR/frontier-margin4.stdout"
495
- python3 - "$TMP_DIR/frontier-margin4.json" <<'PY'
496
- import json
497
- import sys
498
-
499
- report = json.load(open(sys.argv[1], encoding="utf8"))
500
- assert report["min_pair_margin"] == 4
501
- rows = {row["fixture"]: row for row in report["rows"]}
502
- assert rows["F22-cli-low-margin"]["status"] == "pair_evidence_passed"
503
- PY
504
-
505
- python3 "$SCRIPT" \
506
- --fixtures-root "$fixtures" \
507
- --registry "$TMP_DIR/pair-rejected-fixtures.sh" \
508
- --results-root "$results" \
509
- --max-pair-solo-wall-ratio 4 \
510
- --out-json "$TMP_DIR/frontier-wall4.json" \
511
- > "$TMP_DIR/frontier-wall4.stdout"
512
- python3 - "$TMP_DIR/frontier-wall4.json" <<'PY'
513
- import json
514
- import sys
515
-
516
- report = json.load(open(sys.argv[1], encoding="utf8"))
517
- assert report["max_pair_solo_wall_ratio"] == 4.0
518
- rows = {row["fixture"]: row for row in report["rows"]}
519
- assert rows["F23-cli-high-wall"]["status"] == "pair_evidence_passed"
520
- PY
521
-
522
- expect_fail_contains bad-min-pair-margin "--min-pair-margin must be >= 1" \
523
- python3 "$SCRIPT" \
524
- --fixtures-root "$fixtures" \
525
- --registry "$TMP_DIR/pair-rejected-fixtures.sh" \
526
- --results-root "$results" \
527
- --min-pair-margin 0
528
-
529
- expect_fail_contains bad-max-wall-ratio "--max-pair-solo-wall-ratio must be finite and > 0" \
530
- python3 "$SCRIPT" \
531
- --fixtures-root "$fixtures" \
532
- --registry "$TMP_DIR/pair-rejected-fixtures.sh" \
533
- --results-root "$results" \
534
- --max-pair-solo-wall-ratio 0
535
-
536
- expect_fail_contains nan-max-wall-ratio "--max-pair-solo-wall-ratio must be finite and > 0" \
537
- python3 "$SCRIPT" \
538
- --fixtures-root "$fixtures" \
539
- --registry "$TMP_DIR/pair-rejected-fixtures.sh" \
540
- --results-root "$results" \
541
- --max-pair-solo-wall-ratio NaN
542
-
543
- package_fixtures="$TMP_DIR/package-fixtures"
544
- package_results="$TMP_DIR/package-results"
545
- mkdir -p "$package_fixtures/F16-cli-quote-tax-rules" \
546
- "$package_fixtures/F21-cli-scheduler-priority" \
547
- "$package_fixtures/F23-cli-fulfillment-wave" \
548
- "$package_fixtures/F25-cli-cart-promotion-rules" \
549
- "$package_results/20260510-f16-f23-f25-combined-proof" \
550
- "$package_results/20260511-f21-current-riskprobes-v1"
551
- cp "$SCRIPT_DIR/../results/20260510-f16-f23-f25-combined-proof/full-pipeline-pair-gate.json" \
552
- "$package_results/20260510-f16-f23-f25-combined-proof/full-pipeline-pair-gate.json"
553
- cp "$SCRIPT_DIR/../results/20260511-f21-current-riskprobes-v1/full-pipeline-pair-gate.json" \
554
- "$package_results/20260511-f21-current-riskprobes-v1/full-pipeline-pair-gate.json"
555
- for fixture in F16-cli-quote-tax-rules F23-cli-fulfillment-wave F25-cli-cart-promotion-rules; do
556
- mkdir -p "$package_results/20260510-f16-f23-f25-combined-proof/$fixture/l2_risk_probes"
557
- cp "$SCRIPT_DIR/../results/20260510-f16-f23-f25-combined-proof/$fixture/l2_risk_probes/result.json" \
558
- "$package_results/20260510-f16-f23-f25-combined-proof/$fixture/l2_risk_probes/result.json"
559
- done
560
- mkdir -p "$package_results/20260511-f21-current-riskprobes-v1/F21-cli-scheduler-priority/l2_risk_probes"
561
- cp "$SCRIPT_DIR/../results/20260511-f21-current-riskprobes-v1/F21-cli-scheduler-priority/l2_risk_probes/result.json" \
562
- "$package_results/20260511-f21-current-riskprobes-v1/F21-cli-scheduler-priority/l2_risk_probes/result.json"
563
- python3 "$SCRIPT" \
564
- --fixtures-root "$package_fixtures" \
565
- --registry "$SCRIPT_DIR/pair-rejected-fixtures.sh" \
566
- --results-root "$package_results" \
567
- --fail-on-unmeasured \
568
- --out-json "$TMP_DIR/package-frontier.json" \
569
- > "$TMP_DIR/package-frontier.out"
570
- grep -Fq 'fixtures=4 rejected=0 candidates=4 pair_evidence=4 unmeasured=0' "$TMP_DIR/package-frontier.out"
571
- grep -Fq 'PASS pair-candidate-frontier' "$TMP_DIR/package-frontier.out"
572
- python3 - "$TMP_DIR/package-frontier.json" <<'PY'
573
- import json
574
- import sys
575
-
576
- report = json.load(open(sys.argv[1], encoding="utf8"))
577
- assert report["verdict"] == "PASS"
578
- assert report["min_pair_margin"] == 5
579
- assert report["max_pair_solo_wall_ratio"] == 3.0
580
- assert report["fixtures_total"] == 4
581
- assert report["pair_evidence_total"] == 4
582
- assert report["unmeasured_candidate_total"] == 0
583
- assert report["pair_evidence_count"] == 4
584
- assert report["unmeasured_count"] == 0
585
- assert report["pair_margin_avg"] is not None
586
- assert report["pair_margin_min"] is not None
587
- assert report["pair_solo_wall_ratio_avg"] is not None
588
- assert report["pair_solo_wall_ratio_max"] is not None
589
- PY
590
-
591
- echo "PASS test-pair-candidate-frontier"