dsh-aris-panel 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (442) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +98 -0
  3. package/README_CN.md +87 -0
  4. package/dsh/checkout.patch.yml +38 -0
  5. package/dsh/client.js +634 -0
  6. package/dsh/cordis.patch.yml +44 -0
  7. package/dsh/index.mjs +76 -0
  8. package/dsh/run-status.mjs +182 -0
  9. package/dsh/scope-limits.mjs +50 -0
  10. package/dsh/workbench.mjs +291 -0
  11. package/mcp-servers/claude-review/README.md +93 -0
  12. package/mcp-servers/claude-review/run_with_claude_aws.sh +49 -0
  13. package/mcp-servers/claude-review/server.py +718 -0
  14. package/mcp-servers/codex-image2/README.md +65 -0
  15. package/mcp-servers/codex-image2/server.py +893 -0
  16. package/mcp-servers/feishu-bridge/requirements.txt +1 -0
  17. package/mcp-servers/feishu-bridge/server.py +240 -0
  18. package/mcp-servers/gemini-review/README.md +171 -0
  19. package/mcp-servers/gemini-review/server.py +1856 -0
  20. package/mcp-servers/llm-chat/requirements.txt +1 -0
  21. package/mcp-servers/llm-chat/server.py +664 -0
  22. package/mcp-servers/manual-review/README.md +133 -0
  23. package/mcp-servers/manual-review/server.py +910 -0
  24. package/mcp-servers/manual-review/ui.html +279 -0
  25. package/mcp-servers/minimax-chat/requirements.txt +1 -0
  26. package/mcp-servers/minimax-chat/server.py +381 -0
  27. package/package.json +51 -0
  28. package/skills/ablation-planner/SKILL.md +123 -0
  29. package/skills/alphaxiv/SKILL.md +196 -0
  30. package/skills/analyze-results/SKILL.md +46 -0
  31. package/skills/arxiv/SKILL.md +248 -0
  32. package/skills/auto-paper-improvement-loop/SKILL.md +651 -0
  33. package/skills/auto-review-loop/SKILL.md +1137 -0
  34. package/skills/auto-review-loop-llm/SKILL.md +259 -0
  35. package/skills/auto-review-loop-minimax/SKILL.md +302 -0
  36. package/skills/citation-audit/SKILL.md +502 -0
  37. package/skills/claims-drafting/SKILL.md +227 -0
  38. package/skills/comm-lit-review/SKILL.md +297 -0
  39. package/skills/deepxiv/SKILL.md +263 -0
  40. package/skills/dse-loop/SKILL.md +296 -0
  41. package/skills/embodiment-description/SKILL.md +129 -0
  42. package/skills/exa-search/SKILL.md +205 -0
  43. package/skills/experiment-audit/SKILL.md +311 -0
  44. package/skills/experiment-bridge/SKILL.md +376 -0
  45. package/skills/experiment-plan/SKILL.md +249 -0
  46. package/skills/experiment-queue/SKILL.md +431 -0
  47. package/skills/experiment-queue/scripts/build_manifest.py +142 -0
  48. package/skills/experiment-queue/scripts/queue_manager.py +433 -0
  49. package/skills/feishu-notify/SKILL.md +156 -0
  50. package/skills/figure-description/SKILL.md +138 -0
  51. package/skills/figure-spec/SKILL.md +262 -0
  52. package/skills/figure-spec/scripts/figure_renderer.py +799 -0
  53. package/skills/formula-derivation/SKILL.md +280 -0
  54. package/skills/gemini-search/SKILL.md +231 -0
  55. package/skills/grant-proposal/SKILL.md +698 -0
  56. package/skills/idea-creator/SKILL.md +542 -0
  57. package/skills/idea-discovery/SKILL.md +521 -0
  58. package/skills/idea-discovery-robot/SKILL.md +363 -0
  59. package/skills/integrity-forensics/SKILL.md +284 -0
  60. package/skills/interview-cheatsheet/SKILL.md +245 -0
  61. package/skills/invention-structuring/SKILL.md +188 -0
  62. package/skills/jurisdiction-format/SKILL.md +192 -0
  63. package/skills/kill-argument/SKILL.md +437 -0
  64. package/skills/mermaid-diagram/SKILL.md +419 -0
  65. package/skills/meta-apply/SKILL.md +141 -0
  66. package/skills/meta-optimize/SKILL.md +437 -0
  67. package/skills/monitor-experiment/SKILL.md +140 -0
  68. package/skills/novelty-check/SKILL.md +101 -0
  69. package/skills/openalex/SKILL.md +237 -0
  70. package/skills/overleaf-sync/SKILL.md +220 -0
  71. package/skills/paper-claim-audit/SKILL.md +348 -0
  72. package/skills/paper-compile/SKILL.md +266 -0
  73. package/skills/paper-figure/SKILL.md +312 -0
  74. package/skills/paper-illustration/SKILL.md +736 -0
  75. package/skills/paper-illustration-image2/SKILL.md +391 -0
  76. package/skills/paper-illustration-image2/scripts/paper_illustration_image2.py +255 -0
  77. package/skills/paper-plan/SKILL.md +386 -0
  78. package/skills/paper-poster/SKILL.md +19 -0
  79. package/skills/paper-poster-html/DESIGN_FINAL.md +176 -0
  80. package/skills/paper-poster-html/IMPLEMENTATION_CONVENTIONS.md +161 -0
  81. package/skills/paper-poster-html/LICENSES/posterly-MIT.txt +21 -0
  82. package/skills/paper-poster-html/NOTICE.md +57 -0
  83. package/skills/paper-poster-html/SKILL.md +323 -0
  84. package/skills/paper-poster-html/scripts/_posterly/__init__.py +0 -0
  85. package/skills/paper-poster-html/scripts/_posterly/canvas.py +200 -0
  86. package/skills/paper-poster-html/scripts/_posterly/measure.py +588 -0
  87. package/skills/paper-poster-html/scripts/_posterly/polish.py +498 -0
  88. package/skills/paper-poster-html/scripts/_posterly/preflight.py +489 -0
  89. package/skills/paper-poster-html/scripts/_posterly/render.py +215 -0
  90. package/skills/paper-poster-html/scripts/_posterly/textutil.py +16 -0
  91. package/skills/paper-poster-html/scripts/_posterly/verify_final.py +171 -0
  92. package/skills/paper-poster-html/scripts/asset_check.py +897 -0
  93. package/skills/paper-poster-html/scripts/extract_pdf_figures.py +666 -0
  94. package/skills/paper-poster-html/scripts/poster_check.py +251 -0
  95. package/skills/paper-poster-html/scripts/preprocess_figures.py +238 -0
  96. package/skills/paper-poster-html/scripts/render_preview.py +217 -0
  97. package/skills/paper-poster-html/scripts/run_gates.py +556 -0
  98. package/skills/paper-poster-html/scripts/style_check.py +1324 -0
  99. package/skills/paper-poster-html/templates/COMPONENTS.md +462 -0
  100. package/skills/paper-poster-html/templates/README.md +170 -0
  101. package/skills/paper-poster-html/templates/landscape_4col.html +1032 -0
  102. package/skills/paper-poster-html/templates/landscape_hero.html +1046 -0
  103. package/skills/paper-poster-html/templates/portrait_2col.html +947 -0
  104. package/skills/paper-poster-html/templates/tokens/acl.json +9 -0
  105. package/skills/paper-poster-html/templates/tokens/cvpr.json +9 -0
  106. package/skills/paper-poster-html/templates/tokens/generic.json +9 -0
  107. package/skills/paper-poster-html/templates/tokens/iclr.json +9 -0
  108. package/skills/paper-poster-html/templates/tokens/icml.json +9 -0
  109. package/skills/paper-poster-html/templates/tokens/neurips.json +9 -0
  110. package/skills/paper-slides/SKILL.md +635 -0
  111. package/skills/paper-talk/SKILL.md +381 -0
  112. package/skills/paper-write/SKILL.md +604 -0
  113. package/skills/paper-write/templates/IEEEtran.bst +2409 -0
  114. package/skills/paper-write/templates/IEEEtran.cls +6347 -0
  115. package/skills/paper-write/templates/iclr2026.tex +84 -0
  116. package/skills/paper-write/templates/icml2025.tex +87 -0
  117. package/skills/paper-write/templates/ieee_conference.tex +89 -0
  118. package/skills/paper-write/templates/ieee_journal.tex +93 -0
  119. package/skills/paper-write/templates/math_commands.tex +48 -0
  120. package/skills/paper-write/templates/neurips2025.tex +80 -0
  121. package/skills/paper-writing/SKILL.md +916 -0
  122. package/skills/patent-novelty-check/SKILL.md +153 -0
  123. package/skills/patent-pipeline/SKILL.md +344 -0
  124. package/skills/patent-review/SKILL.md +203 -0
  125. package/skills/pixel-art/SKILL.md +137 -0
  126. package/skills/prior-art-search/SKILL.md +146 -0
  127. package/skills/proof-checker/SKILL.md +866 -0
  128. package/skills/proof-orchestrator/NOTICE.md +24 -0
  129. package/skills/proof-orchestrator/SKILL.md +254 -0
  130. package/skills/proof-orchestrator/references/audit-output-contract.md +126 -0
  131. package/skills/proof-orchestrator/references/deepseek-routing.md +74 -0
  132. package/skills/proof-orchestrator/references/dispatch-prompts.md +227 -0
  133. package/skills/proof-orchestrator/references/notation-audit.md +135 -0
  134. package/skills/proof-orchestrator/references/proof-audit-rubric.md +70 -0
  135. package/skills/proof-orchestrator/references/stress-tests.md +38 -0
  136. package/skills/proof-writer/SKILL.md +223 -0
  137. package/skills/qzcli/SKILL.md +324 -0
  138. package/skills/rebuttal/SKILL.md +376 -0
  139. package/skills/render-html/SKILL.md +316 -0
  140. package/skills/render-html/scripts/render_html.py +1006 -0
  141. package/skills/render-html/scripts/templates/academic.html +703 -0
  142. package/skills/render-html/scripts/templates/dashboard.html +333 -0
  143. package/skills/research-lit/SKILL.md +756 -0
  144. package/skills/research-pipeline/SKILL.md +384 -0
  145. package/skills/research-refine/SKILL.md +770 -0
  146. package/skills/research-refine-pipeline/SKILL.md +186 -0
  147. package/skills/research-review/SKILL.md +198 -0
  148. package/skills/research-wiki/SKILL.md +461 -0
  149. package/skills/resubmit-pipeline/SKILL.md +447 -0
  150. package/skills/result-to-claim/SKILL.md +311 -0
  151. package/skills/run-experiment/SKILL.md +313 -0
  152. package/skills/semantic-scholar/SKILL.md +236 -0
  153. package/skills/serverless-modal/SKILL.md +335 -0
  154. package/skills/shared-references/acceptance-gate.md +324 -0
  155. package/skills/shared-references/assurance-contract.md +248 -0
  156. package/skills/shared-references/capture-antipatterns.md +78 -0
  157. package/skills/shared-references/citation-discipline.md +583 -0
  158. package/skills/shared-references/compute-env-contract.md +163 -0
  159. package/skills/shared-references/effort-contract.md +183 -0
  160. package/skills/shared-references/evidence-precheck.md +65 -0
  161. package/skills/shared-references/experiment-integrity.md +49 -0
  162. package/skills/shared-references/external-cadence.md +326 -0
  163. package/skills/shared-references/fan-out-pattern.md +366 -0
  164. package/skills/shared-references/injection-hygiene.md +127 -0
  165. package/skills/shared-references/integration-contract.md +461 -0
  166. package/skills/shared-references/output-composition.md +93 -0
  167. package/skills/shared-references/output-language.md +45 -0
  168. package/skills/shared-references/output-manifest.md +49 -0
  169. package/skills/shared-references/output-versioning.md +111 -0
  170. package/skills/shared-references/patent-format-cn.md +199 -0
  171. package/skills/shared-references/patent-format-ep.md +173 -0
  172. package/skills/shared-references/patent-format-us.md +161 -0
  173. package/skills/shared-references/patent-writing-principles.md +197 -0
  174. package/skills/shared-references/prior-art-databases.md +141 -0
  175. package/skills/shared-references/resumable-runs.md +109 -0
  176. package/skills/shared-references/review-scope-limits.md +81 -0
  177. package/skills/shared-references/review-tracing.md +391 -0
  178. package/skills/shared-references/reviewer-independence.md +79 -0
  179. package/skills/shared-references/reviewer-routing.md +852 -0
  180. package/skills/shared-references/skill-governance.md +104 -0
  181. package/skills/shared-references/taste-calibration.md +85 -0
  182. package/skills/shared-references/venue-checklists.md +114 -0
  183. package/skills/shared-references/wiki-helper-resolution.md +134 -0
  184. package/skills/shared-references/writing-principles.md +525 -0
  185. package/skills/skills-codex/README.md +102 -0
  186. package/skills/skills-codex/README_CN.md +100 -0
  187. package/skills/skills-codex/ablation-planner/SKILL.md +126 -0
  188. package/skills/skills-codex/alphaxiv/SKILL.md +186 -0
  189. package/skills/skills-codex/analyze-results/SKILL.md +45 -0
  190. package/skills/skills-codex/arxiv/SKILL.md +210 -0
  191. package/skills/skills-codex/auto-paper-improvement-loop/SKILL.md +574 -0
  192. package/skills/skills-codex/auto-review-loop/SKILL.md +500 -0
  193. package/skills/skills-codex/auto-review-loop-llm/SKILL.md +247 -0
  194. package/skills/skills-codex/auto-review-loop-minimax/SKILL.md +290 -0
  195. package/skills/skills-codex/citation-audit/SKILL.md +504 -0
  196. package/skills/skills-codex/claims-drafting/SKILL.md +239 -0
  197. package/skills/skills-codex/comm-lit-review/SKILL.md +299 -0
  198. package/skills/skills-codex/comm-lit-review/references/domain-taxonomy.md +57 -0
  199. package/skills/skills-codex/comm-lit-review/references/output-template.md +37 -0
  200. package/skills/skills-codex/comm-lit-review/references/source-policy.md +99 -0
  201. package/skills/skills-codex/comm-lit-review/references/venue-tiering.md +112 -0
  202. package/skills/skills-codex/deepxiv/SKILL.md +142 -0
  203. package/skills/skills-codex/dse-loop/SKILL.md +285 -0
  204. package/skills/skills-codex/embodiment-description/SKILL.md +129 -0
  205. package/skills/skills-codex/exa-search/SKILL.md +192 -0
  206. package/skills/skills-codex/experiment-audit/SKILL.md +286 -0
  207. package/skills/skills-codex/experiment-bridge/SKILL.md +356 -0
  208. package/skills/skills-codex/experiment-plan/SKILL.md +249 -0
  209. package/skills/skills-codex/experiment-queue/SKILL.md +401 -0
  210. package/skills/skills-codex/feishu-notify/SKILL.md +155 -0
  211. package/skills/skills-codex/figure-description/SKILL.md +138 -0
  212. package/skills/skills-codex/figure-spec/SKILL.md +252 -0
  213. package/skills/skills-codex/formula-derivation/SKILL.md +280 -0
  214. package/skills/skills-codex/gemini-search/SKILL.md +205 -0
  215. package/skills/skills-codex/grant-proposal/SKILL.md +626 -0
  216. package/skills/skills-codex/idea-creator/SKILL.md +405 -0
  217. package/skills/skills-codex/idea-discovery/SKILL.md +475 -0
  218. package/skills/skills-codex/idea-discovery-robot/SKILL.md +362 -0
  219. package/skills/skills-codex/integrity-forensics/SKILL.md +106 -0
  220. package/skills/skills-codex/interview-cheatsheet/SKILL.md +245 -0
  221. package/skills/skills-codex/invention-structuring/SKILL.md +188 -0
  222. package/skills/skills-codex/jurisdiction-format/SKILL.md +192 -0
  223. package/skills/skills-codex/kill-argument/SKILL.md +403 -0
  224. package/skills/skills-codex/mermaid-diagram/SKILL.md +379 -0
  225. package/skills/skills-codex/meta-apply/SKILL.md +154 -0
  226. package/skills/skills-codex/meta-optimize/SKILL.md +348 -0
  227. package/skills/skills-codex/monitor-experiment/SKILL.md +98 -0
  228. package/skills/skills-codex/novelty-check/SKILL.md +89 -0
  229. package/skills/skills-codex/openalex/SKILL.md +228 -0
  230. package/skills/skills-codex/overleaf-sync/SKILL.md +220 -0
  231. package/skills/skills-codex/paper-claim-audit/SKILL.md +350 -0
  232. package/skills/skills-codex/paper-compile/SKILL.md +253 -0
  233. package/skills/skills-codex/paper-figure/SKILL.md +311 -0
  234. package/skills/skills-codex/paper-illustration/SKILL.md +690 -0
  235. package/skills/skills-codex/paper-illustration-image2/SKILL.md +383 -0
  236. package/skills/skills-codex/paper-illustration-image2/scripts/paper_illustration_image2.py +255 -0
  237. package/skills/skills-codex/paper-plan/SKILL.md +278 -0
  238. package/skills/skills-codex/paper-poster/SKILL.md +19 -0
  239. package/skills/skills-codex/paper-poster-html/SKILL.md +377 -0
  240. package/skills/skills-codex/paper-slides/SKILL.md +571 -0
  241. package/skills/skills-codex/paper-talk/SKILL.md +381 -0
  242. package/skills/skills-codex/paper-write/SKILL.md +411 -0
  243. package/skills/skills-codex/paper-write/templates/IEEEtran.bst +2409 -0
  244. package/skills/skills-codex/paper-write/templates/IEEEtran.cls +6347 -0
  245. package/skills/skills-codex/paper-write/templates/aaai2026.bst +1493 -0
  246. package/skills/skills-codex/paper-write/templates/aaai2026.sty +315 -0
  247. package/skills/skills-codex/paper-write/templates/aaai2026.tex +952 -0
  248. package/skills/skills-codex/paper-write/templates/acl.sty +312 -0
  249. package/skills/skills-codex/paper-write/templates/acl2026.tex +377 -0
  250. package/skills/skills-codex/paper-write/templates/acl_natbib.bst +1940 -0
  251. package/skills/skills-codex/paper-write/templates/acm.bst +3081 -0
  252. package/skills/skills-codex/paper-write/templates/acm_mm2026.tex +204 -0
  253. package/skills/skills-codex/paper-write/templates/acmart.cls +3520 -0
  254. package/skills/skills-codex/paper-write/templates/cvpr.bst +1448 -0
  255. package/skills/skills-codex/paper-write/templates/cvpr.sty +508 -0
  256. package/skills/skills-codex/paper-write/templates/cvpr2026.tex +63 -0
  257. package/skills/skills-codex/paper-write/templates/iclr2026.tex +84 -0
  258. package/skills/skills-codex/paper-write/templates/iclr2026_conference.bst +1440 -0
  259. package/skills/skills-codex/paper-write/templates/iclr2026_conference.sty +246 -0
  260. package/skills/skills-codex/paper-write/templates/icml2026.sty +767 -0
  261. package/skills/skills-codex/paper-write/templates/icml2026.tex +662 -0
  262. package/skills/skills-codex/paper-write/templates/ieee_conference.tex +89 -0
  263. package/skills/skills-codex/paper-write/templates/ieee_journal.tex +93 -0
  264. package/skills/skills-codex/paper-write/templates/math_commands.tex +48 -0
  265. package/skills/skills-codex/paper-write/templates/neurips2026.tex +493 -0
  266. package/skills/skills-codex/paper-write/templates/neurips_2026.sty +437 -0
  267. package/skills/skills-codex/paper-writing/SKILL.md +731 -0
  268. package/skills/skills-codex/patent-novelty-check/SKILL.md +153 -0
  269. package/skills/skills-codex/patent-pipeline/SKILL.md +344 -0
  270. package/skills/skills-codex/patent-review/SKILL.md +202 -0
  271. package/skills/skills-codex/pixel-art/SKILL.md +139 -0
  272. package/skills/skills-codex/prior-art-search/SKILL.md +146 -0
  273. package/skills/skills-codex/proof-checker/SKILL.md +554 -0
  274. package/skills/skills-codex/proof-orchestrator/SKILL.md +260 -0
  275. package/skills/skills-codex/proof-orchestrator/references/audit-output-contract.md +126 -0
  276. package/skills/skills-codex/proof-orchestrator/references/deepseek-routing.md +76 -0
  277. package/skills/skills-codex/proof-orchestrator/references/dispatch-prompts.md +227 -0
  278. package/skills/skills-codex/proof-orchestrator/references/notation-audit.md +135 -0
  279. package/skills/skills-codex/proof-orchestrator/references/proof-audit-rubric.md +70 -0
  280. package/skills/skills-codex/proof-orchestrator/references/stress-tests.md +38 -0
  281. package/skills/skills-codex/proof-writer/SKILL.md +222 -0
  282. package/skills/skills-codex/qzcli/SKILL.md +324 -0
  283. package/skills/skills-codex/rebuttal/SKILL.md +305 -0
  284. package/skills/skills-codex/render-html/SKILL.md +305 -0
  285. package/skills/skills-codex/render-html/scripts/__pycache__/render_html.cpython-314.pyc +0 -0
  286. package/skills/skills-codex/render-html/scripts/render_html.py +909 -0
  287. package/skills/skills-codex/render-html/scripts/templates/academic.html +342 -0
  288. package/skills/skills-codex/render-html/scripts/templates/dashboard.html +333 -0
  289. package/skills/skills-codex/research-lit/SKILL.md +464 -0
  290. package/skills/skills-codex/research-pipeline/SKILL.md +340 -0
  291. package/skills/skills-codex/research-refine/SKILL.md +721 -0
  292. package/skills/skills-codex/research-refine-pipeline/SKILL.md +186 -0
  293. package/skills/skills-codex/research-review/SKILL.md +135 -0
  294. package/skills/skills-codex/research-wiki/SKILL.md +421 -0
  295. package/skills/skills-codex/resubmit-pipeline/SKILL.md +444 -0
  296. package/skills/skills-codex/result-to-claim/SKILL.md +246 -0
  297. package/skills/skills-codex/run-experiment/SKILL.md +236 -0
  298. package/skills/skills-codex/semantic-scholar/SKILL.md +219 -0
  299. package/skills/skills-codex/serverless-modal/SKILL.md +335 -0
  300. package/skills/skills-codex/shared-references/acceptance-gate.md +336 -0
  301. package/skills/skills-codex/shared-references/assurance-contract.md +139 -0
  302. package/skills/skills-codex/shared-references/capture-antipatterns.md +84 -0
  303. package/skills/skills-codex/shared-references/citation-discipline.md +452 -0
  304. package/skills/skills-codex/shared-references/compute-env-contract.md +163 -0
  305. package/skills/skills-codex/shared-references/effort-contract.md +143 -0
  306. package/skills/skills-codex/shared-references/evidence-precheck.md +73 -0
  307. package/skills/skills-codex/shared-references/experiment-integrity.md +49 -0
  308. package/skills/skills-codex/shared-references/external-cadence.md +334 -0
  309. package/skills/skills-codex/shared-references/fan-out-pattern.md +375 -0
  310. package/skills/skills-codex/shared-references/injection-hygiene.md +132 -0
  311. package/skills/skills-codex/shared-references/integration-contract.md +372 -0
  312. package/skills/skills-codex/shared-references/output-composition.md +98 -0
  313. package/skills/skills-codex/shared-references/output-language.md +45 -0
  314. package/skills/skills-codex/shared-references/output-manifest.md +40 -0
  315. package/skills/skills-codex/shared-references/output-versioning.md +111 -0
  316. package/skills/skills-codex/shared-references/patent-format-cn.md +199 -0
  317. package/skills/skills-codex/shared-references/patent-format-ep.md +173 -0
  318. package/skills/skills-codex/shared-references/patent-format-us.md +161 -0
  319. package/skills/skills-codex/shared-references/patent-writing-principles.md +197 -0
  320. package/skills/skills-codex/shared-references/prior-art-databases.md +141 -0
  321. package/skills/skills-codex/shared-references/resumable-runs.md +125 -0
  322. package/skills/skills-codex/shared-references/review-scope-limits.md +81 -0
  323. package/skills/skills-codex/shared-references/review-tracing.md +144 -0
  324. package/skills/skills-codex/shared-references/reviewer-independence.md +66 -0
  325. package/skills/skills-codex/shared-references/reviewer-routing.md +128 -0
  326. package/skills/skills-codex/shared-references/skill-governance.md +119 -0
  327. package/skills/skills-codex/shared-references/taste-calibration.md +90 -0
  328. package/skills/skills-codex/shared-references/venue-checklists.md +73 -0
  329. package/skills/skills-codex/shared-references/wiki-helper-resolution.md +69 -0
  330. package/skills/skills-codex/shared-references/writing-principles.md +525 -0
  331. package/skills/skills-codex/slides-polish/SKILL.md +563 -0
  332. package/skills/skills-codex/specification-writing/SKILL.md +211 -0
  333. package/skills/skills-codex/system-profile/SKILL.md +103 -0
  334. package/skills/skills-codex/training-check/SKILL.md +83 -0
  335. package/skills/skills-codex/vast-gpu/SKILL.md +394 -0
  336. package/skills/skills-codex/web-debug-search/SKILL.md +334 -0
  337. package/skills/skills-codex/wiki-enrich/SKILL.md +255 -0
  338. package/skills/skills-codex/writing-systems-papers/SKILL.md +184 -0
  339. package/skills/skills-codex-claude-review/README.md +79 -0
  340. package/skills/skills-codex-claude-review/README_CN.md +78 -0
  341. package/skills/skills-codex-claude-review/auto-paper-improvement-loop/SKILL.md +581 -0
  342. package/skills/skills-codex-claude-review/auto-review-loop/SKILL.md +510 -0
  343. package/skills/skills-codex-claude-review/novelty-check/SKILL.md +102 -0
  344. package/skills/skills-codex-claude-review/paper-figure/SKILL.md +319 -0
  345. package/skills/skills-codex-claude-review/paper-plan/SKILL.md +287 -0
  346. package/skills/skills-codex-claude-review/paper-write/SKILL.md +420 -0
  347. package/skills/skills-codex-claude-review/research-refine/SKILL.md +732 -0
  348. package/skills/skills-codex-claude-review/research-review/SKILL.md +149 -0
  349. package/skills/skills-codex-gemini-review/README.md +176 -0
  350. package/skills/skills-codex-gemini-review/README_CN.md +175 -0
  351. package/skills/skills-codex-gemini-review/auto-paper-improvement-loop/SKILL.md +331 -0
  352. package/skills/skills-codex-gemini-review/auto-review-loop/SKILL.md +304 -0
  353. package/skills/skills-codex-gemini-review/grant-proposal/SKILL.md +630 -0
  354. package/skills/skills-codex-gemini-review/idea-creator/SKILL.md +263 -0
  355. package/skills/skills-codex-gemini-review/idea-discovery/SKILL.md +275 -0
  356. package/skills/skills-codex-gemini-review/idea-discovery-robot/SKILL.md +365 -0
  357. package/skills/skills-codex-gemini-review/novelty-check/SKILL.md +92 -0
  358. package/skills/skills-codex-gemini-review/paper-figure/SKILL.md +289 -0
  359. package/skills/skills-codex-gemini-review/paper-plan/SKILL.md +265 -0
  360. package/skills/skills-codex-gemini-review/paper-poster-html/SKILL.md +102 -0
  361. package/skills/skills-codex-gemini-review/paper-slides/SKILL.md +582 -0
  362. package/skills/skills-codex-gemini-review/paper-write/SKILL.md +346 -0
  363. package/skills/skills-codex-gemini-review/paper-writing/SKILL.md +312 -0
  364. package/skills/skills-codex-gemini-review/research-refine/SKILL.md +674 -0
  365. package/skills/skills-codex-gemini-review/research-review/SKILL.md +112 -0
  366. package/skills/slides-polish/SKILL.md +565 -0
  367. package/skills/specification-writing/SKILL.md +211 -0
  368. package/skills/system-profile/SKILL.md +103 -0
  369. package/skills/training-check/SKILL.md +132 -0
  370. package/skills/vast-gpu/SKILL.md +394 -0
  371. package/skills/web-debug-search/SKILL.md +334 -0
  372. package/skills/wiki-enrich/SKILL.md +257 -0
  373. package/skills/writing-systems-papers/SKILL.md +184 -0
  374. package/templates/CLAUDE_MD_TEMPLATE.md +29 -0
  375. package/templates/EXPERIMENT_LOG_TEMPLATE.md +47 -0
  376. package/templates/EXPERIMENT_PLAN_TEMPLATE.md +51 -0
  377. package/templates/EXPERIMENT_PLAN_TEMPLATE_CN.md +53 -0
  378. package/templates/FINDINGS_TEMPLATE.md +52 -0
  379. package/templates/IDEA_CANDIDATES_TEMPLATE.md +47 -0
  380. package/templates/IDEA_CANDIDATES_TEMPLATE_CN.md +47 -0
  381. package/templates/INVENTION_BRIEF_TEMPLATE.md +87 -0
  382. package/templates/MANIFEST_TEMPLATE.md +7 -0
  383. package/templates/NARRATIVE_REPORT_TEMPLATE.md +49 -0
  384. package/templates/PAPER_PLAN_TEMPLATE.md +47 -0
  385. package/templates/PATENT_CLAIMS_TEMPLATE.md +78 -0
  386. package/templates/PATENT_SPECIFICATION_TEMPLATE.md +68 -0
  387. package/templates/README.md +57 -0
  388. package/templates/RESEARCH_BRIEF_TEMPLATE.md +35 -0
  389. package/templates/RESEARCH_BRIEF_TEMPLATE_CN.md +41 -0
  390. package/templates/RESEARCH_CONTRACT_TEMPLATE.md +60 -0
  391. package/templates/claude-hooks/corpus_write_guard.json +16 -0
  392. package/templates/claude-hooks/corpus_write_guard.py +85 -0
  393. package/templates/claude-hooks/meta_logging.json +74 -0
  394. package/templates/gitignore-trace.txt +3 -0
  395. package/tools/__pycache__/check_skills_inventory.cpython-314.pyc +0 -0
  396. package/tools/arxiv_fetch.py +311 -0
  397. package/tools/capture_filter.py +126 -0
  398. package/tools/check_skills_inventory.py +273 -0
  399. package/tools/convert_skills_to_llm_chat.py +282 -0
  400. package/tools/copilot_native_evidence.py +818 -0
  401. package/tools/deepxiv_fetch.py +213 -0
  402. package/tools/evidence_check.py +212 -0
  403. package/tools/exa_search.py +425 -0
  404. package/tools/experiment_queue/README.md +118 -0
  405. package/tools/experiment_queue/build_manifest.py +44 -0
  406. package/tools/experiment_queue/queue_manager.py +44 -0
  407. package/tools/extract_paper_style.py +560 -0
  408. package/tools/figure_renderer.py +69 -0
  409. package/tools/forensics_gate.py +669 -0
  410. package/tools/generate_codex_claude_review_overrides.py +299 -0
  411. package/tools/idea_discovery_gate.py +256 -0
  412. package/tools/install_aris.ps1 +1372 -0
  413. package/tools/install_aris.sh +1370 -0
  414. package/tools/install_aris_codex.sh +1023 -0
  415. package/tools/install_aris_copilot.sh +1052 -0
  416. package/tools/iteration_log.py +143 -0
  417. package/tools/lint_skills_helpers.sh +84 -0
  418. package/tools/meta_opt/check_ready.sh +80 -0
  419. package/tools/meta_opt/log_event.sh +91 -0
  420. package/tools/meta_opt/trigger_eval.py +280 -0
  421. package/tools/meta_opt/trigger_evals.sample.json +28 -0
  422. package/tools/openalex_fetch.py +326 -0
  423. package/tools/overleaf_audit.sh +104 -0
  424. package/tools/overleaf_setup.sh +150 -0
  425. package/tools/paper_illustration_image2.py +62 -0
  426. package/tools/provenance.py +294 -0
  427. package/tools/research_wiki.py +1720 -0
  428. package/tools/review_gate.py +502 -0
  429. package/tools/run_state.py +399 -0
  430. package/tools/save_trace.sh +477 -0
  431. package/tools/semantic_scholar_fetch.py +438 -0
  432. package/tools/skill-groups.tsv +116 -0
  433. package/tools/skill_picker.py +238 -0
  434. package/tools/smart_update.ps1 +521 -0
  435. package/tools/smart_update.sh +591 -0
  436. package/tools/smart_update_codex.sh +419 -0
  437. package/tools/smart_update_copilot.sh +605 -0
  438. package/tools/threat_scan.py +222 -0
  439. package/tools/verify_paper_audits.sh +487 -0
  440. package/tools/verify_papers.py +613 -0
  441. package/tools/verify_wiki_coverage.sh +176 -0
  442. package/tools/watchdog.py +485 -0
