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.
- package/LICENSE +21 -0
- package/README.md +98 -0
- package/README_CN.md +87 -0
- package/dsh/checkout.patch.yml +38 -0
- package/dsh/client.js +634 -0
- package/dsh/cordis.patch.yml +44 -0
- package/dsh/index.mjs +76 -0
- package/dsh/run-status.mjs +182 -0
- package/dsh/scope-limits.mjs +50 -0
- package/dsh/workbench.mjs +291 -0
- package/mcp-servers/claude-review/README.md +93 -0
- package/mcp-servers/claude-review/run_with_claude_aws.sh +49 -0
- package/mcp-servers/claude-review/server.py +718 -0
- package/mcp-servers/codex-image2/README.md +65 -0
- package/mcp-servers/codex-image2/server.py +893 -0
- package/mcp-servers/feishu-bridge/requirements.txt +1 -0
- package/mcp-servers/feishu-bridge/server.py +240 -0
- package/mcp-servers/gemini-review/README.md +171 -0
- package/mcp-servers/gemini-review/server.py +1856 -0
- package/mcp-servers/llm-chat/requirements.txt +1 -0
- package/mcp-servers/llm-chat/server.py +664 -0
- package/mcp-servers/manual-review/README.md +133 -0
- package/mcp-servers/manual-review/server.py +910 -0
- package/mcp-servers/manual-review/ui.html +279 -0
- package/mcp-servers/minimax-chat/requirements.txt +1 -0
- package/mcp-servers/minimax-chat/server.py +381 -0
- package/package.json +51 -0
- package/skills/ablation-planner/SKILL.md +123 -0
- package/skills/alphaxiv/SKILL.md +196 -0
- package/skills/analyze-results/SKILL.md +46 -0
- package/skills/arxiv/SKILL.md +248 -0
- package/skills/auto-paper-improvement-loop/SKILL.md +651 -0
- package/skills/auto-review-loop/SKILL.md +1137 -0
- package/skills/auto-review-loop-llm/SKILL.md +259 -0
- package/skills/auto-review-loop-minimax/SKILL.md +302 -0
- package/skills/citation-audit/SKILL.md +502 -0
- package/skills/claims-drafting/SKILL.md +227 -0
- package/skills/comm-lit-review/SKILL.md +297 -0
- package/skills/deepxiv/SKILL.md +263 -0
- package/skills/dse-loop/SKILL.md +296 -0
- package/skills/embodiment-description/SKILL.md +129 -0
- package/skills/exa-search/SKILL.md +205 -0
- package/skills/experiment-audit/SKILL.md +311 -0
- package/skills/experiment-bridge/SKILL.md +376 -0
- package/skills/experiment-plan/SKILL.md +249 -0
- package/skills/experiment-queue/SKILL.md +431 -0
- package/skills/experiment-queue/scripts/build_manifest.py +142 -0
- package/skills/experiment-queue/scripts/queue_manager.py +433 -0
- package/skills/feishu-notify/SKILL.md +156 -0
- package/skills/figure-description/SKILL.md +138 -0
- package/skills/figure-spec/SKILL.md +262 -0
- package/skills/figure-spec/scripts/figure_renderer.py +799 -0
- package/skills/formula-derivation/SKILL.md +280 -0
- package/skills/gemini-search/SKILL.md +231 -0
- package/skills/grant-proposal/SKILL.md +698 -0
- package/skills/idea-creator/SKILL.md +542 -0
- package/skills/idea-discovery/SKILL.md +521 -0
- package/skills/idea-discovery-robot/SKILL.md +363 -0
- package/skills/integrity-forensics/SKILL.md +284 -0
- package/skills/interview-cheatsheet/SKILL.md +245 -0
- package/skills/invention-structuring/SKILL.md +188 -0
- package/skills/jurisdiction-format/SKILL.md +192 -0
- package/skills/kill-argument/SKILL.md +437 -0
- package/skills/mermaid-diagram/SKILL.md +419 -0
- package/skills/meta-apply/SKILL.md +141 -0
- package/skills/meta-optimize/SKILL.md +437 -0
- package/skills/monitor-experiment/SKILL.md +140 -0
- package/skills/novelty-check/SKILL.md +101 -0
- package/skills/openalex/SKILL.md +237 -0
- package/skills/overleaf-sync/SKILL.md +220 -0
- package/skills/paper-claim-audit/SKILL.md +348 -0
- package/skills/paper-compile/SKILL.md +266 -0
- package/skills/paper-figure/SKILL.md +312 -0
- package/skills/paper-illustration/SKILL.md +736 -0
- package/skills/paper-illustration-image2/SKILL.md +391 -0
- package/skills/paper-illustration-image2/scripts/paper_illustration_image2.py +255 -0
- package/skills/paper-plan/SKILL.md +386 -0
- package/skills/paper-poster/SKILL.md +19 -0
- package/skills/paper-poster-html/DESIGN_FINAL.md +176 -0
- package/skills/paper-poster-html/IMPLEMENTATION_CONVENTIONS.md +161 -0
- package/skills/paper-poster-html/LICENSES/posterly-MIT.txt +21 -0
- package/skills/paper-poster-html/NOTICE.md +57 -0
- package/skills/paper-poster-html/SKILL.md +323 -0
- package/skills/paper-poster-html/scripts/_posterly/__init__.py +0 -0
- package/skills/paper-poster-html/scripts/_posterly/canvas.py +200 -0
- package/skills/paper-poster-html/scripts/_posterly/measure.py +588 -0
- package/skills/paper-poster-html/scripts/_posterly/polish.py +498 -0
- package/skills/paper-poster-html/scripts/_posterly/preflight.py +489 -0
- package/skills/paper-poster-html/scripts/_posterly/render.py +215 -0
- package/skills/paper-poster-html/scripts/_posterly/textutil.py +16 -0
- package/skills/paper-poster-html/scripts/_posterly/verify_final.py +171 -0
- package/skills/paper-poster-html/scripts/asset_check.py +897 -0
- package/skills/paper-poster-html/scripts/extract_pdf_figures.py +666 -0
- package/skills/paper-poster-html/scripts/poster_check.py +251 -0
- package/skills/paper-poster-html/scripts/preprocess_figures.py +238 -0
- package/skills/paper-poster-html/scripts/render_preview.py +217 -0
- package/skills/paper-poster-html/scripts/run_gates.py +556 -0
- package/skills/paper-poster-html/scripts/style_check.py +1324 -0
- package/skills/paper-poster-html/templates/COMPONENTS.md +462 -0
- package/skills/paper-poster-html/templates/README.md +170 -0
- package/skills/paper-poster-html/templates/landscape_4col.html +1032 -0
- package/skills/paper-poster-html/templates/landscape_hero.html +1046 -0
- package/skills/paper-poster-html/templates/portrait_2col.html +947 -0
- package/skills/paper-poster-html/templates/tokens/acl.json +9 -0
- package/skills/paper-poster-html/templates/tokens/cvpr.json +9 -0
- package/skills/paper-poster-html/templates/tokens/generic.json +9 -0
- package/skills/paper-poster-html/templates/tokens/iclr.json +9 -0
- package/skills/paper-poster-html/templates/tokens/icml.json +9 -0
- package/skills/paper-poster-html/templates/tokens/neurips.json +9 -0
- package/skills/paper-slides/SKILL.md +635 -0
- package/skills/paper-talk/SKILL.md +381 -0
- package/skills/paper-write/SKILL.md +604 -0
- package/skills/paper-write/templates/IEEEtran.bst +2409 -0
- package/skills/paper-write/templates/IEEEtran.cls +6347 -0
- package/skills/paper-write/templates/iclr2026.tex +84 -0
- package/skills/paper-write/templates/icml2025.tex +87 -0
- package/skills/paper-write/templates/ieee_conference.tex +89 -0
- package/skills/paper-write/templates/ieee_journal.tex +93 -0
- package/skills/paper-write/templates/math_commands.tex +48 -0
- package/skills/paper-write/templates/neurips2025.tex +80 -0
- package/skills/paper-writing/SKILL.md +916 -0
- package/skills/patent-novelty-check/SKILL.md +153 -0
- package/skills/patent-pipeline/SKILL.md +344 -0
- package/skills/patent-review/SKILL.md +203 -0
- package/skills/pixel-art/SKILL.md +137 -0
- package/skills/prior-art-search/SKILL.md +146 -0
- package/skills/proof-checker/SKILL.md +866 -0
- package/skills/proof-orchestrator/NOTICE.md +24 -0
- package/skills/proof-orchestrator/SKILL.md +254 -0
- package/skills/proof-orchestrator/references/audit-output-contract.md +126 -0
- package/skills/proof-orchestrator/references/deepseek-routing.md +74 -0
- package/skills/proof-orchestrator/references/dispatch-prompts.md +227 -0
- package/skills/proof-orchestrator/references/notation-audit.md +135 -0
- package/skills/proof-orchestrator/references/proof-audit-rubric.md +70 -0
- package/skills/proof-orchestrator/references/stress-tests.md +38 -0
- package/skills/proof-writer/SKILL.md +223 -0
- package/skills/qzcli/SKILL.md +324 -0
- package/skills/rebuttal/SKILL.md +376 -0
- package/skills/render-html/SKILL.md +316 -0
- package/skills/render-html/scripts/render_html.py +1006 -0
- package/skills/render-html/scripts/templates/academic.html +703 -0
- package/skills/render-html/scripts/templates/dashboard.html +333 -0
- package/skills/research-lit/SKILL.md +756 -0
- package/skills/research-pipeline/SKILL.md +384 -0
- package/skills/research-refine/SKILL.md +770 -0
- package/skills/research-refine-pipeline/SKILL.md +186 -0
- package/skills/research-review/SKILL.md +198 -0
- package/skills/research-wiki/SKILL.md +461 -0
- package/skills/resubmit-pipeline/SKILL.md +447 -0
- package/skills/result-to-claim/SKILL.md +311 -0
- package/skills/run-experiment/SKILL.md +313 -0
- package/skills/semantic-scholar/SKILL.md +236 -0
- package/skills/serverless-modal/SKILL.md +335 -0
- package/skills/shared-references/acceptance-gate.md +324 -0
- package/skills/shared-references/assurance-contract.md +248 -0
- package/skills/shared-references/capture-antipatterns.md +78 -0
- package/skills/shared-references/citation-discipline.md +583 -0
- package/skills/shared-references/compute-env-contract.md +163 -0
- package/skills/shared-references/effort-contract.md +183 -0
- package/skills/shared-references/evidence-precheck.md +65 -0
- package/skills/shared-references/experiment-integrity.md +49 -0
- package/skills/shared-references/external-cadence.md +326 -0
- package/skills/shared-references/fan-out-pattern.md +366 -0
- package/skills/shared-references/injection-hygiene.md +127 -0
- package/skills/shared-references/integration-contract.md +461 -0
- package/skills/shared-references/output-composition.md +93 -0
- package/skills/shared-references/output-language.md +45 -0
- package/skills/shared-references/output-manifest.md +49 -0
- package/skills/shared-references/output-versioning.md +111 -0
- package/skills/shared-references/patent-format-cn.md +199 -0
- package/skills/shared-references/patent-format-ep.md +173 -0
- package/skills/shared-references/patent-format-us.md +161 -0
- package/skills/shared-references/patent-writing-principles.md +197 -0
- package/skills/shared-references/prior-art-databases.md +141 -0
- package/skills/shared-references/resumable-runs.md +109 -0
- package/skills/shared-references/review-scope-limits.md +81 -0
- package/skills/shared-references/review-tracing.md +391 -0
- package/skills/shared-references/reviewer-independence.md +79 -0
- package/skills/shared-references/reviewer-routing.md +852 -0
- package/skills/shared-references/skill-governance.md +104 -0
- package/skills/shared-references/taste-calibration.md +85 -0
- package/skills/shared-references/venue-checklists.md +114 -0
- package/skills/shared-references/wiki-helper-resolution.md +134 -0
- package/skills/shared-references/writing-principles.md +525 -0
- package/skills/skills-codex/README.md +102 -0
- package/skills/skills-codex/README_CN.md +100 -0
- package/skills/skills-codex/ablation-planner/SKILL.md +126 -0
- package/skills/skills-codex/alphaxiv/SKILL.md +186 -0
- package/skills/skills-codex/analyze-results/SKILL.md +45 -0
- package/skills/skills-codex/arxiv/SKILL.md +210 -0
- package/skills/skills-codex/auto-paper-improvement-loop/SKILL.md +574 -0
- package/skills/skills-codex/auto-review-loop/SKILL.md +500 -0
- package/skills/skills-codex/auto-review-loop-llm/SKILL.md +247 -0
- package/skills/skills-codex/auto-review-loop-minimax/SKILL.md +290 -0
- package/skills/skills-codex/citation-audit/SKILL.md +504 -0
- package/skills/skills-codex/claims-drafting/SKILL.md +239 -0
- package/skills/skills-codex/comm-lit-review/SKILL.md +299 -0
- package/skills/skills-codex/comm-lit-review/references/domain-taxonomy.md +57 -0
- package/skills/skills-codex/comm-lit-review/references/output-template.md +37 -0
- package/skills/skills-codex/comm-lit-review/references/source-policy.md +99 -0
- package/skills/skills-codex/comm-lit-review/references/venue-tiering.md +112 -0
- package/skills/skills-codex/deepxiv/SKILL.md +142 -0
- package/skills/skills-codex/dse-loop/SKILL.md +285 -0
- package/skills/skills-codex/embodiment-description/SKILL.md +129 -0
- package/skills/skills-codex/exa-search/SKILL.md +192 -0
- package/skills/skills-codex/experiment-audit/SKILL.md +286 -0
- package/skills/skills-codex/experiment-bridge/SKILL.md +356 -0
- package/skills/skills-codex/experiment-plan/SKILL.md +249 -0
- package/skills/skills-codex/experiment-queue/SKILL.md +401 -0
- package/skills/skills-codex/feishu-notify/SKILL.md +155 -0
- package/skills/skills-codex/figure-description/SKILL.md +138 -0
- package/skills/skills-codex/figure-spec/SKILL.md +252 -0
- package/skills/skills-codex/formula-derivation/SKILL.md +280 -0
- package/skills/skills-codex/gemini-search/SKILL.md +205 -0
- package/skills/skills-codex/grant-proposal/SKILL.md +626 -0
- package/skills/skills-codex/idea-creator/SKILL.md +405 -0
- package/skills/skills-codex/idea-discovery/SKILL.md +475 -0
- package/skills/skills-codex/idea-discovery-robot/SKILL.md +362 -0
- package/skills/skills-codex/integrity-forensics/SKILL.md +106 -0
- package/skills/skills-codex/interview-cheatsheet/SKILL.md +245 -0
- package/skills/skills-codex/invention-structuring/SKILL.md +188 -0
- package/skills/skills-codex/jurisdiction-format/SKILL.md +192 -0
- package/skills/skills-codex/kill-argument/SKILL.md +403 -0
- package/skills/skills-codex/mermaid-diagram/SKILL.md +379 -0
- package/skills/skills-codex/meta-apply/SKILL.md +154 -0
- package/skills/skills-codex/meta-optimize/SKILL.md +348 -0
- package/skills/skills-codex/monitor-experiment/SKILL.md +98 -0
- package/skills/skills-codex/novelty-check/SKILL.md +89 -0
- package/skills/skills-codex/openalex/SKILL.md +228 -0
- package/skills/skills-codex/overleaf-sync/SKILL.md +220 -0
- package/skills/skills-codex/paper-claim-audit/SKILL.md +350 -0
- package/skills/skills-codex/paper-compile/SKILL.md +253 -0
- package/skills/skills-codex/paper-figure/SKILL.md +311 -0
- package/skills/skills-codex/paper-illustration/SKILL.md +690 -0
- package/skills/skills-codex/paper-illustration-image2/SKILL.md +383 -0
- package/skills/skills-codex/paper-illustration-image2/scripts/paper_illustration_image2.py +255 -0
- package/skills/skills-codex/paper-plan/SKILL.md +278 -0
- package/skills/skills-codex/paper-poster/SKILL.md +19 -0
- package/skills/skills-codex/paper-poster-html/SKILL.md +377 -0
- package/skills/skills-codex/paper-slides/SKILL.md +571 -0
- package/skills/skills-codex/paper-talk/SKILL.md +381 -0
- package/skills/skills-codex/paper-write/SKILL.md +411 -0
- package/skills/skills-codex/paper-write/templates/IEEEtran.bst +2409 -0
- package/skills/skills-codex/paper-write/templates/IEEEtran.cls +6347 -0
- package/skills/skills-codex/paper-write/templates/aaai2026.bst +1493 -0
- package/skills/skills-codex/paper-write/templates/aaai2026.sty +315 -0
- package/skills/skills-codex/paper-write/templates/aaai2026.tex +952 -0
- package/skills/skills-codex/paper-write/templates/acl.sty +312 -0
- package/skills/skills-codex/paper-write/templates/acl2026.tex +377 -0
- package/skills/skills-codex/paper-write/templates/acl_natbib.bst +1940 -0
- package/skills/skills-codex/paper-write/templates/acm.bst +3081 -0
- package/skills/skills-codex/paper-write/templates/acm_mm2026.tex +204 -0
- package/skills/skills-codex/paper-write/templates/acmart.cls +3520 -0
- package/skills/skills-codex/paper-write/templates/cvpr.bst +1448 -0
- package/skills/skills-codex/paper-write/templates/cvpr.sty +508 -0
- package/skills/skills-codex/paper-write/templates/cvpr2026.tex +63 -0
- package/skills/skills-codex/paper-write/templates/iclr2026.tex +84 -0
- package/skills/skills-codex/paper-write/templates/iclr2026_conference.bst +1440 -0
- package/skills/skills-codex/paper-write/templates/iclr2026_conference.sty +246 -0
- package/skills/skills-codex/paper-write/templates/icml2026.sty +767 -0
- package/skills/skills-codex/paper-write/templates/icml2026.tex +662 -0
- package/skills/skills-codex/paper-write/templates/ieee_conference.tex +89 -0
- package/skills/skills-codex/paper-write/templates/ieee_journal.tex +93 -0
- package/skills/skills-codex/paper-write/templates/math_commands.tex +48 -0
- package/skills/skills-codex/paper-write/templates/neurips2026.tex +493 -0
- package/skills/skills-codex/paper-write/templates/neurips_2026.sty +437 -0
- package/skills/skills-codex/paper-writing/SKILL.md +731 -0
- package/skills/skills-codex/patent-novelty-check/SKILL.md +153 -0
- package/skills/skills-codex/patent-pipeline/SKILL.md +344 -0
- package/skills/skills-codex/patent-review/SKILL.md +202 -0
- package/skills/skills-codex/pixel-art/SKILL.md +139 -0
- package/skills/skills-codex/prior-art-search/SKILL.md +146 -0
- package/skills/skills-codex/proof-checker/SKILL.md +554 -0
- package/skills/skills-codex/proof-orchestrator/SKILL.md +260 -0
- package/skills/skills-codex/proof-orchestrator/references/audit-output-contract.md +126 -0
- package/skills/skills-codex/proof-orchestrator/references/deepseek-routing.md +76 -0
- package/skills/skills-codex/proof-orchestrator/references/dispatch-prompts.md +227 -0
- package/skills/skills-codex/proof-orchestrator/references/notation-audit.md +135 -0
- package/skills/skills-codex/proof-orchestrator/references/proof-audit-rubric.md +70 -0
- package/skills/skills-codex/proof-orchestrator/references/stress-tests.md +38 -0
- package/skills/skills-codex/proof-writer/SKILL.md +222 -0
- package/skills/skills-codex/qzcli/SKILL.md +324 -0
- package/skills/skills-codex/rebuttal/SKILL.md +305 -0
- package/skills/skills-codex/render-html/SKILL.md +305 -0
- package/skills/skills-codex/render-html/scripts/__pycache__/render_html.cpython-314.pyc +0 -0
- package/skills/skills-codex/render-html/scripts/render_html.py +909 -0
- package/skills/skills-codex/render-html/scripts/templates/academic.html +342 -0
- package/skills/skills-codex/render-html/scripts/templates/dashboard.html +333 -0
- package/skills/skills-codex/research-lit/SKILL.md +464 -0
- package/skills/skills-codex/research-pipeline/SKILL.md +340 -0
- package/skills/skills-codex/research-refine/SKILL.md +721 -0
- package/skills/skills-codex/research-refine-pipeline/SKILL.md +186 -0
- package/skills/skills-codex/research-review/SKILL.md +135 -0
- package/skills/skills-codex/research-wiki/SKILL.md +421 -0
- package/skills/skills-codex/resubmit-pipeline/SKILL.md +444 -0
- package/skills/skills-codex/result-to-claim/SKILL.md +246 -0
- package/skills/skills-codex/run-experiment/SKILL.md +236 -0
- package/skills/skills-codex/semantic-scholar/SKILL.md +219 -0
- package/skills/skills-codex/serverless-modal/SKILL.md +335 -0
- package/skills/skills-codex/shared-references/acceptance-gate.md +336 -0
- package/skills/skills-codex/shared-references/assurance-contract.md +139 -0
- package/skills/skills-codex/shared-references/capture-antipatterns.md +84 -0
- package/skills/skills-codex/shared-references/citation-discipline.md +452 -0
- package/skills/skills-codex/shared-references/compute-env-contract.md +163 -0
- package/skills/skills-codex/shared-references/effort-contract.md +143 -0
- package/skills/skills-codex/shared-references/evidence-precheck.md +73 -0
- package/skills/skills-codex/shared-references/experiment-integrity.md +49 -0
- package/skills/skills-codex/shared-references/external-cadence.md +334 -0
- package/skills/skills-codex/shared-references/fan-out-pattern.md +375 -0
- package/skills/skills-codex/shared-references/injection-hygiene.md +132 -0
- package/skills/skills-codex/shared-references/integration-contract.md +372 -0
- package/skills/skills-codex/shared-references/output-composition.md +98 -0
- package/skills/skills-codex/shared-references/output-language.md +45 -0
- package/skills/skills-codex/shared-references/output-manifest.md +40 -0
- package/skills/skills-codex/shared-references/output-versioning.md +111 -0
- package/skills/skills-codex/shared-references/patent-format-cn.md +199 -0
- package/skills/skills-codex/shared-references/patent-format-ep.md +173 -0
- package/skills/skills-codex/shared-references/patent-format-us.md +161 -0
- package/skills/skills-codex/shared-references/patent-writing-principles.md +197 -0
- package/skills/skills-codex/shared-references/prior-art-databases.md +141 -0
- package/skills/skills-codex/shared-references/resumable-runs.md +125 -0
- package/skills/skills-codex/shared-references/review-scope-limits.md +81 -0
- package/skills/skills-codex/shared-references/review-tracing.md +144 -0
- package/skills/skills-codex/shared-references/reviewer-independence.md +66 -0
- package/skills/skills-codex/shared-references/reviewer-routing.md +128 -0
- package/skills/skills-codex/shared-references/skill-governance.md +119 -0
- package/skills/skills-codex/shared-references/taste-calibration.md +90 -0
- package/skills/skills-codex/shared-references/venue-checklists.md +73 -0
- package/skills/skills-codex/shared-references/wiki-helper-resolution.md +69 -0
- package/skills/skills-codex/shared-references/writing-principles.md +525 -0
- package/skills/skills-codex/slides-polish/SKILL.md +563 -0
- package/skills/skills-codex/specification-writing/SKILL.md +211 -0
- package/skills/skills-codex/system-profile/SKILL.md +103 -0
- package/skills/skills-codex/training-check/SKILL.md +83 -0
- package/skills/skills-codex/vast-gpu/SKILL.md +394 -0
- package/skills/skills-codex/web-debug-search/SKILL.md +334 -0
- package/skills/skills-codex/wiki-enrich/SKILL.md +255 -0
- package/skills/skills-codex/writing-systems-papers/SKILL.md +184 -0
- package/skills/skills-codex-claude-review/README.md +79 -0
- package/skills/skills-codex-claude-review/README_CN.md +78 -0
- package/skills/skills-codex-claude-review/auto-paper-improvement-loop/SKILL.md +581 -0
- package/skills/skills-codex-claude-review/auto-review-loop/SKILL.md +510 -0
- package/skills/skills-codex-claude-review/novelty-check/SKILL.md +102 -0
- package/skills/skills-codex-claude-review/paper-figure/SKILL.md +319 -0
- package/skills/skills-codex-claude-review/paper-plan/SKILL.md +287 -0
- package/skills/skills-codex-claude-review/paper-write/SKILL.md +420 -0
- package/skills/skills-codex-claude-review/research-refine/SKILL.md +732 -0
- package/skills/skills-codex-claude-review/research-review/SKILL.md +149 -0
- package/skills/skills-codex-gemini-review/README.md +176 -0
- package/skills/skills-codex-gemini-review/README_CN.md +175 -0
- package/skills/skills-codex-gemini-review/auto-paper-improvement-loop/SKILL.md +331 -0
- package/skills/skills-codex-gemini-review/auto-review-loop/SKILL.md +304 -0
- package/skills/skills-codex-gemini-review/grant-proposal/SKILL.md +630 -0
- package/skills/skills-codex-gemini-review/idea-creator/SKILL.md +263 -0
- package/skills/skills-codex-gemini-review/idea-discovery/SKILL.md +275 -0
- package/skills/skills-codex-gemini-review/idea-discovery-robot/SKILL.md +365 -0
- package/skills/skills-codex-gemini-review/novelty-check/SKILL.md +92 -0
- package/skills/skills-codex-gemini-review/paper-figure/SKILL.md +289 -0
- package/skills/skills-codex-gemini-review/paper-plan/SKILL.md +265 -0
- package/skills/skills-codex-gemini-review/paper-poster-html/SKILL.md +102 -0
- package/skills/skills-codex-gemini-review/paper-slides/SKILL.md +582 -0
- package/skills/skills-codex-gemini-review/paper-write/SKILL.md +346 -0
- package/skills/skills-codex-gemini-review/paper-writing/SKILL.md +312 -0
- package/skills/skills-codex-gemini-review/research-refine/SKILL.md +674 -0
- package/skills/skills-codex-gemini-review/research-review/SKILL.md +112 -0
- package/skills/slides-polish/SKILL.md +565 -0
- package/skills/specification-writing/SKILL.md +211 -0
- package/skills/system-profile/SKILL.md +103 -0
- package/skills/training-check/SKILL.md +132 -0
- package/skills/vast-gpu/SKILL.md +394 -0
- package/skills/web-debug-search/SKILL.md +334 -0
- package/skills/wiki-enrich/SKILL.md +257 -0
- package/skills/writing-systems-papers/SKILL.md +184 -0
- package/templates/CLAUDE_MD_TEMPLATE.md +29 -0
- package/templates/EXPERIMENT_LOG_TEMPLATE.md +47 -0
- package/templates/EXPERIMENT_PLAN_TEMPLATE.md +51 -0
- package/templates/EXPERIMENT_PLAN_TEMPLATE_CN.md +53 -0
- package/templates/FINDINGS_TEMPLATE.md +52 -0
- package/templates/IDEA_CANDIDATES_TEMPLATE.md +47 -0
- package/templates/IDEA_CANDIDATES_TEMPLATE_CN.md +47 -0
- package/templates/INVENTION_BRIEF_TEMPLATE.md +87 -0
- package/templates/MANIFEST_TEMPLATE.md +7 -0
- package/templates/NARRATIVE_REPORT_TEMPLATE.md +49 -0
- package/templates/PAPER_PLAN_TEMPLATE.md +47 -0
- package/templates/PATENT_CLAIMS_TEMPLATE.md +78 -0
- package/templates/PATENT_SPECIFICATION_TEMPLATE.md +68 -0
- package/templates/README.md +57 -0
- package/templates/RESEARCH_BRIEF_TEMPLATE.md +35 -0
- package/templates/RESEARCH_BRIEF_TEMPLATE_CN.md +41 -0
- package/templates/RESEARCH_CONTRACT_TEMPLATE.md +60 -0
- package/templates/claude-hooks/corpus_write_guard.json +16 -0
- package/templates/claude-hooks/corpus_write_guard.py +85 -0
- package/templates/claude-hooks/meta_logging.json +74 -0
- package/templates/gitignore-trace.txt +3 -0
- package/tools/__pycache__/check_skills_inventory.cpython-314.pyc +0 -0
- package/tools/arxiv_fetch.py +311 -0
- package/tools/capture_filter.py +126 -0
- package/tools/check_skills_inventory.py +273 -0
- package/tools/convert_skills_to_llm_chat.py +282 -0
- package/tools/copilot_native_evidence.py +818 -0
- package/tools/deepxiv_fetch.py +213 -0
- package/tools/evidence_check.py +212 -0
- package/tools/exa_search.py +425 -0
- package/tools/experiment_queue/README.md +118 -0
- package/tools/experiment_queue/build_manifest.py +44 -0
- package/tools/experiment_queue/queue_manager.py +44 -0
- package/tools/extract_paper_style.py +560 -0
- package/tools/figure_renderer.py +69 -0
- package/tools/forensics_gate.py +669 -0
- package/tools/generate_codex_claude_review_overrides.py +299 -0
- package/tools/idea_discovery_gate.py +256 -0
- package/tools/install_aris.ps1 +1372 -0
- package/tools/install_aris.sh +1370 -0
- package/tools/install_aris_codex.sh +1023 -0
- package/tools/install_aris_copilot.sh +1052 -0
- package/tools/iteration_log.py +143 -0
- package/tools/lint_skills_helpers.sh +84 -0
- package/tools/meta_opt/check_ready.sh +80 -0
- package/tools/meta_opt/log_event.sh +91 -0
- package/tools/meta_opt/trigger_eval.py +280 -0
- package/tools/meta_opt/trigger_evals.sample.json +28 -0
- package/tools/openalex_fetch.py +326 -0
- package/tools/overleaf_audit.sh +104 -0
- package/tools/overleaf_setup.sh +150 -0
- package/tools/paper_illustration_image2.py +62 -0
- package/tools/provenance.py +294 -0
- package/tools/research_wiki.py +1720 -0
- package/tools/review_gate.py +502 -0
- package/tools/run_state.py +399 -0
- package/tools/save_trace.sh +477 -0
- package/tools/semantic_scholar_fetch.py +438 -0
- package/tools/skill-groups.tsv +116 -0
- package/tools/skill_picker.py +238 -0
- package/tools/smart_update.ps1 +521 -0
- package/tools/smart_update.sh +591 -0
- package/tools/smart_update_codex.sh +419 -0
- package/tools/smart_update_copilot.sh +605 -0
- package/tools/threat_scan.py +222 -0
- package/tools/verify_paper_audits.sh +487 -0
- package/tools/verify_papers.py +613 -0
- package/tools/verify_wiki_coverage.sh +176 -0
- 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
|