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,213 @@
1
+ #!/usr/bin/env python3
2
+ """Thin ARIS adapter around the installed deepxiv CLI."""
3
+
4
+ from __future__ import annotations
5
+
6
+ import argparse
7
+ import json
8
+ import shutil
9
+ import subprocess
10
+ import sys
11
+ from typing import Sequence
12
+
13
+
14
+ INSTALL_MESSAGE = "deepxiv CLI not found. Install it with: pip install deepxiv-sdk"
15
+
16
+
17
+ def ensure_deepxiv_installed() -> dict[str, object]:
18
+ """Check whether the deepxiv CLI is available on PATH."""
19
+ binary = shutil.which("deepxiv")
20
+ if binary:
21
+ return {"ok": True, "binary": binary, "message": ""}
22
+ return {"ok": False, "binary": None, "message": INSTALL_MESSAGE}
23
+
24
+
25
+ def _run_cli(args: Sequence[str]) -> subprocess.CompletedProcess[str]:
26
+ install = ensure_deepxiv_installed()
27
+ if not install["ok"]:
28
+ raise RuntimeError(str(install["message"]))
29
+
30
+ return subprocess.run(
31
+ [str(install["binary"]), *args],
32
+ capture_output=True,
33
+ text=True,
34
+ encoding="utf-8",
35
+ check=False,
36
+ )
37
+
38
+
39
+ def _raise_for_failed_process(proc: subprocess.CompletedProcess[str]) -> None:
40
+ if proc.returncode == 0:
41
+ return
42
+ message = (proc.stderr or proc.stdout or "deepxiv command failed").strip()
43
+ raise RuntimeError(message)
44
+
45
+
46
+ def run_cli_json(args: Sequence[str]) -> dict | list:
47
+ """Run the deepxiv CLI and decode stdout as JSON."""
48
+ proc = _run_cli(args)
49
+ _raise_for_failed_process(proc)
50
+ try:
51
+ return json.loads(proc.stdout)
52
+ except json.JSONDecodeError as exc:
53
+ raise RuntimeError("deepxiv returned invalid JSON output") from exc
54
+
55
+
56
+ def run_cli_text(args: Sequence[str]) -> str:
57
+ """Run the deepxiv CLI and return trimmed stdout."""
58
+ proc = _run_cli(args)
59
+ _raise_for_failed_process(proc)
60
+ return proc.stdout.strip()
61
+
62
+
63
+ def build_parser() -> argparse.ArgumentParser:
64
+ parser = argparse.ArgumentParser(
65
+ description="ARIS wrapper around the installed deepxiv CLI."
66
+ )
67
+ subparsers = parser.add_subparsers(dest="command", required=True)
68
+
69
+ search = subparsers.add_parser("search", help="Search papers through DeepXiv.")
70
+ search.add_argument("query")
71
+ search.add_argument("--max", type=int, default=10, dest="max_results")
72
+ search.add_argument(
73
+ "--mode",
74
+ default="hybrid",
75
+ choices=("bm25", "vector", "hybrid"),
76
+ )
77
+ search.add_argument("--categories")
78
+ search.add_argument("--min-citations", type=int, dest="min_citations")
79
+ search.add_argument("--date-from", dest="date_from")
80
+ search.add_argument("--date-to", dest="date_to")
81
+
82
+ brief = subparsers.add_parser(
83
+ "paper-brief",
84
+ help="Fetch brief paper metadata and TLDR.",
85
+ )
86
+ brief.add_argument("arxiv_id")
87
+
88
+ head = subparsers.add_parser(
89
+ "paper-head",
90
+ help="Fetch paper metadata and section overview.",
91
+ )
92
+ head.add_argument("arxiv_id")
93
+
94
+ section = subparsers.add_parser(
95
+ "paper-section",
96
+ help="Fetch one paper section.",
97
+ )
98
+ section.add_argument("arxiv_id")
99
+ section.add_argument("section_name")
100
+
101
+ trending = subparsers.add_parser(
102
+ "trending",
103
+ help="Fetch trending papers.",
104
+ )
105
+ trending.add_argument("--days", default="7", choices=("7", "14", "30"))
106
+ trending.add_argument("--max", type=int, default=10, dest="max_results")
107
+
108
+ wsearch = subparsers.add_parser(
109
+ "wsearch",
110
+ help="Search the web through DeepXiv.",
111
+ )
112
+ wsearch.add_argument("query")
113
+
114
+ sc = subparsers.add_parser(
115
+ "sc",
116
+ help="Fetch Semantic Scholar metadata by ID.",
117
+ )
118
+ sc.add_argument("semantic_scholar_id")
119
+
120
+ health = subparsers.add_parser(
121
+ "health",
122
+ help="Run DeepXiv health check.",
123
+ )
124
+ health.add_argument("--json", action="store_true", help="Return JSON wrapper.")
125
+
126
+ return parser
127
+
128
+
129
+ def _dispatch_json(args: argparse.Namespace) -> dict | list:
130
+ if args.command == "search":
131
+ cli_args = [
132
+ "search",
133
+ args.query,
134
+ "--limit",
135
+ str(args.max_results),
136
+ "--mode",
137
+ args.mode,
138
+ "--format",
139
+ "json",
140
+ ]
141
+ if args.categories:
142
+ cli_args.extend(["--categories", args.categories])
143
+ if args.min_citations is not None:
144
+ cli_args.extend(["--min-citations", str(args.min_citations)])
145
+ if args.date_from:
146
+ cli_args.extend(["--date-from", args.date_from])
147
+ if args.date_to:
148
+ cli_args.extend(["--date-to", args.date_to])
149
+ return run_cli_json(cli_args)
150
+
151
+ if args.command == "paper-brief":
152
+ return run_cli_json(["paper", args.arxiv_id, "--brief", "--format", "json"])
153
+
154
+ if args.command == "paper-head":
155
+ return run_cli_json(["paper", args.arxiv_id, "--head", "--format", "json"])
156
+
157
+ if args.command == "paper-section":
158
+ return run_cli_json(
159
+ [
160
+ "paper",
161
+ args.arxiv_id,
162
+ "--section",
163
+ args.section_name,
164
+ "--format",
165
+ "json",
166
+ ]
167
+ )
168
+
169
+ if args.command == "trending":
170
+ return run_cli_json(
171
+ [
172
+ "trending",
173
+ "--days",
174
+ str(args.days),
175
+ "--limit",
176
+ str(args.max_results),
177
+ "--output",
178
+ "json",
179
+ ]
180
+ )
181
+
182
+ if args.command == "wsearch":
183
+ return run_cli_json(["wsearch", args.query, "--output", "json"])
184
+
185
+ if args.command == "sc":
186
+ return run_cli_json(["sc", args.semantic_scholar_id, "--output", "json"])
187
+
188
+ if args.command == "health":
189
+ text = run_cli_text(["health"])
190
+ return {"ok": True, "output": text}
191
+
192
+ raise RuntimeError(f"Unsupported command: {args.command}")
193
+
194
+
195
+ def main(argv: Sequence[str] | None = None) -> int:
196
+ parser = build_parser()
197
+ args = parser.parse_args(argv)
198
+
199
+ try:
200
+ payload = _dispatch_json(args)
201
+ except RuntimeError as exc:
202
+ print(str(exc), file=sys.stderr)
203
+ return 1
204
+
205
+ if args.command == "health" and not args.json:
206
+ print(payload["output"])
207
+ else:
208
+ print(json.dumps(payload, ensure_ascii=False, indent=2))
209
+ return 0
210
+
211
+
212
+ if __name__ == "__main__":
213
+ raise SystemExit(main())
@@ -0,0 +1,212 @@
1
+ #!/usr/bin/env python3
2
+ """Deterministic evidence pre-check for ARIS claim audits.
3
+
4
+ Before spending a cross-model (codex) call to judge whether a claim is supported,
5
+ mechanically verify the claim's CITED EVIDENCE actually exists: does the source
6
+ file exist, and does the cited number/string actually appear in it? This catches
7
+ HALLUCINATED evidence ("claim X is supported by results/eval.json: 73.2") for
8
+ free — no model call — and downgrades unverifiable claims before the jury sees
9
+ them.
10
+
11
+ This is the reconcile pattern (a model's self-report cross-checked against
12
+ mechanical ground-truth, adapted from NousResearch/hermes-agent's curator
13
+ reconcile-classifier) made into a two-stage gate:
14
+
15
+ stage 1 (this file) deterministic. Catches HALLUCINATION — the cited path
16
+ is missing, or the cited value is not in the source.
17
+ Cheap, no model, fail-closed (favors false-negative).
18
+ stage 2 (the jury) cross-model (codex/gemini). Catches WRONG-BUT-REAL — the
19
+ number IS in the file, but it doesn't support the claim.
20
+
21
+ A `verified` here means ONLY "the cited evidence exists" — NOT "the claim is
22
+ correct." Existence is execution-completeness (safe same-model / deterministic);
23
+ support is a quality verdict that stays with the cross-model jury
24
+ (acceptance-gate.md: drive, not acquit). The numeric matcher is deliberately
25
+ conservative — it must NEVER emit a false `verified`. It uses an ALLOW-LIST of
26
+ safe boundaries, so a number that is part of a compound construct
27
+ (date/time/version/fraction/locale grouping, or flanked by any non-ASCII
28
+ delimiter such as a Unicode minus/dash) fails closed and goes to the jury. See
29
+ shared-references/evidence-precheck.md.
30
+ """
31
+
32
+ from __future__ import annotations
33
+
34
+ import argparse
35
+ import json
36
+ import re
37
+ import sys
38
+ from decimal import Decimal, InvalidOperation
39
+ from pathlib import Path
40
+ from typing import List
41
+
42
+ # The numeric core: optional sign; an integer (with optional comma-grouping like
43
+ # 1,000), or a plain int, or a leading-decimal (.5) / trailing-decimal (1.);
44
+ # optional scientific exponent.
45
+ _NUM_CORE = r"[+-]?(?:\d{1,3}(?:,\d{3})+(?:\.\d+)?|\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?"
46
+
47
+ # Boundary policy: ALLOW-LIST, fail-closed. A number token is matchable only when
48
+ # flanked by KNOWN-SAFE boundaries — string start/end, whitespace (`\s`, which
49
+ # includes Unicode spaces like NBSP / thin space), or a small ASCII punctuation
50
+ # set. ANY OTHER adjacency — a digit, a Unicode minus/dash (− – —), ':' '/' '-',
51
+ # fullwidth punctuation, a locale grouping separator — is not a safe boundary, so
52
+ # the token fails closed to the jury. A false negative is cheap (the jury reads
53
+ # the file); a false `verified` is the bug this gate must never have. (Quote chars
54
+ # are written \x22 / \x27 to avoid Python string-termination issues.)
55
+ _BEFORE_OK = r"\s=(\[{\x22" # allowed immediately before (or string start); \x22 = "
56
+ _AFTER_OK = r"\s)\]}\x22;,." # allowed immediately after (or string end)
57
+ # NB: apostrophe (') is deliberately NOT a safe boundary — it is a Swiss/locale
58
+ # thousands separator (1'000), so a number adjacent to it fails closed.
59
+ _NUM_TOKEN_RE = re.compile(
60
+ r"(?<![^" + _BEFORE_OK + r"])" # at start, or preceded by a safe char
61
+ r"(" + _NUM_CORE + r")(%?)"
62
+ r"(?=[" + _AFTER_OK + r"]|$)" # at end, or followed by a safe char
63
+ r"(?![.,]\d)" # a trailing . or , must be sentence, not a decimal/sep
64
+ )
65
+ # Whitespace-grouping ("1 000", "1 234", "1\n234" — any run of any whitespace) is
66
+ # checked POST-MATCH in _value_in_text, because a fixed-width lookbehind cannot
67
+ # cover one-or-more whitespace.
68
+ _WS_GROUP_TAIL = re.compile(r"\d\s+$") # <digit><ws+> immediately before a token
69
+ _WS_GROUP_LEAD = re.compile(r"\s+\d{3}(?!\d)") # <ws+><exactly 3 digits> immediately after
70
+ # A grouping TAIL token is a 3-digit group, optionally carrying the final decimal
71
+ # ("234" in "1 234", or "234.5" in "1 234.5") — but NOT "2345" (4 digits).
72
+ _GROUP_TAIL_TOK = re.compile(r"\d{3}(?:\.\d+)?")
73
+ _PURE_NUMBER_RE = re.compile(_NUM_CORE)
74
+
75
+
76
+ def _dec(s: str) -> Decimal:
77
+ """Decimal of a numeric string, ignoring thousands separators. Raises InvalidOperation."""
78
+ return Decimal(s.replace(",", "").strip())
79
+
80
+
81
+ def _pure_number(s: str):
82
+ """If `s` is exactly a number (optional thousands grouping, optional trailing %),
83
+ return (Decimal, has_percent); else None. Exact Decimal, no float tolerance."""
84
+ v = s.strip()
85
+ has_pct = v.endswith("%")
86
+ core = v[:-1].strip() if has_pct else v
87
+ if not _PURE_NUMBER_RE.fullmatch(core):
88
+ return None
89
+ try:
90
+ return _dec(core), has_pct
91
+ except InvalidOperation:
92
+ return None
93
+
94
+
95
+ def _value_in_text(value: str, text: str) -> bool:
96
+ """True if `value` is present in `text` — conservatively (never a false positive).
97
+
98
+ PURE NUMBER (incl. scientific notation, thousands grouping, .5/1. forms,
99
+ optional trailing %): EXACT decimal equality against safely-bounded number
100
+ tokens, with percent-flag consistency. Fails closed on compound constructs
101
+ (dates/times/versions/fractions/locale grouping) and any non-ASCII delimiter.
102
+ NON-NUMERIC / mixed (e.g. "4-point gain", "SOTA on COCO"): normalized-whitespace
103
+ substring of the literal value. An empty value never matches.
104
+ """
105
+ if not value.strip():
106
+ return False
107
+ pn = _pure_number(value)
108
+ if pn is not None:
109
+ dval, want_pct = pn
110
+ for m in _NUM_TOKEN_RE.finditer(text):
111
+ tok = m.group(1)
112
+ # Fail closed on whitespace-grouped numbers: an exactly-3-digit token
113
+ # preceded by <digit><ws+> is a grouping tail; any token followed by
114
+ # <ws+><exactly 3 digits> is a grouping head/middle.
115
+ if _GROUP_TAIL_TOK.fullmatch(tok) and _WS_GROUP_TAIL.search(text[:m.start()]):
116
+ continue
117
+ if _WS_GROUP_LEAD.match(text[m.end():]):
118
+ continue
119
+ try:
120
+ tnum = _dec(tok)
121
+ except InvalidOperation:
122
+ continue
123
+ if tnum == dval and bool(m.group(2)) == want_pct:
124
+ return True
125
+ return False
126
+ norm = re.sub(r"\s+", " ", text)
127
+ return value.strip() in norm
128
+
129
+
130
+ def _resolve_sources(source: str, root: str) -> List[Path]:
131
+ base = Path(root)
132
+ p = base / source
133
+ if p.is_file():
134
+ return [p]
135
+ matches = sorted(base.glob(source)) # treat as a glob relative to root
136
+ return [m for m in matches if m.is_file()]
137
+
138
+
139
+ def check_claim(value: str, source: str, root: str = ".") -> dict:
140
+ """Verify a cited (value, source) pair deterministically.
141
+
142
+ status ∈ {"verified", "path_missing", "value_not_found"}.
143
+ `verified` means only that the cited evidence EXISTS — not that the claim holds.
144
+ """
145
+ files = _resolve_sources(source, root)
146
+ if not files:
147
+ return {"status": "path_missing", "value": value, "source": source,
148
+ "detail": f"no file matches {source!r} under {root!r}"}
149
+ read_any = False
150
+ for f in files:
151
+ try:
152
+ text = f.read_text(encoding="utf-8", errors="replace")
153
+ except OSError:
154
+ continue # skip an unreadable file, keep checking the rest
155
+ read_any = True
156
+ if _value_in_text(value, text):
157
+ return {"status": "verified", "value": value, "source": str(f),
158
+ "detail": f"{value!r} found in {f}"}
159
+ if not read_any:
160
+ return {"status": "path_missing", "value": value, "source": source,
161
+ "detail": f"file(s) matching {source!r} exist but are unreadable"}
162
+ return {"status": "value_not_found", "value": value, "source": source,
163
+ "detail": f"{value!r} not found in {source!r} "
164
+ f"({len(files)} file(s) checked) — send to the cross-model jury"}
165
+
166
+
167
+ def check_batch(claims: List[dict], root: str = ".") -> dict:
168
+ """claims: [{"id"?, "value", "source", ...}]. Returns per-claim results + a summary.
169
+
170
+ A claim with no usable (value, source) is reported `unparseable` — not checkable
171
+ here; the jury handles it. `value is None` (not falsy) so a legit numeric 0 is
172
+ still checked; empty strings are unparseable.
173
+ """
174
+ results = []
175
+ for c in claims:
176
+ value, source = c.get("value"), c.get("source")
177
+ if value is None or source is None or str(value).strip() == "" or str(source).strip() == "":
178
+ results.append({**c, "status": "unparseable",
179
+ "detail": "claim has no usable (value, source) to pre-check"})
180
+ else:
181
+ results.append({**c, **check_claim(str(value), str(source), root)})
182
+ counts: dict = {}
183
+ for r in results:
184
+ counts[r["status"]] = counts.get(r["status"], 0) + 1
185
+ return {"results": results, "summary": counts}
186
+
187
+
188
+ __all__ = ["check_claim", "check_batch"]
189
+
190
+
191
+ def main() -> int:
192
+ ap = argparse.ArgumentParser(description="ARIS deterministic evidence pre-check.")
193
+ ap.add_argument("root", help="project root the sources are relative to")
194
+ ap.add_argument("--value", help="the cited value (number/string)")
195
+ ap.add_argument("--source", help="the cited source file or glob (relative to root)")
196
+ ap.add_argument("--batch", help="JSON file with a list of {value, source, ...} claims")
197
+ a = ap.parse_args()
198
+ if a.batch:
199
+ claims = json.loads(Path(a.batch).read_text(encoding="utf-8"))
200
+ out = check_batch(claims, a.root)
201
+ print(json.dumps(out, ensure_ascii=False, indent=2))
202
+ bad = {"path_missing", "value_not_found"}
203
+ return 1 if any(r["status"] in bad for r in out["results"]) else 0
204
+ if not a.value or not a.source:
205
+ ap.error("provide --value and --source, or --batch")
206
+ res = check_claim(a.value, a.source, a.root)
207
+ print(json.dumps(res, ensure_ascii=False))
208
+ return 0 if res["status"] == "verified" else 1
209
+
210
+
211
+ if __name__ == "__main__":
212
+ raise SystemExit(main())