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,399 @@
1
+ #!/usr/bin/env python3
2
+ """Resumable run-state for ARIS multi-phase workflows.
3
+
4
+ A long ARIS workflow (research-pipeline, paper-writing, idea-discovery) can fail
5
+ mid-run, and today there is no record of *which phase* already finished — a
6
+ resume restarts from scratch. This helper models a run as an ordered list of
7
+ phases with status, so resume can pick up where it left off.
8
+
9
+ The ARIS increment over a naive "resume = reopen" (which is all Hermes does):
10
+ the phase status enum SPLITS execution from acceptance —
11
+
12
+ done executor (Claude) finished writing the artifact.
13
+ EXECUTION-COMPLETENESS — a safe SAME-MODEL self-report.
14
+ accepted a CROSS-MODEL reviewer (codex/gemini) OR a deterministic verifier
15
+ returned a positive verdict, recorded with a verdict id + reviewer.
16
+ provisional a fresh SAME-FAMILY reviewer returned a positive verdict. This
17
+ is terminal for resume so a Codex-only workflow can advance, but
18
+ remains explicitly distinct from accepted.
19
+ skipped the phase does not apply to this run (e.g. paper-writing when
20
+ AUTO_WRITE=false) — a deterministic config decision, terminal.
21
+
22
+ Resume resolves FORWARD to the first phase that is NOT terminal ({accepted,
23
+ provisional, skipped}) — never the first non-`done`. So a phase the executor self-considered
24
+ "done" but that crashed before its cross-model audit is RE-VALIDATED on resume,
25
+ never silently skipped. Acceptance-gate rule made operational: a loop can DRIVE
26
+ resume, it cannot ACQUIT a phase past itself.
27
+
28
+ Structurally enforced: `set` may only write pending/running/done/failed/skipped;
29
+ only `accept` writes `accepted`; `mark-provisional` writes `provisional`. Both
30
+ REQUIRE a verdict id + reviewer AND that
31
+ the phase already be `done` (use --force to override) — you cannot acquit a phase
32
+ that never ran, nor mark one accepted without recording who acquitted it.
33
+
34
+ State at ``<root>/.aris/runs/<run_id>.json`` (file-based, no DB). Single-writer
35
+ contract (one orchestrator per run); a best-effort flock guards against a
36
+ concurrent resumer. See shared-references/resumable-runs.md.
37
+ """
38
+
39
+ from __future__ import annotations
40
+
41
+ import argparse
42
+ import json
43
+ import os
44
+ import sys
45
+ import tempfile
46
+ from contextlib import contextmanager
47
+ from datetime import datetime, timezone
48
+ from pathlib import Path
49
+ from typing import Iterator, Optional
50
+
51
+ try:
52
+ from provenance import model_family
53
+ except ImportError: # package import: ``from tools import run_state``
54
+ from tools.provenance import model_family
55
+
56
+ try:
57
+ import fcntl # POSIX
58
+ except ImportError: # pragma: no cover - Windows
59
+ fcntl = None # type: ignore
60
+
61
+ EXECUTOR_STATUSES = {"pending", "running", "done", "failed", "skipped"}
62
+ GATE_VERDICTS = {"PASS", "BLOCKED"}
63
+ # Statuses resume ALWAYS skips. `provisional` is deliberately NOT here: whether a
64
+ # same-family provisional verdict may advance a run is a PER-RUN POLICY
65
+ # (`policy.provisional_advances`, default False). The Codex-native mirror sets it
66
+ # true at start_run; mainline runs keep the historical guarantee that only a
67
+ # cross-family acceptance (or an explicit skip) closes a phase.
68
+ TERMINAL_STATUSES = {"accepted", "skipped"}
69
+ ALL_STATUSES = EXECUTOR_STATUSES | {"accepted", "provisional"}
70
+
71
+
72
+ def _terminal_statuses(state: dict) -> set:
73
+ base = set(TERMINAL_STATUSES)
74
+ if (state.get("policy") or {}).get("provisional_advances") is True:
75
+ base.add("provisional")
76
+ return base
77
+
78
+
79
+ def _now() -> str:
80
+ return datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
81
+
82
+
83
+ def _run_path(root: str, run_id: str) -> Path:
84
+ safe = "".join(c for c in run_id if c.isalnum() or c in "-_.")
85
+ if not safe or safe != run_id or run_id in (".", ".."):
86
+ raise ValueError(f"invalid run_id {run_id!r} (use [A-Za-z0-9-_.])")
87
+ return Path(root) / ".aris" / "runs" / f"{run_id}.json"
88
+
89
+
90
+ @contextmanager
91
+ def _lock(root: str, run_id: str) -> Iterator[None]:
92
+ """Best-effort advisory lock for the load-modify-save of one run.
93
+
94
+ Single-writer is the contract; this only guards against a stray concurrent
95
+ resumer. No-op where fcntl is unavailable.
96
+ """
97
+ p = _run_path(root, run_id)
98
+ p.parent.mkdir(parents=True, exist_ok=True)
99
+ if fcntl is None:
100
+ yield
101
+ return
102
+ lock_path = p.with_suffix(".lock")
103
+ fh = open(lock_path, "w")
104
+ try:
105
+ fcntl.flock(fh, fcntl.LOCK_EX)
106
+ yield
107
+ finally:
108
+ try:
109
+ fcntl.flock(fh, fcntl.LOCK_UN)
110
+ finally:
111
+ fh.close()
112
+
113
+
114
+ def _load(root: str, run_id: str) -> dict:
115
+ p = _run_path(root, run_id)
116
+ if not p.exists():
117
+ raise FileNotFoundError(f"no run state at {p}")
118
+ return json.loads(p.read_text(encoding="utf-8"))
119
+
120
+
121
+ def _save(root: str, run_id: str, state: dict) -> None:
122
+ p = _run_path(root, run_id)
123
+ p.parent.mkdir(parents=True, exist_ok=True)
124
+ state["updated"] = _now()
125
+ # Unique temp in the same dir → atomic replace, no shared-tmp clobber.
126
+ fd, tmp = tempfile.mkstemp(dir=str(p.parent), prefix=f".{run_id}.", suffix=".tmp")
127
+ try:
128
+ with os.fdopen(fd, "w", encoding="utf-8") as f:
129
+ json.dump(state, f, ensure_ascii=False, indent=2)
130
+ os.replace(tmp, p)
131
+ except BaseException:
132
+ try:
133
+ os.unlink(tmp)
134
+ finally:
135
+ raise
136
+
137
+
138
+ def start_run(root: str, run_id: str, phases: list[str], executor: Optional[str] = "claude",
139
+ provisional_advances: bool = False) -> dict:
140
+ """Create a run with ordered phases, all `pending` (idempotent: won't clobber).
141
+
142
+ ``claude`` is the historical mainline executor default. Codex-native callers
143
+ must record ``--executor codex-gpt-5.6-sol`` (or their actual executor) so a
144
+ same-family review cannot be misclassified as independent acceptance.
145
+ ``provisional_advances`` is the per-run policy that lets a same-family
146
+ provisional verdict close a phase for RESUME purposes (Codex-native mirror:
147
+ true; mainline default: false — only cross-family acceptance advances).
148
+ """
149
+ with _lock(root, run_id):
150
+ if _run_path(root, run_id).exists():
151
+ return _load(root, run_id)
152
+ state = {
153
+ "run_id": run_id,
154
+ "executor_model": executor,
155
+ "executor_family": model_family(executor) if executor else None,
156
+ "policy": {"provisional_advances": bool(provisional_advances)},
157
+ "created": _now(),
158
+ "updated": _now(),
159
+ "gates": {},
160
+ "phases": [{"phase": ph, "status": "pending", "artifact": None,
161
+ "verdict_id": None, "reviewer": None,
162
+ "reviewer_family": None, "review_independence": None,
163
+ "acceptance_status": None, "executor_model": executor,
164
+ "executor_family": model_family(executor) if executor else None,
165
+ "updated": _now()} for ph in phases],
166
+ }
167
+ _save(root, run_id, state)
168
+ return state
169
+
170
+
171
+ def record_gate_result(
172
+ root: str,
173
+ run_id: str,
174
+ gate: str,
175
+ verdict: str,
176
+ reasons: list[str],
177
+ ) -> dict:
178
+ """Persist a deterministic gate result alongside phase state.
179
+
180
+ Gates do not replace per-phase acceptance. They make workflow-level checks
181
+ auditable, including a visible BLOCKED result when required evidence is
182
+ missing.
183
+ """
184
+ if not gate:
185
+ raise ValueError("gate name must be non-empty")
186
+ if verdict not in GATE_VERDICTS:
187
+ raise ValueError(f"gate verdict must be one of {sorted(GATE_VERDICTS)}")
188
+ with _lock(root, run_id):
189
+ state = _load(root, run_id)
190
+ gates = state.setdefault("gates", {})
191
+ gates[gate] = {
192
+ "verdict": verdict,
193
+ "reasons": list(reasons),
194
+ "updated": _now(),
195
+ }
196
+ _save(root, run_id, state)
197
+ return state
198
+
199
+
200
+ def load_run(root: str, run_id: str) -> dict:
201
+ """Return the persisted state for a run without mutating it."""
202
+ return _load(root, run_id)
203
+
204
+
205
+ def _find_phase(state: dict, phase: str) -> dict:
206
+ for ph in state["phases"]:
207
+ if ph["phase"] == phase:
208
+ return ph
209
+ raise KeyError(f"phase {phase!r} not in run (have: {[p['phase'] for p in state['phases']]})")
210
+
211
+
212
+ def set_status(root: str, run_id: str, phase: str, status: str, artifact: Optional[str] = None) -> dict:
213
+ """Executor-side status; acceptance statuses use their dedicated APIs."""
214
+ if status not in EXECUTOR_STATUSES:
215
+ raise ValueError(
216
+ f"set_status may only write {sorted(EXECUTOR_STATUSES)}; "
217
+ "'accepted' and 'provisional' require recorded review provenance.")
218
+ with _lock(root, run_id):
219
+ state = _load(root, run_id)
220
+ ph = _find_phase(state, phase)
221
+ ph["status"] = status
222
+ if artifact is not None:
223
+ ph["artifact"] = artifact
224
+ ph["updated"] = _now()
225
+ _save(root, run_id, state)
226
+ return state
227
+
228
+
229
+ def accept(root: str, run_id: str, phase: str, verdict_id: str, reviewer: str, force: bool = False) -> dict:
230
+ """Mark a phase `accepted` — REQUIRES a recorded verdict id + reviewer, and
231
+ (unless force) that the phase already be `done`.
232
+
233
+ Call ONLY from a cross-model reviewer verdict (codex/gemini) or a deterministic
234
+ verifier (verify_papers.py, verify_paper_audits.sh, a passing test, exit 0).
235
+ The executor (Claude) must never call this on its own self-report.
236
+
237
+ `verdict_id` should be a durable handle: the reviewer thread/trace id, or the
238
+ path/sha of the verifier's report — not just a label.
239
+ """
240
+ if not verdict_id or not reviewer:
241
+ raise ValueError("accept requires a non-empty verdict_id AND reviewer — "
242
+ "a phase cannot be accepted without recording who acquitted it.")
243
+ with _lock(root, run_id):
244
+ state = _load(root, run_id)
245
+ ph = _find_phase(state, phase)
246
+ if not force and ph["status"] not in ("done", "accepted", "provisional"):
247
+ raise ValueError(
248
+ f"phase {phase!r} is {ph['status']!r}, not 'done' — cannot accept a phase that "
249
+ f"has not completed execution. Set it 'done' first, or pass force=True.")
250
+ # (provisional -> accepted is the intended monotonic upgrade: a later
251
+ # cross-family overlay acquits a phase a same-family review only drove.)
252
+ reviewer_family = model_family(reviewer)
253
+ # Older state files predate executor provenance. They belonged to the
254
+ # Claude mainline, whose historical executor was Claude; retain that
255
+ # compatibility default rather than letting an absent value bless an
256
+ # arbitrary reviewer as cross-family.
257
+ executor_model = ph.get("executor_model") or state.get("executor_model") or "claude"
258
+ executor_family = model_family(executor_model)
259
+ if reviewer_family != "deterministic":
260
+ if executor_family == "unknown" or reviewer_family == "unknown":
261
+ raise ValueError(
262
+ f"cannot classify acceptance families: executor={executor_model!r} "
263
+ f"({executor_family}), reviewer={reviewer!r} ({reviewer_family})")
264
+ if executor_family == reviewer_family:
265
+ raise ValueError(
266
+ "accept refuses known same-family review; use mark_provisional "
267
+ "so the phase can advance without claiming cross-family acceptance.")
268
+ ph["status"] = "accepted"
269
+ ph["verdict_id"] = verdict_id
270
+ ph["reviewer"] = reviewer
271
+ ph["reviewer_family"] = reviewer_family
272
+ ph["review_independence"] = (
273
+ "deterministic" if reviewer_family == "deterministic" else "cross-family"
274
+ )
275
+ ph["acceptance_status"] = "accepted"
276
+ ph["executor_model"] = executor_model
277
+ ph["executor_family"] = executor_family
278
+ ph["updated"] = _now()
279
+ _save(root, run_id, state)
280
+ return state
281
+
282
+
283
+ def mark_provisional(root: str, run_id: str, phase: str, verdict_id: str,
284
+ reviewer: str, executor: Optional[str] = None) -> dict:
285
+ """Record a same-family review as terminal-but-not-accepted progress.
286
+
287
+ The executor defaults to the model recorded by :func:`start_run`. Both
288
+ model names must resolve to the same non-deterministic family. This lets a
289
+ Codex-only workflow resume past a reviewed phase while keeping the absence
290
+ of cross-family acceptance machine-readable.
291
+ """
292
+ if not verdict_id or not reviewer:
293
+ raise ValueError(
294
+ "mark_provisional requires a non-empty verdict_id AND reviewer.")
295
+ with _lock(root, run_id):
296
+ state = _load(root, run_id)
297
+ ph = _find_phase(state, phase)
298
+ if ph["status"] not in ("done", "provisional"):
299
+ raise ValueError(
300
+ f"phase {phase!r} is {ph['status']!r}, not 'done' — cannot mark a "
301
+ "phase provisional before execution completes.")
302
+ executor_model = executor or ph.get("executor_model") or state.get("executor_model")
303
+ if not executor_model:
304
+ raise ValueError(
305
+ "mark_provisional requires an executor model, either from start_run "
306
+ "or the executor argument.")
307
+ executor_family = model_family(executor_model)
308
+ reviewer_family = model_family(reviewer)
309
+ if executor_family == "unknown" or reviewer_family == "unknown":
310
+ raise ValueError(
311
+ f"cannot classify provisional executor/reviewer families: "
312
+ f"{executor_model!r}={executor_family}, {reviewer!r}={reviewer_family}")
313
+ if reviewer_family == "deterministic" or executor_family != reviewer_family:
314
+ raise ValueError(
315
+ "mark_provisional is only for same-family model review; use accept "
316
+ "for cross-family or deterministic verdicts.")
317
+ ph["status"] = "provisional"
318
+ ph["verdict_id"] = verdict_id
319
+ ph["reviewer"] = reviewer
320
+ ph["reviewer_family"] = reviewer_family
321
+ ph["review_independence"] = "same-family"
322
+ ph["acceptance_status"] = "provisional"
323
+ ph["executor_model"] = executor_model
324
+ ph["executor_family"] = executor_family
325
+ ph["updated"] = _now()
326
+ _save(root, run_id, state)
327
+ return state
328
+
329
+
330
+ def resume_point(root: str, run_id: str) -> Optional[dict]:
331
+ """First phase whose status is NOT terminal — the resume
332
+ target — or None if the run is complete.
333
+
334
+ A `done`-but-not-`accepted` phase IS a resume target: its cross-model audit is
335
+ still owed and must run before the next phase proceeds.
336
+ """
337
+ state = _load(root, run_id)
338
+ for ph in state["phases"]:
339
+ if ph["status"] not in _terminal_statuses(state):
340
+ return ph
341
+ return None
342
+
343
+
344
+ def _print_status(state: dict) -> None:
345
+ print(f"run {state['run_id']} (updated {state.get('updated', '?')})")
346
+ glyph = {"pending": "·", "running": "▶", "done": "✓(unaccepted)",
347
+ "failed": "✗", "accepted": "✅", "provisional": "⚠ provisional",
348
+ "skipped": "⊘(skipped)"}
349
+ for ph in state["phases"]:
350
+ line = f" {glyph.get(ph['status'], '?'):>14} {ph['phase']} [{ph['status']}]"
351
+ if ph["status"] in ("accepted", "provisional"):
352
+ line += f" ← {ph['reviewer']} / {ph['verdict_id']}"
353
+ elif ph["artifact"]:
354
+ line += f" → {ph['artifact']}"
355
+ print(line)
356
+ rp = next((p for p in state["phases"] if p["status"] not in _terminal_statuses(state)), None)
357
+ print(f" resume → {rp['phase'] if rp else 'COMPLETE (all phases terminal; provisional is not accepted)'}")
358
+
359
+
360
+ def main() -> int:
361
+ ap = argparse.ArgumentParser(description="ARIS resumable run-state (done vs accepted).")
362
+ sub = ap.add_subparsers(dest="cmd", required=True)
363
+ s = sub.add_parser("start"); s.add_argument("root"); s.add_argument("run_id"); s.add_argument("--phases", required=True, help="comma-separated phase names"); s.add_argument("--executor", default="claude"); s.add_argument("--provisional-advances", action="store_true", help="per-run policy: let a same-family provisional verdict close a phase for resume (Codex-native mirror only; mainline default keeps cross-family-only advance)")
364
+ s = sub.add_parser("set"); s.add_argument("root"); s.add_argument("run_id"); s.add_argument("phase"); s.add_argument("status", choices=sorted(EXECUTOR_STATUSES)); s.add_argument("--artifact")
365
+ s = sub.add_parser("accept"); s.add_argument("root"); s.add_argument("run_id"); s.add_argument("phase"); s.add_argument("--verdict-id", required=True); s.add_argument("--reviewer", required=True); s.add_argument("--force", action="store_true")
366
+ s = sub.add_parser("mark-provisional"); s.add_argument("root"); s.add_argument("run_id"); s.add_argument("phase"); s.add_argument("--verdict-id", required=True); s.add_argument("--reviewer", required=True); s.add_argument("--executor")
367
+ s = sub.add_parser("resume"); s.add_argument("root"); s.add_argument("run_id")
368
+ s = sub.add_parser("status"); s.add_argument("root"); s.add_argument("run_id")
369
+ s = sub.add_parser("list"); s.add_argument("root")
370
+ a = ap.parse_args()
371
+
372
+ try:
373
+ if a.cmd == "start":
374
+ _print_status(start_run(a.root, a.run_id, [p.strip() for p in a.phases.split(",") if p.strip()], executor=a.executor, provisional_advances=a.provisional_advances))
375
+ elif a.cmd == "set":
376
+ _print_status(set_status(a.root, a.run_id, a.phase, a.status, a.artifact))
377
+ elif a.cmd == "accept":
378
+ _print_status(accept(a.root, a.run_id, a.phase, a.verdict_id, a.reviewer, force=a.force))
379
+ elif a.cmd == "mark-provisional":
380
+ _print_status(mark_provisional(a.root, a.run_id, a.phase, a.verdict_id, a.reviewer, executor=a.executor))
381
+ elif a.cmd == "resume":
382
+ rp = resume_point(a.root, a.run_id)
383
+ if rp is None:
384
+ print("COMPLETE"); return 0
385
+ print(rp["phase"]) # machine-readable: the resume target phase name
386
+ print(json.dumps(rp), file=sys.stderr)
387
+ elif a.cmd == "status":
388
+ _print_status(_load(a.root, a.run_id))
389
+ elif a.cmd == "list":
390
+ d = Path(a.root) / ".aris" / "runs"
391
+ for f in sorted(d.glob("*.json")) if d.exists() else []:
392
+ print(f.stem)
393
+ except (FileNotFoundError, KeyError, ValueError) as e:
394
+ print(f"error: {e}", file=sys.stderr); return 1
395
+ return 0
396
+
397
+
398
+ if __name__ == "__main__":
399
+ raise SystemExit(main())