@@ -0,0 +1,299 @@
1
+ #!/usr/bin/env python3
2
+ """Generate Claude-review overrides for the upstream Codex-native skills."""
3
+
4
+ from __future__ import annotations
5
+
6
+ import ast
7
+ import json
8
+ import re
9
+ import shutil
10
+ from pathlib import Path
11
+
12
+
13
+ REPO_ROOT = Path(__file__).resolve().parents[1]
14
+ SRC_ROOT = REPO_ROOT / "skills" / "skills-codex"
15
+ DEST_ROOT = REPO_ROOT / "skills" / "skills-codex-claude-review"
16
+
17
+ TARGET_SKILLS = [
18
+ "research-review",
19
+ "novelty-check",
20
+ "research-refine",
21
+ "auto-review-loop",
22
+ "paper-plan",
23
+ "paper-figure",
24
+ "paper-write",
25
+ "auto-paper-improvement-loop",
26
+ ]
27
+
28
+ FRONTMATTER_RE = re.compile(r"^---\n(.*?)\n---\n?", re.DOTALL)
29
+ SPAWN_BLOCK_RE = re.compile(r"```(?:yaml|text)?\nspawn_agent:\n([\s\S]*?)```")
30
+ SEND_BLOCK_RE = re.compile(r"```(?:yaml|text)?\nsend_input:\n([\s\S]*?)```")
31
+
32
+ OVERRIDE_NOTE = (
33
+ "> Override for Codex users who want **Claude Code**, not a second Codex agent, "
34
+ "to act as the reviewer. Install this package **after** `skills/skills-codex/*`.\n>\n"
35
+ "> This reviewer is a different model family from the Codex executor. Every "
36
+ "overlay trace/audit records:\n>\n> ```yaml\n> review_independence: cross-family\n"
37
+ "> acceptance_status: accepted\n> ```"
38
+ )
39
+
40
+ REVIEWER_LINE = (
41
+ "- **REVIEWER_MODEL = `claude-review`** — Claude reviewer invoked through the "
42
+ "local `claude-review` MCP bridge. Set `CLAUDE_REVIEW_MODEL` if you need a "
43
+ "specific Claude model override."
44
+ )
45
+
46
+ PREREQ_BLOCK = """## Prerequisites
47
+
48
+ - Install the base Codex-native skills first: copy `skills/skills-codex/*` into `~/.codex/skills/`.
49
+ - Then install this overlay package: copy `skills/skills-codex-claude-review/*` into `~/.codex/skills/` and allow it to overwrite the same skill names.
50
+ - Register the local reviewer bridge:
51
+ ```bash
52
+ codex mcp add claude-review -- python3 ~/.codex/mcp-servers/claude-review/server.py
53
+ ```
54
+ - This gives Codex access to `mcp__claude-review__review_start`, `mcp__claude-review__review_reply_start`, and `mcp__claude-review__review_status`.
55
+ """.strip()
56
+
57
+
58
+ def extract_field(frontmatter: str, field: str) -> str:
59
+ pattern = re.compile(rf"^{re.escape(field)}:\s*(.+)$", re.MULTILINE)
60
+ match = pattern.search(frontmatter)
61
+ if not match:
62
+ return ""
63
+ value = match.group(1).strip()
64
+ if (value.startswith('"') and value.endswith('"')) or (value.startswith("'") and value.endswith("'")):
65
+ try:
66
+ value = ast.literal_eval(value)
67
+ except (SyntaxError, ValueError):
68
+ value = value[1:-1]
69
+ return value
70
+
71
+
72
+ def build_frontmatter(name: str, description: str) -> str:
73
+ # JSON strings are a valid subset of YAML double-quoted scalars. Using a
74
+ # serializer here keeps backslashes and quotes from being escaped twice.
75
+ return (
76
+ f'---\nname: {json.dumps(name, ensure_ascii=False)}\n'
77
+ f'description: {json.dumps(description, ensure_ascii=False)}\n'
78
+ '---\n\n'
79
+ )
80
+
81
+
82
+ def normalize_description(text: str) -> str:
83
+ text = text or "Claude-review override for a Codex-native ARIS skill."
84
+ # A few legacy Codex-mirror descriptions contain an extra escape layer
85
+ # (the parsed value is `\\\"` instead of `\"`). Remove that layer before
86
+ # serializing the Claude overlay so regeneration stays idempotent.
87
+ text = text.replace('\\\"', '"')
88
+ text = text.replace("GPT using a secondary Codex agent", "Claude via claude-review MCP")
89
+ text = text.replace("using a secondary Codex agent", "using Claude Code via claude-review MCP")
90
+ text = text.replace("via GPT-5.6-Sol xhigh review", "via Claude review through claude-review MCP")
91
+ text = text.replace("(Codex GPT-5.6-Sol ultra)", "(Claude via claude-review MCP)")
92
+ text = text.replace("(Codex GPT-5.6-Sol xhigh)", "(Claude via claude-review MCP)")
93
+ text = text.replace("iterative GPT-5.6-Sol review", "iterative Claude review")
94
+ text = text.replace("GPT-5.6-Sol", "Claude")
95
+ text = text.replace("via GPT-5.6-Sol ultra review", "via Claude review through claude-review MCP")
96
+ text = text.replace("via GPT-5.5 xhigh review", "via Claude review through claude-review MCP")
97
+ text = text.replace("GPT-5.5", "Claude through claude-review MCP")
98
+ return text
99
+
100
+
101
+ def rewrite_spawn_block(match: re.Match[str]) -> str:
102
+ lines = match.group(1).splitlines()
103
+ out = ["```", "mcp__claude-review__review_start:"]
104
+ for line in lines:
105
+ stripped = line.strip()
106
+ if not stripped:
107
+ out.append(line)
108
+ continue
109
+ if stripped.startswith("model:") or stripped.startswith("reasoning_effort:"):
110
+ continue
111
+ if stripped.startswith("message:"):
112
+ out.append(line.replace("message:", "prompt:", 1))
113
+ continue
114
+ out.append(line)
115
+ out.append("```")
116
+ return "\n".join(out)
117
+
118
+
119
+ def rewrite_send_block(match: re.Match[str]) -> str:
120
+ lines = match.group(1).splitlines()
121
+ out = ["```", "mcp__claude-review__review_reply_start:"]
122
+ for line in lines:
123
+ stripped = line.strip()
124
+ if not stripped:
125
+ out.append(line)
126
+ continue
127
+ if stripped.startswith("model:") or stripped.startswith("reasoning_effort:"):
128
+ continue
129
+ if stripped.startswith("target:"):
130
+ out.append(line.replace("target:", "threadId:", 1))
131
+ continue
132
+ if stripped.startswith("agent_id:"):
133
+ out.append(line.replace("agent_id:", "threadId:", 1))
134
+ continue
135
+ if stripped.startswith("id:"):
136
+ out.append(line.replace("id:", "threadId:", 1))
137
+ continue
138
+ if stripped.startswith("message:"):
139
+ out.append(line.replace("message:", "prompt:", 1))
140
+ continue
141
+ out.append(line)
142
+ out.append("```")
143
+ return "\n".join(out)
144
+
145
+
146
+ def append_async_notes(text: str) -> str:
147
+ note = (
148
+ "After this start call, immediately save the returned `jobId` and poll "
149
+ "`mcp__claude-review__review_status` with a bounded `waitSeconds` until "
150
+ "`done=true`. Treat the completed status payload's `response` as the "
151
+ "reviewer output, and save the completed `threadId` for any follow-up round."
152
+ )
153
+
154
+ def repl(match: re.Match[str]) -> str:
155
+ block = match.group(0)
156
+ if note in block:
157
+ return block
158
+ return f"{block}\n\n{note}"
159
+
160
+ return re.sub(
161
+ r"```(?:yaml|text)?\n(?:mcp__claude-review__review_start:|mcp__claude-review__review_reply_start:)[\s\S]*?```",
162
+ repl,
163
+ text,
164
+ )
165
+
166
+
167
+ def transform_body(text: str) -> str:
168
+ text = re.sub(
169
+ r"> \*\*Codex assurance:\*\*[\s\S]*?(?=\n\n)",
170
+ "> **Claude overlay assurance:** this route is a different model family "
171
+ "from the Codex executor and records `review_independence: cross-family` "
172
+ "plus `acceptance_status: accepted`.",
173
+ text,
174
+ count=1,
175
+ )
176
+ # The acquittal receipt example is a literal the overlay would copy verbatim.
177
+ # This pack's backend is claude-review, so leaving the source's "codex" in it
178
+ # makes every overlay run write a false receipt.
179
+ text = text.replace('"backend":"codex","effort":"xhigh"', '"backend":"claude-review","effort":"high-rigor"')
180
+ text = text.replace('"backend": "codex", "effort": "xhigh"', '"backend": "claude-review", "effort": "high-rigor"')
181
+ text = text.replace('"backend":"codex"', '"backend":"claude-review"')
182
+ text = text.replace("secondary Codex agent", "Claude reviewer via `claude-review` MCP")
183
+ text = text.replace("via a Claude reviewer via `claude-review` MCP (xhigh reasoning)", "via `claude-review` MCP (high-rigor review)")
184
+ text = text.replace("secondary Codex agent (xhigh reasoning)", "Claude reviewer via `claude-review` MCP")
185
+ text = text.replace("GPT-5.6-Sol xhigh", "Claude review")
186
+ text = text.replace("GPT-5.6-Sol ultra", "Claude review")
187
+ text = text.replace("GPT-5.5 xhigh", "Claude review")
188
+ text = text.replace("Send the full paper text to GPT-5.5 xhigh:", "Send the full paper text to Claude through `claude-review`:")
189
+ text = text.replace("Send the complete outline to GPT-5.5 xhigh for feedback:", "Send the complete outline to Claude for feedback:")
190
+ text = text.replace("Call REVIEWER_MODEL via `spawn_agent` (`spawn_agent`) with xhigh reasoning:", "Call REVIEWER_MODEL via `mcp__claude-review__review_start` with high-rigor review:")
191
+ text = text.replace("Send a detailed prompt with xhigh reasoning:", "Send a detailed prompt with high-rigor review:")
192
+ text = text.replace("Use `send_input` with the returned agent id to continue the conversation:", "Use `mcp__claude-review__review_reply_start` with the saved completed `threadId`, then poll `mcp__claude-review__review_status` with the returned `jobId` until `done=true` to continue the conversation:")
193
+ text = text.replace("If this is round 2+, use `send_input` with the saved agent id to maintain continuity.", "If this is round 2+, use `mcp__claude-review__review_reply_start` with the saved completed `threadId`, then poll `mcp__claude-review__review_status` with the returned `jobId` until `done=true` to maintain continuity.")
194
+ text = text.replace("Save the agent id for Round 2.", "Save the returned `jobId`, poll `mcp__claude-review__review_status` until `done=true`, then save the completed `threadId` for Round 2.")
195
+ text = text.replace("Save agent id from first call, use `send_input` for subsequent rounds", "Save the completed `threadId` from the first `mcp__claude-review__review_status` result, then use `mcp__claude-review__review_reply_start` plus `mcp__claude-review__review_status` for subsequent rounds")
196
+ text = text.replace("Document the agent id for potential future resumption", "Document the completed `threadId` for potential future resumption")
197
+ text = text.replace("Use `send_input` with the saved agent id:", "Use `mcp__claude-review__review_reply_start` with the saved completed `threadId`:")
198
+ text = text.replace("use `send_input` for Round 2 to maintain conversation context", "use `mcp__claude-review__review_reply_start` plus `mcp__claude-review__review_status` for Round 2 to maintain conversation context")
199
+ text = text.replace("Save the agent id for Round 2.", "Save the completed `threadId` for Round 2.")
200
+ text = text.replace("**CRITICAL: Save the `agent_id`** from this call for all later rounds.", "**CRITICAL: Save the returned `jobId`**, poll `mcp__claude-review__review_status` until `done=true`, then save the completed `threadId` from the status result for all later rounds.")
201
+ text = text.replace("- **ALWAYS use `reasoning_effort: xhigh`** for all Codex review calls.", "- **Always ask the Claude reviewer for strict, high-rigor feedback** in every review round.")
202
+ text = text.replace("- ALWAYS use `model: gpt-5.6-sol` + `reasoning_effort: ultra` for reviews (deep-audit tier; capability fallback per `reviewer-routing.md`, never below `xhigh`)", "- **Always ask the Claude reviewer for strict, high-rigor feedback** in every review round.")
203
+ text = text.replace("- **Save `agent_id` from Phase 2** and use `send_input` for later rounds.", "- **Save the completed `threadId` from Phase 2** and use `mcp__claude-review__review_reply_start` plus `mcp__claude-review__review_status` for later rounds.")
204
+ text = text.replace("- **Use `send_input`** for Round 2 to maintain conversation context", "- **Use `mcp__claude-review__review_reply_start` plus `mcp__claude-review__review_status`** for Round 2 to maintain conversation context")
205
+ text = text.replace("GPT-5.5 responses", "Claude reviewer responses")
206
+ text = text.replace("same-family provisional review", "cross-family accepted Claude review")
207
+ text = text.replace("same-family provisional", "cross-family accepted")
208
+ text = text.replace("A fresh Codex positive review", "A fresh Claude positive review")
209
+ text = re.sub(
210
+ r"^- \*\*REVIEWER_BACKEND = `codex`\*\*.*$",
211
+ "- **REVIEWER_BACKEND = `claude-review`** — Cross-family Claude reviewer "
212
+ "through the local bridge; positive verdicts record accepted.",
213
+ text,
214
+ flags=re.MULTILINE,
215
+ )
216
+ text = text.replace("`agent_id`", "`thread_id`")
217
+ text = text.replace('"agent_id"', '"thread_id"')
218
+ text = text.replace("ALWAYS use `reasoning_effort: xhigh` for reviews", "Always ask the Claude reviewer for strict, high-rigor feedback.")
219
+ text = text.replace("ALWAYS use `reasoning_effort: xhigh` for maximum reasoning depth", "Always ask the Claude reviewer for strict, high-rigor feedback.")
220
+ text = text.replace("mcp__codex__codex-reply", "mcp__claude-review__review_reply_start")
221
+ text = text.replace("mcp__codex__codex", "mcp__claude-review__review_start")
222
+ text = re.sub(r"^-\s+\*{0,2}REVIEWER_MODEL.*$", REVIEWER_LINE, text, flags=re.MULTILINE)
223
+ text = re.sub(r"^-\s+\*{0,2}REVIEWER_BACKEND.*$",
224
+ "- **REVIEWER_BACKEND = `claude-review`** — reviews route through the claude-review MCP (Claude family; cross-family for a Codex executor).",
225
+ text, flags=re.MULTILINE)
226
+ text = text.replace("GPT-5.6-Sol", "Claude")
227
+ text = text.replace("gpt-5.6-sol", "the claude-review model")
228
+ text = text.replace("uses normal Codex xhigh review through", "uses a normal high-rigor Claude review through")
229
+ text = text.replace("Claude review Review (Round", "Claude Review (Round")
230
+ text = text.replace("Never pass a prior agent_id into", "Never pass a prior threadId into")
231
+ text = text.replace("store the returned agent_id for crash recovery only", "store the returned threadId for crash recovery only")
232
+ text = text.replace("Save the agent_id for Round 2.", "Save the completed threadId for Round 2.")
233
+ text = text.replace("Save the returned agent_id only for recovery bookkeeping.", "Save the returned threadId only for recovery bookkeeping.")
234
+ text = text.replace("via a Claude reviewer via `claude-review` MCP (ultra reasoning)", "via `claude-review` MCP (high-rigor review)")
235
+ text = text.replace("saved agent id", "saved threadId")
236
+ text = text.replace("— Codex Review", "— Claude Review")
237
+ # generic prose mop-up — AFTER all longer specific rows
238
+ text = text.replace("`spawn_agent`", "`mcp__claude-review__review_start`")
239
+ text = text.replace("`send_input`", "`mcp__claude-review__review_reply_start`")
240
+ text = re.sub(
241
+ r"## Prerequisites\n\n(?:- .*\n)+",
242
+ PREREQ_BLOCK + "\n\n",
243
+ text,
244
+ count=1,
245
+ )
246
+ text = SPAWN_BLOCK_RE.sub(rewrite_spawn_block, text)
247
+ text = SEND_BLOCK_RE.sub(rewrite_send_block, text)
248
+ text = text.replace(
249
+ "```\nreasoning_effort: xhigh\n```",
250
+ "```\nmcp__claude-review__review_start:\n prompt: |\n [Full novelty briefing + prior work list + specific novelty questions]\n```",
251
+ )
252
+ # New base-skill prose can mention Codex-native routes outside fenced tool
253
+ # examples. Normalize those residual references after rewriting the blocks so
254
+ # generated overlays never instruct users to mix Codex agents with Claude MCP.
255
+ text = text.replace("Codex xhigh review", "Claude high-rigor review")
256
+ text = text.replace("Codex Review", "Claude Review")
257
+ text = text.replace("Codex/GPT-5.5", "Claude reviewer")
258
+ text = text.replace("GPT-5.5", "the Claude reviewer")
259
+ text = text.replace("spawn_agent", "mcp__claude-review__review_start")
260
+ text = text.replace("send_input", "mcp__claude-review__review_reply_start")
261
+ text = text.replace("agent_id", "threadId")
262
+ text = text.replace("thread_id", "threadId")
263
+ text = text.replace("agent id", "completed threadId")
264
+ text = text.replace("agent ID", "completed threadId")
265
+ text = text.replace("same agent", "same completed threadId")
266
+ return append_async_notes(text)
267
+
268
+
269
+ def generate_one(skill_name: str) -> None:
270
+ skill_path = SRC_ROOT / skill_name / "SKILL.md"
271
+ content = skill_path.read_text(encoding="utf-8")
272
+ match = FRONTMATTER_RE.match(content)
273
+ if not match:
274
+ raise ValueError(f"Missing frontmatter: {skill_path}")
275
+
276
+ frontmatter = match.group(1)
277
+ body = content[match.end():].lstrip("\n")
278
+ name = extract_field(frontmatter, "name") or skill_name
279
+ description = normalize_description(extract_field(frontmatter, "description"))
280
+
281
+ output = build_frontmatter(name, description)
282
+ output += OVERRIDE_NOTE + "\n\n"
283
+ output += transform_body(body).rstrip() + "\n"
284
+
285
+ target_dir = DEST_ROOT / skill_name
286
+ if target_dir.exists():
287
+ shutil.rmtree(target_dir)
288
+ target_dir.mkdir(parents=True, exist_ok=True)
289
+ (target_dir / "SKILL.md").write_text(output, encoding="utf-8")
290
+
291
+
292
+ def main() -> None:
293
+ DEST_ROOT.mkdir(parents=True, exist_ok=True)
294
+ for skill_name in TARGET_SKILLS:
295
+ generate_one(skill_name)
296
+
297
+
298
+ if __name__ == "__main__":
299
+ main()
@@ -0,0 +1,256 @@
1
+ #!/usr/bin/env python3
2
+ """Deterministically gate Idea Discovery reports on recorded stage evidence."""
3
+
4
+ from __future__ import annotations
5
+
6
+ import argparse
7
+ import re
8
+ import sys
9
+ from dataclasses import dataclass
10
+ from pathlib import Path
11
+
12
+ try:
13
+ import run_state
14
+ except ImportError: # package import: ``from tools import idea_discovery_gate``
15
+ from tools import run_state
16
+
17
+
18
+ GATE_NAME = "idea-discovery-evidence"
19
+ REQUIRED_PHASES = (
20
+ "research-lit",
21
+ "idea-creator",
22
+ "novelty-check",
23
+ "research-review",
24
+ "research-refine-pipeline",
25
+ )
26
+ # These phases promise a model review, not merely executor-produced prose. A
27
+ # heading and a ``done`` self-report therefore cannot satisfy their evidence
28
+ # obligation: the run state must contain the receipt written by ``accept`` or
29
+ # ``mark-provisional``.
30
+ REVIEW_REQUIRED_PHASES = frozenset({"novelty-check", "research-review"})
31
+ START_MARKER = "<!-- ARIS_IDEA_DISCOVERY_EVIDENCE_GATE:START -->"
32
+ END_MARKER = "<!-- ARIS_IDEA_DISCOVERY_EVIDENCE_GATE:END -->"
33
+
34
+
35
+ @dataclass(frozen=True)
36
+ class GateResult:
37
+ verdict: str
38
+ reasons: tuple[str, ...]
39
+
40
+
41
+ def _artifact_target(root: Path, artifact: str) -> tuple[Path, str | None]:
42
+ path_text, separator, anchor = artifact.partition("#")
43
+ if not path_text:
44
+ raise ValueError("artifact path is empty")
45
+ if separator and not anchor.strip():
46
+ raise ValueError(f"artifact anchor is empty: {artifact}")
47
+ candidate = (root / path_text).resolve()
48
+ try:
49
+ candidate.relative_to(root.resolve())
50
+ except ValueError as exc:
51
+ raise ValueError(f"artifact escapes project root: {artifact}") from exc
52
+ return candidate, anchor if separator else None
53
+
54
+
55
+ def _heading_slug(line: str) -> str | None:
56
+ match = re.match(r"^#{1,6}\s+(.+?)\s*#*\s*$", line)
57
+ if not match:
58
+ return None
59
+ text = match.group(1).strip().lower()
60
+ slug = re.sub(r"[^\w\s-]", "", text, flags=re.UNICODE)
61
+ return re.sub(r"[\s-]+", "-", slug).strip("-")
62
+
63
+
64
+ def _section_has_content(path: Path, anchor: str) -> tuple[bool, bool]:
65
+ """Return whether the first matching section exists and has a non-empty body."""
66
+ found = False
67
+ for line in path.read_text(encoding="utf-8").splitlines():
68
+ heading = _heading_slug(line)
69
+ if not found:
70
+ if heading == anchor:
71
+ found = True
72
+ continue
73
+ if heading is not None:
74
+ return True, False
75
+ if line.strip():
76
+ return True, True
77
+ return found, False
78
+
79
+
80
+ def _review_provenance_reason(name: str, phase: dict, state: dict) -> str | None:
81
+ """Validate a reviewer receipt without granting or repairing acceptance."""
82
+ status = phase.get("status")
83
+ if status not in {"accepted", "provisional"}:
84
+ return f"{name} review evidence missing (status={status or 'unknown'})"
85
+
86
+ verdict_id = phase.get("verdict_id")
87
+ reviewer = phase.get("reviewer")
88
+ if not isinstance(verdict_id, str) or not verdict_id.strip():
89
+ return f"{name} review evidence missing (verdict_id not recorded)"
90
+ if not isinstance(reviewer, str) or not reviewer.strip():
91
+ return f"{name} review evidence missing (reviewer not recorded)"
92
+
93
+ executor = phase.get("executor_model")
94
+ if not isinstance(executor, str) or not executor.strip():
95
+ return f"{name} review provenance invalid (executor_model not recorded)"
96
+
97
+ executor_family = run_state.model_family(executor)
98
+ reviewer_family = run_state.model_family(reviewer)
99
+ if executor_family == "unknown" or reviewer_family in {"unknown", "deterministic"}:
100
+ return (
101
+ f"{name} review provenance invalid (model families cannot establish "
102
+ "a model review)"
103
+ )
104
+ if phase.get("executor_family") != executor_family:
105
+ return f"{name} review provenance invalid (executor_family inconsistent)"
106
+ if phase.get("reviewer_family") != reviewer_family:
107
+ return f"{name} review provenance invalid (reviewer_family inconsistent)"
108
+
109
+ if status == "accepted":
110
+ if phase.get("acceptance_status") != "accepted":
111
+ return f"{name} review provenance invalid (acceptance_status inconsistent)"
112
+ if executor_family == reviewer_family:
113
+ return f"{name} review provenance invalid (accepted review is same-family)"
114
+ if phase.get("review_independence") != "cross-family":
115
+ return f"{name} review provenance invalid (review_independence inconsistent)"
116
+ return None
117
+
118
+ if phase.get("acceptance_status") != "provisional":
119
+ return f"{name} review provenance invalid (acceptance_status inconsistent)"
120
+ if executor_family != reviewer_family:
121
+ return f"{name} review provenance invalid (provisional review is not same-family)"
122
+ if phase.get("review_independence") != "same-family":
123
+ return f"{name} review provenance invalid (review_independence inconsistent)"
124
+ policy = state.get("policy")
125
+ if not isinstance(policy, dict) or policy.get("provisional_advances") is not True:
126
+ return (
127
+ f"{name} review provenance invalid "
128
+ "(provisional review cannot advance this run)"
129
+ )
130
+ return None
131
+
132
+
133
+ def evaluate(root: str | Path, state: dict) -> GateResult:
134
+ """Check that every required stage has completed, durable evidence."""
135
+ project_root = Path(root).resolve()
136
+ phases = {phase["phase"]: phase for phase in state.get("phases", [])}
137
+ reasons: list[str] = []
138
+
139
+ for name in REQUIRED_PHASES:
140
+ phase = phases.get(name)
141
+ if phase is None:
142
+ reasons.append(f"{name} evidence missing (phase not recorded)")
143
+ continue
144
+ if phase.get("status") not in {"done", "accepted", "provisional"}:
145
+ reasons.append(
146
+ f"{name} evidence missing (status={phase.get('status', 'unknown')})"
147
+ )
148
+ continue
149
+ if name in REVIEW_REQUIRED_PHASES:
150
+ provenance_reason = _review_provenance_reason(name, phase, state)
151
+ if provenance_reason is not None:
152
+ reasons.append(provenance_reason)
153
+ continue
154
+ artifact = phase.get("artifact")
155
+ if not artifact:
156
+ reasons.append(f"{name} evidence missing (artifact not recorded)")
157
+ continue
158
+ try:
159
+ artifact_path, anchor = _artifact_target(project_root, artifact)
160
+ except ValueError as exc:
161
+ reasons.append(f"{name} evidence missing ({exc})")
162
+ continue
163
+ if not artifact_path.is_file():
164
+ reasons.append(f"{name} evidence missing (artifact absent: {artifact})")
165
+ continue
166
+ if anchor:
167
+ section_exists, section_has_content = _section_has_content(
168
+ artifact_path, anchor
169
+ )
170
+ if not section_exists:
171
+ reasons.append(f"{name} evidence missing (section absent: #{anchor})")
172
+ elif not section_has_content:
173
+ reasons.append(f"{name} evidence missing (section empty: #{anchor})")
174
+
175
+ return GateResult("PASS" if not reasons else "BLOCKED", tuple(reasons))
176
+
177
+
178
+ def _gate_section(result: GateResult) -> str:
179
+ lines = [START_MARKER, "## Evidence Gate", f"**Status:** {result.verdict}", ""]
180
+ if result.verdict == "PASS":
181
+ lines.append(
182
+ "All required stage records, review receipts, artifacts, and report "
183
+ "sections are present."
184
+ )
185
+ else:
186
+ lines.append("The workflow is not complete. Required stage evidence is missing:")
187
+ lines.extend(f"- BLOCKED: {reason}" for reason in result.reasons)
188
+ lines.extend([END_MARKER, ""])
189
+ return "\n".join(lines)
190
+
191
+
192
+ def write_report_gate(root: str | Path, report: str | Path, result: GateResult) -> Path:
193
+ project_root = Path(root).resolve()
194
+ report_path = (project_root / report).resolve()
195
+ try:
196
+ report_path.relative_to(project_root)
197
+ except ValueError as exc:
198
+ raise ValueError(f"report escapes project root: {report}") from exc
199
+
200
+ report_path.parent.mkdir(parents=True, exist_ok=True)
201
+ original = report_path.read_text(encoding="utf-8") if report_path.exists() else "# Idea Discovery Report\n"
202
+ section = _gate_section(result)
203
+ pattern = re.compile(
204
+ rf"{re.escape(START_MARKER)}.*?{re.escape(END_MARKER)}\n?",
205
+ flags=re.DOTALL,
206
+ )
207
+ if pattern.search(original):
208
+ updated = pattern.sub(section, original)
209
+ else:
210
+ updated = original.rstrip() + "\n\n" + section
211
+ report_path.write_text(updated, encoding="utf-8")
212
+ return report_path
213
+
214
+
215
+ def run(root: str | Path, run_id: str, report: str | Path) -> GateResult:
216
+ try:
217
+ state = run_state.load_run(str(root), run_id)
218
+ except FileNotFoundError:
219
+ result = GateResult("BLOCKED", ("run state missing",))
220
+ write_report_gate(root, report, result)
221
+ return result
222
+
223
+ result = evaluate(root, state)
224
+ # The gate's verdict lives ONLY in gates.<GATE_NAME>. It must not mark the
225
+ # semantic phases `accepted`: per resumable-runs.md, file-exists evidence
226
+ # can accept a purely mechanical phase, while these five stages carry
227
+ # quality semantics whose acceptance/provisional receipt belongs to their
228
+ # own reviewer gate — and resume relies on done-but-not-reviewed to know a
229
+ # stage still needs its audit.
230
+ run_state.record_gate_result(str(root), run_id, GATE_NAME, result.verdict, list(result.reasons))
231
+ write_report_gate(root, report, result)
232
+ return result
233
+
234
+
235
+ def main() -> int:
236
+ parser = argparse.ArgumentParser(description=__doc__)
237
+ parser.add_argument("root")
238
+ parser.add_argument("run_id")
239
+ parser.add_argument("--report", default="idea-stage/IDEA_REPORT.md")
240
+ args = parser.parse_args()
241
+
242
+ try:
243
+ result = run(args.root, args.run_id, args.report)
244
+ except ValueError as exc:
245
+ print(f"ERROR: {exc}", file=sys.stderr)
246
+ return 2
247
+ for reason in result.reasons:
248
+ print(f"BLOCKED: {reason}")
249
+ if result.verdict == "PASS":
250
+ print("PASS: idea-discovery evidence gate")
251
+ return 0
252
+ return 1
253
+
254
+
255
+ if __name__ == "__main__":
256
+ raise SystemExit(main())