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,487 @@
1
+ #!/usr/bin/env bash
2
+ # verify_paper_audits.sh — External verifier for ARIS mandatory paper audits.
3
+ #
4
+ # Single source of truth for "are this paper's mandatory audits complete and
5
+ # current?" Called by paper-writing Phase 6 and by the audit-enforcement Stop
6
+ # hook. Both rely on this script's exit code, not on the LLM's claims.
7
+ #
8
+ # Usage:
9
+ # bash tools/verify_paper_audits.sh <paper-dir> [--assurance draft|submission] [--json-out <path>]
10
+ #
11
+ # Defaults:
12
+ # --assurance: read from <paper-dir>/.aris/assurance.txt if present, else "draft"
13
+ # --json-out: <paper-dir>/.aris/audit-verifier-report.json
14
+ #
15
+ # Exit codes:
16
+ # 0 All required audits present, schema-valid, fresh (no STALE), no
17
+ # blocking verdicts (FAIL/BLOCKED/ERROR) at submission level
18
+ # 1 Any blocking issue (missing artifact / schema invalid / STALE / FAIL /
19
+ # BLOCKED / ERROR at submission level)
20
+ # 2 Bad arguments
21
+ #
22
+ # Exit 0 at draft level means "audits, where present, are well-formed."
23
+ # Exit 0 at submission level additionally means "no skipped mandatory audits,
24
+ # no stale audits, no FAIL/BLOCKED/ERROR verdicts."
25
+ #
26
+ # Allowed verdicts (per assurance-contract.md):
27
+ # PASS WARN FAIL NOT_APPLICABLE BLOCKED ERROR
28
+ #
29
+ # Required artifact fields (per assurance-contract.md):
30
+ # audit_skill verdict reason_code summary audited_input_hashes
31
+ # trace_path (thread_id OR agent_id) reviewer_model reviewer_reasoning generated_at
32
+ # New artifacts also emit review_independence + acceptance_status. Older
33
+ # artifacts remain readable and are conservatively classified provisional.
34
+
35
+ set -uo pipefail
36
+
37
+ # ─── Constants ────────────────────────────────────────────────────────────────
38
+ MANDATORY_AUDITS=(
39
+ "PROOF_AUDIT.json|proof-checker"
40
+ "PAPER_CLAIM_AUDIT.json|paper-claim-audit"
41
+ "CITATION_AUDIT.json|citation-audit"
42
+ "KILL_ARGUMENT.json|kill-argument"
43
+ )
44
+ ALLOWED_VERDICTS=("PASS" "WARN" "FAIL" "NOT_APPLICABLE" "BLOCKED" "ERROR")
45
+ SUBMISSION_BLOCKING=("FAIL" "BLOCKED" "ERROR")
46
+ REQUIRED_FIELDS=(
47
+ "audit_skill" "verdict" "reason_code" "summary"
48
+ "audited_input_hashes" "trace_path"
49
+ "reviewer_model" "reviewer_reasoning" "generated_at"
50
+ )
51
+
52
+ # ─── Args ─────────────────────────────────────────────────────────────────────
53
+ PAPER_DIR=""
54
+ ASSURANCE=""
55
+ JSON_OUT=""
56
+
57
+ while [[ $# -gt 0 ]]; do
58
+ case "$1" in
59
+ --assurance) ASSURANCE="${2:?--assurance requires draft|submission}"; shift 2 ;;
60
+ --json-out) JSON_OUT="${2:?--json-out requires path}"; shift 2 ;;
61
+ -h|--help) sed -n '2,30p' "$0" | sed 's/^# \?//'; exit 0 ;;
62
+ --*) echo "unknown option: $1" >&2; exit 2 ;;
63
+ *)
64
+ if [[ -z "$PAPER_DIR" ]]; then PAPER_DIR="$1"
65
+ else echo "unexpected positional: $1" >&2; exit 2; fi
66
+ shift ;;
67
+ esac
68
+ done
69
+
70
+ [[ -n "$PAPER_DIR" ]] || { echo "usage: $0 <paper-dir> [--assurance ...] [--json-out ...]" >&2; exit 2; }
71
+ [[ -d "$PAPER_DIR" ]] || { echo "paper-dir not found: $PAPER_DIR" >&2; exit 2; }
72
+ PAPER_DIR="$(cd "$PAPER_DIR" && pwd)"
73
+
74
+ # Resolve assurance level
75
+ if [[ -z "$ASSURANCE" ]]; then
76
+ if [[ -f "$PAPER_DIR/.aris/assurance.txt" ]]; then
77
+ ASSURANCE="$(tr -d '[:space:]' < "$PAPER_DIR/.aris/assurance.txt")"
78
+ else
79
+ ASSURANCE="draft"
80
+ fi
81
+ fi
82
+ case "$ASSURANCE" in
83
+ draft|submission) ;;
84
+ *) echo "invalid --assurance: $ASSURANCE (expected draft or submission)" >&2; exit 2 ;;
85
+ esac
86
+
87
+ [[ -n "$JSON_OUT" ]] || JSON_OUT="$PAPER_DIR/.aris/audit-verifier-report.json"
88
+ mkdir -p "$(dirname "$JSON_OUT")"
89
+
90
+ # ─── Helpers ──────────────────────────────────────────────────────────────────
91
+ SHA256() {
92
+ if command -v shasum >/dev/null 2>&1; then shasum -a 256 "$1" | awk '{print $1}'
93
+ elif command -v sha256sum >/dev/null 2>&1; then sha256sum "$1" | awk '{print $1}'
94
+ else echo "no_sha256_tool"; fi
95
+ }
96
+
97
+ PY=python3
98
+ command -v "$PY" >/dev/null 2>&1 || { echo "python3 required for JSON parsing" >&2; exit 2; }
99
+
100
+ # Output accumulator
101
+ declare -a REPORT_LINES=()
102
+ ANY_BLOCKING=0
103
+ ANY_PROBLEM=0
104
+ ANY_PROVISIONAL=0
105
+
106
+ add_report() {
107
+ # add_report <audit> <status> <verdict> <stale> <review_independence> <issues_json_array>
108
+ # Do not interpolate artifact-derived values into JSON in Bash. Audit fields
109
+ # are model-controlled, so serialize every row through Python.
110
+ REPORT_LINES+=("$("$PY" - "$1" "$2" "$3" "$4" "$5" "$6" <<'PYEOF'
111
+ import json, sys
112
+ try:
113
+ issues = json.loads(sys.argv[6])
114
+ except (TypeError, json.JSONDecodeError):
115
+ issues = [sys.argv[6]]
116
+ print(json.dumps({
117
+ "audit": sys.argv[1],
118
+ "status": sys.argv[2],
119
+ "verdict": sys.argv[3],
120
+ "stale": sys.argv[4].lower() == "true",
121
+ "review_independence": sys.argv[5],
122
+ "issues": issues,
123
+ }, ensure_ascii=False, separators=(",", ":")))
124
+ PYEOF
125
+ )" )
126
+ }
127
+
128
+ is_in() {
129
+ # is_in <needle> <haystack-element-1> <haystack-element-2> ...
130
+ local needle="$1"; shift
131
+ for e in "$@"; do [[ "$e" == "$needle" ]] && return 0; done
132
+ return 1
133
+ }
134
+
135
+ # ─── Per-audit verification ───────────────────────────────────────────────────
136
+ verify_one() {
137
+ local artifact_name="$1" expected_skill="$2"
138
+ local artifact_path="$PAPER_DIR/$artifact_name"
139
+ local issues=()
140
+ local verdict=""
141
+ local stale="false"
142
+
143
+ if [[ ! -f "$artifact_path" ]]; then
144
+ if [[ "$ASSURANCE" == "submission" ]]; then
145
+ issues+=("\"missing_artifact: $artifact_name\"")
146
+ ANY_BLOCKING=1
147
+ ANY_PROBLEM=1
148
+ local issues_json="[$(IFS=,; echo "${issues[*]}")]"
149
+ add_report "$expected_skill" "MISSING" "" "false" "unavailable" "$issues_json"
150
+ else
151
+ # draft mode: missing is fine, but record
152
+ ANY_PROVISIONAL=1
153
+ add_report "$expected_skill" "MISSING_DRAFT_OK" "" "false" "unavailable" "[]"
154
+ fi
155
+ return
156
+ fi
157
+
158
+ # Parse JSON, extract fields, compute stale
159
+ # Single python call returns: VERDICT|FIELD_ISSUES|STALE_FILES|TRACE_OK|INDEPENDENCE
160
+ local parsed
161
+ parsed=$("$PY" - "$artifact_path" "$expected_skill" "$PAPER_DIR" <<'PYEOF'
162
+ import json, hashlib, os, sys
163
+ artifact_path, expected_skill, paper_dir = sys.argv[1], sys.argv[2], sys.argv[3]
164
+
165
+ REQUIRED = ["audit_skill","verdict","reason_code","summary",
166
+ "audited_input_hashes","trace_path",
167
+ "reviewer_model","reviewer_reasoning","generated_at"]
168
+ ALLOWED_VERDICTS = ["PASS","WARN","FAIL","NOT_APPLICABLE","BLOCKED","ERROR"]
169
+ FAMILIES = [
170
+ ("anthropic", ("claude", "opus", "sonnet", "haiku")),
171
+ ("openai", ("gpt", "codex", "oracle", "chatgpt", "o1", "o3", "o4")),
172
+ ("google", ("gemini", "palm", "bard")),
173
+ ("deepseek", ("deepseek",)), ("minimax", ("minimax", "abab")),
174
+ ("moonshot", ("kimi", "moonshot")), ("qwen", ("qwen", "tongyi")),
175
+ ("xai", ("grok",)), ("meta", ("llama",)), ("mistral", ("mistral", "mixtral")),
176
+ ]
177
+ SHORT = {"o1", "o3", "o4"}
178
+
179
+ def model_family(name):
180
+ import re
181
+ name = (name or "").strip().lower()
182
+ if name == "deterministic" or name.startswith("deterministic:"):
183
+ return "deterministic"
184
+ tokens = set(re.split(r"[^a-z0-9.]+", name))
185
+ found = {
186
+ family for family, needles in FAMILIES
187
+ if any((needle in tokens) if needle in SHORT else (needle in name)
188
+ for needle in needles)
189
+ }
190
+ return next(iter(found)) if len(found) == 1 else "unknown"
191
+
192
+ issues = []
193
+ verdict = ""
194
+ stale_files = []
195
+ trace_ok = True
196
+ independence = "legacy-unspecified"
197
+
198
+ def _san(x):
199
+ # the |-protocol to bash is a trust boundary: artifact-controlled text must
200
+ # not be able to smuggle field separators or newlines into it
201
+ import re as _re
202
+ return _re.sub(r"[|,\r\n]", "_", str(x))
203
+
204
+ def _emit(verdict, issues, stale, trace_ok, independence):
205
+ print("|".join([_san(verdict), ";".join(_san(i) for i in issues),
206
+ ";".join(_san(x) for x in stale), _san(trace_ok), _san(independence)]))
207
+
208
+ try:
209
+ with open(artifact_path) as f:
210
+ data = json.load(f)
211
+ except Exception:
212
+ _emit("BLOCKED", ["schema_invalid:cannot_parse_json"], [], False, "unknown")
213
+ sys.exit(0)
214
+ if not isinstance(data, dict):
215
+ _emit("BLOCKED", ["schema_invalid:not_a_json_object"], [], False, "unknown")
216
+ sys.exit(0)
217
+
218
+ try:
219
+
220
+ # Required fields
221
+ for k in REQUIRED:
222
+ if k not in data:
223
+ issues.append(f"missing_field:{k}")
224
+ if not data.get("thread_id") and not data.get("agent_id"):
225
+ issues.append("missing_field:thread_id_or_agent_id")
226
+
227
+ # Verdict valid
228
+ verdict = data.get("verdict","")
229
+ if verdict not in ALLOWED_VERDICTS:
230
+ issues.append(f"invalid_verdict:{verdict}")
231
+
232
+ # audit_skill matches expected
233
+ if data.get("audit_skill") and data.get("audit_skill") != expected_skill:
234
+ issues.append(f"wrong_audit_skill:{data.get('audit_skill')}_vs_{expected_skill}")
235
+
236
+ # Review-independence metadata. Legacy artifacts (with none of the new fields)
237
+ # remain schema-readable but cannot prove independent acceptance, so the aggregate
238
+ # treats them provisional. Any partially-new artifact is invalid: it must retain
239
+ # executor/reviewer provenance and prove its claimed independence.
240
+ new_fields = ("review_independence", "acceptance_status", "executor_model",
241
+ "executor_family", "reviewer_family")
242
+ if any(k in data for k in new_fields):
243
+ for k in new_fields:
244
+ if not data.get(k):
245
+ issues.append(f"missing_field:{k}")
246
+ independence = data.get("review_independence", "")
247
+ if independence not in ("same-family", "cross-family", "deterministic"):
248
+ issues.append(f"invalid_review_independence:{independence}")
249
+ executor_family = model_family(data.get("executor_model", ""))
250
+ reviewer_family = model_family(data.get("reviewer_model", ""))
251
+ # A deterministic verifier is a process, not a model family, so it may
252
+ # formally accept artifacts produced by tooling whose model family is not
253
+ # known. Same-/cross-family model reviews still fail closed on unknowns.
254
+ if reviewer_family == "unknown" or (
255
+ independence != "deterministic" and executor_family == "unknown"
256
+ ):
257
+ issues.append(
258
+ f"unrecognized_model_family:executor={executor_family},reviewer={reviewer_family}")
259
+ if data.get("executor_family") != executor_family:
260
+ issues.append(f"executor_family_mismatch:{data.get('executor_family')}_vs_{executor_family}")
261
+ if data.get("reviewer_family") != reviewer_family:
262
+ issues.append(f"reviewer_family_mismatch:{data.get('reviewer_family')}_vs_{reviewer_family}")
263
+ if independence == "same-family":
264
+ expected_acceptance = "provisional"
265
+ if executor_family == "deterministic" or reviewer_family == "deterministic" or executor_family != reviewer_family:
266
+ issues.append("same_family_independence_mismatch")
267
+ elif independence == "cross-family":
268
+ expected_acceptance = "accepted"
269
+ if reviewer_family == "deterministic" or executor_family == reviewer_family:
270
+ issues.append("cross_family_independence_mismatch")
271
+ else:
272
+ expected_acceptance = "accepted"
273
+ if reviewer_family != "deterministic":
274
+ issues.append("deterministic_independence_mismatch")
275
+ else:
276
+ # These four audits are SEMANTIC (proof/claims/citations/attack) —
277
+ # a self-reported deterministic label cannot acquit them; only a
278
+ # real cross-family model review can. Whitelist is empty until a
279
+ # genuinely deterministic audit type exists AND binds its report.
280
+ issues.append(
281
+ f"deterministic_reviewer_not_allowed_for_semantic_audit:{expected_skill}")
282
+ if data.get("acceptance_status") != expected_acceptance:
283
+ issues.append(
284
+ f"acceptance_status_mismatch:{data.get('acceptance_status')}_vs_{expected_acceptance}")
285
+
286
+ # Hashes are dict and recompute
287
+ hashes = data.get("audited_input_hashes", {})
288
+ if not isinstance(hashes, dict):
289
+ issues.append("audited_input_hashes_not_dict")
290
+ else:
291
+ for rel_path, recorded in hashes.items():
292
+ # Strip 'sha256:' prefix
293
+ if isinstance(recorded, str) and recorded.startswith("sha256:"):
294
+ recorded_hex = recorded.split(":",1)[1]
295
+ else:
296
+ recorded_hex = recorded
297
+ full_path = os.path.join(paper_dir, rel_path) if not os.path.isabs(rel_path) else rel_path
298
+ if not os.path.isfile(full_path):
299
+ stale_files.append(f"{rel_path}:file_gone")
300
+ continue
301
+ try:
302
+ with open(full_path,"rb") as f:
303
+ h = hashlib.sha256(f.read()).hexdigest()
304
+ if h != recorded_hex:
305
+ stale_files.append(rel_path)
306
+ except Exception as e:
307
+ stale_files.append(f"{rel_path}:read_error_{e}")
308
+
309
+ # Trace path exists and is non-empty
310
+ trace_path = data.get("trace_path","")
311
+ if trace_path:
312
+ full_trace = os.path.join(paper_dir, trace_path) if not os.path.isabs(trace_path) else trace_path
313
+ if os.path.isdir(full_trace):
314
+ try:
315
+ if not any(True for _ in os.scandir(full_trace)):
316
+ trace_ok = False
317
+ issues.append(f"trace_path_empty:{trace_path}")
318
+ except Exception as e:
319
+ trace_ok = False
320
+ issues.append(f"trace_path_unreadable:{trace_path}")
321
+ elif os.path.isfile(full_trace):
322
+ try:
323
+ if os.path.getsize(full_trace) == 0:
324
+ trace_ok = False
325
+ issues.append(f"trace_path_empty_file:{trace_path}")
326
+ except Exception as e:
327
+ trace_ok = False
328
+ issues.append(f"trace_path_unreadable:{trace_path}")
329
+ else:
330
+ trace_ok = False
331
+ issues.append(f"trace_path_missing:{trace_path}")
332
+
333
+ except Exception as e: # any analysis crash is a BLOCKING schema failure, never fail-open
334
+ _emit("BLOCKED", [f"internal_error:{type(e).__name__}"], [], False, "unknown")
335
+ sys.exit(0)
336
+
337
+ # Output protocol: VERDICT|ISSUE;ISSUE|STALE;STALE|TRACE_OK|INDEPENDENCE (all sanitized)
338
+ _emit(verdict, issues, stale_files, trace_ok, independence)
339
+ PYEOF
340
+ )
341
+ local prc=$?
342
+ if [[ $prc -ne 0 || -z "$parsed" ]]; then
343
+ # the analyzer itself failed — NEVER fail open
344
+ if [[ "$ASSURANCE" == "submission" ]]; then ANY_BLOCKING=1; fi
345
+ ANY_PROBLEM=1
346
+ add_report "$expected_skill" "SCHEMA_INVALID" "BLOCKED" "false" "unknown" "[\"analyzer_failed_rc_${prc}\"]"
347
+ return
348
+ fi
349
+ local v_issues v_stale v_trace v_independence
350
+ verdict="$(echo "$parsed" | awk -F'|' '{print $1}')"
351
+ v_issues="$(echo "$parsed" | awk -F'|' '{print $2}')"
352
+ v_stale="$(echo "$parsed" | awk -F'|' '{print $3}')"
353
+ v_trace="$(echo "$parsed" | awk -F'|' '{print $4}')"
354
+ v_independence="$(echo "$parsed" | awk -F'|' '{print $5}')"
355
+
356
+ if [[ "$v_independence" == "same-family" || "$v_independence" == "legacy-unspecified" ]]; then
357
+ ANY_PROVISIONAL=1
358
+ fi
359
+
360
+ # Build issues array
361
+ if [[ -n "$v_issues" ]]; then
362
+ IFS=';' read -ra fissues <<< "$v_issues"
363
+ for fi in "${fissues[@]}"; do issues+=("\"$fi\""); done
364
+ fi
365
+
366
+ # Stale handling
367
+ if [[ -n "$v_stale" ]]; then
368
+ IFS=';' read -ra fstale <<< "$v_stale"
369
+ for fs in "${fstale[@]}"; do issues+=("\"stale:$fs\""); done
370
+ stale="true"
371
+ if [[ "$ASSURANCE" == "submission" ]]; then
372
+ ANY_BLOCKING=1
373
+ fi
374
+ ANY_PROBLEM=1
375
+ fi
376
+
377
+ # Submission-blocking verdict?
378
+ if [[ "$ASSURANCE" == "submission" ]] && is_in "$verdict" "${SUBMISSION_BLOCKING[@]}"; then
379
+ ANY_BLOCKING=1
380
+ ANY_PROBLEM=1
381
+ fi
382
+
383
+ # Schema or missing fields → blocking at submission
384
+ if [[ ${#issues[@]} -gt 0 ]]; then
385
+ if [[ "$ASSURANCE" == "submission" ]]; then ANY_BLOCKING=1; fi
386
+ ANY_PROBLEM=1
387
+ fi
388
+
389
+ # Verdict must be one of the known values — anything else blocks at submission
390
+ case "$verdict" in
391
+ PASS|WARN|FAIL|NOT_APPLICABLE|BLOCKED|ERROR) : ;;
392
+ *)
393
+ issues+=("\"unknown_verdict_token\"")
394
+ if [[ "$ASSURANCE" == "submission" ]]; then ANY_BLOCKING=1; fi
395
+ ANY_PROBLEM=1
396
+ ;;
397
+ esac
398
+ # An empty/schema-invalid verdict blocks at submission (no silent pass-through)
399
+ if [[ -z "$verdict" && "$ASSURANCE" == "submission" ]]; then
400
+ ANY_BLOCKING=1; ANY_PROBLEM=1
401
+ fi
402
+
403
+ # Status label
404
+ local status="OK"
405
+ if [[ -z "$verdict" ]]; then status="SCHEMA_INVALID"
406
+ elif [[ "$stale" == "true" ]]; then status="STALE"
407
+ elif is_in "$verdict" "${SUBMISSION_BLOCKING[@]}"; then status="BLOCKING_VERDICT"
408
+ elif [[ ${#issues[@]} -gt 0 ]]; then status="HAS_ISSUES"
409
+ fi
410
+
411
+ local issues_json
412
+ if [[ ${#issues[@]} -eq 0 ]]; then issues_json="[]"
413
+ else issues_json="[$(IFS=,; echo "${issues[*]}")]"
414
+ fi
415
+
416
+ add_report "$expected_skill" "$status" "$verdict" "$stale" "$v_independence" "$issues_json"
417
+ }
418
+
419
+ # ─── Run all checks ───────────────────────────────────────────────────────────
420
+ for entry in "${MANDATORY_AUDITS[@]}"; do
421
+ artifact="${entry%%|*}"
422
+ skill="${entry##*|}"
423
+ verify_one "$artifact" "$skill"
424
+ done
425
+
426
+ # ─── Write report ─────────────────────────────────────────────────────────────
427
+ OVERALL_ASSURANCE="accepted"
428
+ if [[ "$ANY_BLOCKING" -eq 1 ]]; then
429
+ OVERALL_ASSURANCE="blocked"
430
+ elif [[ "$ANY_PROVISIONAL" -eq 1 ]]; then
431
+ OVERALL_ASSURANCE="provisional"
432
+ fi
433
+
434
+ "$PY" - "$JSON_OUT" "$PAPER_DIR" "$ASSURANCE" "$ANY_PROBLEM" "$ANY_BLOCKING" "$OVERALL_ASSURANCE" "${REPORT_LINES[@]}" <<'PYEOF'
435
+ import json, sys
436
+ from datetime import datetime, timezone
437
+
438
+ json_out, paper_dir, assurance, any_problem, any_blocking, overall, *rows = sys.argv[1:]
439
+ report = {
440
+ "verifier_version": "2",
441
+ "paper_dir": paper_dir,
442
+ "assurance": assurance,
443
+ "generated_at": datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ"),
444
+ "any_problem": any_problem == "1",
445
+ "submission_blocking": any_blocking == "1",
446
+ "overall_assurance": overall,
447
+ "audits": [json.loads(row) for row in rows],
448
+ }
449
+ with open(json_out, "w", encoding="utf-8") as f:
450
+ json.dump(report, f, ensure_ascii=False, indent=2)
451
+ f.write("\n")
452
+ PYEOF
453
+
454
+ # ─── Human-readable summary to stderr ─────────────────────────────────────────
455
+ echo "" >&2
456
+ echo "Audit verifier report ($ASSURANCE)" >&2
457
+ echo " paper: $PAPER_DIR" >&2
458
+ echo " json: $JSON_OUT" >&2
459
+ echo "" >&2
460
+ for line in "${REPORT_LINES[@]}"; do
461
+ skill="$(echo "$line" | sed -n 's/.*"audit":"\([^"]*\)".*/\1/p')"
462
+ status="$(echo "$line" | sed -n 's/.*"status":"\([^"]*\)".*/\1/p')"
463
+ verdict="$(echo "$line" | sed -n 's/.*"verdict":"\([^"]*\)".*/\1/p')"
464
+ stale="$(echo "$line" | sed -n 's/.*"stale":\([^,]*\).*/\1/p')"
465
+ independence="$(echo "$line" | sed -n 's/.*"review_independence":"\([^"]*\)".*/\1/p')"
466
+ if [[ "$status" == "OK" ]]; then mark="✓"
467
+ elif [[ "$status" == "MISSING_DRAFT_OK" ]]; then mark="·"
468
+ else mark="✗"
469
+ fi
470
+ printf " %s %-22s status=%-18s verdict=%-15s independence=%-18s stale=%s\n" \
471
+ "$mark" "$skill" "$status" "${verdict:-(none)}" "$independence" "$stale" >&2
472
+ done
473
+ echo " overall assurance: $OVERALL_ASSURANCE" >&2
474
+ echo "" >&2
475
+
476
+ # ─── Exit ─────────────────────────────────────────────────────────────────────
477
+ if [[ "$ASSURANCE" == "submission" && "$ANY_BLOCKING" -eq 1 ]]; then
478
+ echo "FAIL: submission-level enforcement triggered." >&2
479
+ echo " Fix the issues above (or downgrade to --assurance draft) before finalizing." >&2
480
+ exit 1
481
+ fi
482
+ if [[ "$ASSURANCE" == "draft" && "$ANY_PROBLEM" -eq 1 ]]; then
483
+ # Draft level: surface but do not block
484
+ echo "WARN: draft-mode artifacts present but have issues (see above). Not blocking." >&2
485
+ exit 0
486
+ fi
487
+ exit 0