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