devlyn-cli 3.2.1 → 3.3.1

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 +8 -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 +660 -150
  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 +47 -38
  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
package/AGENTS.md CHANGED
@@ -38,11 +38,11 @@ Each skill's `SKILL.md` is the source of truth for flags and workflow. Do not du
38
38
 
39
39
  Engine roles: orchestrator = whichever CLI the user opened (this contract is symmetric with CLAUDE.md. If you are Codex orchestrating `/devlyn:resolve`, the phase machinery is mandatory regardless of task size; if you will not run it, say so explicitly and stop — do not silently degrade to ad-hoc execution); legacy executor (with optional separate worker/primary/pair profiles) uses the canonical skill's orchestrator-supported default, overridable per run with `--engine <name>` or durably via machine-local `.devlyn/engines.json` `{"executor": "<name>", "pair_judge_priority": ["<name>", ...]}`; PLAN is orchestrator-fixed and never inherits `--engine` or the executor pin; pair judge = first available OTHER engine, default for VERIFY whenever available; risk probes remain conditional and --no-pair opts out. Pins fail closed (`BLOCKED:<engine>-unavailable` / `BLOCKED:invalid-engine-config`); new engines plug in by shipping `_shared/adapters/<name>.md`. `/devlyn:engines` (no args) shows the role table + detected engines; `executor <name>` / `pair <name>,...` / `clear` manage the pins. The executor pin binds the orchestrator in plain conversation too, not only inside a skill run: when you would implement directly and executor is pinned to a non-default engine, route that work through the pin — via `/devlyn:resolve` (reads it at PHASE 0) or by delegating to that engine; no pin / no file → use the canonical skill's orchestrator-supported default. The pair-judge pin stays pipeline-scoped. `/devlyn:engines role` configures explicit engine/model/effort for supported worker and judge routes; `/devlyn:resolve --role-config <path>` overrides roles for one run. Canonical skills define precedence, evidence and unsupported-route errors; absent profiles preserve existing defaults.
40
40
 
41
- Conversational entry: Before loading a workflow or writing files, inspect the requested change and relevant callers/tests. Quoted phase names, past logs and skill-file paths are context, not an instruction to invoke that workflow; follow the current user request. Default to direct execution when inspection makes the requested behavior, affected boundaries and verification tractable in the current context, including bounded multi-file work. Preserve requested behavior, scope, explicit constraints and the executor pin; make scoped edits, run required checks, review the final diff, and report changes with evidence. One concise route/check explanation suffices; ordinary direct work needs no spec, pipeline state, phase workers or extra approval. For direct/full/queue work, the outer owner reads `references/task-completion.md` relative to the installed `devlyn:resolve` skill's directory: prospective task-branch ownership (linked worktree optional), scoped commit acceptance, then PR/merge and recoverable owned-resource cleanup after required archive/queue commits. Local-only/no-push wins; delivery pending/failure stays separate from product verification.
41
+ Conversational entry: Before loading a workflow or writing files, inspect the requested change and relevant callers/tests. Quoted phase names, past logs and skill-file paths are context, not an instruction to invoke that workflow; follow the current user request. Default to direct execution when inspection makes the requested behavior, affected boundaries and verification tractable in the current context, including bounded multi-file work. Preserve requested behavior, scope, explicit constraints and the executor pin; make scoped edits, run required checks, review the final diff, and report changes with evidence. One concise route/check explanation suffices; ordinary direct work needs no spec, pipeline state, phase workers or extra approval. For direct/full/queue work, the outer owner reads `references/task-completion.md` relative to the installed `devlyn:resolve` skill's directory: prospective task-branch ownership (own linked worktree), scoped commit acceptance, then PR/merge and recoverable owned-resource cleanup after required archive/queue commits. Local-only/no-push wins; delivery pending/failure stays separate from product verification.
42
42
 
43
43
  Use full `/devlyn:resolve` automatically only when inspection identifies interacting requirements or verification work too complex to manage reliably in the current context, such as coupled durable state, concurrent ownership and failure recovery across boundaries. Name the concrete interaction or verification gap. Domain labels (security/auth/payment/persistence/concurrency/API), file count and a spec document alone do not trigger it. Investigate or clarify missing intent/access first; a pipeline cannot supply them. Direct work still requires risk-proportionate checks and independent review for consequential changes. Explicit resolve (even small), explicit spec-mode workflows and queue drains retain all canonical phases, independent verification, pins and failure handling. If the full-route condition emerges mid-edit, carry the existing delta into its scope/evidence; do not reset the baseline or reconfirm existing authorization.
44
44
 
