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,99 +0,0 @@
1
- # F36 Session admission command with a global concurrency cap
2
-
3
- ## Failure mode
4
-
5
- Detects implementations that get interval-admission logic correct at small,
6
- hand-written scale but reach for a data structure that stops scaling once
7
- the number of concurrently active sessions grows large — most naturally, a
8
- plain array of admitted sessions that gets linearly scanned or filtered on
9
- every new candidate. That shape is indistinguishable from the fully correct
10
- answer on any test an agent is likely to hand-write, and only fails once the
11
- active set stays large across a long run (Tier-2 axis: performance/scale,
12
- never previously used in this suite — no existing fixture verifier measures
13
- wall-clock; grepped `verifiers/*.js` across active + retired fixtures for
14
- `Date.now|hrtime|performance.now|elapsed`, zero hits before this one).
15
- Compounded with four small-scale correctness sub-traps so a fast-but-wrong
16
- shortcut and a correct-but-slow shortcut both lose points independently:
17
- half-open boundary (touching, not overlapping), start-time eligibility
18
- order vs. file order, per-candidate (not static) `active_at_start`, and
19
- eviction that must be driven by actual expiry (`end`) rather than admission
20
- order — the last one specifically closes a FIFO-queue shortcut that would
21
- otherwise pass the scale case by coincidence, since the scale case uses a
22
- uniform session duration and a FIFO queue's admission order happens to
23
- coincide with its expiry order there (Codex R2 catch, see Rounds below).
24
-
25
- ## Fairness
26
-
27
- Every verifier assertion quotes a visible spec.md bullet via `contract_refs`
28
- (lint-fixtures enforced). The 150,000-session performance requirement is
29
- stated as a plain, numeric, visible spec bullet — no mechanism vocabulary
30
- (no "sort", "heap", "priority queue", "efficient", "O(n log n)") appears
31
- anywhere in `spec.md` or `task.txt`; only the observable behavior (must
32
- finish within the process timeout, must not change the answer) is named.
33
- The scale verifier's 15-second hard kill (`spawnSync` `timeout` option) sits
34
- more than 100x above the efficient reference's actual running time and
35
- correspondingly far below any realistic degraded-shortcut running time on
36
- this fixture's parameters, so the gate has a wide, non-flaky margin in both
37
- directions.
38
-
39
- ## Pipeline phase(s) tested
40
-
41
- BUILD_GATE / VERIFY: an agent's own test suite is overwhelmingly likely to
42
- be small-N (a handful of hand-written sessions), so nothing in a normal
43
- iterative dev loop surfaces the scale defect; only the hidden, harness-side
44
- scale verifier (never visible to the arm) exercises it. This is a
45
- structurally different discriminator from every prior fixture in this
46
- suite, which relied entirely on a single hidden semantic trap rather than a
47
- mechanical, orthogonal performance axis.
48
-
49
- ## Why another fixture can't cover this
50
-
51
- No active or retired fixture in this suite measures wall-clock/algorithmic
52
- complexity at all (verified by grep, see Failure mode above). Every prior
53
- headroom attempt (F27, F28, F30, F34, F35, S2-S6 — see
54
- `pair-rejected-fixtures.sh`) relied on a single hidden ordering/rollback/
55
- atomicity trap, and solo_claude scored 88-100 on all of them. This fixture
56
- tests a category of miss (asymptotic complexity blindness under a full
57
- self-review pipeline) that none of those exercise.
58
-
59
- ## When to retire or replace
60
-
61
- If a headroom run shows solo_claude reliably recognizes and implements the
62
- required efficient structure even without prompting (i.e. the visible
63
- numeric scale requirement alone is enough to trigger scale-aware design),
64
- retire per the same honest-retirement contract used for F27/F28/F30/F34/F35
65
- and add this id to `pair-rejected-fixtures.sh` with the observed scores.
66
-
67
- ## Rounds — Codex GPT-5.5 collaboration (read-only, `codex-monitored.sh`)
68
-
69
- **Round 1** (initial design: performance stated as a secondary condition on
70
- top of a single hidden ordering trap, textbook "meeting rooms with
71
- capacity" shape): Codex verdict **needs-rework** — "200,000 sessions" alone
72
- is enough for a strong PLAN phase to infer scale pressure and pattern-match
73
- the well-known interval-scheduling/heap shape; the boundary traps alone
74
- weren't judged sufficient given solo already solved comparable explicit
75
- order/rollback traps in F34/F35. Adopted: make performance the dominant
76
- axis by choosing scale-case parameters (uniform long overlapping durations,
77
- capacity held well below the overlap window) so that BOTH a brute
78
- nested-loop AND a "linear-scan a plain active-sessions array" middle-tier
79
- shortcut fail — only a genuinely sub-linear-per-op structure survives, not
80
- merely "some awareness of scale."
81
-
82
- **Round 2** (revised design presented): Codex verdict **converge, with one
83
- fix** — flagged that because the scale case uses a uniform session
84
- duration, admission order and expiry order coincide, so a FIFO
85
- queue-with-front-eviction (simpler than the general answer, and not the
86
- "real" discriminator intended) would also pass the scale case correctly and
87
- fast. Fix adopted: added the fourth small-scale correctness sub-trap
88
- (eviction driven by actual smallest `end` among currently active sessions,
89
- not admission order) via a hand-authored 3-session case where a FIFO
90
- shortcut and the correct rule disagree. This closes the loophole without
91
- touching the scale case's parameters, since the two verifiers are
92
- independent files/inputs.
93
-
94
- Codex's own words, R2 answer to Q1: "F36 is much stronger now, but I see one
95
- real shortcut left: a FIFO/sliding-window queue of admitted sessions can
96
- pass the scale case if ends are monotonic... Add one small correctness case
97
- where admitted end order differs from start/admission order... That defeats
98
- FIFO while keeping the scale discriminator intact." Adopted verbatim as
99
- correctness sub-trap 4.
@@ -1,18 +0,0 @@
1
- # F36 retired
2
-
3
- Retired from the active golden suite after headroom run
4
- `iter-0041-headroom-f36-f37`.
5
-
6
- Reason: `solo_claude` scored 96, exceeding the headroom ceiling of 80, and
7
- timed out doing so (full 1500s budget). bare scored 50 — the bare ceiling
8
- held (headroom 10), and bare failed on the intended traps (wrong deferred-row
9
- output shape: reason `capacity`/key `active` instead of
10
- `over_capacity`/`blocking`, plus a validation miss). But solo's pipeline
11
- still produced a scalable heap-based implementation that cleared the hidden
12
- scale verifier, so there is no pair-lift headroom to measure. The
13
- performance/scale axis alone does not hold the solo pipeline under 80.
14
-
15
- Future use: the small-scale correctness traps discriminated bare as designed;
16
- the scale verifier did not discriminate solo. A future rework needs a
17
- difficulty axis that survives a full PLAN/BUILD_GATE loop, not just a
18
- single-pass implementation.
@@ -1,64 +0,0 @@
1
- {
2
- "verification_commands": [
3
- {
4
- "cmd": "node --test tests/cli.test.js",
5
- "exit_code": 0,
6
- "stdout_contains": [],
7
- "stdout_not_contains": ["not ok "]
8
- },
9
- {
10
- "cmd": "node \"$BENCH_FIXTURE_DIR/verifiers/correctness-small.js\"",
11
- "exit_code": 0,
12
- "stdout_contains": ["\"ok\":true"],
13
- "stdout_not_contains": [],
14
- "contract_refs": [
15
- "an admitted session whose `end` equals the candidate's `start` has already ended and does not count against it",
16
- "Sessions become eligible for admission in ascending order of `start`; ties are broken by the session's position in the input `sessions` array",
17
- "Each deferred row reports `blocking`: the ids of the currently-active admitted sessions preventing its admission, in the order those sessions were themselves admitted"
18
- ]
19
- },
20
- {
21
- "cmd": "node \"$BENCH_FIXTURE_DIR/verifiers/validation.js\"",
22
- "exit_code": 0,
23
- "stdout_contains": ["\"ok\":true"],
24
- "stdout_not_contains": [],
25
- "contract_refs": [
26
- "Validation happens before any admission decision.",
27
- "a duplicate `id` uses shape `{ \"error\": \"duplicate_session_id\", \"id\": string }`"
28
- ]
29
- },
30
- {
31
- "cmd": "node \"$BENCH_FIXTURE_DIR/verifiers/scale.js\"",
32
- "exit_code": 0,
33
- "stdout_contains": ["\"ok\":true"],
34
- "stdout_not_contains": [],
35
- "contract_refs": [
36
- "`bench-cli admit` must finish processing the 150,000-session verification input (see `## Verification`) within its process timeout, without changing which sessions are admitted or deferred compared to a smaller input processed under the same rule."
37
- ]
38
- }
39
- ],
40
- "forbidden_patterns": [
41
- {
42
- "pattern": "catch\\s*\\([^)]*\\)\\s*\\{[^}]*return\\s+(null|undefined|''|\\{\\})",
43
- "description": "silent catch returning fallback in admit path",
44
- "files": ["bin/cli.js"],
45
- "severity": "disqualifier"
46
- },
47
- {
48
- "pattern": "catch\\s*\\([^)]*\\)\\s*\\{\\s*\\}",
49
- "description": "empty catch block",
50
- "files": ["bin/cli.js"],
51
- "severity": "disqualifier"
52
- },
53
- {
54
- "pattern": "/\\*\\s*eslint-disable",
55
- "description": "eslint-disable without scoped justification",
56
- "files": ["bin/cli.js"],
57
- "severity": "disqualifier"
58
- }
59
- ],
60
- "required_files": ["bin/cli.js", "tests/cli.test.js"],
61
- "forbidden_files": [],
62
- "max_deps_added": 0,
63
- "spec_output_files": ["bin/cli.js", "tests/cli.test.js"]
64
- }
@@ -1,10 +0,0 @@
1
- {
2
- "id": "F36-cli-session-admission",
3
- "category": "high-risk",
4
- "difficulty": "high",
5
- "timeout_seconds": 1500,
6
- "required_tools": ["node"],
7
- "browser": false,
8
- "deps_change_expected": false,
9
- "intent": "Add a bench-cli admit command that admits scheduling sessions against a global concurrency capacity in start-time order with file-order tie-break, deferring sessions that would exceed capacity, and that must finish processing a 150,000-session verification input within its process timeout without changing which sessions are admitted or deferred."
10
- }
@@ -1,4 +0,0 @@
1
- #!/usr/bin/env bash
2
- # F36 setup — no seed data required; sessions arrive entirely via --input.
3
- set -e
4
- exit 0
@@ -1,61 +0,0 @@
1
- ---
2
- id: "F36-cli-session-admission"
3
- title: "Session admission command with a global concurrency cap"
4
- status: planned
5
- complexity: high
6
- depends-on: []
7
- ---
8
-
9
- # F36 Session admission command with a global concurrency cap
10
-
11
- ## Context
12
-
13
- `bench-cli` gets an `admit` command that decides which of a batch of
14
- scheduling sessions can run at all, given a single global limit on how many
15
- sessions may be concurrently active. Downstream capacity-planning tooling
16
- parses stdout as JSON and replays the verification input at production
17
- scale, so the decision must be exact and the command must finish in
18
- reasonable time even on large batches.
19
-
20
- ## Requirements
21
-
22
- - [ ] `bench-cli admit --input <path>` reads JSON shaped as `{ "capacity": number, "sessions": [{ "id": string, "start": number, "end": number }] }`.
23
- - [ ] Sessions become eligible for admission in ascending order of `start`; ties are broken by the session's position in the input `sessions` array (the earlier entry is eligible first).
24
- - [ ] Sessions are considered for admission one at a time, in that eligibility order. A session is admitted unless, at the moment it is considered, the number of already-admitted sessions whose interval has not yet ended is already equal to `capacity` — in that case it is deferred instead. A session's interval `[start, end)` is half-open: an admitted session whose `end` equals the candidate's `start` has already ended and does not count against it.
25
- - [ ] Each deferred row reports `blocking`: the ids of the currently-active admitted sessions preventing its admission, in the order those sessions were themselves admitted (not a final or static list, and not the list for any other candidate).
26
- - [ ] `bench-cli admit` must finish processing the 150,000-session verification input (see `## Verification`) within its process timeout, without changing which sessions are admitted or deferred compared to a smaller input processed under the same rule.
27
- - [ ] Validation happens before any admission decision. `capacity` must be a positive integer; `sessions` must be an array; every session needs a non-empty string `id`, integer `start`, and integer `end` with `start < end`; every `id` must be unique across the whole input. Invalid input exits `2` and writes exactly one JSON error object to stderr, printing nothing to stdout: a malformed capacity/session field uses shape `{ "error": "invalid_input", "reason": string }`; a duplicate `id` uses shape `{ "error": "duplicate_session_id", "id": string }`.
28
- - [ ] On success, write exactly one JSON object to stdout and no stderr. Keys: `admitted` (array of admitted session ids, in eligibility order) and `deferred` (array of `{ "id": string, "reason": "over_capacity", "blocking": [string, ...] }` rows, in eligibility order).
29
- - [ ] `tests/cli.test.js` is updated. Existing tests still pass AND at least two new tests cover `admit`: one where a session listed earlier in the file but starting later must not be admitted ahead of a session listed later but starting earlier, and one deferral.
30
-
31
- ## Constraints
32
-
33
- - **No new npm dependencies.**
34
- - **No silent catches.** If parsing or file reading fails, emit a visible JSON error to stderr and exit `2`.
35
- - **No extra stdout/stderr text** on the success path; downstream tooling parses stdout as JSON.
36
- - `data`, `server`, and `web` directories are unrelated to this command; do not add files there.
37
-
38
- ## Out of Scope
39
-
40
- - Persisting admission results between command invocations.
41
- - Retrying, rescheduling, or suggesting alternate times for deferred sessions.
42
- - Changing server routes, web UI, or any file outside `bin/cli.js` and `tests/cli.test.js`.
43
- - Touching `server/`, `web/`, or `tests/server.test.js`.
44
-
45
- ## Verification
46
-
47
- - `node --test tests/cli.test.js` exits 0.
48
- - Given three sessions where the second-admitted session's interval ends before the first-admitted session's interval ends, a fourth session starting after the second has ended but before the first has ended is correctly admitted (its admission depends on evicting the second, not the first, from the active set) — `node "$BENCH_FIXTURE_DIR/verifiers/correctness-small.js"` exposes misses on this and the eligibility-order, half-open-boundary, and `blocking` rules above.
49
- - Malformed input, non-unique ids, and a non-positive capacity are all rejected before any admission decision, per the exact error shapes above — `node "$BENCH_FIXTURE_DIR/verifiers/validation.js"` exposes misses.
50
- - A 150,000-session input with `capacity` set low relative to heavily overlapping session durations completes within the process timeout and produces the exact admitted/deferred sets — `node "$BENCH_FIXTURE_DIR/verifiers/scale.js"` exposes misses on both timing and correctness.
51
- - `git diff --stat` shows only `bin/cli.js` and `tests/cli.test.js` touched.
52
-
53
- ## Solo-headroom hypothesis
54
-
55
- A capable solo_claude baseline is expected to reach for a data structure
56
- that is correct on typical hand-written examples but does not stay fast as
57
- the number of concurrently active sessions grows — for example, keeping
58
- admitted sessions in a plain list and scanning or filtering it on every new
59
- candidate — which is correct at small scale but does not finish the
60
- 150,000-session input in time; observable command
61
- `node "$BENCH_FIXTURE_DIR/verifiers/scale.js"` exposes the miss.
@@ -1,9 +0,0 @@
1
- Add an `admit` command to `bench-cli` so users can run `bench-cli admit --input <path>` with a JSON file shaped as `{ "capacity": number, "sessions": [{ "id": string, "start": number, "end": number }] }`. Sessions become eligible for admission in ascending order of `start`; if two sessions share the same `start`, the one listed earlier in the `sessions` array is eligible first.
2
-
3
- Consider sessions one at a time in that eligibility order. Admit a session unless the number of already-admitted sessions whose interval hasn't ended yet is already equal to `capacity` — in that case defer it instead. Treat intervals as half-open: a session that ends exactly when another starts is not overlapping it. Each deferred session should report which already-admitted sessions are still active at its own turn (their ids, in the order those sessions were admitted) — this can differ across deferred sessions depending on when each one is considered, since a session admitted earlier isn't necessarily still active later.
4
-
5
- This command needs to stay fast: downstream capacity-planning tooling replays inputs with well over a hundred thousand sessions, and the command must still finish within a reasonable process timeout without changing which sessions get admitted or deferred versus a small input processed the same way.
6
-
7
- Validate the whole input before making any admission decision: `capacity` must be a positive integer, `sessions` must be an array, every session needs a non-empty string `id` and integer `start`/`end` with `start` less than `end`, and every `id` must be unique. On any violation, exit 2, print exactly one JSON error object to stderr, and print nothing to stdout — use a distinct error for duplicate ids versus other malformed input. On success, print exactly one JSON object with `admitted` (ids in eligibility order) and `deferred` (rows with id/reason/active-count, in eligibility order) — nothing on stderr.
8
-
9
- Update `tests/cli.test.js`: existing tests still pass, plus at least two new tests for `admit` (one exercising the start-time-vs-file-order tie-break, one deferral). No new npm dependencies. Only touch `bin/cli.js` and `tests/cli.test.js`.
@@ -1,135 +0,0 @@
1
- 'use strict';
2
- // F36 hidden verifier — four independent small-scale correctness sub-traps:
3
- // (1) half-open boundary (touching is not overlapping), (2) eligibility
4
- // order is by `start` ascending with file-order tiebreak, not file order or
5
- // output order, (3) `blocking` reports the exact currently-active admitted
6
- // ids at each candidate's own turn (not a static/final list), (4) eviction
7
- // must be driven by actual expiry (`end`), not admission order — a FIFO
8
- // queue that only evicts from its front would miss B's expiry here since A
9
- // (admitted first, longer-lived) is still in front and never expired.
10
- //
11
- // Structural equality: object key order is not part of the visible
12
- // contract; array order is (Codex fairness-audit pattern from F35).
13
- function deepEqual(a, b) {
14
- if (a === b) return true;
15
- if (Array.isArray(a) && Array.isArray(b)) {
16
- return a.length === b.length && a.every((v, i) => deepEqual(v, b[i]));
17
- }
18
- if (a && b && typeof a === 'object' && typeof b === 'object' && !Array.isArray(a) && !Array.isArray(b)) {
19
- const ka = Object.keys(a).sort();
20
- const kb = Object.keys(b).sort();
21
- return deepEqual(ka, kb) && ka.every((k) => deepEqual(a[k], b[k]));
22
- }
23
- return false;
24
- }
25
-
26
- const fs = require('node:fs');
27
- const os = require('node:os');
28
- const path = require('node:path');
29
- const { spawnSync } = require('node:child_process');
30
-
31
- const work = process.env.BENCH_WORKDIR;
32
- const cli = path.join(work, 'bin', 'cli.js');
33
-
34
- let callCount = 0;
35
- function runAdmit(payload) {
36
- callCount += 1;
37
- const inputPath = path.join(os.tmpdir(), `admit-small-${process.pid}-${callCount}.json`);
38
- fs.writeFileSync(inputPath, JSON.stringify(payload));
39
- const result = spawnSync('node', [cli, 'admit', '--input', inputPath], {
40
- cwd: work,
41
- encoding: 'utf8',
42
- maxBuffer: 16 * 1024 * 1024,
43
- });
44
- let out = null;
45
- try {
46
- out = JSON.parse(result.stdout);
47
- } catch {
48
- out = null;
49
- }
50
- return { result, out };
51
- }
52
-
53
- const failures = [];
54
-
55
- // Sub-test 1: half-open boundary — b.start === a.end must not overlap.
56
- {
57
- const { result, out } = runAdmit({
58
- capacity: 1,
59
- sessions: [
60
- { id: 'a', start: 0, end: 10 },
61
- { id: 'b', start: 10, end: 20 },
62
- ],
63
- });
64
- const expected = { admitted: ['a', 'b'], deferred: [] };
65
- if (result.status !== 0 || result.stderr !== '' || !deepEqual(out, expected)) {
66
- failures.push({ test: 'boundary', status: result.status, stderr: result.stderr, out, expected });
67
- }
68
- }
69
-
70
- // Sub-test 2: eligibility order is by start ascending (file-order tiebreak
71
- // only applies to equal starts) — output arrays follow eligibility order,
72
- // not input file order.
73
- {
74
- const { result, out } = runAdmit({
75
- capacity: 1,
76
- sessions: [
77
- { id: 'x', start: 5, end: 6 },
78
- { id: 'y', start: 1, end: 2 },
79
- ],
80
- });
81
- const expected = { admitted: ['y', 'x'], deferred: [] };
82
- if (result.status !== 0 || result.stderr !== '' || !deepEqual(out, expected)) {
83
- failures.push({ test: 'eligibility-order', status: result.status, stderr: result.stderr, out, expected });
84
- }
85
- }
86
-
87
- // Sub-test 3: `blocking` must be the exact currently-active admitted ids at
88
- // each candidate's own turn, not a static or cumulative list.
89
- {
90
- const { result, out } = runAdmit({
91
- capacity: 2,
92
- sessions: [
93
- { id: 'a', start: 0, end: 5 },
94
- { id: 'b', start: 1, end: 100 },
95
- { id: 'c', start: 2, end: 3 },
96
- { id: 'd', start: 10, end: 100 },
97
- { id: 'e', start: 15, end: 16 },
98
- ],
99
- });
100
- const expected = {
101
- admitted: ['a', 'b', 'd'],
102
- deferred: [
103
- { id: 'c', reason: 'over_capacity', blocking: ['a', 'b'] },
104
- { id: 'e', reason: 'over_capacity', blocking: ['b', 'd'] },
105
- ],
106
- };
107
- if (result.status !== 0 || result.stderr !== '' || !deepEqual(out, expected)) {
108
- failures.push({ test: 'blocking-per-candidate', status: result.status, stderr: result.stderr, out, expected });
109
- }
110
- }
111
-
112
- // Sub-test 4: eviction must be driven by actual expiry, not admission
113
- // order. A (admitted 1st, end=100) stays in front of any admission-order
114
- // queue; B (admitted 2nd, end=3) expires first. C's admission at start=5
115
- // depends on correctly evicting B (expired) while keeping A (still
116
- // active) — a front-only-eviction shortcut stops at A and never checks B,
117
- // leaving B incorrectly counted as active and wrongly deferring C.
118
- {
119
- const { result, out } = runAdmit({
120
- capacity: 2,
121
- sessions: [
122
- { id: 'A', start: 0, end: 100 },
123
- { id: 'B', start: 1, end: 3 },
124
- { id: 'C', start: 5, end: 6 },
125
- ],
126
- });
127
- const expected = { admitted: ['A', 'B', 'C'], deferred: [] };
128
- if (result.status !== 0 || result.stderr !== '' || !deepEqual(out, expected)) {
129
- failures.push({ test: 'non-monotonic-eviction', status: result.status, stderr: result.stderr, out, expected });
130
- }
131
- }
132
-
133
- const ok = failures.length === 0;
134
- console.log(JSON.stringify({ ok, failures }));
135
- process.exit(ok ? 0 : 1);
@@ -1,100 +0,0 @@
1
- 'use strict';
2
- // F36 hidden verifier — the performance discriminator. 150,000 sessions,
3
- // each with a 100,000-unit duration (so the natural overlap peak reaches
4
- // ~100,000 concurrently-active sessions across a wide middle stretch), with
5
- // `capacity` set to 140,000 — comfortably above the natural peak (so
6
- // nothing is ever actually deferred, keeping the expected output tiny and
7
- // the correctness check trivial: everyone is admitted, in start order) but
8
- // still below `n` (so an implementation cannot mathematically prove up
9
- // front that capacity never binds and skip active-set tracking entirely —
10
- // it must genuinely compute the active count per candidate for a batch this
11
- // size and still get the right, ever-growing answer).
12
- //
13
- // Sessions are written to the input file in a shuffled (non-start-sorted)
14
- // order via a deterministic permutation, so an implementation that trusts
15
- // file order instead of actually sorting by `start` also fails here.
16
- //
17
- // A brute nested-loop-over-all-admitted approach, or a "keep an array of
18
- // admitted sessions and linearly filter/scan it on every candidate"
19
- // approach, costs on the order of n * (average active-set size) ~= 150,000
20
- // * 90,000 =~ 1.35e10 element touches here — many minutes in Node. A
21
- // genuinely sub-linear-per-op structure (evict-expired + size-check via an
22
- // ordered-by-end structure) finishes in well under a second. The 15-second
23
- // hard kill sits far above the efficient solution's expected running time
24
- // and correspondingly far below any realistic degraded-shortcut running
25
- // time, so the gate has a wide, non-flaky margin in both directions.
26
-
27
- const fs = require('node:fs');
28
- const os = require('node:os');
29
- const path = require('node:path');
30
- const { spawnSync } = require('node:child_process');
31
-
32
- const work = process.env.BENCH_WORKDIR;
33
- const cli = path.join(work, 'bin', 'cli.js');
34
-
35
- const N = 150000;
36
- const DURATION = 100000;
37
- const CAPACITY = 140000;
38
- const PERMUTE_MULTIPLIER = 99991; // coprime with N (150000 = 2^4 * 3 * 5^5)
39
-
40
- const sessions = new Array(N);
41
- for (let i = 0; i < N; i++) {
42
- const pos = (i * PERMUTE_MULTIPLIER) % N;
43
- sessions[pos] = { id: `s-${i}`, start: i, end: i + DURATION };
44
- }
45
-
46
- const inputPath = path.join(os.tmpdir(), `admit-scale-${process.pid}.json`);
47
- fs.writeFileSync(inputPath, JSON.stringify({ capacity: CAPACITY, sessions }));
48
-
49
- const start = Date.now();
50
- const result = spawnSync('node', [cli, 'admit', '--input', inputPath], {
51
- cwd: work,
52
- encoding: 'utf8',
53
- timeout: 15000,
54
- killSignal: 'SIGKILL',
55
- maxBuffer: 64 * 1024 * 1024,
56
- });
57
- const elapsedMs = Date.now() - start;
58
-
59
- const timedOut = result.status === null && result.signal !== null;
60
-
61
- let out = null;
62
- if (!timedOut) {
63
- try {
64
- out = JSON.parse(result.stdout);
65
- } catch {
66
- out = null;
67
- }
68
- }
69
-
70
- const expectedAdmitted = Array.from({ length: N }, (_, i) => `s-${i}`);
71
-
72
- let correct = false;
73
- let mismatch = null;
74
- if (out && Array.isArray(out.admitted) && Array.isArray(out.deferred)) {
75
- correct =
76
- out.deferred.length === 0 &&
77
- out.admitted.length === expectedAdmitted.length &&
78
- out.admitted.every((id, i) => id === expectedAdmitted[i]);
79
- if (!correct) {
80
- mismatch = {
81
- admittedLength: out.admitted.length,
82
- deferredLength: out.deferred.length,
83
- firstMismatchIndex: out.admitted.findIndex((id, i) => id !== expectedAdmitted[i]),
84
- };
85
- }
86
- }
87
-
88
- const ok = !timedOut && result.status === 0 && result.stderr === '' && correct;
89
-
90
- console.log(JSON.stringify({
91
- ok,
92
- timedOut,
93
- elapsedMs,
94
- status: result.status,
95
- signal: result.signal,
96
- stderrLength: result.stderr ? result.stderr.length : 0,
97
- correct,
98
- mismatch,
99
- }));
100
- process.exit(ok ? 0 : 1);
@@ -1,75 +0,0 @@
1
- 'use strict';
2
- // F36 hidden verifier — validation happens before any admission decision:
3
- // malformed capacity/session fields use `invalid_input`, duplicate ids use
4
- // the distinct `duplicate_session_id` shape, and nothing is admitted or
5
- // printed to stdout in either case.
6
-
7
- const fs = require('node:fs');
8
- const os = require('node:os');
9
- const path = require('node:path');
10
- const { spawnSync } = require('node:child_process');
11
-
12
- const work = process.env.BENCH_WORKDIR;
13
- const cli = path.join(work, 'bin', 'cli.js');
14
-
15
- let callCount = 0;
16
- function runAdmit(payload) {
17
- callCount += 1;
18
- const inputPath = path.join(os.tmpdir(), `admit-validate-${process.pid}-${callCount}.json`);
19
- fs.writeFileSync(inputPath, JSON.stringify(payload));
20
- const result = spawnSync('node', [cli, 'admit', '--input', inputPath], {
21
- cwd: work,
22
- encoding: 'utf8',
23
- maxBuffer: 16 * 1024 * 1024,
24
- });
25
- let err = null;
26
- try {
27
- err = JSON.parse(result.stderr);
28
- } catch {
29
- err = null;
30
- }
31
- return { result, err };
32
- }
33
-
34
- const failures = [];
35
-
36
- function expectInvalidInput(label, payload) {
37
- const { result, err } = runAdmit(payload);
38
- const ok = result.status === 2 && result.stdout === '' && err !== null && err.error === 'invalid_input' && typeof err.reason === 'string';
39
- if (!ok) {
40
- failures.push({ test: label, status: result.status, stdout: result.stdout, stderr: result.stderr, err });
41
- }
42
- }
43
-
44
- // Non-positive capacity.
45
- expectInvalidInput('capacity-zero', { capacity: 0, sessions: [{ id: 'a', start: 0, end: 1 }] });
46
- // Non-integer capacity.
47
- expectInvalidInput('capacity-float', { capacity: 1.5, sessions: [{ id: 'a', start: 0, end: 1 }] });
48
- // start >= end.
49
- expectInvalidInput('start-not-before-end', { capacity: 1, sessions: [{ id: 'a', start: 5, end: 5 }] });
50
- // Non-integer start.
51
- expectInvalidInput('non-integer-start', { capacity: 1, sessions: [{ id: 'a', start: 0.5, end: 5 }] });
52
- // Missing id.
53
- expectInvalidInput('missing-id', { capacity: 1, sessions: [{ start: 0, end: 5 }] });
54
- // sessions not an array.
55
- expectInvalidInput('sessions-not-array', { capacity: 1, sessions: 'nope' });
56
-
57
- // Duplicate session id — distinct error shape.
58
- {
59
- const payload = {
60
- capacity: 2,
61
- sessions: [
62
- { id: 'dup', start: 0, end: 1 },
63
- { id: 'dup', start: 2, end: 3 },
64
- ],
65
- };
66
- const { result, err } = runAdmit(payload);
67
- const ok = result.status === 2 && result.stdout === '' && err !== null && err.error === 'duplicate_session_id' && err.id === 'dup';
68
- if (!ok) {
69
- failures.push({ test: 'duplicate-session-id', status: result.status, stdout: result.stdout, stderr: result.stderr, err });
70
- }
71
- }
72
-
73
- const ok = failures.length === 0;
74
- console.log(JSON.stringify({ ok, failures }));
75
- process.exit(ok ? 0 : 1);