devlyn-cli 3.2.0 → 3.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (424) hide show
  1. package/AGENTS.md +2 -2
  2. package/CLAUDE.md +2 -2
  3. package/README.md +22 -113
  4. package/bin/devlyn.js +13 -225
  5. package/bin/instruction-templates.json +752 -1
  6. package/bin/instructions.js +101 -17
  7. package/config/skills/_shared/adapters/grok.md +1 -2
  8. package/config/skills/_shared/archive_run.py +15 -3
  9. package/config/skills/_shared/judge-role-evidence.py +21 -1
  10. package/config/skills/_shared/runtime-principles.md +1 -1
  11. package/config/skills/_shared/spec-verify-check.py +0 -653
  12. package/config/skills/_shared/state-phase-write.py +371 -30
  13. package/config/skills/_shared/task-complete.py +635 -143
  14. package/config/skills/_shared/terminal-claim-check.py +229 -4
  15. package/config/skills/_shared/verify-merge-findings.py +93 -2
  16. package/config/skills/devlyn:ideate/SKILL.md +3 -4
  17. package/config/skills/devlyn:ideate/references/elicitation.md +2 -35
  18. package/config/skills/devlyn:ideate/references/from-spec-mode.md +3 -18
  19. package/config/skills/devlyn:ideate/references/project-mode.md +1 -16
  20. package/config/skills/devlyn:ideate/references/spec-template.md +0 -2
  21. package/config/skills/devlyn:queue/SKILL.md +6 -4
  22. package/config/skills/devlyn:resolve/SKILL.md +16 -25
  23. package/config/skills/devlyn:resolve/references/free-form-mode.md +0 -14
  24. package/config/skills/devlyn:resolve/references/outer-loop.md +1 -1
  25. package/config/skills/devlyn:resolve/references/phases/build-gate.md +1 -1
  26. package/config/skills/devlyn:resolve/references/phases/cleanup.md +3 -3
  27. package/config/skills/devlyn:resolve/references/phases/implement.md +1 -1
  28. package/config/skills/devlyn:resolve/references/phases/probe-derive.md +1 -16
  29. package/config/skills/devlyn:resolve/references/phases/verify.md +4 -9
  30. package/config/skills/devlyn:resolve/references/state-schema.md +9 -7
  31. package/config/skills/devlyn:resolve/references/task-completion.md +46 -37
  32. package/{config/skills → optional-skills}/code-health-standards/SKILL.md +4 -13
  33. package/{config/skills → optional-skills}/code-review-standards/SKILL.md +4 -12
  34. package/{config/skills → optional-skills}/root-cause-analysis/SKILL.md +4 -12
  35. package/{config/skills → optional-skills}/ui-implementation-standards/SKILL.md +4 -14
  36. package/package.json +1 -57
  37. package/benchmark/auto-resolve/BENCHMARK-DESIGN.md +0 -289
  38. package/benchmark/auto-resolve/BENCHMARK-RESULTS.md +0 -341
  39. package/benchmark/auto-resolve/README.md +0 -696
  40. package/benchmark/auto-resolve/RUBRIC.md +0 -177
  41. package/benchmark/auto-resolve/fixtures/F1-cli-trivial-flag/NOTES.md +0 -34
  42. package/benchmark/auto-resolve/fixtures/F1-cli-trivial-flag/expected.json +0 -68
  43. package/benchmark/auto-resolve/fixtures/F1-cli-trivial-flag/metadata.json +0 -10
  44. package/benchmark/auto-resolve/fixtures/F1-cli-trivial-flag/setup.sh +0 -4
  45. package/benchmark/auto-resolve/fixtures/F1-cli-trivial-flag/spec.md +0 -44
  46. package/benchmark/auto-resolve/fixtures/F1-cli-trivial-flag/task.ko.txt +0 -8
  47. package/benchmark/auto-resolve/fixtures/F1-cli-trivial-flag/task.txt +0 -8
  48. package/benchmark/auto-resolve/fixtures/F10-persist-write-collision/NOTES.md +0 -68
  49. package/benchmark/auto-resolve/fixtures/F10-persist-write-collision/expected.json +0 -60
  50. package/benchmark/auto-resolve/fixtures/F10-persist-write-collision/metadata.json +0 -10
  51. package/benchmark/auto-resolve/fixtures/F10-persist-write-collision/setup.sh +0 -17
  52. package/benchmark/auto-resolve/fixtures/F10-persist-write-collision/spec.md +0 -51
  53. package/benchmark/auto-resolve/fixtures/F10-persist-write-collision/task.txt +0 -9
  54. package/benchmark/auto-resolve/fixtures/F10-persist-write-collision/verifiers/invalid.js +0 -29
  55. package/benchmark/auto-resolve/fixtures/F10-persist-write-collision/verifiers/parallel.js +0 -50
  56. package/benchmark/auto-resolve/fixtures/F11-batch-import-all-or-nothing/NOTES.md +0 -75
  57. package/benchmark/auto-resolve/fixtures/F11-batch-import-all-or-nothing/expected.json +0 -52
  58. package/benchmark/auto-resolve/fixtures/F11-batch-import-all-or-nothing/metadata.json +0 -10
  59. package/benchmark/auto-resolve/fixtures/F11-batch-import-all-or-nothing/setup.sh +0 -171
  60. package/benchmark/auto-resolve/fixtures/F11-batch-import-all-or-nothing/spec.md +0 -50
  61. package/benchmark/auto-resolve/fixtures/F11-batch-import-all-or-nothing/task.txt +0 -9
  62. package/benchmark/auto-resolve/fixtures/F12-webhook-raw-body-signature/NOTES.md +0 -89
  63. package/benchmark/auto-resolve/fixtures/F12-webhook-raw-body-signature/expected.json +0 -74
  64. package/benchmark/auto-resolve/fixtures/F12-webhook-raw-body-signature/metadata.json +0 -10
  65. package/benchmark/auto-resolve/fixtures/F12-webhook-raw-body-signature/setup.sh +0 -251
  66. package/benchmark/auto-resolve/fixtures/F12-webhook-raw-body-signature/spec.md +0 -57
  67. package/benchmark/auto-resolve/fixtures/F12-webhook-raw-body-signature/task.txt +0 -13
  68. package/benchmark/auto-resolve/fixtures/F12-webhook-raw-body-signature/verifiers/replay-malformed-body.js +0 -64
  69. package/benchmark/auto-resolve/fixtures/F15-frozen-diff-race-review/NOTES.md +0 -104
  70. package/benchmark/auto-resolve/fixtures/F15-frozen-diff-race-review/expected.json +0 -46
  71. package/benchmark/auto-resolve/fixtures/F15-frozen-diff-race-review/metadata.json +0 -10
  72. package/benchmark/auto-resolve/fixtures/F15-frozen-diff-race-review/setup.sh +0 -336
  73. package/benchmark/auto-resolve/fixtures/F15-frozen-diff-race-review/spec.md +0 -51
  74. package/benchmark/auto-resolve/fixtures/F15-frozen-diff-race-review/task.txt +0 -9
  75. package/benchmark/auto-resolve/fixtures/F16-cli-quote-tax-rules/NOTES.md +0 -38
  76. package/benchmark/auto-resolve/fixtures/F16-cli-quote-tax-rules/expected.json +0 -64
  77. package/benchmark/auto-resolve/fixtures/F16-cli-quote-tax-rules/metadata.json +0 -10
  78. package/benchmark/auto-resolve/fixtures/F16-cli-quote-tax-rules/setup.sh +0 -32
  79. package/benchmark/auto-resolve/fixtures/F16-cli-quote-tax-rules/spec.md +0 -63
  80. package/benchmark/auto-resolve/fixtures/F16-cli-quote-tax-rules/task.txt +0 -7
  81. package/benchmark/auto-resolve/fixtures/F16-cli-quote-tax-rules/verifiers/exact-success.js +0 -54
  82. package/benchmark/auto-resolve/fixtures/F16-cli-quote-tax-rules/verifiers/no-hardcoded-pricing.js +0 -47
  83. package/benchmark/auto-resolve/fixtures/F16-cli-quote-tax-rules/verifiers/stock-error.js +0 -45
  84. package/benchmark/auto-resolve/fixtures/F2-cli-medium-subcommand/NOTES.md +0 -57
  85. package/benchmark/auto-resolve/fixtures/F2-cli-medium-subcommand/expected-pair-plan-registry.json +0 -170
  86. package/benchmark/auto-resolve/fixtures/F2-cli-medium-subcommand/expected.json +0 -84
  87. package/benchmark/auto-resolve/fixtures/F2-cli-medium-subcommand/metadata.json +0 -21
  88. package/benchmark/auto-resolve/fixtures/F2-cli-medium-subcommand/pair-plan.sample-fail.json +0 -214
  89. package/benchmark/auto-resolve/fixtures/F2-cli-medium-subcommand/pair-plan.sample-pass.json +0 -223
  90. package/benchmark/auto-resolve/fixtures/F2-cli-medium-subcommand/setup.sh +0 -5
  91. package/benchmark/auto-resolve/fixtures/F2-cli-medium-subcommand/spec.md +0 -55
  92. package/benchmark/auto-resolve/fixtures/F2-cli-medium-subcommand/task.txt +0 -14
  93. package/benchmark/auto-resolve/fixtures/F21-cli-scheduler-priority/NOTES.md +0 -39
  94. package/benchmark/auto-resolve/fixtures/F21-cli-scheduler-priority/expected.json +0 -62
  95. package/benchmark/auto-resolve/fixtures/F21-cli-scheduler-priority/metadata.json +0 -10
  96. package/benchmark/auto-resolve/fixtures/F21-cli-scheduler-priority/setup.sh +0 -2
  97. package/benchmark/auto-resolve/fixtures/F21-cli-scheduler-priority/spec.md +0 -67
  98. package/benchmark/auto-resolve/fixtures/F21-cli-scheduler-priority/task.txt +0 -7
  99. package/benchmark/auto-resolve/fixtures/F21-cli-scheduler-priority/verifiers/error-order.js +0 -55
  100. package/benchmark/auto-resolve/fixtures/F21-cli-scheduler-priority/verifiers/priority-blocked.js +0 -48
  101. package/benchmark/auto-resolve/fixtures/F22-cli-ledger-close/NOTES.md +0 -35
  102. package/benchmark/auto-resolve/fixtures/F22-cli-ledger-close/expected.json +0 -56
  103. package/benchmark/auto-resolve/fixtures/F22-cli-ledger-close/metadata.json +0 -10
  104. package/benchmark/auto-resolve/fixtures/F22-cli-ledger-close/setup.sh +0 -2
  105. package/benchmark/auto-resolve/fixtures/F22-cli-ledger-close/spec.md +0 -64
  106. package/benchmark/auto-resolve/fixtures/F22-cli-ledger-close/task.txt +0 -7
  107. package/benchmark/auto-resolve/fixtures/F22-cli-ledger-close/verifiers/conflicting-duplicate.js +0 -34
  108. package/benchmark/auto-resolve/fixtures/F22-cli-ledger-close/verifiers/idempotent-close.js +0 -41
  109. package/benchmark/auto-resolve/fixtures/F23-cli-fulfillment-wave/NOTES.md +0 -39
  110. package/benchmark/auto-resolve/fixtures/F23-cli-fulfillment-wave/expected.json +0 -56
  111. package/benchmark/auto-resolve/fixtures/F23-cli-fulfillment-wave/metadata.json +0 -10
  112. package/benchmark/auto-resolve/fixtures/F23-cli-fulfillment-wave/setup.sh +0 -2
  113. package/benchmark/auto-resolve/fixtures/F23-cli-fulfillment-wave/spec.md +0 -76
  114. package/benchmark/auto-resolve/fixtures/F23-cli-fulfillment-wave/task.txt +0 -7
  115. package/benchmark/auto-resolve/fixtures/F23-cli-fulfillment-wave/verifiers/priority-rollback.js +0 -64
  116. package/benchmark/auto-resolve/fixtures/F23-cli-fulfillment-wave/verifiers/single-warehouse-fefo.js +0 -66
  117. package/benchmark/auto-resolve/fixtures/F25-cli-cart-promotion-rules/NOTES.md +0 -40
  118. package/benchmark/auto-resolve/fixtures/F25-cli-cart-promotion-rules/expected.json +0 -66
  119. package/benchmark/auto-resolve/fixtures/F25-cli-cart-promotion-rules/metadata.json +0 -10
  120. package/benchmark/auto-resolve/fixtures/F25-cli-cart-promotion-rules/setup.sh +0 -36
  121. package/benchmark/auto-resolve/fixtures/F25-cli-cart-promotion-rules/spec.md +0 -71
  122. package/benchmark/auto-resolve/fixtures/F25-cli-cart-promotion-rules/task.txt +0 -7
  123. package/benchmark/auto-resolve/fixtures/F25-cli-cart-promotion-rules/verifiers/catalog-source.js +0 -57
  124. package/benchmark/auto-resolve/fixtures/F25-cli-cart-promotion-rules/verifiers/exact-success.js +0 -63
  125. package/benchmark/auto-resolve/fixtures/F25-cli-cart-promotion-rules/verifiers/stock-error.js +0 -34
  126. package/benchmark/auto-resolve/fixtures/F26-cli-payout-ledger-rules/NOTES.md +0 -31
  127. package/benchmark/auto-resolve/fixtures/F26-cli-payout-ledger-rules/expected.json +0 -68
  128. package/benchmark/auto-resolve/fixtures/F26-cli-payout-ledger-rules/metadata.json +0 -10
  129. package/benchmark/auto-resolve/fixtures/F26-cli-payout-ledger-rules/setup.sh +0 -17
  130. package/benchmark/auto-resolve/fixtures/F26-cli-payout-ledger-rules/spec.md +0 -68
  131. package/benchmark/auto-resolve/fixtures/F26-cli-payout-ledger-rules/task.txt +0 -7
  132. package/benchmark/auto-resolve/fixtures/F26-cli-payout-ledger-rules/verifiers/conflicting-duplicate.js +0 -29
  133. package/benchmark/auto-resolve/fixtures/F26-cli-payout-ledger-rules/verifiers/exact-payout.js +0 -58
  134. package/benchmark/auto-resolve/fixtures/F26-cli-payout-ledger-rules/verifiers/rules-source.js +0 -56
  135. package/benchmark/auto-resolve/fixtures/F3-backend-contract-risk/NOTES.md +0 -35
  136. package/benchmark/auto-resolve/fixtures/F3-backend-contract-risk/expected-pair-plan-registry.json +0 -162
  137. package/benchmark/auto-resolve/fixtures/F3-backend-contract-risk/expected.json +0 -67
  138. package/benchmark/auto-resolve/fixtures/F3-backend-contract-risk/metadata.json +0 -19
  139. package/benchmark/auto-resolve/fixtures/F3-backend-contract-risk/setup.sh +0 -4
  140. package/benchmark/auto-resolve/fixtures/F3-backend-contract-risk/spec.md +0 -55
  141. package/benchmark/auto-resolve/fixtures/F3-backend-contract-risk/task.txt +0 -9
  142. package/benchmark/auto-resolve/fixtures/F31-cli-seat-rebalance/NOTES.md +0 -34
  143. package/benchmark/auto-resolve/fixtures/F31-cli-seat-rebalance/expected.json +0 -57
  144. package/benchmark/auto-resolve/fixtures/F31-cli-seat-rebalance/metadata.json +0 -10
  145. package/benchmark/auto-resolve/fixtures/F31-cli-seat-rebalance/setup.sh +0 -2
  146. package/benchmark/auto-resolve/fixtures/F31-cli-seat-rebalance/spec.md +0 -67
  147. package/benchmark/auto-resolve/fixtures/F31-cli-seat-rebalance/task.txt +0 -7
  148. package/benchmark/auto-resolve/fixtures/F31-cli-seat-rebalance/verifiers/duplicate-event-error.js +0 -35
  149. package/benchmark/auto-resolve/fixtures/F31-cli-seat-rebalance/verifiers/priority-transfer-rollback.js +0 -53
  150. package/benchmark/auto-resolve/fixtures/F32-cli-subscription-renewal/NOTES.md +0 -38
  151. package/benchmark/auto-resolve/fixtures/F32-cli-subscription-renewal/expected.json +0 -57
  152. package/benchmark/auto-resolve/fixtures/F32-cli-subscription-renewal/metadata.json +0 -10
  153. package/benchmark/auto-resolve/fixtures/F32-cli-subscription-renewal/setup.sh +0 -2
  154. package/benchmark/auto-resolve/fixtures/F32-cli-subscription-renewal/spec.md +0 -70
  155. package/benchmark/auto-resolve/fixtures/F32-cli-subscription-renewal/task.txt +0 -3
  156. package/benchmark/auto-resolve/fixtures/F32-cli-subscription-renewal/verifiers/duplicate-renewal-error.js +0 -42
  157. package/benchmark/auto-resolve/fixtures/F32-cli-subscription-renewal/verifiers/priority-credit-rollback.js +0 -70
  158. package/benchmark/auto-resolve/fixtures/F4-web-browser-design/NOTES.md +0 -47
  159. package/benchmark/auto-resolve/fixtures/F4-web-browser-design/expected.json +0 -57
  160. package/benchmark/auto-resolve/fixtures/F4-web-browser-design/metadata.json +0 -10
  161. package/benchmark/auto-resolve/fixtures/F4-web-browser-design/setup.sh +0 -6
  162. package/benchmark/auto-resolve/fixtures/F4-web-browser-design/spec.md +0 -48
  163. package/benchmark/auto-resolve/fixtures/F4-web-browser-design/task.txt +0 -9
  164. package/benchmark/auto-resolve/fixtures/F5-fix-loop-red-green/NOTES.md +0 -45
  165. package/benchmark/auto-resolve/fixtures/F5-fix-loop-red-green/expected.json +0 -65
  166. package/benchmark/auto-resolve/fixtures/F5-fix-loop-red-green/metadata.json +0 -10
  167. package/benchmark/auto-resolve/fixtures/F5-fix-loop-red-green/setup.sh +0 -55
  168. package/benchmark/auto-resolve/fixtures/F5-fix-loop-red-green/spec.md +0 -48
  169. package/benchmark/auto-resolve/fixtures/F5-fix-loop-red-green/task.txt +0 -7
  170. package/benchmark/auto-resolve/fixtures/F6-dep-audit-native-module/NOTES.md +0 -43
  171. package/benchmark/auto-resolve/fixtures/F6-dep-audit-native-module/expected.json +0 -77
  172. package/benchmark/auto-resolve/fixtures/F6-dep-audit-native-module/metadata.json +0 -10
  173. package/benchmark/auto-resolve/fixtures/F6-dep-audit-native-module/setup.sh +0 -4
  174. package/benchmark/auto-resolve/fixtures/F6-dep-audit-native-module/spec.md +0 -48
  175. package/benchmark/auto-resolve/fixtures/F6-dep-audit-native-module/task.txt +0 -10
  176. package/benchmark/auto-resolve/fixtures/F7-out-of-scope-trap/NOTES.md +0 -57
  177. package/benchmark/auto-resolve/fixtures/F7-out-of-scope-trap/expected.json +0 -76
  178. package/benchmark/auto-resolve/fixtures/F7-out-of-scope-trap/metadata.json +0 -10
  179. package/benchmark/auto-resolve/fixtures/F7-out-of-scope-trap/setup.sh +0 -36
  180. package/benchmark/auto-resolve/fixtures/F7-out-of-scope-trap/spec.md +0 -45
  181. package/benchmark/auto-resolve/fixtures/F7-out-of-scope-trap/task.txt +0 -7
  182. package/benchmark/auto-resolve/fixtures/F8-known-limit-ambiguous/NOTES.md +0 -53
  183. package/benchmark/auto-resolve/fixtures/F8-known-limit-ambiguous/expected.json +0 -63
  184. package/benchmark/auto-resolve/fixtures/F8-known-limit-ambiguous/metadata.json +0 -10
  185. package/benchmark/auto-resolve/fixtures/F8-known-limit-ambiguous/setup.sh +0 -4
  186. package/benchmark/auto-resolve/fixtures/F8-known-limit-ambiguous/spec.md +0 -48
  187. package/benchmark/auto-resolve/fixtures/F8-known-limit-ambiguous/task.txt +0 -1
  188. package/benchmark/auto-resolve/fixtures/F9-e2e-ideate-to-resolve/NOTES.md +0 -105
  189. package/benchmark/auto-resolve/fixtures/F9-e2e-ideate-to-resolve/expected.json +0 -74
  190. package/benchmark/auto-resolve/fixtures/F9-e2e-ideate-to-resolve/metadata.json +0 -10
  191. package/benchmark/auto-resolve/fixtures/F9-e2e-ideate-to-resolve/setup.sh +0 -28
  192. package/benchmark/auto-resolve/fixtures/F9-e2e-ideate-to-resolve/spec.md +0 -59
  193. package/benchmark/auto-resolve/fixtures/F9-e2e-ideate-to-resolve/task.txt +0 -5
  194. package/benchmark/auto-resolve/fixtures/SCHEMA.md +0 -188
  195. package/benchmark/auto-resolve/fixtures/retired/F27-cli-subscription-proration/NOTES.md +0 -37
  196. package/benchmark/auto-resolve/fixtures/retired/F27-cli-subscription-proration/RETIRED.md +0 -13
  197. package/benchmark/auto-resolve/fixtures/retired/F27-cli-subscription-proration/expected.json +0 -56
  198. package/benchmark/auto-resolve/fixtures/retired/F27-cli-subscription-proration/metadata.json +0 -10
  199. package/benchmark/auto-resolve/fixtures/retired/F27-cli-subscription-proration/setup.sh +0 -18
  200. package/benchmark/auto-resolve/fixtures/retired/F27-cli-subscription-proration/spec.md +0 -69
  201. package/benchmark/auto-resolve/fixtures/retired/F27-cli-subscription-proration/task.txt +0 -7
  202. package/benchmark/auto-resolve/fixtures/retired/F27-cli-subscription-proration/verifiers/exact-proration.js +0 -48
  203. package/benchmark/auto-resolve/fixtures/retired/F27-cli-subscription-proration/verifiers/rules-source-and-conflict.js +0 -79
  204. package/benchmark/auto-resolve/fixtures/retired/F28-cli-return-authorization/NOTES.md +0 -54
  205. package/benchmark/auto-resolve/fixtures/retired/F28-cli-return-authorization/RETIRED.md +0 -7
  206. package/benchmark/auto-resolve/fixtures/retired/F28-cli-return-authorization/expected.json +0 -67
  207. package/benchmark/auto-resolve/fixtures/retired/F28-cli-return-authorization/metadata.json +0 -10
  208. package/benchmark/auto-resolve/fixtures/retired/F28-cli-return-authorization/setup.sh +0 -2
  209. package/benchmark/auto-resolve/fixtures/retired/F28-cli-return-authorization/spec.md +0 -67
  210. package/benchmark/auto-resolve/fixtures/retired/F28-cli-return-authorization/task.txt +0 -5
  211. package/benchmark/auto-resolve/fixtures/retired/F28-cli-return-authorization/verifiers/policy-precedence.js +0 -72
  212. package/benchmark/auto-resolve/fixtures/retired/F28-cli-return-authorization/verifiers/validation-and-immutability.js +0 -43
  213. package/benchmark/auto-resolve/fixtures/retired/F28-cli-return-authorization/verifiers/validation-boundary.js +0 -116
  214. package/benchmark/auto-resolve/fixtures/retired/F30-cli-credit-hold-settlement/NOTES.md +0 -35
  215. package/benchmark/auto-resolve/fixtures/retired/F30-cli-credit-hold-settlement/RETIRED.md +0 -12
  216. package/benchmark/auto-resolve/fixtures/retired/F30-cli-credit-hold-settlement/expected.json +0 -58
  217. package/benchmark/auto-resolve/fixtures/retired/F30-cli-credit-hold-settlement/metadata.json +0 -10
  218. package/benchmark/auto-resolve/fixtures/retired/F30-cli-credit-hold-settlement/setup.sh +0 -2
  219. package/benchmark/auto-resolve/fixtures/retired/F30-cli-credit-hold-settlement/spec.md +0 -73
  220. package/benchmark/auto-resolve/fixtures/retired/F30-cli-credit-hold-settlement/task.txt +0 -17
  221. package/benchmark/auto-resolve/fixtures/retired/F30-cli-credit-hold-settlement/verifiers/mixed-idempotent-settlement.js +0 -53
  222. package/benchmark/auto-resolve/fixtures/retired/F30-cli-credit-hold-settlement/verifiers/rejection-boundaries.js +0 -74
  223. package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/NOTES.md +0 -28
  224. package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/RETIRED.md +0 -15
  225. package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/expected.json +0 -57
  226. package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/metadata.json +0 -10
  227. package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/setup.sh +0 -50
  228. package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/spec.md +0 -59
  229. package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/task.txt +0 -9
  230. package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/verifiers/ordered-settlement.js +0 -88
  231. package/benchmark/auto-resolve/fixtures/retired/F34-cli-settle-inflight/verifiers/reject-invalid.js +0 -45
  232. package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/NOTES.md +0 -30
  233. package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/RETIRED.md +0 -16
  234. package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/expected.json +0 -64
  235. package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/metadata.json +0 -10
  236. package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/setup.sh +0 -21
  237. package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/spec.md +0 -58
  238. package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/task.txt +0 -9
  239. package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/verifiers/dup-op.js +0 -54
  240. package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/verifiers/priority-apply.js +0 -82
  241. package/benchmark/auto-resolve/fixtures/retired/F35-cli-apply-journal/verifiers/rollback.js +0 -77
  242. package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/NOTES.md +0 -99
  243. package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/RETIRED.md +0 -18
  244. package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/expected.json +0 -64
  245. package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/metadata.json +0 -10
  246. package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/setup.sh +0 -4
  247. package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/spec.md +0 -61
  248. package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/task.txt +0 -9
  249. package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/verifiers/correctness-small.js +0 -135
  250. package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/verifiers/scale.js +0 -100
  251. package/benchmark/auto-resolve/fixtures/retired/F36-cli-session-admission/verifiers/validation.js +0 -75
  252. package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/NOTES.md +0 -93
  253. package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/RETIRED.md +0 -16
  254. package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/expected.json +0 -65
  255. package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/metadata.json +0 -10
  256. package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/setup.sh +0 -18
  257. package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/spec.md +0 -66
  258. package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/task.txt +0 -9
  259. package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/verifiers/correctness-small.js +0 -84
  260. package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/verifiers/scale.js +0 -184
  261. package/benchmark/auto-resolve/fixtures/retired/F37-cli-rule-lookup/verifiers/validation.js +0 -74
  262. package/benchmark/auto-resolve/fixtures/retired/F9-e2e-ideate-to-preflight/NOTES.md +0 -60
  263. package/benchmark/auto-resolve/fixtures/retired/F9-e2e-ideate-to-preflight/RETIRED.md +0 -29
  264. package/benchmark/auto-resolve/fixtures/retired/F9-e2e-ideate-to-preflight/expected.json +0 -73
  265. package/benchmark/auto-resolve/fixtures/retired/F9-e2e-ideate-to-preflight/metadata.json +0 -10
  266. package/benchmark/auto-resolve/fixtures/retired/F9-e2e-ideate-to-preflight/setup.sh +0 -28
  267. package/benchmark/auto-resolve/fixtures/retired/F9-e2e-ideate-to-preflight/spec.md +0 -58
  268. package/benchmark/auto-resolve/fixtures/retired/F9-e2e-ideate-to-preflight/task.txt +0 -5
  269. package/benchmark/auto-resolve/fixtures/test-repo/README.md +0 -12
  270. package/benchmark/auto-resolve/fixtures/test-repo/bin/cli.js +0 -63
  271. package/benchmark/auto-resolve/fixtures/test-repo/package-lock.json +0 -823
  272. package/benchmark/auto-resolve/fixtures/test-repo/package.json +0 -22
  273. package/benchmark/auto-resolve/fixtures/test-repo/playwright.config.js +0 -17
  274. package/benchmark/auto-resolve/fixtures/test-repo/server/index.js +0 -37
  275. package/benchmark/auto-resolve/fixtures/test-repo/tests/cli.test.js +0 -25
  276. package/benchmark/auto-resolve/fixtures/test-repo/tests/server.test.js +0 -58
  277. package/benchmark/auto-resolve/fixtures/test-repo/web/index.html +0 -37
  278. package/benchmark/auto-resolve/results/20260507-f10-f11-tier1-full-pipeline/headroom-gate.json +0 -25
  279. package/benchmark/auto-resolve/results/20260507-f10-f11-tier1-full-pipeline/headroom-gate.md +0 -10
  280. package/benchmark/auto-resolve/results/20260508-f22-exact-error-headroom/headroom-gate.json +0 -18
  281. package/benchmark/auto-resolve/results/20260508-f22-exact-error-headroom/headroom-gate.md +0 -9
  282. package/benchmark/auto-resolve/results/20260508-f26-headroom/headroom-gate.json +0 -18
  283. package/benchmark/auto-resolve/results/20260508-f26-headroom/headroom-gate.md +0 -9
  284. package/benchmark/auto-resolve/results/20260510-f16-f23-f25-combined-proof/F16-cli-quote-tax-rules/l2_risk_probes/result.json +0 -28
  285. package/benchmark/auto-resolve/results/20260510-f16-f23-f25-combined-proof/F23-cli-fulfillment-wave/l2_risk_probes/result.json +0 -28
  286. package/benchmark/auto-resolve/results/20260510-f16-f23-f25-combined-proof/F25-cli-cart-promotion-rules/l2_risk_probes/result.json +0 -30
  287. package/benchmark/auto-resolve/results/20260510-f16-f23-f25-combined-proof/full-pipeline-pair-gate.json +0 -82
  288. package/benchmark/auto-resolve/results/20260510-f16-f23-f25-combined-proof/full-pipeline-pair-gate.md +0 -18
  289. package/benchmark/auto-resolve/results/20260510-f16-f23-f25-combined-proof/headroom-gate.json +0 -46
  290. package/benchmark/auto-resolve/results/20260510-f16-f23-f25-combined-proof/headroom-gate.md +0 -17
  291. package/benchmark/auto-resolve/results/20260511-f12-webhook-headroom/headroom-gate.json +0 -28
  292. package/benchmark/auto-resolve/results/20260511-f12-webhook-headroom/headroom-gate.md +0 -15
  293. package/benchmark/auto-resolve/results/20260511-f15-concurrency-headroom/headroom-gate.json +0 -28
  294. package/benchmark/auto-resolve/results/20260511-f15-concurrency-headroom/headroom-gate.md +0 -15
  295. package/benchmark/auto-resolve/results/20260511-f21-current-riskprobes-v1/F21-cli-scheduler-priority/l2_risk_probes/result.json +0 -32
  296. package/benchmark/auto-resolve/results/20260511-f21-current-riskprobes-v1/full-pipeline-pair-gate.json +0 -44
  297. package/benchmark/auto-resolve/results/20260511-f21-current-riskprobes-v1/full-pipeline-pair-gate.md +0 -16
  298. package/benchmark/auto-resolve/results/20260511-f21-current-riskprobes-v1/headroom-gate.json +0 -18
  299. package/benchmark/auto-resolve/results/20260511-f21-current-riskprobes-v1/headroom-gate.md +0 -9
  300. package/benchmark/auto-resolve/results/20260511-f3-http-error-headroom/headroom-gate.json +0 -28
  301. package/benchmark/auto-resolve/results/20260511-f3-http-error-headroom/headroom-gate.md +0 -15
  302. package/benchmark/auto-resolve/results/20260512-f2-medium-headroom/headroom-gate.json +0 -28
  303. package/benchmark/auto-resolve/results/20260512-f2-medium-headroom/headroom-gate.md +0 -15
  304. package/benchmark/auto-resolve/results/20260512-f31-seat-rebalance-headroom/headroom-gate.json +0 -28
  305. package/benchmark/auto-resolve/results/20260512-f31-seat-rebalance-headroom/headroom-gate.md +0 -15
  306. package/benchmark/auto-resolve/results/20260512-f32-subscription-renewal-headroom/headroom-gate.json +0 -28
  307. package/benchmark/auto-resolve/results/20260512-f32-subscription-renewal-headroom/headroom-gate.md +0 -15
  308. package/benchmark/auto-resolve/results/20260512-f4-web-headroom/headroom-gate.json +0 -28
  309. package/benchmark/auto-resolve/results/20260512-f4-web-headroom/headroom-gate.md +0 -15
  310. package/benchmark/auto-resolve/results/20260512-f5-fixloop-headroom/headroom-gate.json +0 -28
  311. package/benchmark/auto-resolve/results/20260512-f5-fixloop-headroom/headroom-gate.md +0 -15
  312. package/benchmark/auto-resolve/results/20260512-f6-checksum-headroom/headroom-gate.json +0 -28
  313. package/benchmark/auto-resolve/results/20260512-f6-checksum-headroom/headroom-gate.md +0 -15
  314. package/benchmark/auto-resolve/results/20260512-f7-scope-headroom/headroom-gate.json +0 -28
  315. package/benchmark/auto-resolve/results/20260512-f7-scope-headroom/headroom-gate.md +0 -15
  316. package/benchmark/auto-resolve/results/20260512-f9-e2e-headroom/headroom-gate.json +0 -28
  317. package/benchmark/auto-resolve/results/20260512-f9-e2e-headroom/headroom-gate.md +0 -15
  318. package/benchmark/auto-resolve/run-real-benchmark.md +0 -303
  319. package/benchmark/auto-resolve/scripts/audit-headroom-rejections.py +0 -441
  320. package/benchmark/auto-resolve/scripts/audit-pair-evidence.py +0 -1256
  321. package/benchmark/auto-resolve/scripts/build-pair-eligible-manifest.py +0 -306
  322. package/benchmark/auto-resolve/scripts/check-f9-artifacts.py +0 -268
  323. package/benchmark/auto-resolve/scripts/collect-swebench-predictions.py +0 -108
  324. package/benchmark/auto-resolve/scripts/compile-report.py +0 -493
  325. package/benchmark/auto-resolve/scripts/fetch-swebench-instances.py +0 -129
  326. package/benchmark/auto-resolve/scripts/frozen-verify-gate.py +0 -434
  327. package/benchmark/auto-resolve/scripts/full-pipeline-pair-gate.py +0 -612
  328. package/benchmark/auto-resolve/scripts/headroom-gate.py +0 -378
  329. package/benchmark/auto-resolve/scripts/iter-0033c-compare.py +0 -683
  330. package/benchmark/auto-resolve/scripts/iter-0033c-l1-summary.py +0 -97
  331. package/benchmark/auto-resolve/scripts/judge-opus-pass.sh +0 -542
  332. package/benchmark/auto-resolve/scripts/judge.sh +0 -565
  333. package/benchmark/auto-resolve/scripts/oracle-scope-tier-a.py +0 -256
  334. package/benchmark/auto-resolve/scripts/oracle-scope-tier-b.py +0 -287
  335. package/benchmark/auto-resolve/scripts/oracle-test-fidelity.py +0 -328
  336. package/benchmark/auto-resolve/scripts/pair-candidate-frontier.py +0 -469
  337. package/benchmark/auto-resolve/scripts/pair-plan-idgen.py +0 -401
  338. package/benchmark/auto-resolve/scripts/pair-plan-lint.py +0 -475
  339. package/benchmark/auto-resolve/scripts/pair-rejected-fixtures.sh +0 -103
  340. package/benchmark/auto-resolve/scripts/pair_evidence_contract.py +0 -270
  341. package/benchmark/auto-resolve/scripts/prepare-swebench-frozen-case.py +0 -273
  342. package/benchmark/auto-resolve/scripts/prepare-swebench-frozen-corpus.py +0 -148
  343. package/benchmark/auto-resolve/scripts/prepare-swebench-solver-worktree.py +0 -210
  344. package/benchmark/auto-resolve/scripts/recent-benchmark-summary.py +0 -232
  345. package/benchmark/auto-resolve/scripts/run-fixture.sh +0 -1024
  346. package/benchmark/auto-resolve/scripts/run-frozen-verify-pair.sh +0 -683
  347. package/benchmark/auto-resolve/scripts/run-full-pipeline-pair-candidate.sh +0 -458
  348. package/benchmark/auto-resolve/scripts/run-headroom-candidate.sh +0 -336
  349. package/benchmark/auto-resolve/scripts/run-iter-0033c.sh +0 -208
  350. package/benchmark/auto-resolve/scripts/run-suite.sh +0 -251
  351. package/benchmark/auto-resolve/scripts/run-swebench-frozen-corpus.sh +0 -310
  352. package/benchmark/auto-resolve/scripts/run-swebench-solver-batch.sh +0 -257
  353. package/benchmark/auto-resolve/scripts/ship-gate.py +0 -391
  354. package/benchmark/auto-resolve/scripts/solo-ceiling-avoidance.py +0 -53
  355. package/benchmark/auto-resolve/scripts/solo-headroom-hypothesis.py +0 -77
  356. package/benchmark/auto-resolve/scripts/swebench-frozen-matrix.py +0 -478
  357. package/benchmark/auto-resolve/scripts/test-audit-headroom-rejections.sh +0 -288
  358. package/benchmark/auto-resolve/scripts/test-audit-pair-evidence.sh +0 -1672
  359. package/benchmark/auto-resolve/scripts/test-benchmark-arg-parsing.sh +0 -1015
  360. package/benchmark/auto-resolve/scripts/test-build-pair-eligible-manifest.sh +0 -491
  361. package/benchmark/auto-resolve/scripts/test-check-f9-artifacts.sh +0 -91
  362. package/benchmark/auto-resolve/scripts/test-frozen-verify-gate.sh +0 -517
  363. package/benchmark/auto-resolve/scripts/test-full-pipeline-pair-gate.sh +0 -610
  364. package/benchmark/auto-resolve/scripts/test-headroom-gate.sh +0 -401
  365. package/benchmark/auto-resolve/scripts/test-iter-0033c-compare.sh +0 -525
  366. package/benchmark/auto-resolve/scripts/test-iter-0033c-l1-summary.sh +0 -254
  367. package/benchmark/auto-resolve/scripts/test-lint-fixtures.sh +0 -580
  368. package/benchmark/auto-resolve/scripts/test-pair-candidate-frontier.sh +0 -591
  369. package/benchmark/auto-resolve/scripts/test-run-full-pipeline-pair-candidate.sh +0 -497
  370. package/benchmark/auto-resolve/scripts/test-run-headroom-candidate.sh +0 -401
  371. package/benchmark/auto-resolve/scripts/test-run-swebench-solver-batch.sh +0 -111
  372. package/benchmark/auto-resolve/scripts/test-ship-gate.sh +0 -1189
  373. package/benchmark/auto-resolve/scripts/test-swebench-frozen-case.sh +0 -1221
  374. package/benchmark/auto-resolve/shadow-fixtures/S1-cli-lang-flag/NOTES.md +0 -28
  375. package/benchmark/auto-resolve/shadow-fixtures/S1-cli-lang-flag/expected.json +0 -63
  376. package/benchmark/auto-resolve/shadow-fixtures/S1-cli-lang-flag/metadata.json +0 -10
  377. package/benchmark/auto-resolve/shadow-fixtures/S1-cli-lang-flag/setup.sh +0 -3
  378. package/benchmark/auto-resolve/shadow-fixtures/S1-cli-lang-flag/spec.md +0 -47
  379. package/benchmark/auto-resolve/shadow-fixtures/S1-cli-lang-flag/task.txt +0 -1
  380. package/benchmark/auto-resolve/shadow-fixtures/S2-cli-inventory-reservation/NOTES.md +0 -34
  381. package/benchmark/auto-resolve/shadow-fixtures/S2-cli-inventory-reservation/expected.json +0 -53
  382. package/benchmark/auto-resolve/shadow-fixtures/S2-cli-inventory-reservation/metadata.json +0 -10
  383. package/benchmark/auto-resolve/shadow-fixtures/S2-cli-inventory-reservation/setup.sh +0 -3
  384. package/benchmark/auto-resolve/shadow-fixtures/S2-cli-inventory-reservation/spec.md +0 -50
  385. package/benchmark/auto-resolve/shadow-fixtures/S2-cli-inventory-reservation/task.txt +0 -1
  386. package/benchmark/auto-resolve/shadow-fixtures/S2-cli-inventory-reservation/verifiers/duplicate-order-error.js +0 -27
  387. package/benchmark/auto-resolve/shadow-fixtures/S2-cli-inventory-reservation/verifiers/priority-stock-reservation.js +0 -44
  388. package/benchmark/auto-resolve/shadow-fixtures/S3-cli-ticket-assignment/NOTES.md +0 -34
  389. package/benchmark/auto-resolve/shadow-fixtures/S3-cli-ticket-assignment/expected.json +0 -55
  390. package/benchmark/auto-resolve/shadow-fixtures/S3-cli-ticket-assignment/metadata.json +0 -10
  391. package/benchmark/auto-resolve/shadow-fixtures/S3-cli-ticket-assignment/setup.sh +0 -3
  392. package/benchmark/auto-resolve/shadow-fixtures/S3-cli-ticket-assignment/spec.md +0 -52
  393. package/benchmark/auto-resolve/shadow-fixtures/S3-cli-ticket-assignment/task.txt +0 -1
  394. package/benchmark/auto-resolve/shadow-fixtures/S3-cli-ticket-assignment/verifiers/duplicate-ticket-error.js +0 -29
  395. package/benchmark/auto-resolve/shadow-fixtures/S3-cli-ticket-assignment/verifiers/priority-agent-assignment.js +0 -48
  396. package/benchmark/auto-resolve/shadow-fixtures/S4-cli-return-routing/NOTES.md +0 -34
  397. package/benchmark/auto-resolve/shadow-fixtures/S4-cli-return-routing/expected.json +0 -55
  398. package/benchmark/auto-resolve/shadow-fixtures/S4-cli-return-routing/metadata.json +0 -10
  399. package/benchmark/auto-resolve/shadow-fixtures/S4-cli-return-routing/setup.sh +0 -3
  400. package/benchmark/auto-resolve/shadow-fixtures/S4-cli-return-routing/spec.md +0 -55
  401. package/benchmark/auto-resolve/shadow-fixtures/S4-cli-return-routing/task.txt +0 -1
  402. package/benchmark/auto-resolve/shadow-fixtures/S4-cli-return-routing/verifiers/duplicate-return-error.js +0 -43
  403. package/benchmark/auto-resolve/shadow-fixtures/S4-cli-return-routing/verifiers/priority-return-routing.js +0 -70
  404. package/benchmark/auto-resolve/shadow-fixtures/S5-cli-credit-grant-ledger/NOTES.md +0 -37
  405. package/benchmark/auto-resolve/shadow-fixtures/S5-cli-credit-grant-ledger/expected.json +0 -54
  406. package/benchmark/auto-resolve/shadow-fixtures/S5-cli-credit-grant-ledger/metadata.json +0 -10
  407. package/benchmark/auto-resolve/shadow-fixtures/S5-cli-credit-grant-ledger/setup.sh +0 -3
  408. package/benchmark/auto-resolve/shadow-fixtures/S5-cli-credit-grant-ledger/spec.md +0 -59
  409. package/benchmark/auto-resolve/shadow-fixtures/S5-cli-credit-grant-ledger/task.txt +0 -1
  410. package/benchmark/auto-resolve/shadow-fixtures/S5-cli-credit-grant-ledger/verifiers/credit-ledger-priority.js +0 -98
  411. package/benchmark/auto-resolve/shadow-fixtures/S5-cli-credit-grant-ledger/verifiers/duplicate-charge-error.js +0 -38
  412. package/benchmark/auto-resolve/shadow-fixtures/S6-cli-refund-window-ledger/NOTES.md +0 -36
  413. package/benchmark/auto-resolve/shadow-fixtures/S6-cli-refund-window-ledger/expected.json +0 -56
  414. package/benchmark/auto-resolve/shadow-fixtures/S6-cli-refund-window-ledger/metadata.json +0 -10
  415. package/benchmark/auto-resolve/shadow-fixtures/S6-cli-refund-window-ledger/setup.sh +0 -3
  416. package/benchmark/auto-resolve/shadow-fixtures/S6-cli-refund-window-ledger/spec.md +0 -59
  417. package/benchmark/auto-resolve/shadow-fixtures/S6-cli-refund-window-ledger/task.txt +0 -1
  418. package/benchmark/auto-resolve/shadow-fixtures/S6-cli-refund-window-ledger/verifiers/duplicate-refund-error.js +0 -41
  419. package/benchmark/auto-resolve/shadow-fixtures/S6-cli-refund-window-ledger/verifiers/priority-refund-ledger.js +0 -65
  420. package/config/skills/_shared/pair-plan-schema.md +0 -298
  421. package/scripts/lint-fixtures.sh +0 -352
  422. package/scripts/lint-shadow-fixtures.sh +0 -58
  423. package/scripts/lint-skills.sh +0 -4265
  424. package/scripts/test-owner-phases.py +0 -193
