self-evolve-framework 1.6.0 → 1.6.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 (301) hide show
  1. package/README.md +33 -23
  2. package/bin/cli.js +24 -67
  3. package/package.json +1 -1
  4. package/template/rules/knowledge/README.md +56 -0
  5. package/template/rules/knowledge/ant-design-vue.mdc +54 -0
  6. package/template/rules/knowledge/general.mdc +56 -0
  7. package/template/rules/knowledge/rust.mdc +55 -0
  8. package/template/rules/knowledge/shadcn-svelte.mdc +64 -0
  9. package/template/rules/knowledge/svelte.mdc +135 -0
  10. package/template/rules/knowledge/tailwind.mdc +66 -0
  11. package/template/rules/knowledge/tauri.mdc +65 -0
  12. package/template/rules/knowledge/typescript.mdc +41 -0
  13. package/template/rules/knowledge/vue.mdc +48 -0
  14. package/template/rules/ponytail.mdc +23 -98
  15. package/template/rules/self-evolve.mdc +24 -0
  16. package/template/skills/impeccable/SKILL.md +47 -174
  17. package/template/skills/skillopt-sleep/SKILL.md +32 -88
  18. package/template/skills/impeccable/agents/impeccable_asset_producer.toml +0 -92
  19. package/template/skills/impeccable/agents/impeccable_manual_edit_applier.toml +0 -95
  20. package/template/skills/impeccable/agents/openai.yaml +0 -4
  21. package/template/skills/impeccable/reference/adapt.md +0 -311
  22. package/template/skills/impeccable/reference/animate.md +0 -201
  23. package/template/skills/impeccable/reference/audit.md +0 -133
  24. package/template/skills/impeccable/reference/bolder.md +0 -113
  25. package/template/skills/impeccable/reference/brand.md +0 -108
  26. package/template/skills/impeccable/reference/clarify.md +0 -288
  27. package/template/skills/impeccable/reference/codex.md +0 -105
  28. package/template/skills/impeccable/reference/colorize.md +0 -257
  29. package/template/skills/impeccable/reference/craft.md +0 -123
  30. package/template/skills/impeccable/reference/critique.md +0 -790
  31. package/template/skills/impeccable/reference/delight.md +0 -302
  32. package/template/skills/impeccable/reference/distill.md +0 -111
  33. package/template/skills/impeccable/reference/document.md +0 -429
  34. package/template/skills/impeccable/reference/extract.md +0 -69
  35. package/template/skills/impeccable/reference/harden.md +0 -347
  36. package/template/skills/impeccable/reference/hooks.md +0 -90
  37. package/template/skills/impeccable/reference/init.md +0 -172
  38. package/template/skills/impeccable/reference/interaction-design.md +0 -189
  39. package/template/skills/impeccable/reference/layout.md +0 -161
  40. package/template/skills/impeccable/reference/live.md +0 -720
  41. package/template/skills/impeccable/reference/onboard.md +0 -234
  42. package/template/skills/impeccable/reference/optimize.md +0 -258
  43. package/template/skills/impeccable/reference/overdrive.md +0 -130
  44. package/template/skills/impeccable/reference/polish.md +0 -241
  45. package/template/skills/impeccable/reference/product.md +0 -60
  46. package/template/skills/impeccable/reference/quieter.md +0 -99
  47. package/template/skills/impeccable/reference/shape.md +0 -165
  48. package/template/skills/impeccable/reference/typeset.md +0 -279
  49. package/template/skills/impeccable/scripts/command-metadata.json +0 -94
  50. package/template/skills/impeccable/scripts/context-signals.mjs +0 -225
  51. package/template/skills/impeccable/scripts/context.mjs +0 -961
  52. package/template/skills/impeccable/scripts/critique-storage.mjs +0 -242
  53. package/template/skills/impeccable/scripts/detect-csp.mjs +0 -198
  54. package/template/skills/impeccable/scripts/detect.mjs +0 -21
  55. package/template/skills/impeccable/scripts/detector/browser/injected/index.mjs +0 -1937
  56. package/template/skills/impeccable/scripts/detector/cli/main.mjs +0 -290
  57. package/template/skills/impeccable/scripts/detector/design-system.mjs +0 -750
  58. package/template/skills/impeccable/scripts/detector/detect-antipatterns-browser.js +0 -5138
  59. package/template/skills/impeccable/scripts/detector/detect-antipatterns.mjs +0 -50
  60. package/template/skills/impeccable/scripts/detector/engines/browser/detect-url.mjs +0 -277
  61. package/template/skills/impeccable/scripts/detector/engines/regex/detect-text.mjs +0 -568
  62. package/template/skills/impeccable/scripts/detector/engines/static-html/css-cascade.mjs +0 -1015
  63. package/template/skills/impeccable/scripts/detector/engines/static-html/detect-html.mjs +0 -234
  64. package/template/skills/impeccable/scripts/detector/engines/visual/screenshot-contrast.mjs +0 -189
  65. package/template/skills/impeccable/scripts/detector/findings.mjs +0 -12
  66. package/template/skills/impeccable/scripts/detector/node/file-system.mjs +0 -198
  67. package/template/skills/impeccable/scripts/detector/profile/profiler.mjs +0 -166
  68. package/template/skills/impeccable/scripts/detector/registry/antipatterns.mjs +0 -448
  69. package/template/skills/impeccable/scripts/detector/rules/checks.mjs +0 -2671
  70. package/template/skills/impeccable/scripts/detector/shared/color.mjs +0 -124
  71. package/template/skills/impeccable/scripts/detector/shared/constants.mjs +0 -101
  72. package/template/skills/impeccable/scripts/detector/shared/inline-ignores.mjs +0 -148
  73. package/template/skills/impeccable/scripts/detector/shared/page.mjs +0 -7
  74. package/template/skills/impeccable/scripts/hook-admin.mjs +0 -661
  75. package/template/skills/impeccable/scripts/hook-before-edit.mjs +0 -476
  76. package/template/skills/impeccable/scripts/hook-lib.mjs +0 -1632
  77. package/template/skills/impeccable/scripts/hook.mjs +0 -61
  78. package/template/skills/impeccable/scripts/lib/design-parser.mjs +0 -842
  79. package/template/skills/impeccable/scripts/lib/impeccable-config.mjs +0 -638
  80. package/template/skills/impeccable/scripts/lib/impeccable-paths.mjs +0 -128
  81. package/template/skills/impeccable/scripts/lib/is-generated.mjs +0 -69
  82. package/template/skills/impeccable/scripts/lib/target-args.mjs +0 -42
  83. package/template/skills/impeccable/scripts/live/browser-script-parts.mjs +0 -49
  84. package/template/skills/impeccable/scripts/live/completion.mjs +0 -19
  85. package/template/skills/impeccable/scripts/live/event-validation.mjs +0 -137
  86. package/template/skills/impeccable/scripts/live/insert-ui.mjs +0 -458
  87. package/template/skills/impeccable/scripts/live/manual-apply.mjs +0 -939
  88. package/template/skills/impeccable/scripts/live/manual-edit-routes.mjs +0 -357
  89. package/template/skills/impeccable/scripts/live/manual-edits-buffer.mjs +0 -152
  90. package/template/skills/impeccable/scripts/live/session-store.mjs +0 -289
  91. package/template/skills/impeccable/scripts/live/svelte-component.mjs +0 -826
  92. package/template/skills/impeccable/scripts/live/sveltekit-adapter.mjs +0 -274
  93. package/template/skills/impeccable/scripts/live/ui-core.mjs +0 -180
  94. package/template/skills/impeccable/scripts/live/vocabulary.mjs +0 -36
  95. package/template/skills/impeccable/scripts/live-accept.mjs +0 -812
  96. package/template/skills/impeccable/scripts/live-browser-dom.js +0 -146
  97. package/template/skills/impeccable/scripts/live-browser-session.js +0 -123
  98. package/template/skills/impeccable/scripts/live-browser.js +0 -11173
  99. package/template/skills/impeccable/scripts/live-commit-manual-edits.mjs +0 -1241
  100. package/template/skills/impeccable/scripts/live-complete.mjs +0 -75
  101. package/template/skills/impeccable/scripts/live-copy-edit-agent.mjs +0 -683
  102. package/template/skills/impeccable/scripts/live-discard-manual-edits.mjs +0 -51
  103. package/template/skills/impeccable/scripts/live-inject.mjs +0 -583
  104. package/template/skills/impeccable/scripts/live-insert.mjs +0 -272
  105. package/template/skills/impeccable/scripts/live-manual-edit-evidence.mjs +0 -363
  106. package/template/skills/impeccable/scripts/live-poll.mjs +0 -384
  107. package/template/skills/impeccable/scripts/live-resume.mjs +0 -94
  108. package/template/skills/impeccable/scripts/live-server.mjs +0 -1135
  109. package/template/skills/impeccable/scripts/live-status.mjs +0 -61
  110. package/template/skills/impeccable/scripts/live-target.mjs +0 -30
  111. package/template/skills/impeccable/scripts/live-wrap.mjs +0 -894
  112. package/template/skills/impeccable/scripts/live.mjs +0 -297
  113. package/template/skills/impeccable/scripts/modern-screenshot.umd.js +0 -14
  114. package/template/skills/impeccable/scripts/palette.mjs +0 -633
  115. package/template/skills/impeccable/scripts/pin.mjs +0 -214
  116. package/template/skills/skillopt-sleep/configs/_base_/default.yaml +0 -103
  117. package/template/skills/skillopt-sleep/configs/alfworld/default.yaml +0 -29
  118. package/template/skills/skillopt-sleep/configs/docvqa/default.yaml +0 -28
  119. package/template/skills/skillopt-sleep/configs/features/soft_gate.yaml +0 -47
  120. package/template/skills/skillopt-sleep/configs/livemathematicianbench/default.yaml +0 -22
  121. package/template/skills/skillopt-sleep/configs/officeqa/default.yaml +0 -34
  122. package/template/skills/skillopt-sleep/configs/searchqa/default.yaml +0 -32
  123. package/template/skills/skillopt-sleep/configs/spreadsheetbench/default.yaml +0 -34
  124. package/template/skills/skillopt-sleep/scripts/framework/skillopt/__init__.py +0 -28
  125. package/template/skills/skillopt-sleep/scripts/framework/skillopt/config.py +0 -282
  126. package/template/skills/skillopt-sleep/scripts/framework/skillopt/datasets/__init__.py +0 -7
  127. package/template/skills/skillopt-sleep/scripts/framework/skillopt/datasets/base.py +0 -512
  128. package/template/skills/skillopt-sleep/scripts/framework/skillopt/engine/__init__.py +0 -9
  129. package/template/skills/skillopt-sleep/scripts/framework/skillopt/engine/trainer.py +0 -2379
  130. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/__init__.py +0 -1
  131. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/_template/README.md +0 -43
  132. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/_template/config_template.yaml +0 -55
  133. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/_template/env_template.py +0 -151
  134. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/_template/loader_template.py +0 -87
  135. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/alfworld/__init__.py +0 -5
  136. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/alfworld/adapter.py +0 -428
  137. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/alfworld/dataloader.py +0 -123
  138. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/alfworld/prompts/analyst_error.md +0 -55
  139. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/alfworld/prompts/analyst_success.md +0 -33
  140. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/alfworld/prompts/rollout_no_history.md +0 -8
  141. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/alfworld/prompts/rollout_with_history.md +0 -9
  142. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/alfworld/prompts/rollout_with_memory.md +0 -16
  143. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/alfworld/reflect.py +0 -4
  144. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/alfworld/rollout.py +0 -366
  145. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/alfworld/skills/initial.md +0 -45
  146. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/alfworld/vendor/__init__.py +0 -9
  147. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/alfworld/vendor/alfworld_envs.py +0 -221
  148. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/alfworld/vendor/alfworld_projection.py +0 -60
  149. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/alfworld/vendor/alfworld_prompts.py +0 -8
  150. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/alfworld/vendor/config_tw.yaml +0 -145
  151. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/alfworld/vendor/env_base.py +0 -84
  152. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/alfworld/vendor/env_manager.py +0 -139
  153. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/alfworld/vendor/memory.py +0 -87
  154. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/base.py +0 -329
  155. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/docvqa/__init__.py +0 -1
  156. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/docvqa/adapter.py +0 -90
  157. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/docvqa/dataloader.py +0 -61
  158. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/docvqa/evaluator.py +0 -113
  159. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/docvqa/prompts/analyst_error.md +0 -35
  160. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/docvqa/prompts/analyst_success.md +0 -24
  161. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/docvqa/prompts/rollout_system.md +0 -12
  162. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/docvqa/rollout.py +0 -391
  163. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/docvqa/skills/initial.md +0 -11
  164. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/livemathematicianbench/__init__.py +0 -1
  165. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/livemathematicianbench/adapter.py +0 -129
  166. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/livemathematicianbench/dataloader.py +0 -308
  167. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/livemathematicianbench/evaluator.py +0 -62
  168. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/livemathematicianbench/prompts/analyst_error.md +0 -37
  169. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/livemathematicianbench/prompts/analyst_success.md +0 -25
  170. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/livemathematicianbench/prompts/rollout_system.md +0 -12
  171. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/livemathematicianbench/reflect.py +0 -4
  172. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/livemathematicianbench/rollout.py +0 -434
  173. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/livemathematicianbench/skills/initial.md +0 -16
  174. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/officeqa/__init__.py +0 -1
  175. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/officeqa/adapter.py +0 -112
  176. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/officeqa/dataloader.py +0 -71
  177. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/officeqa/evaluator.py +0 -46
  178. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/officeqa/prompts/analyst_error.md +0 -37
  179. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/officeqa/prompts/analyst_success.md +0 -25
  180. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/officeqa/prompts/rollout_system.md +0 -15
  181. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/officeqa/rollout.py +0 -799
  182. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/officeqa/skills/initial.md +0 -15
  183. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/officeqa/tool_runtime.py +0 -552
  184. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/searchqa/__init__.py +0 -1
  185. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/searchqa/adapter.py +0 -96
  186. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/searchqa/dataloader.py +0 -42
  187. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/searchqa/evaluator.py +0 -100
  188. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/searchqa/prompts/analyst_error.md +0 -46
  189. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/searchqa/prompts/analyst_success.md +0 -32
  190. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/searchqa/prompts/rollout_system.md +0 -13
  191. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/searchqa/reflect.py +0 -4
  192. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/searchqa/rollout.py +0 -494
  193. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/searchqa/skills/initial.md +0 -3
  194. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/spreadsheetbench/__init__.py +0 -5
  195. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/spreadsheetbench/adapter.py +0 -159
  196. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/spreadsheetbench/codegen_agent.py +0 -731
  197. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/spreadsheetbench/dataloader.py +0 -37
  198. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/spreadsheetbench/evaluator.py +0 -158
  199. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/spreadsheetbench/executor.py +0 -67
  200. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/spreadsheetbench/prompts/analyst_error.md +0 -46
  201. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/spreadsheetbench/prompts/analyst_success.md +0 -32
  202. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/spreadsheetbench/prompts/codegen_system.md +0 -1
  203. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/spreadsheetbench/prompts/critical_rules.md +0 -9
  204. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/spreadsheetbench/prompts/react_system.md +0 -21
  205. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/spreadsheetbench/react_agent.py +0 -395
  206. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/spreadsheetbench/reflect.py +0 -4
  207. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/spreadsheetbench/rollout.py +0 -979
  208. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/spreadsheetbench/skills/initial.md +0 -56
  209. package/template/skills/skillopt-sleep/scripts/framework/skillopt/evaluation/__init__.py +0 -13
  210. package/template/skills/skillopt-sleep/scripts/framework/skillopt/evaluation/gate.py +0 -148
  211. package/template/skills/skillopt-sleep/scripts/framework/skillopt/gradient/__init__.py +0 -15
  212. package/template/skills/skillopt-sleep/scripts/framework/skillopt/gradient/aggregate.py +0 -253
  213. package/template/skills/skillopt-sleep/scripts/framework/skillopt/gradient/reflect.py +0 -635
  214. package/template/skills/skillopt-sleep/scripts/framework/skillopt/model/__init__.py +0 -514
  215. package/template/skills/skillopt-sleep/scripts/framework/skillopt/model/azure_openai.py +0 -915
  216. package/template/skills/skillopt-sleep/scripts/framework/skillopt/model/backend_config.py +0 -185
  217. package/template/skills/skillopt-sleep/scripts/framework/skillopt/model/claude_backend.py +0 -371
  218. package/template/skills/skillopt-sleep/scripts/framework/skillopt/model/codex_backend.py +0 -666
  219. package/template/skills/skillopt-sleep/scripts/framework/skillopt/model/codex_harness.py +0 -1057
  220. package/template/skills/skillopt-sleep/scripts/framework/skillopt/model/common.py +0 -229
  221. package/template/skills/skillopt-sleep/scripts/framework/skillopt/model/minimax_backend.py +0 -277
  222. package/template/skills/skillopt-sleep/scripts/framework/skillopt/model/qwen_backend.py +0 -456
  223. package/template/skills/skillopt-sleep/scripts/framework/skillopt/model/router.py +0 -236
  224. package/template/skills/skillopt-sleep/scripts/framework/skillopt/optimizer/__init__.py +0 -15
  225. package/template/skills/skillopt-sleep/scripts/framework/skillopt/optimizer/appendix.py +0 -156
  226. package/template/skills/skillopt-sleep/scripts/framework/skillopt/optimizer/clip.py +0 -109
  227. package/template/skills/skillopt-sleep/scripts/framework/skillopt/optimizer/lr_autonomous.py +0 -108
  228. package/template/skills/skillopt-sleep/scripts/framework/skillopt/optimizer/meta_skill.py +0 -79
  229. package/template/skills/skillopt-sleep/scripts/framework/skillopt/optimizer/rewrite.py +0 -59
  230. package/template/skills/skillopt-sleep/scripts/framework/skillopt/optimizer/scheduler.py +0 -127
  231. package/template/skills/skillopt-sleep/scripts/framework/skillopt/optimizer/select.py +0 -4
  232. package/template/skills/skillopt-sleep/scripts/framework/skillopt/optimizer/skill.py +0 -201
  233. package/template/skills/skillopt-sleep/scripts/framework/skillopt/optimizer/skill_aware.py +0 -206
  234. package/template/skills/skillopt-sleep/scripts/framework/skillopt/optimizer/slow_update.py +0 -396
  235. package/template/skills/skillopt-sleep/scripts/framework/skillopt/optimizer/update_modes.py +0 -135
  236. package/template/skills/skillopt-sleep/scripts/framework/skillopt/prompts/__init__.py +0 -63
  237. package/template/skills/skillopt-sleep/scripts/framework/skillopt/prompts/analyst_error.md +0 -41
  238. package/template/skills/skillopt-sleep/scripts/framework/skillopt/prompts/analyst_error_full_rewrite.md +0 -32
  239. package/template/skills/skillopt-sleep/scripts/framework/skillopt/prompts/analyst_error_rewrite.md +0 -44
  240. package/template/skills/skillopt-sleep/scripts/framework/skillopt/prompts/analyst_success.md +0 -36
  241. package/template/skills/skillopt-sleep/scripts/framework/skillopt/prompts/analyst_success_full_rewrite.md +0 -30
  242. package/template/skills/skillopt-sleep/scripts/framework/skillopt/prompts/analyst_success_rewrite.md +0 -33
  243. package/template/skills/skillopt-sleep/scripts/framework/skillopt/prompts/lr_autonomous.md +0 -20
  244. package/template/skills/skillopt-sleep/scripts/framework/skillopt/prompts/merge_failure.md +0 -30
  245. package/template/skills/skillopt-sleep/scripts/framework/skillopt/prompts/merge_failure_full_rewrite.md +0 -28
  246. package/template/skills/skillopt-sleep/scripts/framework/skillopt/prompts/merge_failure_rewrite.md +0 -26
  247. package/template/skills/skillopt-sleep/scripts/framework/skillopt/prompts/merge_final.md +0 -33
  248. package/template/skills/skillopt-sleep/scripts/framework/skillopt/prompts/merge_final_full_rewrite.md +0 -28
  249. package/template/skills/skillopt-sleep/scripts/framework/skillopt/prompts/merge_final_rewrite.md +0 -25
  250. package/template/skills/skillopt-sleep/scripts/framework/skillopt/prompts/merge_success.md +0 -28
  251. package/template/skills/skillopt-sleep/scripts/framework/skillopt/prompts/merge_success_full_rewrite.md +0 -28
  252. package/template/skills/skillopt-sleep/scripts/framework/skillopt/prompts/merge_success_rewrite.md +0 -25
  253. package/template/skills/skillopt-sleep/scripts/framework/skillopt/prompts/meta_skill.md +0 -40
  254. package/template/skills/skillopt-sleep/scripts/framework/skillopt/prompts/ranking.md +0 -20
  255. package/template/skills/skillopt-sleep/scripts/framework/skillopt/prompts/ranking_rewrite.md +0 -15
  256. package/template/skills/skillopt-sleep/scripts/framework/skillopt/prompts/rewrite_skill.md +0 -25
  257. package/template/skills/skillopt-sleep/scripts/framework/skillopt/prompts/slow_update.md +0 -60
  258. package/template/skills/skillopt-sleep/scripts/framework/skillopt/scheduler/__init__.py +0 -8
  259. package/template/skills/skillopt-sleep/scripts/framework/skillopt/types.py +0 -306
  260. package/template/skills/skillopt-sleep/scripts/framework/skillopt/utils/__init__.py +0 -4
  261. package/template/skills/skillopt-sleep/scripts/framework/skillopt/utils/json_utils.py +0 -172
  262. package/template/skills/skillopt-sleep/scripts/framework/skillopt/utils/scoring.py +0 -28
  263. package/template/skills/skillopt-sleep/scripts/python/__init__.py +0 -20
  264. package/template/skills/skillopt-sleep/scripts/python/__main__.py +0 -343
  265. package/template/skills/skillopt-sleep/scripts/python/backend.py +0 -1371
  266. package/template/skills/skillopt-sleep/scripts/python/budget.py +0 -75
  267. package/template/skills/skillopt-sleep/scripts/python/config.py +0 -162
  268. package/template/skills/skillopt-sleep/scripts/python/consolidate.py +0 -238
  269. package/template/skills/skillopt-sleep/scripts/python/cycle.py +0 -291
  270. package/template/skills/skillopt-sleep/scripts/python/dream.py +0 -138
  271. package/template/skills/skillopt-sleep/scripts/python/experiments/__init__.py +0 -1
  272. package/template/skills/skillopt-sleep/scripts/python/experiments/gbrain_bench.py +0 -119
  273. package/template/skills/skillopt-sleep/scripts/python/experiments/personas.py +0 -86
  274. package/template/skills/skillopt-sleep/scripts/python/experiments/report.py +0 -132
  275. package/template/skills/skillopt-sleep/scripts/python/experiments/run_experiment.py +0 -178
  276. package/template/skills/skillopt-sleep/scripts/python/experiments/run_gbrain.py +0 -209
  277. package/template/skills/skillopt-sleep/scripts/python/experiments/run_transfer.py +0 -155
  278. package/template/skills/skillopt-sleep/scripts/python/experiments/sweep.py +0 -164
  279. package/template/skills/skillopt-sleep/scripts/python/gate.py +0 -50
  280. package/template/skills/skillopt-sleep/scripts/python/harvest.py +0 -304
  281. package/template/skills/skillopt-sleep/scripts/python/harvest_codex.py +0 -253
  282. package/template/skills/skillopt-sleep/scripts/python/harvest_sources.py +0 -41
  283. package/template/skills/skillopt-sleep/scripts/python/judges.py +0 -84
  284. package/template/skills/skillopt-sleep/scripts/python/llm_miner.py +0 -134
  285. package/template/skills/skillopt-sleep/scripts/python/memory.py +0 -129
  286. package/template/skills/skillopt-sleep/scripts/python/mine.py +0 -312
  287. package/template/skills/skillopt-sleep/scripts/python/replay.py +0 -146
  288. package/template/skills/skillopt-sleep/scripts/python/rollout.py +0 -153
  289. package/template/skills/skillopt-sleep/scripts/python/scheduler.py +0 -138
  290. package/template/skills/skillopt-sleep/scripts/python/slow_update.py +0 -142
  291. package/template/skills/skillopt-sleep/scripts/python/staging.py +0 -103
  292. package/template/skills/skillopt-sleep/scripts/python/state.py +0 -96
  293. package/template/skills/skillopt-sleep/scripts/python/tasks_file.py +0 -81
  294. package/template/skills/skillopt-sleep/scripts/python/types.py +0 -146
  295. package/template/skills/skillopt-sleep/scripts/shell/__init__.py +0 -0
  296. package/template/skills/skillopt-sleep/scripts/shell/eval_only.py +0 -466
  297. package/template/skills/skillopt-sleep/scripts/shell/materialize_searchqa.py +0 -148
  298. package/template/skills/skillopt-sleep/scripts/shell/run_alfworld.sh +0 -60
  299. package/template/skills/skillopt-sleep/scripts/shell/run_searchqa.sh +0 -40
  300. package/template/skills/skillopt-sleep/scripts/shell/run_spreadsheetbench.sh +0 -39
  301. package/template/skills/skillopt-sleep/scripts/shell/train.py +0 -556