45
- Full-route handoff + loop engineering: the orchestrating model — not the user — invokes the skills. `/devlyn:queue` fronts the intent queue (`docs/specs/queue.md`): no args = status, `add <intent>`, `drain` = serial unattended drain per the contract below. Work selected for full resolve is written to `docs/specs/<id>/spec.md` (always a spec file — the user's reviewed contract; free-form large assumes-and-logs instead of halting, zero-scope-signal goals still halt to ideate), summarized once for user review, then run hands-free via `--spec`. Outer loop per task: before the first full run, commit the scoped queue-item delta (when applicable) and linked spec bundle; findings-backed verdicts (NEEDS_WORK, verify/build-gate exhaustion) get a committed spec amendment before re-run, max 3 iterations; infrastructure / invalid-input / engine-availability / implement-empty BLOCKED verdicts surface immediately. Unattended queue drain (`docs/specs/queue.md`, strictly serial): assumptions may only take scope-narrowing, reversible, non-user-visible defaults — material ambiguity marks the item `[F] needs-review`; commit every terminal `[x]` / `[F]` transition before advancing. The canonical commit order is `config/skills/devlyn:resolve/references/outer-loop.md`.
45
+ Full-route handoff + loop engineering: the orchestrating model — not the user — invokes the skills. `/devlyn:queue` fronts the intent queue (`docs/specs/queue.md`): no args = status, `add <intent>`, `drain` = serial unattended drain per the contract below. Work selected for full resolve is written to `docs/specs/<id>/spec.md` (always a spec file — the user's reviewed contract; free-form large assumes-and-logs instead of halting, zero-scope-signal goals still halt to ideate), summarized once for user review, then run hands-free via `--spec`. Outer loop per task: before the first full run, commit the scoped queue-item delta (when applicable) and linked spec bundle; findings-backed verdicts (NEEDS_WORK, BLOCKED:repair-budget-exhausted) get a committed spec amendment before re-run, max 3 iterations; infrastructure / invalid-input / engine-availability / implement-empty BLOCKED verdicts surface immediately. Unattended queue drain (`docs/specs/queue.md`, strictly serial): assumptions may only take scope-narrowing, reversible, non-user-visible defaults — material ambiguity marks the item `[F] needs-review`; commit every terminal `[x]` / `[F]` transition before advancing. The canonical commit order is `config/skills/devlyn:resolve/references/outer-loop.md`.
46
46
 
47
47
  ## Subtractive-First Editing
48
48
 
package/CLAUDE.md CHANGED
@@ -51,7 +51,7 @@ Each skill's `SKILL.md` is the source of truth for its flags and workflow — do
51
51
 
52
52
  ### Conversational entry + full-route handoff
53
53
 
54
- Before loading a workflow or writing files, inspect the requested change and relevant callers/tests. Quoted phase names, past logs and skill-file paths are context, not an instruction to invoke that workflow; follow the current user request. Default to direct execution when inspection makes the requested behavior, affected boundaries and verification tractable in the current context, including bounded multi-file work. Preserve requested behavior, scope, explicit constraints and the executor pin; make scoped edits, run required checks, review the final diff, and report changes with evidence. One concise route/check explanation suffices; ordinary direct work needs no spec, pipeline state, phase workers or extra approval. For direct/full/queue work, the outer owner reads `references/task-completion.md` relative to the installed `devlyn:resolve` skill's directory: prospective task-branch ownership (linked worktree optional), scoped commit acceptance, then PR/merge and recoverable owned-resource cleanup after required archive/queue commits. Local-only/no-push wins; delivery pending/failure stays separate from product verification.
54
+ Before loading a workflow or writing files, inspect the requested change and relevant callers/tests. Quoted phase names, past logs and skill-file paths are context, not an instruction to invoke that workflow; follow the current user request. Default to direct execution when inspection makes the requested behavior, affected boundaries and verification tractable in the current context, including bounded multi-file work. Preserve requested behavior, scope, explicit constraints and the executor pin; make scoped edits, run required checks, review the final diff, and report changes with evidence. One concise route/check explanation suffices; ordinary direct work needs no spec, pipeline state, phase workers or extra approval. For direct/full/queue work, the outer owner reads `references/task-completion.md` relative to the installed `devlyn:resolve` skill's directory: prospective task-branch ownership (own linked worktree), scoped commit acceptance, then PR/merge and recoverable owned-resource cleanup after required archive/queue commits. Local-only/no-push wins; delivery pending/failure stays separate from product verification.
55
55
 
56
56
  Use full `/devlyn:resolve` automatically only when inspection identifies interacting requirements or verification work too complex to manage reliably in the current context, such as coupled durable state, concurrent ownership and failure recovery across boundaries. Name the concrete interaction or verification gap. Domain labels (security/auth/payment/persistence/concurrency/API), file count and a spec document alone do not trigger it. Investigate or clarify missing intent/access first; a pipeline cannot supply them. Direct work still requires risk-proportionate checks and independent review for consequential changes. Explicit resolve (even small), explicit spec-mode workflows and queue drains retain all canonical phases, independent verification, pins and failure handling. If the full-route condition emerges mid-edit, carry the existing delta into its scope/evidence; do not reset the baseline or reconfirm existing authorization.
57
57
 
@@ -60,7 +60,7 @@ The user does not invoke skills manually; the orchestrating model does. For work
60
60
  1. Write the agreed contract to `docs/specs/<id>/spec.md` (+ `spec.expected.json` when mechanical verifications exist). Use a spec file for the selected work — a written spec is the user's reviewed contract; free-form large now assumes-and-logs instead of halting (zero-scope-signal goals still halt to ideate).
61
61
  2. Present a one-screen plan-contract summary — the user's single review checkpoint, BEFORE the pipeline starts.
62
62
  3. On go-ahead, commit the scoped queue-item delta (when applicable) and linked spec bundle, then invoke `/devlyn:resolve --spec <path>` hands-free to completion.
63
- 4. **Per-task outer loop**: read the terminal verdict. Successful normal-run archive → outer-owner completion per the canonical task-completion reference, after any terminal queue commit. Verdicts backed by spec/verification findings (NEEDS_WORK, verify/build-gate exhaustion) → adjudicate the findings, amend the spec (recorded in the spec file; spec stays read-only inside a run), commit that scoped amendment, then re-invoke — at most 3 outer iterations, then surface with the findings trail. Infrastructure, invalid-input, engine-availability, and implement-empty BLOCKED verdicts are not spec-amendable: surface immediately. Every iteration re-enters through committed durable artifacts (spec, findings, run archive), never conversation memory.
63
+ 4. **Per-task outer loop**: read the terminal verdict. Successful normal-run archive → outer-owner completion per the canonical task-completion reference, after any terminal queue commit. Verdicts backed by spec/verification findings (NEEDS_WORK, BLOCKED:repair-budget-exhausted) → adjudicate the findings, amend the spec (recorded in the spec file; spec stays read-only inside a run), commit that scoped amendment, then re-invoke — at most 3 outer iterations, then surface with the findings trail. Infrastructure, invalid-input, engine-availability, and implement-empty BLOCKED verdicts are not spec-amendable: surface immediately. Every iteration re-enters through committed durable artifacts (spec, findings, run archive), never conversation memory.
64
64
 
65
65
  **Intent queue (unattended drain)**: the user stacks intents in `docs/specs/queue.md` (ordered checklist; `/devlyn:queue` is the front-end — no args shows status, `add <intent>` appends, `drain` starts the serial drain). Drain strictly serially — per item: spec it, commit the scoped owner baseline, run the outer loop, mark `[x]` done or `[F]` blocked with reason, commit that terminal transition, then complete eligible delivery once. Retain PR/pending workspaces; unavailable separate safe placement stops the drain with remaining items pending. A product-blocked item otherwise never halts the queue. The queue entry is the user's go-ahead, so assume-and-log replaces the interactive checkpoint — but unattended assumptions may only take scope-narrowing, reversible, non-user-visible defaults. Material ambiguity (user-visible behavior, data/state semantics, new files/scripts/flags, implementation surface) → mark `[F] needs-review`, commit it, and move on. End the drain with a per-item product verdict, separate delivery status/URL/resume and assumptions report. The canonical commit order is `config/skills/devlyn:resolve/references/outer-loop.md`.
66
66
 
package/README.md CHANGED
@@ -84,27 +84,14 @@ PLAN → IMPLEMENT → BUILD_GATE → CLEANUP → VERIFY (fresh subagent
84
84
  Common flags: `--engine claude|codex|omp` (default: the orchestrator-supported default), `--role-config <path>` (one-run worker/judge profiles, see below), `--bypass build-gate,cleanup`, `--pair-verify` (force pair-mode JUDGE in VERIFY), `--no-pair` (intentional solo VERIFY), `--risk-probes` / `--no-risk-probes`, `--perf` (per-phase timing).
85
85
  `--pair-verify` and `--no-pair` are mutually exclusive; using both stops with `BLOCKED:invalid-flags`.
86
86
 
87
- Free-form goals that ask for benchmark evidence, pair-evidence, risk-probe
88
- measurement, `solo<pair` proof, or solo-headroom work must include an
89
- actionable `solo-headroom hypothesis` naming the visible behavior `solo_claude`
90
- is expected to miss plus a backticked observable command; the backticked line
91
- itself must contain `miss` and be framed as the command/observable that exposes it. Without that,
92
- `/devlyn:resolve` stops with `BLOCKED:solo-headroom-hypothesis-required` and
93
- points you to `/devlyn:ideate` instead of inventing a weak hypothesis.
94
- Free-form goals that add or run a new unmeasured benchmark, shadow fixture,
95
- golden fixture, risk-probe, or pair-evidence candidate must also include
96
- `solo ceiling avoidance`, mention `solo_claude`, and name the concrete
97
- difference from rejected or solo-saturated controls such as `S2`-`S6`; without
98
- that, `/devlyn:resolve` stops with `BLOCKED:solo-ceiling-avoidance-required`.
99
-
100
- Accepted tasks default to owner completion: scoped commit → push → PR → normal
101
- protected merge → recoverable cleanup of prospectively owned resources. Set
102
- `git config --local devlyn.completionMode pr` to stop at a PR, or `auto` to restore
103
- the default; `task-complete.py complete --mode auto|pr` overrides one task.
104
- Local-only/no-push instructions take precedence. Linked worktrees are optional;
105
- existing branches cannot be adopted. Full runs require successful archive before
106
- delivery; direct tasks use their actual checks and root acceptance. Verify-only
107
- never publishes. Pending checks or unsupported merge policy retain resources and
87
+ Each task gets its own linked worktree; accepted tasks default to scoped commit → push → PR
88
+ → merge when the repository allows it (otherwise the PR waits for a person). After the
89
+ PR merges, the worktree and branch its session released are cleaned; anything in use is
90
+ kept. Set `git config --local devlyn.completionMode pr` to stop at the PR; `task-complete.py complete --mode auto|pr`
91
+ overrides one task. Local-only/no-push instructions take precedence; existing
92
+ branches cannot be adopted. Full runs require successful archive before delivery;
93
+ direct tasks use their actual checks and root acceptance. Verify-only never
94
+ publishes. Pending checks or unsupported merge policy retain resources and
108
95
  report a receipt-based resume command separately from product verification.
109
96
  See [task completion](config/skills/devlyn:resolve/references/task-completion.md)
110
97
  for allocation, acceptance, writer cessation and recovery.
@@ -157,74 +144,6 @@ Pin roles durably with `/devlyn:engines` (no args shows the role table + detecte
157
144
 
158
145
  If an engine is absent when explicitly selected by flag, pin, or role profile, or OTHER engine is absent under `--pair-verify`, the harness stops with `BLOCKED:<engine>-unavailable` and prints setup guidance. Automatic VERIFY absence is a reported solo route. Use `--no-pair` only when intentionally accepting solo VERIFY; use `--no-risk-probes` only when intentionally disabling automatic high-risk probes.
159
146
 
160
- ### Benchmark score runs
161
-
162
- Use the benchmark CLI when a change claims `solo_claude < pair`. The score-focused runners print the run id, startup gate lines, blind-judge score tables, fixture pair margins, average pair margin, wall-time ratio, and failure reasons:
163
-
164
- ```bash
165
- npx devlyn-cli benchmark headroom --min-fixtures 3 F16-cli-quote-tax-rules F23-cli-fulfillment-wave F25-cli-cart-promotion-rules
166
- npx devlyn-cli benchmark recent
167
- npx devlyn-cli benchmark recent --out-md /tmp/devlyn-recent-benchmark.md
168
- npx devlyn-cli benchmark frontier --out-md /tmp/devlyn-pair-frontier.md
169
- npx devlyn-cli benchmark audit --out-dir /tmp/devlyn-benchmark-audit
170
- npx devlyn-cli benchmark audit-headroom --out-json /tmp/devlyn-headroom-audit.json
171
- npx devlyn-cli benchmark pair --min-fixtures 3 --max-pair-solo-wall-ratio 3 F16-cli-quote-tax-rules F23-cli-fulfillment-wave F25-cli-cart-promotion-rules
172
- ```
173
-
174
- `benchmark recent` prints a compact, wrap-safe snapshot of the current local
175
- pair evidence: status counts, pair-lift aggregates, and one card per passing
176
- pair-evidence fixture. It intentionally avoids wide Markdown tables, so the
177
- same output stays readable in narrow terminals, PR comments, and release notes.
178
- `benchmark frontier` also prints a stdout score summary for existing complete pair
179
- evidence rows, including pair arm, trigger reasons, average/minimum pair margin,
180
- and wall ratio, plus row-level verdicts even when `--out-json` or `--out-md`
181
- writes an artifact. Markdown frontier artifacts include a `Triggers` column.
182
- Full-pipeline pair gate artifacts record `require_hypothesis_trigger` in JSON
183
- and include a Markdown `Hypothesis trigger` column, so strict regenerated
184
- evidence shows whether each row carried `spec.solo_headroom_hypothesis`.
185
- `benchmark audit` is the provider-free release/handoff guard: it writes
186
- `audit.json` with the frontier summary, artifact map, and compact trigger-backed verdict-bearing `pair_evidence_rows`
187
- (each row carries `pair_trigger_eligible: true`, non-empty `pair_trigger_reasons`, `pair_trigger_has_canonical_reason: true`, and `pair_trigger_has_hypothesis_reason`; the audit fails rows missing trigger reasons or missing actionable solo-headroom hypotheses in fixture `spec.md` whose observable command matches `expected.json`), runs the frontier with
188
- `--fail-on-unmeasured`, requires at least four fixtures with passing pair evidence,
189
- revalidates frontier `verdict: PASS`, zero unmeasured candidates, and revalidates `pair_mode: true`,
190
- the default 5-point pair margin, and 3x pair/solo wall ratio, then
191
- audits failed headroom results. The audit stdout also prints
192
- `headroom_rejections=...`, `pair_evidence_quality=...`,
193
- `pair_trigger_reasons=...`, `pair_evidence_hypotheses=...`, and
194
- `pair_evidence_hypothesis_triggers=...` handoff rows, plus
195
- `pair_trigger_historical_aliases=...` when archived evidence includes legacy
196
- trigger aliases and `pair_evidence_hypothesis_trigger_gaps=...` when documented
197
- hypotheses have not yet propagated into trigger reasons, with the rejected-fixture
198
- coverage counts plus actual minimum pair margin, maximum pair/solo wall ratio,
199
- and canonical trigger reason coverage plus row-match status.
200
- The compact evidence row count must match the frontier evidence count,
201
- `checks.frontier_stdout` records summary, aggregate, final-verdict, expected, printed score-row, trigger-visible row, and hypothesis-trigger-visible row counts,
202
- `checks.headroom_rejections` records child verdict plus unrecorded/unsupported counts,
203
- `checks.pair_evidence_quality` records the same quality thresholds from the compact rows,
204
- `checks.pair_trigger_reasons` records canonical/historical-alias/exposed/total trigger-reason row counts, fixture-level historical alias details, summary count, and row-match status,
205
- `checks.pair_evidence_hypotheses` records documented/total pair-evidence hypothesis row counts,
206
- and `checks.pair_evidence_hypothesis_triggers` records whether documented hypotheses also appear as `spec.solo_headroom_hypothesis` trigger reasons plus fixture-level gap details
207
- so incomplete or low-quality local score artifacts cannot inflate the claim.
208
- Add `--require-hypothesis-trigger` to turn those hypothesis-trigger gaps from
209
- archived-evidence WARN rows into release-blocking FAIL rows for newly
210
- regenerated pair evidence.
211
-
212
- ```bash
213
- npx devlyn-cli benchmark audit --require-hypothesis-trigger --out-dir /tmp/devlyn-benchmark-audit-strict
214
- ```
215
-
216
- Historical trigger aliases are only reported for archived artifact review; new
217
- current pair-evidence gates fail historical-only or unknown trigger reasons and
218
- require at least one canonical `pair_trigger.reasons` entry.
219
- `benchmark audit-headroom` fails if an active failed headroom fixture is missing
220
- from both rejected registry and passing pair evidence.
221
- Headroom runs use the current claim gate: `bare <= 60`, `solo_claude <= 80`,
222
- and the default 5-point `bare`/`solo_claude` headroom margins before spending a pair arm.
223
- Add `--dry-run` to either score runner to validate args, fixture ids, minimum
224
- fixture count, and the replay command without running arms or judges. Dry-runs
225
- and lint prove wiring only; real score claims must cite the run id and fixture
226
- ids.
227
-
228
147
  ### Migration from earlier versions
229
148
 
230
149
  Reinstall with the new version to refresh instructions and skills for the selected
@@ -260,19 +179,6 @@ Earlier versions of devlyn-cli shipped 16+ slash commands. The iter-0034 Phase 4
260
179
 
261
180
  ---
262
181
 
263
- ## Auto-Activated Skills
264
-
265
- These activate automatically — no commands needed. They shape how Claude thinks during relevant tasks.
266
-
267
- | Skill | Activates During |
268
- |---|---|
269
- | `root-cause-analysis` | Debugging — enforces 5 Whys, evidence standards |
270
- | `code-review-standards` | Reviews — severity framework, approval criteria |
271
- | `ui-implementation-standards` | UI work — design fidelity, accessibility, responsiveness |
272
- | `code-health-standards` | Maintenance — dead code prevention, complexity thresholds |
273
-
274
- ---
275
-
276
182
  ## Optional Add-ons
277
183
 
278
184
  Selected during install. Run `npx devlyn-cli` again to add more.
@@ -292,6 +198,10 @@ Selected during install. Run `npx devlyn-cli` again to add more.
292
198
  | `devlyn:pencil-pull` | Pull Pencil designs into code |
293
199
  | `devlyn:pencil-push` | Push codebase UI to Pencil canvas |
294
200
  | `devlyn:reap` | Safely reap orphaned MCP / codex / Superset child processes |
201
+ | `code-health-standards` | Maintainability standards — dead code, dependencies, complexity, naming |
202
+ | `code-review-standards` | Severity framework and approval criteria for reviews |
203
+ | `root-cause-analysis` | Evidence-first why-chain debugging |
204
+ | `ui-implementation-standards` | UI quality bar — design tokens, accessibility, state coverage, responsive layout |
295
205
 
296
206
  </details>
297
207
 
package/bin/devlyn.js CHANGED
@@ -13,8 +13,7 @@ const { updateInstructions, InstructionError } = require('./instructions');
13
13
 
14
14
  // The devlyn skill bundle installed into every skill-capable agent's loader
15
15
  // directory. Single source of truth so codex/omp/pi stay in lockstep — adding a
16
- // skill here installs it everywhere. Standards skills (code-*, root-cause-*,
17
- // ui-*) stay Claude-core-only, matching the pre-existing Codex bundle.
16
+ // skill here installs it everywhere.
18
17
  const DEVLYN_CORE_SKILLS = ['devlyn:resolve', 'devlyn:ideate', 'devlyn:design-ui', 'devlyn:engines', 'devlyn:queue', '_shared'];
19
18
  const DEVLYN_SKILL_DIR_STAMP = '__DEVLYN_SKILL_DIR__';
20
19
  const DEVLYN_INSTALL_MARKER = '.devlyn-install.json';
@@ -169,6 +168,11 @@ const DEPRECATED_DIRS = [
169
168
  // upgrade so users only have them if they opt in via the interactive
170
169
  // installer (matches the pencil-pull / pencil-push pattern).
171
170
  'skills/devlyn:reap',
171
+ // 0221 Session 1: standards skills moved to optional-skills/ (opt-in).
172
+ 'skills/code-health-standards',
173
+ 'skills/code-review-standards',
174
+ 'skills/root-cause-analysis',
175
+ 'skills/ui-implementation-standards',
172
176
  // Deleted entirely on 2026-05-14 (devlyn:team-design-ui merged into
173
177
  // devlyn:design-ui; devlyn:design-system removed outright). Entries kept
174
178
  // so users who previously opted in get their stale copies purged on upgrade.
@@ -237,6 +241,10 @@ const OPTIONAL_ADDONS = [
237
241
  { name: 'devlyn:pencil-pull', desc: 'Pull Pencil designs into code with exact visual fidelity', type: 'local' },
238
242
  { name: 'devlyn:pencil-push', desc: 'Push codebase UI to Pencil canvas for design sync', type: 'local' },
239
243
  { name: 'devlyn:reap', desc: 'Safely reap orphaned MCP / codex / Superset child processes left behind by long Claude sessions', type: 'local' },
244
+ { name: 'code-health-standards', desc: 'Maintainability standards — dead code, dependencies, complexity, naming, hygiene', type: 'local' },
245
+ { name: 'code-review-standards', desc: 'Severity framework and approval criteria for reviewing a change', type: 'local' },
246
+ { name: 'root-cause-analysis', desc: 'Evidence-first why-chain debugging to the actionable root cause', type: 'local' },
247
+ { name: 'ui-implementation-standards', desc: 'UI quality bar — design tokens, WCAG 2.1 AA, state coverage, responsive layout', type: 'local' },
240
248
  // External skill packs (installed via npx skills add)
241
249
  { name: 'vercel-labs/agent-skills', desc: 'React, Next.js, React Native best practices', type: 'external' },
242
250
  { name: 'supabase/agent-skills', desc: 'Supabase integration patterns', type: 'external' },
@@ -660,7 +668,7 @@ function detectOtherCLIs() {
660
668
  return detected;
661
669
  }
662
670
 
663
- // Install devlyn:resolve + devlyn:ideate + devlyn:design-ui + _shared skills into a CLI's
671
+ // Install DEVLYN_CORE_SKILLS into a CLI's
664
672
  // global skills directory (e.g. ~/.codex/skills/). Returns count of skills
665
673
  // copied. Skipped silently for CLIs without a skillsDir (e.g. cursor, copilot
666
674
  // at the time of writing — they don't have an analogous skill-loader).
@@ -722,7 +730,7 @@ function installAgentsForCLI(cliKey) {
722
730
  const instr = installInstructionsForCLI(cliKey);
723
731
  const skillsCopied = installSkillsForCLI(cliKey);
724
732
  if (skillsCopied > 0) {
725
- log(` → ${skillsCopied} skill${skillsCopied > 1 ? 's' : ''} installed (devlyn:resolve / devlyn:ideate / devlyn:design-ui / _shared)`, 'dim');
733
+ log(` → ${skillsCopied} skill${skillsCopied > 1 ? 's' : ''} installed (${DEVLYN_CORE_SKILLS.join(' / ')})`, 'dim');
726
734
  }
727
735
  return instr || skillsCopied > 0;
728
736
  }
@@ -928,19 +936,11 @@ function installClaudeCore() {
928
936
  // Configure global Claude Code settings (~/.claude/settings.json)
929
937
  // Project settings may refer to this same file; merge the latest bytes.
930
938
  const globalSettings = readGlobalSettings();
931
- let globalSettingsChanged = false;
932
- if (!globalSettings.env.CLAUDE_CODE_DISABLE_ADAPTIVE_THINKING) {
933
- globalSettings.env.CLAUDE_CODE_DISABLE_ADAPTIVE_THINKING = '1';
934
- globalSettingsChanged = true;
935
- }
936
939
  if (!globalSettings.env.ENABLE_PROMPT_CACHING_1H) {
937
940
  globalSettings.env.ENABLE_PROMPT_CACHING_1H = 'true';
938
- globalSettingsChanged = true;
939
- }
940
- if (globalSettingsChanged) {
941
941
  if (!fs.existsSync(globalClaudeDir)) fs.mkdirSync(globalClaudeDir, { recursive: true });
942
942
  fs.writeFileSync(globalSettingsPath, JSON.stringify(globalSettings, null, 2) + '\n');
943
- log(' → ~/.claude/settings.json (disabled adaptive thinking, enabled 1h prompt caching)', 'dim');
943
+ log(' → ~/.claude/settings.json (enabled 1h prompt caching)', 'dim');
944
944
  }
945
945
 
946
946
  log('\n✅ Claude Code config installed!', 'green');
@@ -1022,15 +1022,6 @@ function showHelp() {
1022
1022
  log(' npx devlyn-cli -y Install Claude core without prompts');
1023
1023
  log(' npx devlyn-cli agents Install agents for detected CLIs');
1024
1024
  log(' npx devlyn-cli agents all Install agents for all supported CLIs');
1025
- log(' npx devlyn-cli benchmark Run the resolve benchmark suite');
1026
- log(' npx devlyn-cli benchmark recent Show compact recent benchmark results');
1027
- log(' npx devlyn-cli benchmark frontier Show pair candidate frontier scores/triggers without providers');
1028
- log(' npx devlyn-cli benchmark audit Audit pair evidence readiness');
1029
- log(' npx devlyn-cli benchmark audit-headroom Audit failed headroom results');
1030
- log(' npx devlyn-cli benchmark headroom <fixtures...> Score bare vs solo_claude headroom');
1031
- log(' npx devlyn-cli benchmark pair <fixtures...> Score solo_claude vs pair path');
1032
- log(' npx devlyn-cli benchmark --bless If ship-gate passes, promote baseline');
1033
- log(' npx devlyn-cli benchmark --dry-run Validate suite setup without model invocation');
1034
1025
  log(' npx devlyn-cli --help Show this help\n');
1035
1026
  log('Optional skills (select during install):', 'green');
1036
1027
  OPTIONAL_ADDONS.filter((a) => a.type === 'local').forEach((skill) => {
@@ -1051,170 +1042,6 @@ function showHelp() {
1051
1042
  log('');
1052
1043
  }
1053
1044
 
1054
- function showBenchmarkHelp() {
1055
- log('Usage:', 'green');
1056
- log(' npx devlyn-cli benchmark [suite] [options] [fixtures...]');
1057
- log(' npx devlyn-cli benchmark recent [options]');
1058
- log(' npx devlyn-cli benchmark frontier [options]');
1059
- log(' npx devlyn-cli benchmark audit [options]');
1060
- log(' npx devlyn-cli benchmark audit-headroom [options]');
1061
- log(' npx devlyn-cli benchmark headroom [options] <fixtures...>');
1062
- log(' npx devlyn-cli benchmark pair [options] <fixtures...>');
1063
- log('');
1064
- log('Score-focused runs:', 'green');
1065
- log(' recent Show compact, wrap-safe recent benchmark results');
1066
- log(' frontier Show active rejected/evidence/unmeasured pair candidates, scores, and triggers without providers');
1067
- log(' audit Fail on unmeasured pair candidates and invalid headroom rejections');
1068
- log(' Prints frontier score rows plus headroom and pair quality handoff rows');
1069
- log(' audit-headroom Fail on active failed or unsupported headroom rejections');
1070
- log(' headroom Score bare vs solo_claude before spending the pair arm');
1071
- log(' pair Score solo_claude vs the selected pair path and print gate tables');
1072
- log('');
1073
- log('Shadow suite:', 'green');
1074
- log(' npx devlyn-cli benchmark suite --suite shadow --dry-run');
1075
- log(' Lists shadow tasks only; use headroom/pair with explicit S* ids for real measurement');
1076
- log('');
1077
- log('Examples:', 'green');
1078
- log(' npx devlyn-cli benchmark --dry-run F1-cli-trivial-flag');
1079
- log(' npx devlyn-cli benchmark recent');
1080
- log(' npx devlyn-cli benchmark recent --out-md /tmp/devlyn-recent-benchmark.md');
1081
- log(' npx devlyn-cli benchmark frontier --out-md /tmp/devlyn-pair-frontier.md');
1082
- log(' npx devlyn-cli benchmark audit --out-dir /tmp/devlyn-benchmark-audit');
1083
- log(' npx devlyn-cli benchmark audit-headroom --out-json /tmp/devlyn-headroom-audit.json');
1084
- log(' npx devlyn-cli benchmark headroom --min-fixtures 3 F16-cli-quote-tax-rules F23-cli-fulfillment-wave F25-cli-cart-promotion-rules');
1085
- log(' npx devlyn-cli benchmark pair --min-fixtures 3 --max-pair-solo-wall-ratio 3 F16-cli-quote-tax-rules F23-cli-fulfillment-wave F25-cli-cart-promotion-rules');
1086
- log('');
1087
- }
1088
-
1089
- function showBenchmarkModeHelp(mode) {
1090
- if (mode === 'recent') {
1091
- log('Usage:', 'green');
1092
- log(' npx devlyn-cli benchmark recent [options]');
1093
- log('');
1094
- log('Options:', 'green');
1095
- log(' --out-json PATH');
1096
- log(' --out-md PATH');
1097
- log(' --fixtures-root PATH');
1098
- log(' --registry PATH');
1099
- log(' --results-root PATH');
1100
- log(' --max-width N default: 92');
1101
- log(' --min-pair-margin N default: 5');
1102
- log(' --max-pair-solo-wall-ratio N default: 3');
1103
- log('');
1104
- log('Output:', 'green');
1105
- log(' Prints compact, wrap-safe benchmark status and pair-evidence cards without wide tables');
1106
- log('');
1107
- log('Example:', 'green');
1108
- log(' npx devlyn-cli benchmark recent');
1109
- log(' npx devlyn-cli benchmark recent --out-md /tmp/devlyn-recent-benchmark.md');
1110
- log('');
1111
- return;
1112
- }
1113
- if (mode === 'frontier') {
1114
- log('Usage:', 'green');
1115
- log(' npx devlyn-cli benchmark frontier [options]');
1116
- log('');
1117
- log('Options:', 'green');
1118
- log(' --out-json PATH');
1119
- log(' --out-md PATH');
1120
- log(' --fixtures-root PATH');
1121
- log(' --registry PATH');
1122
- log(' --results-root PATH');
1123
- log(' --min-pair-margin N default: 5');
1124
- log(' --max-pair-solo-wall-ratio N default: 3');
1125
- log(' --fail-on-unmeasured');
1126
- log('');
1127
- log('Output:', 'green');
1128
- log(' Prints pair evidence score rows with trigger reasons; --out-md includes a Triggers column');
1129
- log('');
1130
- log('Example:', 'green');
1131
- log(' npx devlyn-cli benchmark frontier --out-md /tmp/devlyn-pair-frontier.md');
1132
- log('');
1133
- return;
1134
- }
1135
- if (mode === 'audit-headroom') {
1136
- log('Usage:', 'green');
1137
- log(' npx devlyn-cli benchmark audit-headroom [options]');
1138
- log('');
1139
- log('Options:', 'green');
1140
- log(' --out-json PATH');
1141
- log(' --fixtures-root PATH');
1142
- log(' --registry PATH');
1143
- log(' --results-root PATH');
1144
- log('');
1145
- log('Example:', 'green');
1146
- log(' npx devlyn-cli benchmark audit-headroom --out-json /tmp/devlyn-headroom-audit.json');
1147
- log('');
1148
- return;
1149
- }
1150
- if (mode === 'audit') {
1151
- log('Usage:', 'green');
1152
- log(' npx devlyn-cli benchmark audit [options]');
1153
- log('');
1154
- log('Options:', 'green');
1155
- log(' --out-dir PATH');
1156
- log(' --fixtures-root PATH');
1157
- log(' --registry PATH');
1158
- log(' --results-root PATH');
1159
- log(' --min-pair-evidence N default: 4');
1160
- log(' --min-pair-margin N default: 5');
1161
- log(' --max-pair-solo-wall-ratio N default: 3');
1162
- log(' --require-hypothesis-trigger');
1163
- log('');
1164
- log('Output:', 'green');
1165
- log(' Prints frontier score rows plus headroom_rejections=PASS/FAIL, pair_evidence_quality=PASS/FAIL, pair_trigger_reasons=PASS/FAIL, pair_evidence_hypotheses=PASS/FAIL, pair_evidence_hypothesis_triggers=PASS/WARN/FAIL, historical-alias, and hypothesis-trigger gap handoff rows');
1166
- log('');
1167
- log('Example:', 'green');
1168
- log(' npx devlyn-cli benchmark audit --out-dir /tmp/devlyn-benchmark-audit');
1169
- log(' npx devlyn-cli benchmark audit --require-hypothesis-trigger --out-dir /tmp/devlyn-benchmark-audit-strict');
1170
- log('');
1171
- return;
1172
- }
1173
- if (mode === 'headroom') {
1174
- log('Usage:', 'green');
1175
- log(' npx devlyn-cli benchmark headroom [options] <fixtures...>');
1176
- log('');
1177
- log('Options:', 'green');
1178
- log(' --run-id ID');
1179
- log(' --bare-max N default: 60');
1180
- log(' --solo-max N default: 80');
1181
- log(' --min-bare-headroom N default: 5');
1182
- log(' --min-solo-headroom N default: 5');
1183
- log(' --min-fixtures N default: 2; use 3 for F16/F23/F25 proof reruns; audit requires 4 passing evidence rows');
1184
- log(' --allow-rejected-fixtures active-fixture diagnostics only');
1185
- log(' --dry-run validate args/fixtures and print replay command only');
1186
- log('');
1187
- log('Example:', 'green');
1188
- log(' npx devlyn-cli benchmark headroom --min-fixtures 3 F16-cli-quote-tax-rules F23-cli-fulfillment-wave F25-cli-cart-promotion-rules');
1189
- log('');
1190
- return;
1191
- }
1192
- if (mode === 'pair') {
1193
- log('Usage:', 'green');
1194
- log(' npx devlyn-cli benchmark pair [options] <fixtures...>');
1195
- log('');
1196
- log('Options:', 'green');
1197
- log(' --run-id ID');
1198
- log(' --bare-max N');
1199
- log(' --solo-max N');
1200
- log(' --min-bare-headroom N default: 5');
1201
- log(' --min-solo-headroom N default: 5');
1202
- log(' --min-fixtures N default: 2; use 3 for F16/F23/F25 proof reruns; audit requires 4 passing evidence rows');
1203
- log(' --min-pair-margin N default: 5');
1204
- log(' --max-pair-solo-wall-ratio N default: 3');
1205
- log(' --pair-arm ARM default: l2_risk_probes; l2_gated is diagnostic');
1206
- log(' --reuse-calibrated-from RUN_ID');
1207
- log(' --allow-rejected-fixtures active-fixture diagnostics only');
1208
- log(' --dry-run validate args/fixtures and print replay command only');
1209
- log('');
1210
- log('Example:', 'green');
1211
- log(' npx devlyn-cli benchmark pair --min-fixtures 3 --max-pair-solo-wall-ratio 3 F16-cli-quote-tax-rules F23-cli-fulfillment-wave F25-cli-cart-promotion-rules');
1212
- log('');
1213
- return;
1214
- }
1215
- showBenchmarkHelp();
1216
- }
1217
-
1218
1045
  // Main
1219
1046
  const args = process.argv.slice(2);
1220
1047
 
@@ -1234,45 +1061,6 @@ switch (command) {
1234
1061
  case 'ls':
1235
1062
  listContents();
1236
1063
  break;
1237
- case 'benchmark':
1238
- case 'bench': {
1239
- const benchmarkScripts = {
1240
- suite: 'run-suite.sh',
1241
- recent: 'recent-benchmark-summary.py',
1242
- frontier: 'pair-candidate-frontier.py',
1243
- audit: 'audit-pair-evidence.py',
1244
- 'audit-headroom': 'audit-headroom-rejections.py',
1245
- headroom: 'run-headroom-candidate.sh',
1246
- pair: 'run-full-pipeline-pair-candidate.sh',
1247
- };
1248
- let forwardedArgs = args.slice(1);
1249
- if (forwardedArgs[0] === '--help' || forwardedArgs[0] === '-h') {
1250
- showBenchmarkHelp();
1251
- break;
1252
- }
1253
- let benchmarkMode = 'suite';
1254
- if (forwardedArgs[0] === 'suite' || forwardedArgs[0] === 'recent' || forwardedArgs[0] === 'frontier' || forwardedArgs[0] === 'audit' || forwardedArgs[0] === 'audit-headroom' || forwardedArgs[0] === 'headroom' || forwardedArgs[0] === 'pair') {
1255
- benchmarkMode = forwardedArgs[0];
1256
- forwardedArgs = forwardedArgs.slice(1);
1257
- }
1258
- if (forwardedArgs[0] === '--help' || forwardedArgs[0] === '-h') {
1259
- showBenchmarkModeHelp(benchmarkMode);
1260
- break;
1261
- }
1262
- const runnerName = benchmarkScripts[benchmarkMode];
1263
- const runner = path.join(__dirname, '..', 'benchmark', 'auto-resolve', 'scripts', runnerName);
1264
- if (!fs.existsSync(runner)) {
1265
- log('❌ Benchmark suite runner missing — is this a clean devlyn-cli checkout?', 'yellow');
1266
- log(` Expected: ${runner}`, 'dim');
1267
- process.exit(1);
1268
- }
1269
- const { spawnSync } = require('child_process');
1270
- const env = { ...process.env, DEVLYN_BENCHMARK_CLI_SUBCOMMAND: benchmarkMode };
1271
- const executable = (benchmarkMode === 'recent' || benchmarkMode === 'frontier' || benchmarkMode === 'audit' || benchmarkMode === 'audit-headroom') ? 'python3' : 'bash';
1272
- const res = spawnSync(executable, [runner, ...forwardedArgs], { stdio: 'inherit', env });
1273
- process.exit(res.status ?? 1);
1274
- break;
1275
- }
1276
1064
  case 'agents': {
1277
1065
  showLogo();
1278
1066
  log('─'.repeat(44), 'dim');
@@ -131,6 +131,7 @@
131
131
  "3475b34e03725d5e8ea4f2e2fbecc60e1c3ad4a89167e1bb9a26d41640eccbd7",
132
132
  "34a09b8d6023ae5b858ec5135cae8efeabd921e3108e63e9627a222b188fe554",
133
133
  "350aa6a3140d56a22cb4d5f2503f453ad238384150dc2b5e480fc626db33dfec",
134
+ "37f003566c80ead28d713e86bd6a877e2e3239302c884911f5144a896c291c17",
134
135
  "39af5b94a2734e4fc6c943b604fde4b0d798c4a2a7b1ffb5d053ab7f22488de3",
135
136
  "39c3033487667dc0020f9cb6c106afb000177294560be80d67b5020475aec3f6",
136
137
  "3c38ab8745dde6391d4dda47d74fe5f8cef410c28325d43dc0dd22e8cf4ab4a7",
@@ -221,6 +222,7 @@
221
222
  "9f62c5b2a94e8b5e81528ccbdb6f78d147d14882108568b2cb3b7f85212694c0",
222
223
  "a02eb2d8d77553327fb77377dbfedeab059b2e68e0a33c469b9be54a5d55182b",
223
224
  "a3a15249968f64085b0cec8c0826688a4c3a1e4cf09b4879054baa086d5cbca1",
225
+ "a4da26a46ab83815d8ca5d747c68a907ad67dad485adbc6c863b982ee23b307e",
224
226
  "a5d6ff585d696254d6727cd1e6d7f8825881f90210eff744265e211ced715ea3",
225
227
  "a7ff913df40945a8a16b6632214020a368119ff665953d4a07ec58330b39f101",
226
228
  "aafc680a7ac73e100f4a17d2c4070190e68563f78614c39f4c2f58f1e291d9a9",
@@ -255,6 +257,7 @@
255
257
  "caaed0b9f9f1e425dcfa45b098c9cde91fc06e50339600585bb7597dd634f636",
256
258
  "cb72ba4857899e510a64d8365529e46593e8c69b829d0b5b90e611dd9f1fbdc0",
257
259
  "cc8bf51efb9ef8e5fa4134743f2d25434f4fd51595128edcfd2331dbf29d7dd5",
260
+ "ccacf091bab4102d7156631c6227120a661bb4ec0df514e14a59db44b7bd5dfd",
258
261
  "ce1b0d9d0621fd057e684dc18b43156d30f589c72ed20189ea1232ea4f7ce6c6",
259
262
  "cebacda3b11db7aa161d96b12edd6f3f790ee2850404cd42ecdf2912ed53de08",
260
263
  "cefad7acb7dcd92777f888081aa6585b1418aa581366736fd44db68b1bd66dd0",
@@ -270,6 +273,7 @@
270
273
  "ddb200267b43942de3c061b449d08cc3f73441258b74816cfe13da091377b428",
271
274
  "dff43f9976c68267baf13f6a460f24af8e76be233c8440ac4684dc664106deae",
272
275
  "e237f12ed08800ccc4c6eb4ae57cdd59d61198711f6a3b02dcb668aa08fddb93",
276
+ "e289dbab99dadb30d8315b32b8243154148c82955f238936bce4c1fe1c3ae525",
273
277
  "e2bac40f3ff0b39726f95caaa9b19aa3b21596f165ac7a9dc68ebf42681d58cb",
274
278
  "e3ee2da50e961046da3f5b68b0c328570307fb21a93424ae22536b8f216b55a3",
275
279
  "e43e4b5b86044fbf7be8d7fd1e3e27cd2089bfc8243e07dc2c3fc034c19794ea",
@@ -400,6 +404,7 @@
400
404
  "287fa116a8235756a8b0e28caa951a9ad981667443434e13dbfde3c23f1590e6",
401
405
  "28c5b42a58dca1a093576c8c35369c346caaf3963e14a4702ab3330d0d93e4d4",
402
406
  "2939f7a22fd12f3ca3fdd0a08fc52535cf25dae38b9b445aceed09dc331fc1de",
407
+ "2969b7a979fd58d76a2b274270edaf5c08bb8a09e1f25bae34d81a350742ecb2",
403
408
  "2989b31e2b03781fb27bdf016db97045772eaaf7459a68728cbbfaa7df916a11",
404
409
  "2a23d1450b104b591b0c1358c181bd3ec30c32b8e3a477c342c31272117fdc9d",
405
410
  "2a2d82124b77fb1a077bae0a31c849e15ad4b8a3221f5252c99955dd1b835b1b",
@@ -459,6 +464,8 @@
459
464
  "43fc337e91354bc672daafc86122b6f15b33c9ca71097a6a056fc55bb0fba1c4",
460
465
  "440ddccccc9060a3f5c1a69568e95197b4238cdb4992c4de605d62d6990590e3",
461
466
  "4428ea64057045d076c80488245cf7461d45fa7b2e966de5f65292458f96e718",
467
+ "447d13ec6bc76320d5d305a69c3154a707d7ca0054c170d5d8a18e8c6f7e4001",
468
+ "45335f760ad0ac3f1fb23ebc9d3ed4e4bf325656dadd4e9cedb9c31c12804361",
462
469
  "4549d24fa764d8cd240c7eae696e875378590aa7a27097dfeceb90c7a4bb9291",
463
470
  "4609f53455366937df6cbd0f2b4cd19972ebe2db4c89a470fffd44b98583a6f2",
464
471
  "462d1647f9e1506d5fc8cd31e2ce9cccb3cba0063193a2145007126ea7e8ed59",
@@ -769,6 +776,7 @@
769
776
  "e29fec7d54a144ea4867a3764fccdee6849d58d0f32eacdd56b2c317863fa1c6",
770
777
  "e2e0fc585321ee2013cccaed95d47c49fbca71b54c67abad9080d19d70e3c1a5",
771
778
  "e3b2f7be15a793f07cbe8e51aa2feeac51d4c67077b94e5e20bad2e14be07fc5",
779
+ "e468c242cc38c390f9679fca61f355848f58d51570249dfbb65b4f2e26a9dfb1",
772
780
  "e4bafa0f553e899b65f05feabf4cbe86d8246c57cbba745eb79e6aa858f40a6b",
773
781
  "e5160f4da789914e7f93694a55b9f80b8d06c3b0a126ff60f7627b0b418ae292",
774
782
  "e55a62fa1a993f5df1b44d1c55ef27915938d58a1c357604f3dc150f795672df",
@@ -67,8 +67,7 @@ tool-use loop (2/3 made zero tool calls and fabricated findings), and a
67
67
 
68
68
  The judge prompt must name the exact permitted command(s). Derive the prompt
69
69
  anchor and allow-list string identically from one source, in this precedence:
70
- the solo-headroom hypothesis's backticked observable command when present;
71
- otherwise the backticked commands in the spec's `## Verification` bullets;
70
+ the backticked commands in the spec's `## Verification` bullets;
72
71
  otherwise the repo's existing test/CLI runner. If none exists, the probe
73
72
  obligation does not arise and a static review is correct for that spec.
74
73
  The documented `Bash(<command>)` form matches the exact command or its prefix;
@@ -110,6 +110,9 @@ BOOTSTRAP_TEMP_PATTERNS = tuple(
110
110
  PER_RUN_PATTERNS += BOOTSTRAP_TEMP_PATTERNS
111
111
 
112
112
  SAFE_RUN_ID_RE = re.compile(r"^[A-Za-z0-9_.-]+$")
113
+ valid_final_verdict = runpy.run_path(
114
+ pathlib.Path(__file__).with_name("terminal-claim-check.py")
115
+ )["valid_final_verdict"]
113
116
 
114
117
 
115
118
  class ArchiveError(Exception):
@@ -173,9 +176,7 @@ def read_run_id(devlyn: pathlib.Path) -> str:
173
176
  def is_completed(state: object) -> bool:
174
177
  phases = state.get("phases") if isinstance(state, dict) else None
175
178
  final = phases.get("final_report") if isinstance(phases, dict) else None
176
- if not isinstance(final, dict) or final.get("verdict") not in (
177
- "PASS", "PASS_WITH_ISSUES", "NEEDS_WORK", "BLOCKED",
178
- ):
179
+ if not isinstance(final, dict) or not valid_final_verdict(final.get("verdict")):
179
180
  return False
180
181
  timestamp = final.get("completed_at")
181
182
  if not isinstance(timestamp, str) or not re.fullmatch(
@@ -566,6 +567,16 @@ def completion_self_test() -> None:
566
567
  print("PASS archive completion: 8 terminal forms; malformed/unfinished/residue retained beyond keep-10")
567
568
 
568
569
 
570
+ def full_terminal_verdict_completion_self_test() -> None:
571
+ timestamp = "2026-09-06T00:00:00Z"
572
+ assert is_completed({"phases": {"final_report": {
573
+ "verdict": "BLOCKED:repair-budget-exhausted", "completed_at": timestamp,
574
+ }}})
575
+ assert not is_completed({"phases": {"final_report": {
576
+ "verdict": "BLOCKED:", "completed_at": timestamp,
577
+ }}})
578
+
579
+
569
580
  def self_test() -> int:
570
581
  assert dynamic_judge_role_artifacts(pathlib.Path(".devlyn"), {"phases": {"verify": None}}) == []
571
582
  assert dynamic_judge_role_artifacts(pathlib.Path(".devlyn"), {"phases": {}}) == []
@@ -921,6 +932,7 @@ def self_test() -> int:
921
932
  else:
922
933
  raise AssertionError("NaN archive run_id was accepted")
923
934
  completion_self_test()
935
+ full_terminal_verdict_completion_self_test()
924
936
  return 0
925
937
 
926
938