@@ -1,177 +0,0 @@
1
- # Benchmark Judge Rubric
2
-
3
- Stable across model upgrades. This file is the single source of truth for how
4
- arms are scored and how ship gates evaluate a run. Do not change the rubric
5
- during a benchmarking window — changing it invalidates comparability with
6
- prior `history/runs/`.
7
-
8
- **Outer goal lives in [`autoresearch/NORTH-STAR.md`](../../autoresearch/NORTH-STAR.md).** The release-decision layer (L0 / L1 / L2 contracts, wall-time efficiency, pair-cost justification) sits on top of the per-arm scoring rules below. When NORTH-STAR.md adds a release-gate number that this file did not have, the new number applies — open a doc-fix iter to mirror it here.
9
-
10
- ## Scoring — 4 axes, 25 points each, 100 total
11
-
12
- The blind judge scores all submitted arms on identical axes without knowing
13
- which label maps to which arm.
14
-
15
- ### Axis 1 — Spec Compliance (0-25)
16
-
17
- Does this implementation satisfy every Requirements bullet in `spec.md`?
18
- Does every Verification command behave as the spec states?
19
-
20
- - **25** — All Requirements satisfied. All Verification commands would pass.
21
- - **19-24** — 90%+ coverage, minor omissions.
22
- - **13-18** — Partial implementation or verification gaps.
23
- - **7-12** — Major requirements missed.
24
- - **0-6** — Does not address the core task.
25
-
26
- Mechanical cap: after the blind judge returns, `judge.sh` caps total score at
27
- `floor(100 * verify_score)` and caps the Spec Compliance axis at
28
- `floor(25 * verify_score)`. This makes the machine-readable acceptance
29
- contract binding when a judge grades prose generously despite failed required
30
- verification commands.
31
-
32
- ### Axis 2 — Constraint Respect (0-25)
33
-
34
- Zero new npm deps (unless spec allows), no silent catches (`try { } catch { return fallback }`), no `any`/`@ts-ignore`, explicit HOME/env guards where required, EACCES-specific handling, no hardcoded values that should be configurable.
35
-
36
- - Each **disqualifier-severity forbidden_pattern match** or explicit constraint violation = −4 points, minimum 0.
37
-
38
- ### Axis 3 — Scope Discipline (0-25)
39
-
40
- Out of Scope respected. No gratuitous refactors of unrelated code. No "while I'm here" additions. No opportunistic upgrades.
41
-
42
- - Each out-of-scope change = −5 points, minimum 0.
43
-
44
- ### Axis 4 — Code Quality (0-25)
45
-
46
- Readable, idiomatic for the language/framework, helpful error messages, appropriate abstraction level (not under- or over-engineered), uses standard library primitives where available (e.g., `fs.accessSync` over mode-bit checks per CLAUDE.md `phase-3-critic.md:32` calibration).
47
-
48
- - This axis is judge-calibrated; no deterministic grading. The judge looks at
49
- naming, function/file decomposition, error handling, and comparability to
50
- idiomatic peer code.
51
-
52
- ---
53
-
54
- ## Judge Disqualifiers (hard floor)
55
-
56
- Any of these produces `disqualifier: true` on the arm, overriding score:
57
-
58
- - Silent-catch pattern in diff.
59
- - Fabricated verification (code that claims to pass without actually running).
60
- - Skipped a required test file that the spec names.
61
- - Created a file listed in `expected.forbidden_files`.
62
- - Exceeded `expected.max_deps_added`.
63
- - `@ts-ignore` / `eslint-disable` without scoped justification comment.
64
- - Hardcoded paths or values where spec required configurability.
65
-
66
- Disqualifier arms automatically lose the fixture regardless of score.
67
-
68
- ---
69
-
70
- ## Ship Gates
71
-
72
- After the judge finishes every fixture, `scripts/ship-gate.py` applies these
73
- rules to the run's `summary.json`.
74
-
75
- This section describes the broad run-suite ship gate. Current solo<pair
76
- evidence uses the full-pipeline pair gate with an explicit selected pair arm
77
- (`l2_risk_probes` for proof runs, `l2_gated` for diagnostics), and that gate
78
- compares the selected pair arm against `solo_claude`.
79
-
80
- ### Hard floors (any one failure blocks ship)
81
-
82
- 1. **No disqualifier-level violation** in any gated harness arm (legacy suite `variant`/L2 and `solo_claude`/L1 when present).
83
- 2. **F9 (E2E) must PASS** — novice-flow contract.
84
- 3. **At least 7 gated, headroom-available fixtures** must have the required margin ≥ +5 for each gated contract — legacy `variant`-`bare` (L2-L0) for the suite gate, and `solo_claude`-`bare` (L1-L0) when `solo_claude` is present. This is **headroom-aware** (added 2026-05-02 per iter-0033 R4 + NORTH-STAR amendment): a fixture is excluded from a contract count when the lower arm is ceiling-near and the higher arm is clean at ceiling. Excluded fixtures become fixture-rotation candidates per the policy below if the two-shipped-version rule is met.
85
- 4. **No fixture regression worse than −5** vs. last `baselines/shipped.json` on the same fixture.
86
-
87
- ### Soft gates (produce WARNING but do not block)
88
-
89
- 5. Suite average margin drop > 3 vs. last shipped.
90
- 6. A fixture that previously had margin > +5 now has margin ≤ 0.
91
- 7. Critical-finding catch-rate decrease vs. the last shipped gated harness arm.
92
-
93
- ### Known-limit exception
94
-
95
- - **F8-known-limit-ambiguous** is excluded from gates 3 and 4. It exists to
96
- document where the harness may not beat bare. Its allowed margin range is
97
- [-3, +3]. Margins outside this range trigger a WARNING regardless of sign
98
- (too-good means the fixture is no longer a known limit; too-bad means we
99
- shipped a regression somewhere else that this fixture caught).
100
-
101
- ---
102
-
103
- ## Run Record
104
-
105
- Every suite run appends an immutable record to `history/runs/<ts>-<label>.json`:
106
-
107
- ```json
108
- {
109
- "run_id": "2026-04-23T12:00:00Z-v3.6",
110
- "version_label": "v3.6",
111
- "git_sha": "fdb7428...",
112
- "branch": "benchmark/v3.6-ab-...",
113
- "n_per_fixture": 1,
114
- "judge_model": "<recorded from ~/.codex/config.toml at run time; do not hardcode>",
115
- "judge_effort": "xhigh",
116
- "fixtures": [
117
- {
118
- "id": "F2-cli-medium-subcommand",
119
- "variant": { "score": 92, "wall_s": 707, "tokens_agg": 108852, "disqualifier": false,
120
- "axes": {"spec": 23, "constraint": 23, "scope": 24, "quality": 22} },
121
- "bare": { "score": 81, "wall_s": 101, "tokens_agg": 55588, "disqualifier": false,
122
- "axes": {"spec": 19, "constraint": 19, "scope": 20, "quality": 23} },
123
- "winner": "variant",
124
- "margin": 11,
125
- "critical_findings": {
126
- "variant": [],
127
- "bare": ["silent catch in findSkillMdFiles (no-silent-catches violation)"]
128
- }
129
- }
130
- ],
131
- "suite": {
132
- "fixtures_run": 9,
133
- "variant_avg": 89.3,
134
- "bare_avg": 75.0,
135
- "margin_avg": 14.3,
136
- "hard_floor_violations": 0,
137
- "ship_gate": "PASS"
138
- }
139
- }
140
- ```
141
-
142
- ---
143
-
144
- ## Fixture Rotation Policy
145
-
146
- If any fixture has all compared gated arms scoring > 95 for two consecutive
147
- shipped versions, it's saturated and no longer differentiates. Replace with a
148
- harder equivalent and record the swap in
149
- `history/runs/<ts>-fixture-rotation.json`:
150
-
151
- ```json
152
- {
153
- "retired": "F1-cli-trivial-flag",
154
- "retired_reason": "all compared gated arms > 95 on v3.7 and v3.8 (saturation)",
155
- "replacement": "F1b-cli-trivial-flag-v2",
156
- "replacement_rationale": "adds exit-code precedence requirement that current leaders didn't handle on first try"
157
- }
158
- ```
159
-
160
- Retired fixtures stay in `fixtures/retired/` for replay if a regression is
161
- suspected in their area.
162
-
163
- ---
164
-
165
- ## Why These Thresholds
166
-
167
- - **+5 margin floor** — below this, the gated harness arm is not reliably
168
- beating its lower baseline given judge variance (empirically ~±3 per axis).
169
- For the legacy suite that is `variant` over `bare`; for pair evidence it is
170
- the selected pair arm over `solo_claude`. Worth paying pipeline cost requires
171
- margin clearly above noise.
172
- - **−5 regression floor** — one-axis regression can look like −5; allowing
173
- less would let real regressions slip through.
174
- - **7-fixture coverage floor** — requires a broad enough set of
175
- headroom-available, non-known-limit fixtures to clear the margin floor. This
176
- preserves the original core-suite coverage bar without pretending the current
177
- extended fixture inventory is still exactly nine fixtures.
@@ -1,34 +0,0 @@
1
- # F1 — Notes
2
-
3
- ## Purpose
4
-
5
- Trivial-tier calibration. Every arm should one-shot this; it's here to catch
6
- catastrophic regressions and to anchor the "saturation" end of the scoring
7
- scale.
8
-
9
- Pair-candidate status: rejected by design. Because every arm is expected to
10
- one-shot F1, it is a trivial calibration/control fixture and must not be used
11
- as pair-lift evidence.
12
-
13
- ## Failure mode
14
-
15
- - **Default-behavior regression.** Careless implementations add `--loud`
16
- handling but accidentally alter the default case (e.g., always uppercasing
17
- because the flag-check is misplaced). Verification commands 1 and 4 guard
18
- against that.
19
- - **Scope creep.** Modifying unrelated code while "here" would be caught by
20
- both CRITIC design sub-pass and the `git diff --stat` spec requirement.
21
-
22
- ## Pipeline exercise
23
-
24
- - Phase 0 routing: expected `standard` route (no risk keywords).
25
- - Phase 1 BUILD: single-file edit.
26
- - Phase 1.4 BUILD GATE: `node --check` + `node --test` both must pass.
27
- - Phase 2 EVAL: minimal findings expected.
28
- - Phase 3 CRITIC design: verifies diff surgical-ness.
29
-
30
- ## Rotation trigger
31
-
32
- When both `bare` and `solo_claude` score > 95 for two consecutive shipped
33
- versions, replace with a harder trivial fixture (e.g., one that requires
34
- handling a new flag interacting with existing flag precedence).
@@ -1,68 +0,0 @@
1
- {
2
- "verification_commands": [
3
- {
4
- "cmd": "node bin/cli.js hello",
5
- "exit_code": 0,
6
- "stdout_contains": [
7
- "Hello, world!"
8
- ],
9
- "stdout_not_contains": [
10
- "HELLO"
11
- ]
12
- },
13
- {
14
- "cmd": "node bin/cli.js hello --loud",
15
- "exit_code": 0,
16
- "stdout_contains": [
17
- "HELLO, WORLD!!"
18
- ],
19
- "stdout_not_contains": []
20
- },
21
- {
22
- "cmd": "node bin/cli.js hello --loud --name alice",
23
- "exit_code": 0,
24
- "stdout_contains": [
25
- "HELLO, ALICE!!"
26
- ],
27
- "stdout_not_contains": []
28
- },
29
- {
30
- "cmd": "node bin/cli.js hello --name bob",
31
- "exit_code": 0,
32
- "stdout_contains": [
33
- "Hello, bob!"
34
- ],
35
- "stdout_not_contains": [
36
- "HELLO"
37
- ]
38
- },
39
- {
40
- "cmd": "node --test tests/cli.test.js",
41
- "exit_code": 0,
42
- "stdout_contains": [],
43
- "stdout_not_contains": [
44
- "not ok "
45
- ]
46
- }
47
- ],
48
- "forbidden_patterns": [
49
- {
50
- "pattern": "catch\\s*\\([^)]*\\)\\s*\\{[^}]*return\\s+(null|undefined|'')",
51
- "description": "silent catch returning fallback",
52
- "files": [
53
- "bin/cli.js"
54
- ],
55
- "severity": "disqualifier"
56
- }
57
- ],
58
- "required_files": [
59
- "bin/cli.js",
60
- "tests/cli.test.js"
61
- ],
62
- "forbidden_files": [],
63
- "max_deps_added": 0,
64
- "spec_output_files": [
65
- "bin/cli.js",
66
- "tests/cli.test.js"
67
- ]
68
- }
@@ -1,10 +0,0 @@
1
- {
2
- "id": "F1-cli-trivial-flag",
3
- "category": "trivial",
4
- "difficulty": "trivial",
5
- "timeout_seconds": 900,
6
- "required_tools": ["node"],
7
- "browser": false,
8
- "deps_change_expected": false,
9
- "intent": "Add a boolean --loud flag to bench-test-repo's hello subcommand. When passed, the greeting is uppercased and ends with '!!'. Default behavior unchanged. Update tests."
10
- }
@@ -1,4 +0,0 @@
1
- #!/usr/bin/env bash
2
- # F1 setup — no changes to base test-repo needed.
3
- set -e
4
- exit 0
@@ -1,44 +0,0 @@
1
- ---
2
- id: "F1-cli-trivial-flag"
3
- title: "Add --loud flag to hello subcommand"
4
- status: planned
5
- complexity: trivial
6
- depends-on: []
7
- ---
8
-
9
- # F1 Add `--loud` flag to `hello`
10
-
11
- ## Context
12
-
13
- The `hello` subcommand in `bin/cli.js` currently prints `Hello, <name>!`. A
14
- `--loud` flag gives users an emphatic variant without breaking the default.
15
- This is a low-risk edit used to calibrate trivial-tier fixture difficulty.
16
-
17
- ## Requirements
18
-
19
- - [ ] `node bin/cli.js hello --loud` prints `HELLO, WORLD!!` (everything uppercased, two trailing exclamation marks).
20
- - [ ] `node bin/cli.js hello --loud --name alice` prints `HELLO, ALICE!!`.
21
- - [ ] `node bin/cli.js hello` (no flag) still prints `Hello, world!` (unchanged).
22
- - [ ] `node bin/cli.js hello --name bob` still prints `Hello, bob!` (unchanged).
23
- - [ ] Existing tests continue to pass. Add at least one test covering the `--loud` path.
24
-
25
- ## Constraints
26
-
27
- - **No new npm dependencies.** Built-ins only.
28
- - **No silent catches.** If an unknown flag is passed, exit 1 with an informative message (same pattern as the existing `--name` handler).
29
- - **Surgical diff.** Only touch `bin/cli.js` and `tests/cli.test.js`. Do not reformat unrelated code.
30
-
31
-
32
- ## Out of Scope
33
-
34
- - Adding unrelated flags (`--quiet`, `--locale`, etc.).
35
- - Refactoring the existing argument parser.
36
- - Touching `server/`, `web/`, or `tests/server.test.js`.
37
-
38
- ## Verification
39
-
40
- - `node bin/cli.js hello` prints `Hello, world!` (exit 0).
41
- - `node bin/cli.js hello --loud` prints `HELLO, WORLD!!` (exit 0).
42
- - `node bin/cli.js hello --loud --name alice` prints `HELLO, ALICE!!` (exit 0).
43
- - `node --test tests/` passes all tests including the new `--loud` case.
44
- - `git diff --stat` shows only `bin/cli.js` and `tests/cli.test.js` touched.
@@ -1,8 +0,0 @@
1
- bench-test-repo의 CLI(bin/cli.js)에 있는 `hello` 서브커맨드에 `--loud` 플래그를 추가해주세요. `--loud`가 전달되면 인사말이 대문자로 바뀌고 느낌표 두 개로 끝나야 합니다.
2
-
3
- 예시:
4
- - `node bin/cli.js hello --loud` → `HELLO, WORLD!!`
5
- - `node bin/cli.js hello --loud --name alice` → `HELLO, ALICE!!`
6
- - `node bin/cli.js hello` → `Hello, world!` (기본값 변경 없음)
7
-
8
- 기존 테스트가 계속 통과하는지 확인하고, `--loud` 경로에 대한 테스트를 최소 하나 추가해주세요. 관련 없는 파일은 건드리지 마세요 — `bin/cli.js`와 `tests/cli.test.js`만 수정하세요. 새로운 npm 의존성은 추가하지 마세요.
@@ -1,8 +0,0 @@
1
- Add a --loud flag to the `hello` subcommand in bench-test-repo's CLI (bin/cli.js). When --loud is passed, the greeting is uppercased and ends with two exclamation marks.
2
-
3
- For example:
4
- - `node bin/cli.js hello --loud` → `HELLO, WORLD!!`
5
- - `node bin/cli.js hello --loud --name alice` → `HELLO, ALICE!!`
6
- - `node bin/cli.js hello` → `Hello, world!` (unchanged default)
7
-
8
- Make sure existing tests still pass and add at least one test for the --loud path. Don't touch unrelated files — only `bin/cli.js` and `tests/cli.test.js`. No new npm dependencies.
@@ -1,68 +0,0 @@
1
- # F10 — Notes
2
-
3
- ## Purpose
4
-
5
- Pair-discriminating high-risk fixture. Adds a write endpoint with persistent
6
- storage. The pair-edge mechanism: when an implementation reads-modifies-
7
- writes a JSON file in response to async requests, multiple in-flight POSTs
8
- can interleave during the await gap between read and write — producing
9
- duplicate ids or lost writes. A single-pass implementer typically writes
10
- the natural shape:
11
-
12
- ```js
13
- const data = JSON.parse(await fs.readFile(...));
14
- data.items.push({ id: data.items.length + 1, ...body });
15
- await fs.writeFile(...);
16
- ```
17
-
18
- This passes single-POST tests trivially. The failure only surfaces when
19
- multiple POSTs are in flight together. A reviewer with fresh eyes asking
20
- "what happens if two of these run at once?" catches it; the same model
21
- reviewing its own work tends to anchor on the "happy path" view.
22
-
23
- ## Failure modes detected
24
-
25
- - **Duplicate ids** from `length + 1` after concurrent reads.
26
- - **Lost writes** from last-writer-wins overwrite of in-flight POSTs.
27
- - **No persistence** — implementer keeps in-memory only, ignoring the
28
- restart-survival requirement. Caught by `data/items.json` byte check.
29
- - **Silent catch** wrapping the write path. Caught by forbidden_pattern.
30
-
31
- ## Pipeline exercise
32
-
33
- - Phase 1 BUILD: implementer must derive that an awaited file read-modify-
34
- write under parallel requests requires either serialization (mutex /
35
- queue) or a unique-id source independent of array length.
36
- - Phase 2 EVAL: scrutinizes whether the new tests exercise the close-
37
- together POST case rather than just single-POST happy path.
38
- - Phase 3 CRITIC: scope discipline + production-ready invariant on the
39
- consistency claim.
40
-
41
- ## Discrimination expectation
42
-
43
- Calibration target (set in pyx-memory project memory 2026-05-05):
44
-
45
- - bare arm: 40-65 (passes spec wording verbatim, fails parallel verifier).
46
- - solo arm: 60-78 (review pass may catch one mode, may miss another).
47
- - pair arm: 75-90 (cross-perspective derivation of the consistency
48
- invariant from the English "close together" wording).
49
-
50
- ## Public-spec wording — load-bearing
51
-
52
- The spec deliberately uses "close together" and "remain consistent"
53
- instead of trigger keywords. If the spec were to say "race condition",
54
- "concurrent", "atomic", or "lock", a single-pass solo arm would
55
- keyword-match the answer pattern and ace the fixture. The English
56
- prose forces invariant derivation, which is where pair has the edge.
57
-
58
- ## Rotation trigger
59
-
60
- Headroom run `20260507-f10-f11-tier1-full-pipeline` rejected this fixture as
61
- pair-lift evidence: bare scored 75 and solo_claude scored 94. Keep it as a
62
- concurrent persistence control unless the visible contract is reworked to
63
- expose lower bare/solo ceilings.
64
-
65
- Retire when both `bare` and `solo_claude` consistently land > 90 across two
66
- shipped versions, OR when "close-together-write" becomes a recognized pattern
67
- such that solo arm reliably reaches for a serializing mechanism on first read.
68
- Whichever comes first.
@@ -1,60 +0,0 @@
1
- {
2
- "verification_commands": [
3
- {
4
- "cmd": "node --test tests/server.test.js",
5
- "exit_code": 0,
6
- "stdout_contains": [],
7
- "stdout_not_contains": ["not ok "]
8
- },
9
- {
10
- "cmd": "node \"$BENCH_FIXTURE_DIR/verifiers/parallel.js\"",
11
- "exit_code": 0,
12
- "stdout_contains": ["\"ok\":true"],
13
- "stdout_not_contains": [],
14
- "contract_refs": [
15
- "After multiple POSTs (single or many at once), `GET /items` reflects every successful POST exactly once",
16
- "Several POSTs sent close together produce a list with every item, each with a distinct id"
17
- ]
18
- },
19
- {
20
- "cmd": "node \"$BENCH_FIXTURE_DIR/verifiers/invalid.js\"",
21
- "exit_code": 0,
22
- "stdout_contains": ["\"ok\":true"],
23
- "stdout_not_contains": [],
24
- "contract_refs": [
25
- "Invalid body (missing `name`, missing `qty`, `qty` not a positive number) → respond `400` with `{ error: 'invalid_body', field: '<name>' }`",
26
- "An invalid POST returns `400` and the persisted file is byte-identical to its pre-request contents."
27
- ]
28
- },
29
- {
30
- "cmd": "node -e 'const fs=require(\"fs\"); const d=JSON.parse(fs.readFileSync(\"data/items.json\",\"utf8\")); console.log(Array.isArray(d.items));'",
31
- "exit_code": 0,
32
- "stdout_contains": ["true"],
33
- "stdout_not_contains": ["false", "undefined"]
34
- }
35
- ],
36
- "forbidden_patterns": [
37
- {
38
- "pattern": "catch\\s*\\([^)]*\\)\\s*\\{[^}]*return\\s+(null|undefined|''|\\{\\})",
39
- "description": "silent catch returning fallback in write path",
40
- "files": ["server/index.js"],
41
- "severity": "disqualifier"
42
- },
43
- {
44
- "pattern": "catch\\s*\\([^)]*\\)\\s*\\{\\s*\\}",
45
- "description": "empty catch block",
46
- "files": ["server/index.js"],
47
- "severity": "disqualifier"
48
- },
49
- {
50
- "pattern": "/\\*\\s*eslint-disable",
51
- "description": "eslint-disable without scoped justification",
52
- "files": ["server/index.js"],
53
- "severity": "disqualifier"
54
- }
55
- ],
56
- "required_files": ["server/index.js", "tests/server.test.js", "data/items.json"],
57
- "forbidden_files": [],
58
- "max_deps_added": 0,
59
- "spec_output_files": ["server/index.js", "tests/server.test.js"]
60
- }
@@ -1,10 +0,0 @@
1
- {
2
- "id": "F10-persist-write-collision",
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 POST /items that appends a new entry and persists the full list to data/items.json. The list and its ids must remain consistent when multiple POSTs arrive close together — every saved item ends up with a unique numeric id and none are lost."
10
- }
@@ -1,17 +0,0 @@
1
- #!/usr/bin/env bash
2
- # F10 setup — seed data/items.json.
3
- set -e
4
-
5
- mkdir -p data
6
-
7
- # Seed with the same baseline the in-memory items started with.
8
- cat > data/items.json <<'JSON'
9
- {
10
- "items": [
11
- { "id": 1, "name": "alpha", "qty": 3 },
12
- { "id": 2, "name": "beta", "qty": 5 }
13
- ]
14
- }
15
- JSON
16
-
17
- exit 0
@@ -1,51 +0,0 @@
1
- ---
2
- id: "F10-persist-write-collision"
3
- title: "Add POST /items with persistent store"
4
- status: planned
5
- complexity: high
6
- depends-on: []
7
- ---
8
-
9
- # F10 Add POST /items with persistent store
10
-
11
- ## Context
12
-
13
- `server/index.js` currently keeps `items` in an in-memory array that
14
- resets on restart. The task: add `POST /items` that appends a new entry
15
- and persists the full list to `data/items.json` so state survives
16
- restarts. Read paths (`GET /items`, `GET /items/:id`) load from the same
17
- persisted file.
18
-
19
- The list and every saved item's `id` must remain consistent when
20
- multiple POSTs arrive close together — no duplicate ids, no lost writes.
21
-
22
- ## Requirements
23
-
24
- - [ ] `POST /items` accepts JSON body `{ name: string, qty: number }` and returns `201` with `{ item: { id, name, qty } }` on success.
25
- - [ ] `id` is a unique numeric value. Every successful POST returns an id no other item has, past or present.
26
- - [ ] After multiple POSTs (single or many at once), `GET /items` reflects every successful POST exactly once — `items.length` equals starting count plus successful POST count.
27
- - [ ] `data/items.json` on disk reflects the same state. Restarting the server preserves the items.
28
- - [ ] `GET /items` and `GET /items/:id` read from the persisted file (or from state initialized from it at startup, with all writes persisted before the response is returned).
29
- - [ ] Invalid body (missing `name`, missing `qty`, `qty` not a positive number) → respond `400` with `{ error: 'invalid_body', field: '<name>' }`. The persisted store must be unchanged after a 400 response.
30
- - [ ] `tests/server.test.js` is updated. Existing assertions still hold AND at least two new tests cover POST behavior, including a test that fires several POST requests close together and verifies the resulting list contains every item with distinct ids.
31
-
32
- ## Constraints
33
-
34
- - **No new npm dependencies.** Use only Express + Node built-ins (`fs/promises`).
35
- - **No silent catches.** Any `try/catch` in the write path must surface failure as `500` with a clear body, not return a fake success.
36
- - **No hardcoded ids.** Existing baseline ids (1, 2) remain valid; new ids must not collide with any past or present id.
37
- - **No breaking change** to `GET /items` shape or `GET /items/:id` semantics.
38
-
39
- ## Out of Scope
40
-
41
- - Authentication, rate limiting, validation libraries.
42
- - Database integration. The store is a single JSON file by design.
43
- - Touching `bin/cli.js`, `web/`, or `tests/cli.test.js`.
44
-
45
- ## Verification
46
-
47
- - `node --test tests/server.test.js` exits 0 and the new tests cover POST.
48
- - Several POSTs sent close together produce a list with every item, each with a distinct id — assertable from a small Node script that POSTs in parallel and reads back `GET /items`.
49
- - After server restart, items posted before the restart are still present in `GET /items`.
50
- - An invalid POST returns `400` and the persisted file is byte-identical to its pre-request contents.
51
- - `git diff --stat` shows only `server/index.js` and `tests/server.test.js` touched (the `data/items.json` seed comes from setup, not the arm).
@@ -1,9 +0,0 @@
1
- Add `POST /items` to `server/index.js` so users can append a new item with `{ name, qty }`. The full list should be persisted to `data/items.json` so state survives restarts — the existing read endpoints (`GET /items`, `GET /items/:id`) should also use the same persisted file going forward.
2
-
3
- Every saved item must have a unique numeric id. If two or more POSTs arrive close together, the resulting list must contain every successful one with distinct ids — no duplicates, nothing lost.
4
-
5
- Invalid body (missing `name`, missing `qty`, `qty` not a positive number) → respond `400` with `{ error: 'invalid_body', field: '<name>' }`, and the persisted store must be unchanged after the 400.
6
-
7
- Update `tests/server.test.js` so existing tests still pass AND add at least two new tests covering POST behavior. One of them must fire several POSTs close together and verify the final list contains every item with distinct ids.
8
-
9
- No new npm dependencies. Only touch `server/index.js`, `tests/server.test.js`, and `data/items.json` (which is seeded for you).
@@ -1,29 +0,0 @@
1
- 'use strict';
2
- const fs = require('fs');
3
- const http = require('http');
4
- const path = require('path');
5
- const { app } = require(path.join(process.env.BENCH_WORKDIR, 'server'));
6
-
7
- const before = fs.readFileSync('data/items.json');
8
-
9
- const s = http.createServer(app).listen(0, () => {
10
- const { port } = s.address();
11
- const req = http.request(
12
- { host: '127.0.0.1', port, method: 'POST', path: '/items',
13
- headers: { 'Content-Type': 'application/json' } },
14
- (r) => {
15
- let b = '';
16
- r.on('data', (c) => (b += c));
17
- r.on('end', () => {
18
- const after = fs.readFileSync('data/items.json');
19
- const same = before.equals(after);
20
- const ok = r.statusCode === 400 && same;
21
- console.log(JSON.stringify({ status: r.statusCode, store_unchanged: same, ok }));
22
- s.close();
23
- process.exit(ok ? 0 : 1);
24
- });
25
- }
26
- );
27
- req.write(JSON.stringify({ name: 'noqty' }));
28
- req.end();
29
- });
@@ -1,50 +0,0 @@
1
- 'use strict';
2
- const http = require('http');
3
- const path = require('path');
4
- const { app } = require(path.join(process.env.BENCH_WORKDIR, 'server'));
5
-
6
- const s = http.createServer(app).listen(0, () => {
7
- const { port } = s.address();
8
- const post = (body) => new Promise((resolve) => {
9
- const req = http.request(
10
- { host: '127.0.0.1', port, method: 'POST', path: '/items',
11
- headers: { 'Content-Type': 'application/json' } },
12
- (r) => {
13
- let b = '';
14
- r.on('data', (c) => (b += c));
15
- r.on('end', () => resolve({ status: r.statusCode, body: b ? safeJson(b) : null }));
16
- }
17
- );
18
- req.on('error', () => resolve({ status: 0, body: null }));
19
- req.write(JSON.stringify(body));
20
- req.end();
21
- });
22
-
23
- Promise.all([
24
- post({ name: 'gamma', qty: 1 }),
25
- post({ name: 'delta', qty: 2 }),
26
- post({ name: 'epsilon', qty: 3 }),
27
- ]).then(async (results) => {
28
- await new Promise((r) => setTimeout(r, 250));
29
- http.get(`http://127.0.0.1:${port}/items`, (r) => {
30
- let b = '';
31
- r.on('data', (c) => (b += c));
32
- r.on('end', () => {
33
- let data;
34
- try { data = JSON.parse(b); } catch { data = { items: [] }; }
35
- const items = Array.isArray(data.items) ? data.items : [];
36
- const ids = items.map((i) => i && i.id);
37
- const uniq = new Set(ids).size;
38
- const allPosted = results.every((x) => x.status === 201);
39
- const ok = allPosted && items.length === 5 && uniq === 5;
40
- console.log(JSON.stringify({
41
- len: items.length, uniq, status: results.map((r) => r.status), ok,
42
- }));
43
- s.close();
44
- process.exit(ok ? 0 : 1);
45
- });
46
- });
47
- });
48
- });
49
-
50
- function safeJson(s) { try { return JSON.parse(s); } catch { return null; } }