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,311 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""CLI helper for searching and downloading arXiv papers.
|
|
3
|
+
|
|
4
|
+
Used by the ``arxiv`` skill (skills/arxiv/SKILL.md).
|
|
5
|
+
|
|
6
|
+
Commands
|
|
7
|
+
--------
|
|
8
|
+
search Search arXiv and print results as JSON.
|
|
9
|
+
download Download a paper PDF by arXiv ID.
|
|
10
|
+
|
|
11
|
+
Examples
|
|
12
|
+
--------
|
|
13
|
+
python3 tools/arxiv_fetch.py search "attention mechanism" --max 10
|
|
14
|
+
python3 tools/arxiv_fetch.py search "id:2301.07041" --max 1
|
|
15
|
+
python3 tools/arxiv_fetch.py download 2301.07041 --dir papers
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
from __future__ import annotations
|
|
19
|
+
|
|
20
|
+
import argparse
|
|
21
|
+
import json
|
|
22
|
+
import os
|
|
23
|
+
import re
|
|
24
|
+
import sys
|
|
25
|
+
import time
|
|
26
|
+
import urllib.error
|
|
27
|
+
import urllib.parse
|
|
28
|
+
import urllib.request
|
|
29
|
+
import xml.etree.ElementTree as ET
|
|
30
|
+
from pathlib import Path
|
|
31
|
+
|
|
32
|
+
_ATOM_NS = "http://www.w3.org/2005/Atom"
|
|
33
|
+
_API_BASE = "http://export.arxiv.org/api/query"
|
|
34
|
+
_MIN_PDF_BYTES = 10_240
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def _validate_pdf(size_bytes: int, first_bytes: bytes) -> None:
|
|
38
|
+
"""Reject truncated downloads and non-PDF response bodies."""
|
|
39
|
+
if size_bytes < _MIN_PDF_BYTES:
|
|
40
|
+
raise ValueError(
|
|
41
|
+
f"Downloaded file is only {size_bytes} bytes - likely an error page, not a PDF"
|
|
42
|
+
)
|
|
43
|
+
if b"%PDF-" not in first_bytes[:1024]:
|
|
44
|
+
raise ValueError("Downloaded file has no PDF header - likely an error page, not a PDF")
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def _arxiv_user_agent() -> str:
|
|
48
|
+
"""Descriptive User-Agent for arXiv API calls.
|
|
49
|
+
|
|
50
|
+
arXiv rate-limits the default ``Python-urllib/x.y`` agent far more
|
|
51
|
+
aggressively than a named client; sending a descriptive UA (with an
|
|
52
|
+
optional contact address) lands requests in arXiv's more lenient pool.
|
|
53
|
+
The contact is read from ``ARIS_VERIFY_EMAIL`` — the same env var
|
|
54
|
+
``tools/research_wiki.py`` and ``tools/verify_papers.py`` already use —
|
|
55
|
+
so no address is hard-coded. Falls back to a contactless UA when unset.
|
|
56
|
+
"""
|
|
57
|
+
contact = os.environ.get("ARIS_VERIFY_EMAIL", "").strip()
|
|
58
|
+
base = ("arxiv-skill/1.0 "
|
|
59
|
+
"(+https://github.com/wanshuiyin/Auto-claude-code-research-in-sleep)")
|
|
60
|
+
return f"{base} (mailto:{contact})" if contact else base
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
_NEW_STYLE_ID_RE = re.compile(r"^\d{4}\.\d{4,5}(v\d+)?$")
|
|
64
|
+
_OLD_STYLE_ID_RE = re.compile(r"^[A-Za-z.-]+/\d{7}(v\d+)?$")
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def _normalize_id(arxiv_id: str) -> str:
|
|
68
|
+
"""Strip URL/version noise and return a clean arXiv ID."""
|
|
69
|
+
value = arxiv_id.strip()
|
|
70
|
+
if "/abs/" in value:
|
|
71
|
+
value = value.split("/abs/", 1)[1]
|
|
72
|
+
if value.startswith("id:"):
|
|
73
|
+
value = value[3:]
|
|
74
|
+
if "v" in value.split(".")[-1]:
|
|
75
|
+
value = value.rsplit("v", 1)[0]
|
|
76
|
+
return value
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def _looks_like_arxiv_id(value: str) -> bool:
|
|
80
|
+
"""Return True when the input resembles a modern or legacy arXiv ID."""
|
|
81
|
+
value = value.strip()
|
|
82
|
+
return bool(_NEW_STYLE_ID_RE.match(value) or _OLD_STYLE_ID_RE.match(value))
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def _api_url(query: str, max_results: int, start: int) -> str:
|
|
86
|
+
"""Build the arXiv API URL for a search query or specific ID lookup."""
|
|
87
|
+
query = query.strip()
|
|
88
|
+
if query.startswith("id:"):
|
|
89
|
+
params = {"id_list": _normalize_id(query)}
|
|
90
|
+
elif _looks_like_arxiv_id(query):
|
|
91
|
+
params = {"id_list": _normalize_id(query)}
|
|
92
|
+
else:
|
|
93
|
+
params = {
|
|
94
|
+
"search_query": query,
|
|
95
|
+
"start": start,
|
|
96
|
+
"max_results": max_results,
|
|
97
|
+
"sortBy": "relevance",
|
|
98
|
+
"sortOrder": "descending",
|
|
99
|
+
}
|
|
100
|
+
return f"{_API_BASE}?{urllib.parse.urlencode(params)}"
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
def _fetch_atom(url: str) -> ET.Element:
|
|
104
|
+
"""Fetch an arXiv Atom feed and return the parsed XML root.
|
|
105
|
+
|
|
106
|
+
Sends a descriptive User-Agent (landing requests in arXiv's lenient pool)
|
|
107
|
+
and retries up to 3 times on HTTP 429, transient network errors, and the
|
|
108
|
+
plain-text ``Rate exceeded.`` body the API sometimes returns with 200 OK.
|
|
109
|
+
Raises RuntimeError when all retries are exhausted.
|
|
110
|
+
"""
|
|
111
|
+
req = urllib.request.Request(url, headers={"User-Agent": _arxiv_user_agent()})
|
|
112
|
+
for attempt in (1, 2, 3):
|
|
113
|
+
try:
|
|
114
|
+
with urllib.request.urlopen(req, timeout=30) as resp:
|
|
115
|
+
body = resp.read()
|
|
116
|
+
except urllib.error.HTTPError as e:
|
|
117
|
+
if e.code == 429 and attempt < 3:
|
|
118
|
+
time.sleep(5 * attempt)
|
|
119
|
+
continue
|
|
120
|
+
raise RuntimeError(f"arXiv API fetch failed: {e}")
|
|
121
|
+
except (urllib.error.URLError, TimeoutError, OSError) as e:
|
|
122
|
+
if attempt < 3:
|
|
123
|
+
time.sleep(2 * attempt)
|
|
124
|
+
continue
|
|
125
|
+
raise RuntimeError(f"arXiv API fetch failed: {e}")
|
|
126
|
+
if body.strip() == b"Rate exceeded.":
|
|
127
|
+
if attempt < 3:
|
|
128
|
+
time.sleep(5 * attempt)
|
|
129
|
+
continue
|
|
130
|
+
raise RuntimeError("arXiv API rate-limited after 3 attempts")
|
|
131
|
+
return ET.fromstring(body)
|
|
132
|
+
# unreachable; loop either returns or raises
|
|
133
|
+
raise RuntimeError("arXiv API fetch failed: exhausted retries")
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def _parse_entry(entry: ET.Element) -> dict:
|
|
137
|
+
"""Extract structured fields from a single Atom <entry> element."""
|
|
138
|
+
raw_id = entry.findtext(f"{{{_ATOM_NS}}}id", "")
|
|
139
|
+
arxiv_id = _normalize_id(raw_id)
|
|
140
|
+
title = (entry.findtext(f"{{{_ATOM_NS}}}title", "") or "").strip().replace("\n", " ")
|
|
141
|
+
abstract = (entry.findtext(f"{{{_ATOM_NS}}}summary", "") or "").strip().replace("\n", " ")
|
|
142
|
+
published = (entry.findtext(f"{{{_ATOM_NS}}}published", "") or "")[:10]
|
|
143
|
+
updated = (entry.findtext(f"{{{_ATOM_NS}}}updated", "") or "")[:10]
|
|
144
|
+
authors = [
|
|
145
|
+
author.findtext(f"{{{_ATOM_NS}}}name", "")
|
|
146
|
+
for author in entry.findall(f"{{{_ATOM_NS}}}author")
|
|
147
|
+
]
|
|
148
|
+
categories = [
|
|
149
|
+
category.get("term", "")
|
|
150
|
+
for category in entry.findall(f"{{{_ATOM_NS}}}category")
|
|
151
|
+
if category.get("term")
|
|
152
|
+
]
|
|
153
|
+
return {
|
|
154
|
+
"id": arxiv_id,
|
|
155
|
+
"title": title,
|
|
156
|
+
"authors": authors,
|
|
157
|
+
"abstract": abstract,
|
|
158
|
+
"published": published,
|
|
159
|
+
"updated": updated,
|
|
160
|
+
"categories": categories,
|
|
161
|
+
"pdf_url": f"https://arxiv.org/pdf/{arxiv_id}.pdf",
|
|
162
|
+
"abs_url": f"https://arxiv.org/abs/{arxiv_id}",
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
def search(query: str, max_results: int = 10, start: int = 0) -> list[dict]:
|
|
167
|
+
"""Search arXiv and return a list of paper dictionaries."""
|
|
168
|
+
url = _api_url(query, max_results=max_results, start=start)
|
|
169
|
+
root = _fetch_atom(url)
|
|
170
|
+
return [_parse_entry(entry) for entry in root.findall(f"{{{_ATOM_NS}}}entry")]
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
def download(arxiv_id: str, output_dir: str = "papers") -> dict:
|
|
174
|
+
"""Download a paper PDF and return metadata about the saved file."""
|
|
175
|
+
clean_id = _normalize_id(arxiv_id)
|
|
176
|
+
safe_id = clean_id.replace("/", "_")
|
|
177
|
+
|
|
178
|
+
dest_dir = Path(output_dir)
|
|
179
|
+
dest_dir.mkdir(parents=True, exist_ok=True)
|
|
180
|
+
dest = dest_dir / f"{safe_id}.pdf"
|
|
181
|
+
|
|
182
|
+
if dest.exists():
|
|
183
|
+
size_bytes = dest.stat().st_size
|
|
184
|
+
with dest.open("rb") as cached_file:
|
|
185
|
+
first_bytes = cached_file.read(1024)
|
|
186
|
+
try:
|
|
187
|
+
_validate_pdf(size_bytes, first_bytes)
|
|
188
|
+
except ValueError:
|
|
189
|
+
# Poisoned cache entry (e.g. an HTML error page saved as .pdf by an
|
|
190
|
+
# older version): drop it so the next call re-downloads instead of
|
|
191
|
+
# failing forever.
|
|
192
|
+
dest.unlink()
|
|
193
|
+
raise
|
|
194
|
+
return {
|
|
195
|
+
"id": clean_id,
|
|
196
|
+
"path": str(dest),
|
|
197
|
+
"size_kb": size_bytes // 1024,
|
|
198
|
+
"skipped": True,
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
pdf_url = f"https://arxiv.org/pdf/{clean_id}.pdf"
|
|
202
|
+
req = urllib.request.Request(pdf_url, headers={"User-Agent": _arxiv_user_agent()})
|
|
203
|
+
|
|
204
|
+
data = b""
|
|
205
|
+
for attempt in (1, 2, 3):
|
|
206
|
+
try:
|
|
207
|
+
with urllib.request.urlopen(req, timeout=60) as resp:
|
|
208
|
+
data = resp.read()
|
|
209
|
+
break
|
|
210
|
+
except urllib.error.HTTPError as exc:
|
|
211
|
+
if exc.code == 429 and attempt < 3:
|
|
212
|
+
time.sleep(5 * attempt)
|
|
213
|
+
continue
|
|
214
|
+
raise
|
|
215
|
+
except (urllib.error.URLError, TimeoutError, OSError) as exc:
|
|
216
|
+
if attempt < 3:
|
|
217
|
+
time.sleep(2 * attempt)
|
|
218
|
+
continue
|
|
219
|
+
raise RuntimeError(f"Failed to download {pdf_url}: {exc}")
|
|
220
|
+
else:
|
|
221
|
+
raise RuntimeError(f"Failed to download {pdf_url} after 3 attempts")
|
|
222
|
+
|
|
223
|
+
_validate_pdf(len(data), data)
|
|
224
|
+
|
|
225
|
+
dest.write_bytes(data)
|
|
226
|
+
return {
|
|
227
|
+
"id": clean_id,
|
|
228
|
+
"path": str(dest),
|
|
229
|
+
"size_kb": len(data) // 1024,
|
|
230
|
+
"skipped": False,
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
def _build_parser() -> argparse.ArgumentParser:
|
|
235
|
+
parser = argparse.ArgumentParser(
|
|
236
|
+
description="Search and download arXiv papers.",
|
|
237
|
+
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
238
|
+
)
|
|
239
|
+
subparsers = parser.add_subparsers(dest="command", required=True)
|
|
240
|
+
|
|
241
|
+
def _add_search_args(p: argparse.ArgumentParser) -> None:
|
|
242
|
+
p.add_argument(
|
|
243
|
+
"query",
|
|
244
|
+
help="Search query or arXiv ID (bare ID or id:ARXIV_ID).",
|
|
245
|
+
)
|
|
246
|
+
p.add_argument(
|
|
247
|
+
"--max",
|
|
248
|
+
type=int,
|
|
249
|
+
default=10,
|
|
250
|
+
metavar="N",
|
|
251
|
+
help="Maximum number of results (default: 10).",
|
|
252
|
+
)
|
|
253
|
+
p.add_argument(
|
|
254
|
+
"--start",
|
|
255
|
+
type=int,
|
|
256
|
+
default=0,
|
|
257
|
+
help="Start offset for pagination (default: 0).",
|
|
258
|
+
)
|
|
259
|
+
|
|
260
|
+
search_parser = subparsers.add_parser("search", help="Search arXiv papers")
|
|
261
|
+
_add_search_args(search_parser)
|
|
262
|
+
|
|
263
|
+
# Defensive aliases — models frequently hallucinate `get` / `fetch`
|
|
264
|
+
# instead of `search`. Accept them silently so the invocation succeeds
|
|
265
|
+
# regardless of model quality.
|
|
266
|
+
for alias in ("get", "fetch"):
|
|
267
|
+
_add_search_args(subparsers.add_parser(alias, help="Alias for search"))
|
|
268
|
+
|
|
269
|
+
download_parser = subparsers.add_parser("download", help="Download a paper PDF by arXiv ID")
|
|
270
|
+
download_parser.add_argument(
|
|
271
|
+
"id",
|
|
272
|
+
help="arXiv paper ID, e.g. 2301.07041 or cs/0601001",
|
|
273
|
+
)
|
|
274
|
+
download_parser.add_argument(
|
|
275
|
+
"--dir",
|
|
276
|
+
default="papers",
|
|
277
|
+
metavar="DIR",
|
|
278
|
+
help="Output directory (default: papers).",
|
|
279
|
+
)
|
|
280
|
+
download_parser.add_argument(
|
|
281
|
+
"--delay",
|
|
282
|
+
type=float,
|
|
283
|
+
default=1.0,
|
|
284
|
+
help="Seconds to sleep after download (default: 1.0).",
|
|
285
|
+
)
|
|
286
|
+
|
|
287
|
+
return parser
|
|
288
|
+
|
|
289
|
+
|
|
290
|
+
def main(argv: list[str] | None = None) -> int:
|
|
291
|
+
args = _build_parser().parse_args(argv)
|
|
292
|
+
|
|
293
|
+
if args.command in ("search", "get", "fetch"):
|
|
294
|
+
results = search(args.query, max_results=args.max, start=args.start)
|
|
295
|
+
print(json.dumps(results, ensure_ascii=False, indent=2))
|
|
296
|
+
return 0
|
|
297
|
+
|
|
298
|
+
if args.command == "download":
|
|
299
|
+
result = download(args.id, output_dir=args.dir)
|
|
300
|
+
if result.get("skipped"):
|
|
301
|
+
print(json.dumps({**result, "message": "already exists, skipped"}, ensure_ascii=False))
|
|
302
|
+
else:
|
|
303
|
+
time.sleep(args.delay)
|
|
304
|
+
print(json.dumps(result, ensure_ascii=False))
|
|
305
|
+
return 0
|
|
306
|
+
|
|
307
|
+
raise ValueError(f"Unsupported command: {args.command}")
|
|
308
|
+
|
|
309
|
+
|
|
310
|
+
if __name__ == "__main__":
|
|
311
|
+
sys.exit(main())
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Anti-self-poisoning capture filter for ARIS memory (research-wiki / meta-optimize).
|
|
3
|
+
|
|
4
|
+
When ARIS captures durable knowledge — a research-wiki idea/claim, a meta-optimize
|
|
5
|
+
SKILL.md proposal — it must NOT store *operational noise* that hardens into a
|
|
6
|
+
self-cited falsehood. Hermes learned this the hard way: its self-improvement loop
|
|
7
|
+
poisoned itself with negative tool-capability claims that "harden into refusals
|
|
8
|
+
the agent cites against itself for months after the actual problem was fixed"
|
|
9
|
+
(background_review.py). ARIS's research-wiki "failed ideas → anti-repeat memory"
|
|
10
|
+
is the GOOD inverse; this filter is the missing blocklist for the BAD kind.
|
|
11
|
+
|
|
12
|
+
This is a CHEAP, DETERMINISTIC pre-filter for the UNAMBIGUOUS classes — error
|
|
13
|
+
output and explicitly-broken-tool phrasing. The judgment-y classes (a single-run
|
|
14
|
+
narrative that isn't a class-level rule; an intentional one-off) are prose
|
|
15
|
+
guidance in shared-references/capture-antipatterns.md, not regex.
|
|
16
|
+
|
|
17
|
+
Asymmetry (acceptance-gate.md): this filter may REJECT a capture same-model (it
|
|
18
|
+
is a mechanical safety screen, low risk) — but anything that PASSES and would
|
|
19
|
+
become a load-bearing skill/claim still goes to the cross-model jury. Same-model
|
|
20
|
+
is fine to reject; must-be-cross-model to accept.
|
|
21
|
+
|
|
22
|
+
Deliberately conservative — anchored so it does NOT flag legitimate RESEARCH
|
|
23
|
+
findings ("the model can't generalize to OOD", "the method fails on long
|
|
24
|
+
sequences"). It targets ARIS's OWN TOOLING being declared broken, and raw error
|
|
25
|
+
output. False negatives are fine (the jury still judges); a false reject just
|
|
26
|
+
sends a real insight to manual review.
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
from __future__ import annotations
|
|
30
|
+
|
|
31
|
+
import argparse
|
|
32
|
+
import re
|
|
33
|
+
import sys
|
|
34
|
+
from typing import List
|
|
35
|
+
|
|
36
|
+
# Raw error / environment-failure output — unambiguous; these are transient
|
|
37
|
+
# operational state, never a durable research fact.
|
|
38
|
+
_ENV_FAILURE = [
|
|
39
|
+
(re.compile(r"\bcommand not found\b", re.I), "env_failure"),
|
|
40
|
+
(re.compile(r"\bNo such file or directory\b", re.I), "env_failure"),
|
|
41
|
+
(re.compile(r"\bNo module named\b", re.I), "env_failure"),
|
|
42
|
+
(re.compile(r"\bModuleNotFoundError\b"), "env_failure"),
|
|
43
|
+
(re.compile(r"\bImportError\b"), "env_failure"),
|
|
44
|
+
(re.compile(r"\bPermission denied\b", re.I), "env_failure"),
|
|
45
|
+
(re.compile(r"\bconnection (refused|timed out|reset)\b", re.I), "transient_error"),
|
|
46
|
+
(re.compile(r"\b(rate limit|429|quota exceeded|503|502|temporarily unavailable)\b", re.I), "transient_error"),
|
|
47
|
+
(re.compile(r"\bCUDA out of memory\b|\bOOM\b", re.I), "transient_error"),
|
|
48
|
+
]
|
|
49
|
+
|
|
50
|
+
# Negative tool-capability claims about ARIS's OWN infrastructure. Anchored on
|
|
51
|
+
# ARIS-INFRA-QUALIFIED nouns ONLY — bare model names (codex/gemini/oracle/gpt-5)
|
|
52
|
+
# and generic infra words (the api/server/gpu/tool/cli/reviewer) are deliberately
|
|
53
|
+
# NOT here, because they appear in legitimate research findings ("Gemini cannot
|
|
54
|
+
# solve task T", "the GPU cannot fit the batch", "the API does not expose
|
|
55
|
+
# gradients"). Flagging those would suppress real research notes — the failure
|
|
56
|
+
# this filter must avoid. So we require a qualifier (mcp/cli/reviewer/-pro/-review)
|
|
57
|
+
# or an unambiguous ARIS tool name.
|
|
58
|
+
_TOOL = (r"(?:"
|
|
59
|
+
r"codex[ -](?:mcp|cli|reviewer)|"
|
|
60
|
+
r"oracle[ -](?:mcp|pro|reviewer)|"
|
|
61
|
+
r"gemini[ -](?:mcp|cli|review|reviewer)|"
|
|
62
|
+
r"manual[ -]review|"
|
|
63
|
+
# "claude code" dropped — too broad: research notes may benchmark Claude
|
|
64
|
+
# Code as a coding agent ("Claude Code cannot solve this SWE-bench task"),
|
|
65
|
+
# which is a finding, not an ARIS-infra complaint.
|
|
66
|
+
r"mcp server|reviewer mcp|the reviewer backend|"
|
|
67
|
+
r"wandb"
|
|
68
|
+
r")")
|
|
69
|
+
_NEG_CLAIM = [
|
|
70
|
+
(re.compile(_TOOL + r"\s+(?:can'?t|cannot|is unable to|does(?:n'?t| not))\s+", re.I), "negative_tool_claim"),
|
|
71
|
+
(re.compile(_TOOL + r"\s+(?:is|are|was|were)\s+(?:broken|down|useless|unusable|buggy)\b", re.I), "negative_tool_claim"),
|
|
72
|
+
(re.compile(_TOOL + r"\s+always\s+(?:fails|crashes|hangs|errors)\b", re.I), "negative_tool_claim"),
|
|
73
|
+
(re.compile(r"\b(?:don'?t|do not|never)\s+use\s+(?:the\s+|a\s+)?" + _TOOL, re.I), "negative_tool_claim"),
|
|
74
|
+
]
|
|
75
|
+
|
|
76
|
+
_ALL = _ENV_FAILURE + _NEG_CLAIM
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def screen(text: str) -> List[str]:
|
|
80
|
+
"""Return de-duplicated anti-pattern reason codes found in `text` (empty = clean).
|
|
81
|
+
|
|
82
|
+
reason ∈ {env_failure, transient_error, negative_tool_claim}.
|
|
83
|
+
"""
|
|
84
|
+
if not text:
|
|
85
|
+
return []
|
|
86
|
+
found: List[str] = []
|
|
87
|
+
for rx, reason in _ALL:
|
|
88
|
+
if reason not in found and rx.search(text):
|
|
89
|
+
found.append(reason)
|
|
90
|
+
return found
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def reason_detail(reason: str) -> str:
|
|
94
|
+
return {
|
|
95
|
+
"env_failure": "looks like an environment-specific failure (missing binary/module/path "
|
|
96
|
+
"/permission) — transient state, not a durable fact. Store HOW TO FIX or "
|
|
97
|
+
"the missing config, never 'X failed'.",
|
|
98
|
+
"transient_error": "looks like a transient error (rate limit / OOM / network) that "
|
|
99
|
+
"self-resolves — do not capture it as a durable rule.",
|
|
100
|
+
"negative_tool_claim": "looks like a negative capability claim about ARIS's own tooling "
|
|
101
|
+
"('X can't / is broken'). These harden into self-cited refusals long "
|
|
102
|
+
"after the real problem is fixed. Store the fix / the workaround, not "
|
|
103
|
+
"'X can't do Y'.",
|
|
104
|
+
}.get(reason, reason)
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
__all__ = ["screen", "reason_detail"]
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def main() -> int:
|
|
111
|
+
ap = argparse.ArgumentParser(description="ARIS anti-self-poisoning capture filter.")
|
|
112
|
+
ap.add_argument("path", help="file to screen, or - for stdin")
|
|
113
|
+
a = ap.parse_args()
|
|
114
|
+
text = sys.stdin.read() if a.path == "-" else open(a.path, encoding="utf-8").read()
|
|
115
|
+
reasons = screen(text)
|
|
116
|
+
if reasons:
|
|
117
|
+
print(f"DO-NOT-CAPTURE: {', '.join(reasons)}", file=sys.stderr)
|
|
118
|
+
for r in reasons:
|
|
119
|
+
print(f" - {r}: {reason_detail(r)}", file=sys.stderr)
|
|
120
|
+
return 1
|
|
121
|
+
print("ok to capture (mechanical screen clean)")
|
|
122
|
+
return 0
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
if __name__ == "__main__":
|
|
126
|
+
raise SystemExit(main())
|