@@ -1,75 +0,0 @@
1
- """SkillOpt-Sleep — budget controller.
2
-
3
- Lets the user say how much they're willing to spend on a night's "dreaming",
4
- in tokens or wall-clock minutes, and the engine schedules depth (how many
5
- rollouts × how many nights) within that budget. Stops cleanly when exhausted
6
- and reports what it skipped (no silent truncation).
7
- """
8
- from __future__ import annotations
9
-
10
- from dataclasses import dataclass
11
- from typing import Optional
12
-
13
-
14
- @dataclass
15
- class Budget:
16
- max_tokens: Optional[int] = None # None = unlimited
17
- max_minutes: Optional[float] = None # None = unlimited
18
- _start_time: Optional[float] = None
19
- _tokens_at_start: int = 0
20
-
21
- def start(self, clock_fn, tokens_now: int) -> None:
22
- self._start_time = clock_fn()
23
- self._tokens_at_start = tokens_now
24
-
25
- def tokens_spent(self, tokens_now: int) -> int:
26
- return max(0, tokens_now - self._tokens_at_start)
27
-
28
- def minutes_elapsed(self, clock_fn) -> float:
29
- if self._start_time is None:
30
- return 0.0
31
- return (clock_fn() - self._start_time) / 60.0
32
-
33
- def remaining_fraction(self, *, tokens_now: int, clock_fn) -> float:
34
- """Smallest remaining fraction across all active limits (1.0 = fresh)."""
35
- fracs = [1.0]
36
- if self.max_tokens:
37
- fracs.append(max(0.0, 1.0 - self.tokens_spent(tokens_now) / self.max_tokens))
38
- if self.max_minutes:
39
- fracs.append(max(0.0, 1.0 - self.minutes_elapsed(clock_fn) / self.max_minutes))
40
- return min(fracs)
41
-
42
- def exhausted(self, *, tokens_now: int, clock_fn) -> bool:
43
- if self.max_tokens and self.tokens_spent(tokens_now) >= self.max_tokens:
44
- return True
45
- if self.max_minutes and self.minutes_elapsed(clock_fn) >= self.max_minutes:
46
- return True
47
- return False
48
-
49
- def status(self, *, tokens_now: int, clock_fn) -> str:
50
- parts = []
51
- if self.max_tokens:
52
- parts.append(f"tokens {self.tokens_spent(tokens_now)}/{self.max_tokens}")
53
- if self.max_minutes:
54
- parts.append(f"minutes {self.minutes_elapsed(clock_fn):.1f}/{self.max_minutes}")
55
- return ", ".join(parts) or "unbounded"
56
-
57
-
58
- def plan_depth(budget: Budget, *, n_tasks: int,
59
- default_nights: int = 2, default_k: int = 1) -> tuple:
60
- """Heuristically choose (nights, rollouts_per_task) from a token budget.
61
-
62
- Rough cost model: one rollout ≈ 1 unit; a night does ~n_tasks*k rollouts
63
- plus reflect/gate (~2*n_tasks). We scale k and nights up with more budget.
64
- Returns (nights, k). With no budget set, returns the defaults.
65
- """
66
- if not budget.max_tokens:
67
- return default_nights, default_k
68
- # assume ~1.5k tokens per rollout as a planning constant
69
- rollouts_affordable = budget.max_tokens / 1500.0
70
- per_night = max(1, n_tasks) * 3 # rollouts + reflect + gate, k=1
71
- nights = max(1, min(4, int(rollouts_affordable // per_night)))
72
- # spend surplus on more rollouts-per-task (contrastive signal)
73
- surplus = rollouts_affordable - nights * per_night
74
- k = max(1, min(5, 1 + int(surplus // max(1, n_tasks))))
75
- return nights, k
@@ -1,162 +0,0 @@
1
- """SkillOpt-Sleep — configuration.
2
-
3
- Config is JSON-first (yaml optional) so the engine and the deterministic
4
- experiment run with zero external dependencies. Defaults are safe:
5
- review-gated adoption, single-project scope, bounded token/task budgets.
6
-
7
- Resolution order (later wins):
8
- 1. built-in DEFAULTS
9
- 2. ~/.skillopt-sleep/config.json (or .yaml if PyYAML available)
10
- 3. explicit overrides passed to load_config(**overrides)
11
- """
12
- from __future__ import annotations
13
-
14
- import json
15
- import os
16
- from dataclasses import dataclass, field
17
- from typing import Any, Dict, Optional
18
-
19
- HOME_STATE_DIR = os.path.expanduser("~/.skillopt-sleep")
20
- CLAUDE_HOME = os.path.expanduser("~/.claude")
21
- CODEX_HOME = os.path.expanduser("~/.codex")
22
-
23
-
24
- DEFAULTS: Dict[str, Any] = {
25
- # ── scope ──────────────────────────────────────────────────────────────
26
- "claude_home": CLAUDE_HOME,
27
- "codex_home": CODEX_HOME,
28
- "transcript_source": "claude", # "claude" | "codex" | "auto"
29
- "projects": "invoked", # "invoked" | "all" | [list of abs paths]
30
- "invoked_project": "", # filled at runtime (cwd) when projects == "invoked"
31
- "lookback_hours": 72, # harvest window when no prior sleep recorded
32
- # ── budgets ────────────────────────────────────────────────────────────
33
- "max_tasks_per_night": 40,
34
- "max_tokens_per_night": 400_000,
35
- "holdout_fraction": 0.34, # legacy alias for val_fraction
36
- "val_fraction": 0.34, # real tasks reserved to gate updates
37
- "test_fraction": 0.0, # real tasks reserved as the final held-out measure
38
- # ── optimizer ──────────────────────────────────────────────────────────
39
- "backend": "mock", # "mock" | "claude" | "codex" | "copilot"
40
- "model": "", # backend-specific; "" => backend default
41
- "gate_mode": "on", # "on" (validation-gated) | "off" (greedy, no hard filter)
42
- "codex_path": "", # "" => auto-detect the real @openai/codex binary
43
- "edit_budget": 4, # textual learning rate (max edits/night)
44
- "gate_metric": "mixed", # hard | soft | mixed (mixed best for tiny holdouts)
45
- "gate_mixed_weight": 0.5,
46
- "replay_mode": "mock", # "mock" (sandboxed prompt) | "fresh" (worktree)
47
- # ── dream + recall (opt-in; defaults reproduce the prior single-shot loop) ─
48
- "dream_rollouts": 1, # >1 => multi-rollout contrastive reflection per task
49
- "dream_factor": 0, # >0 => add N synthetic variants of each task to the dream
50
- "recall_k": 0, # >0 => recall the K most-similar past tasks into the dream
51
- "evolve_memory": True, # consolidate CLAUDE.md
52
- "evolve_skill": True, # consolidate the managed SKILL.md
53
- "llm_mine": True, # use the backend to mine checkable tasks (real backends)
54
- "target_skill_path": "", # explicit SKILL.md target for repo-scoped agents
55
- "target_task_filter": True, # prefer mined tasks matching target_skill_path/text
56
- "progress": False, # print phase progress to stderr
57
- # ── adoption / safety ──────────────────────────────────────────────────
58
- "auto_adopt": False, # default: stage + require explicit `adopt`
59
- "managed_skill_name": "skillopt-sleep-learned",
60
- "redact_secrets": True,
61
- "seed": 42,
62
- }
63
-
64
-
65
- @dataclass
66
- class SleepConfig:
67
- data: Dict[str, Any] = field(default_factory=lambda: dict(DEFAULTS))
68
-
69
- # convenient attribute access -------------------------------------------
70
- def __getattr__(self, name: str) -> Any:
71
- # only called when normal attribute lookup fails
72
- data = object.__getattribute__(self, "data")
73
- if name in data:
74
- return data[name]
75
- raise AttributeError(name)
76
-
77
- def get(self, key: str, default: Any = None) -> Any:
78
- return self.data.get(key, default)
79
-
80
- def to_dict(self) -> Dict[str, Any]:
81
- return dict(self.data)
82
-
83
- # paths ------------------------------------------------------------------
84
- @property
85
- def state_dir(self) -> str:
86
- # Allow full isolation: if the caller overrides state_dir explicitly,
87
- # honor it; else derive from claude_home's parent so a single
88
- # --claude-home flag isolates transcripts AND state together; else the
89
- # default ~/.skillopt-sleep.
90
- explicit = self.data.get("state_dir")
91
- if explicit:
92
- return explicit
93
- ch = self.data.get("claude_home", CLAUDE_HOME)
94
- if os.path.abspath(ch) != os.path.abspath(CLAUDE_HOME):
95
- return os.path.join(os.path.dirname(os.path.abspath(ch)), ".skillopt-sleep")
96
- return HOME_STATE_DIR
97
-
98
- @property
99
- def state_path(self) -> str:
100
- return os.path.join(self.state_dir, "state.json")
101
-
102
- @property
103
- def transcripts_dir(self) -> str:
104
- return os.path.join(self.data["claude_home"], "projects")
105
-
106
- @property
107
- def codex_archived_sessions_dir(self) -> str:
108
- return os.path.join(self.data["codex_home"], "archived_sessions")
109
-
110
- @property
111
- def history_path(self) -> str:
112
- return os.path.join(self.data["claude_home"], "history.jsonl")
113
-
114
- @property
115
- def skills_dir(self) -> str:
116
- return os.path.join(self.data["claude_home"], "skills")
117
-
118
- def managed_skill_path(self) -> str:
119
- target = self.data.get("target_skill_path") or ""
120
- if target:
121
- target = os.path.expanduser(str(target))
122
- if not os.path.isabs(target):
123
- base = self.data.get("invoked_project") or os.getcwd()
124
- target = os.path.join(base, target)
125
- return os.path.abspath(target)
126
- return os.path.join(
127
- self.skills_dir, self.data["managed_skill_name"], "SKILL.md"
128
- )
129
-
130
-
131
- def _user_config_path() -> Optional[str]:
132
- for name in ("config.json", "config.yaml", "config.yml"):
133
- p = os.path.join(HOME_STATE_DIR, name)
134
- if os.path.exists(p):
135
- return p
136
- return None
137
-
138
-
139
- def _load_file(path: str) -> Dict[str, Any]:
140
- if path.endswith((".yaml", ".yml")):
141
- try:
142
- import yaml # optional
143
- with open(path) as f:
144
- return yaml.safe_load(f) or {}
145
- except Exception:
146
- return {}
147
- with open(path) as f:
148
- return json.load(f)
149
-
150
-
151
- def load_config(**overrides: Any) -> SleepConfig:
152
- data = dict(DEFAULTS)
153
- path = _user_config_path()
154
- if path:
155
- try:
156
- data.update(_load_file(path) or {})
157
- except Exception:
158
- pass
159
- data.update({k: v for k, v in overrides.items() if v is not None})
160
- if data.get("projects") == "invoked" and not data.get("invoked_project"):
161
- data["invoked_project"] = os.getcwd()
162
- return SleepConfig(data=data)
@@ -1,238 +0,0 @@
1
- """SkillOpt-Sleep — Stage 4: consolidate (one SkillOpt epoch).
2
-
3
- This is the core that makes nightly evolution *safe*: it proposes bounded
4
- edits from replayed failures, applies them to a candidate skill/memory, then
5
- **gates** the candidate on a held-out slice of the user's own tasks. Only a
6
- candidate that strictly improves the held-out score is accepted — the SkillOpt
7
- validation gate, vendored self-contained in ``skillopt_sleep.gate``.
8
- """
9
- from __future__ import annotations
10
-
11
- import os
12
- from dataclasses import dataclass
13
- from typing import List, Optional, Tuple
14
-
15
- from skillopt_sleep.backend import Backend
16
- from skillopt_sleep.memory import apply_edits
17
- from skillopt_sleep.replay import aggregate_scores, replay_batch
18
- from skillopt_sleep.types import EditRecord, ReplayResult, TaskRecord
19
-
20
-
21
- # Self-contained validation gate (vendored from SkillOpt; zero dependency on the
22
- # research package, so this open-source tool stays decoupled from the paper code).
23
- from skillopt_sleep.gate import evaluate_gate, select_gate_score
24
- _HAVE_REPO_GATE = True
25
-
26
-
27
- @dataclass
28
- class ConsolidationResult:
29
- accepted: bool
30
- gate_action: str
31
- baseline_score: float
32
- candidate_score: float
33
- new_skill: str
34
- new_memory: str
35
- applied_edits: List[EditRecord]
36
- rejected_edits: List[EditRecord]
37
- holdout_baseline: float
38
- holdout_candidate: float
39
-
40
-
41
- def _split(tasks: List[TaskRecord]) -> Tuple[List[TaskRecord], List[TaskRecord]]:
42
- """Return (train_tasks, val_tasks).
43
-
44
- train drives reflect; val gates updates. test is held out entirely from
45
- consolidation and is scored by the caller. Accepts legacy split names
46
- (replay->train, holdout->val) for robustness.
47
- """
48
- def _norm(s: str) -> str:
49
- return {"replay": "train", "holdout": "val"}.get(s, s)
50
-
51
- train = [t for t in tasks if _norm(t.split) == "train"]
52
- val = [t for t in tasks if _norm(t.split) == "val"]
53
- # be robust if a split is empty: fall back so a night still does something,
54
- # but never silently use test as val.
55
- test = [t for t in tasks if _norm(t.split) == "test"]
56
- if not val:
57
- # prefer train as the gate reference over nothing; last resort all-but-test
58
- val = train or [t for t in tasks if _norm(t.split) != "test"] or tasks
59
- if not train:
60
- train = val
61
- return train, val
62
-
63
-
64
- def consolidate(
65
- backend: Backend,
66
- tasks: List[TaskRecord],
67
- skill: str,
68
- memory: str,
69
- *,
70
- edit_budget: int = 4,
71
- gate_metric: str = "mixed",
72
- gate_mixed_weight: float = 0.5,
73
- gate_mode: str = "on", # "on" (hard/soft per gate_metric) | "off" (greedy)
74
- rollouts_k: int = 1, # >1 => multi-rollout contrastive reflection
75
- evolve_skill: bool = True,
76
- evolve_memory: bool = True,
77
- night: int = 1,
78
- ) -> ConsolidationResult:
79
- """Run one consolidation epoch: reflect -> bounded edit -> gate.
80
-
81
- train tasks drive reflect; val tasks gate the update (test is held out by the
82
- caller). With ``gate_mode='off'`` edits are accepted greedily (no val-improve
83
- requirement) — the user opts out of hard filtering — but val scores are still
84
- recorded so the report shows whether quality moved.
85
-
86
- Skill and memory are evolved in sequence (skill first if both enabled).
87
- """
88
- train_tasks, val_tasks = _split(tasks)
89
- gate_off = str(gate_mode).strip().lower() in {"off", "none", "false", "greedy"}
90
-
91
- # ── baseline on the VAL slice (the gate reference) ────────────────────
92
- # When the gate is OFF the user has opted out of holding out a validation set
93
- # (the daily-use design): we accept edits greedily and judge quality only on
94
- # the real test set, scored by the caller. So we SKIP all val scoring — it is
95
- # both wasted cost and contrary to the "no val set required" design.
96
- if gate_off:
97
- base_hard, base_soft = 0.0, 0.0
98
- else:
99
- base_pairs = replay_batch(backend, val_tasks, skill, memory)
100
- base_hard, base_soft = aggregate_scores(base_pairs)
101
- base_score = select_gate_score(base_hard, base_soft, gate_metric, gate_mixed_weight)
102
-
103
- # ── reflect over TRAIN-split failures/successes ───────────────────────
104
- train_pairs = replay_batch(backend, train_tasks, skill, memory)
105
- failures = [(t, r) for (t, r) in train_pairs if r.hard < 1.0]
106
- successes = [(t, r) for (t, r) in train_pairs if r.hard >= 1.0]
107
-
108
- cand_skill, cand_memory = skill, memory
109
- all_applied: List[EditRecord] = []
110
- all_rejected: List[EditRecord] = []
111
-
112
- def _gate_apply(doc: str, edits: List[EditRecord], which: str) -> str:
113
- nonlocal cand_skill, cand_memory, base_score, all_applied, all_rejected
114
- if not edits:
115
- return doc
116
- new_doc, applied = apply_edits(doc, edits)
117
- if not applied:
118
- return doc
119
- # gate OFF: accept greedily with NO val scoring (the daily-use path)
120
- if gate_off:
121
- all_applied.extend(applied)
122
- return new_doc
123
- # gate ON: score the candidate on the VAL slice, keep only if it improves
124
- trial_skill = new_doc if which == "skill" else cand_skill
125
- trial_memory = new_doc if which == "memory" else cand_memory
126
- pairs = replay_batch(backend, val_tasks, trial_skill, trial_memory)
127
- h, s = aggregate_scores(pairs)
128
- cand_score = select_gate_score(h, s, gate_metric, gate_mixed_weight)
129
- if cand_score > base_score:
130
- base_score = max(base_score, cand_score)
131
- all_applied.extend(applied)
132
- return new_doc
133
- all_rejected.extend(applied)
134
- return doc
135
-
136
- if evolve_skill:
137
- if rollouts_k > 1:
138
- # multi-rollout contrastive reflection: run each train task K times
139
- # and distill a rule from the good-vs-bad contrast (the imagination signal).
140
- from skillopt_sleep.rollout import multi_rollout, contrastive_reflect
141
- # Parallelize across tasks (each multi_rollout also parallelizes its K
142
- # attempts). This dream phase is the dominant cost; serial execution
143
- # times out on real backends. Cap total in-flight at the worker env.
144
- import os
145
- from concurrent.futures import ThreadPoolExecutor
146
- try:
147
- _w = int(os.environ.get("SKILLOPT_SLEEP_WORKERS", "1"))
148
- except ValueError:
149
- _w = 1
150
- if _w > 1 and len(train_tasks) > 1:
151
- # split the worker budget between task-parallelism and per-task K
152
- task_workers = max(1, min(len(train_tasks), _w))
153
- per_task = max(1, _w // task_workers)
154
- with ThreadPoolExecutor(max_workers=task_workers) as ex:
155
- sets = list(ex.map(
156
- lambda t: multi_rollout(backend, t, cand_skill, cand_memory,
157
- k=rollouts_k, workers=per_task),
158
- train_tasks))
159
- else:
160
- sets = [multi_rollout(backend, t, cand_skill, cand_memory,
161
- k=rollouts_k, workers=1)
162
- for t in train_tasks]
163
- edits = contrastive_reflect(
164
- backend, sets, cand_skill, cand_memory,
165
- edit_budget=edit_budget, target="skill",
166
- )
167
- # fall back to single-shot reflect if contrast yielded nothing
168
- if not edits:
169
- edits = backend.reflect(
170
- failures, successes, cand_skill, cand_memory,
171
- edit_budget=edit_budget, evolve_skill=True, evolve_memory=False,
172
- )
173
- else:
174
- edits = backend.reflect(
175
- failures, successes, cand_skill, cand_memory,
176
- edit_budget=edit_budget, evolve_skill=True, evolve_memory=False,
177
- )
178
- cand_skill = _gate_apply(cand_skill, edits, "skill")
179
-
180
- if evolve_memory:
181
- # re-evaluate failures under the (possibly improved) skill
182
- train_pairs2 = replay_batch(backend, train_tasks, cand_skill, cand_memory)
183
- failures2 = [(t, r) for (t, r) in train_pairs2 if r.hard < 1.0]
184
- successes2 = [(t, r) for (t, r) in train_pairs2 if r.hard >= 1.0]
185
- edits_m = backend.reflect(
186
- failures2, successes2, cand_skill, cand_memory,
187
- edit_budget=edit_budget, evolve_skill=False, evolve_memory=True,
188
- )
189
- cand_memory = _gate_apply(cand_memory, edits_m, "memory")
190
-
191
- # ── final decision ────────────────────────────────────────────────────
192
- if gate_off:
193
- # greedy mode: no val scoring at all. Keep whatever edits we applied; the
194
- # caller measures real quality on the test set. We report holdout_candidate
195
- # as 0.0 (val intentionally not computed in this variant).
196
- final_hard, final_soft = 0.0, 0.0
197
- final_score = 0.0
198
- accepted = bool(all_applied)
199
- action = "greedy_applied" if all_applied else "greedy_noop"
200
- base_gate_score = 0.0
201
- else:
202
- # scored on the VAL slice (the gate reference)
203
- final_pairs = replay_batch(backend, val_tasks, cand_skill, cand_memory)
204
- final_hard, final_soft = aggregate_scores(final_pairs)
205
- final_score = select_gate_score(final_hard, final_soft, gate_metric, gate_mixed_weight)
206
- base_gate_score = select_gate_score(base_hard, base_soft, gate_metric, gate_mixed_weight)
207
- if _HAVE_REPO_GATE:
208
- gate = evaluate_gate(
209
- candidate_skill=cand_skill,
210
- cand_hard=final_hard,
211
- current_skill=skill,
212
- current_score=base_gate_score,
213
- best_skill=skill,
214
- best_score=base_gate_score,
215
- best_step=night - 1,
216
- global_step=night,
217
- cand_soft=final_soft,
218
- metric=gate_metric,
219
- mixed_weight=gate_mixed_weight,
220
- )
221
- action = gate.action
222
- accepted = bool(all_applied) and final_score > base_gate_score
223
- else:
224
- action = "accept" if final_score > base_gate_score else "reject"
225
- accepted = bool(all_applied) and final_score > base_gate_score
226
-
227
- return ConsolidationResult(
228
- accepted=accepted,
229
- gate_action=action,
230
- baseline_score=base_gate_score,
231
- candidate_score=final_score,
232
- new_skill=cand_skill if accepted else skill,
233
- new_memory=cand_memory if accepted else memory,
234
- applied_edits=all_applied,
235
- rejected_edits=all_rejected,
236
- holdout_baseline=base_hard,
237
- holdout_candidate=final_hard,
238
- )