paperlint 2.0.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/.github/dependabot.yml +72 -0
- package/.github/workflows/ci.yml +297 -0
- package/.github/workflows/dependabot-automerge.yml +70 -0
- package/.github/workflows/pr-title.yml +59 -0
- package/.github/workflows/release.yml +54 -0
- package/CLAUDE.md +598 -0
- package/CONTRIBUTING.md +159 -0
- package/LICENSE +21 -0
- package/README.md +240 -0
- package/action.harness.mjs +287 -0
- package/action.mutations.mjs +162 -0
- package/action.yml +138 -0
- package/bin/rpp.mjs +43 -0
- package/dist/action-ref.d.ts +12 -0
- package/dist/action-ref.d.ts.map +1 -0
- package/dist/action-ref.js +16 -0
- package/dist/action-ref.js.map +1 -0
- package/dist/adapters/banal/failure.d.ts +73 -0
- package/dist/adapters/banal/failure.d.ts.map +1 -0
- package/dist/adapters/banal/failure.js +58 -0
- package/dist/adapters/banal/failure.js.map +1 -0
- package/dist/adapters/banal/index.d.ts +17 -0
- package/dist/adapters/banal/index.d.ts.map +1 -0
- package/dist/adapters/banal/index.js +56 -0
- package/dist/adapters/banal/index.js.map +1 -0
- package/dist/adapters/banal/install.d.ts +26 -0
- package/dist/adapters/banal/install.d.ts.map +1 -0
- package/dist/adapters/banal/install.js +15 -0
- package/dist/adapters/banal/install.js.map +1 -0
- package/dist/adapters/banal/invocation.d.ts +48 -0
- package/dist/adapters/banal/invocation.d.ts.map +1 -0
- package/dist/adapters/banal/invocation.js +43 -0
- package/dist/adapters/banal/invocation.js.map +1 -0
- package/dist/adapters/banal/locate.d.ts +50 -0
- package/dist/adapters/banal/locate.d.ts.map +1 -0
- package/dist/adapters/banal/locate.js +34 -0
- package/dist/adapters/banal/locate.js.map +1 -0
- package/dist/adapters/banal/output.d.ts +27 -0
- package/dist/adapters/banal/output.d.ts.map +1 -0
- package/dist/adapters/banal/output.js +112 -0
- package/dist/adapters/banal/output.js.map +1 -0
- package/dist/adapters/banal/pin.d.ts +19 -0
- package/dist/adapters/banal/pin.d.ts.map +1 -0
- package/dist/adapters/banal/pin.js +15 -0
- package/dist/adapters/banal/pin.js.map +1 -0
- package/dist/adapters/banal/probe.d.ts +12 -0
- package/dist/adapters/banal/probe.d.ts.map +1 -0
- package/dist/adapters/banal/probe.js +27 -0
- package/dist/adapters/banal/probe.js.map +1 -0
- package/dist/adapters/banal/run.d.ts +89 -0
- package/dist/adapters/banal/run.d.ts.map +1 -0
- package/dist/adapters/banal/run.js +104 -0
- package/dist/adapters/banal/run.js.map +1 -0
- package/dist/adapters/banal/settings.d.ts +18 -0
- package/dist/adapters/banal/settings.d.ts.map +1 -0
- package/dist/adapters/banal/settings.js +29 -0
- package/dist/adapters/banal/settings.js.map +1 -0
- package/dist/adapters/banal/xml.d.ts +48 -0
- package/dist/adapters/banal/xml.d.ts.map +1 -0
- package/dist/adapters/banal/xml.js +67 -0
- package/dist/adapters/banal/xml.js.map +1 -0
- package/dist/adapters/curl/download.io.d.ts +14 -0
- package/dist/adapters/curl/download.io.d.ts.map +1 -0
- package/dist/adapters/curl/download.io.js +69 -0
- package/dist/adapters/curl/download.io.js.map +1 -0
- package/dist/adapters/curl/index.d.ts +6 -0
- package/dist/adapters/curl/index.d.ts.map +1 -0
- package/dist/adapters/curl/index.js +6 -0
- package/dist/adapters/curl/index.js.map +1 -0
- package/dist/adapters/memory/index.d.ts +43 -0
- package/dist/adapters/memory/index.d.ts.map +1 -0
- package/dist/adapters/memory/index.js +79 -0
- package/dist/adapters/memory/index.js.map +1 -0
- package/dist/adapters/node/files.io.d.ts +3 -0
- package/dist/adapters/node/files.io.d.ts.map +1 -0
- package/dist/adapters/node/files.io.js +31 -0
- package/dist/adapters/node/files.io.js.map +1 -0
- package/dist/adapters/node/host.io.d.ts +3 -0
- package/dist/adapters/node/host.io.d.ts.map +1 -0
- package/dist/adapters/node/host.io.js +14 -0
- package/dist/adapters/node/host.io.js.map +1 -0
- package/dist/adapters/node/index.d.ts +25 -0
- package/dist/adapters/node/index.d.ts.map +1 -0
- package/dist/adapters/node/index.js +14 -0
- package/dist/adapters/node/index.js.map +1 -0
- package/dist/adapters/node/process.io.d.ts +14 -0
- package/dist/adapters/node/process.io.d.ts.map +1 -0
- package/dist/adapters/node/process.io.js +41 -0
- package/dist/adapters/node/process.io.js.map +1 -0
- package/dist/adapters/node/workspace.io.d.ts +4 -0
- package/dist/adapters/node/workspace.io.d.ts.map +1 -0
- package/dist/adapters/node/workspace.io.js +33 -0
- package/dist/adapters/node/workspace.io.js.map +1 -0
- package/dist/adapters/pdfjs/fill.d.ts +42 -0
- package/dist/adapters/pdfjs/fill.d.ts.map +1 -0
- package/dist/adapters/pdfjs/fill.js +91 -0
- package/dist/adapters/pdfjs/fill.js.map +1 -0
- package/dist/build-engine.d.ts +48 -0
- package/dist/build-engine.d.ts.map +1 -0
- package/dist/build-engine.js +148 -0
- package/dist/build-engine.js.map +1 -0
- package/dist/build.d.ts +163 -0
- package/dist/build.d.ts.map +1 -0
- package/dist/build.js +575 -0
- package/dist/build.js.map +1 -0
- package/dist/cli.d.ts +151 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +951 -0
- package/dist/cli.js.map +1 -0
- package/dist/doctor.d.ts +42 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +280 -0
- package/dist/doctor.js.map +1 -0
- package/dist/domain/geometry.d.ts +71 -0
- package/dist/domain/geometry.d.ts.map +1 -0
- package/dist/domain/geometry.js +35 -0
- package/dist/domain/geometry.js.map +1 -0
- package/dist/domain/host.d.ts +16 -0
- package/dist/domain/host.d.ts.map +1 -0
- package/dist/domain/host.js +8 -0
- package/dist/domain/host.js.map +1 -0
- package/dist/domain/page-layout.d.ts +34 -0
- package/dist/domain/page-layout.d.ts.map +1 -0
- package/dist/domain/page-layout.js +8 -0
- package/dist/domain/page-layout.js.map +1 -0
- package/dist/domain/paths.d.ts +5 -0
- package/dist/domain/paths.d.ts.map +1 -0
- package/dist/domain/paths.js +2 -0
- package/dist/domain/paths.js.map +1 -0
- package/dist/domain/result.d.ts +23 -0
- package/dist/domain/result.d.ts.map +1 -0
- package/dist/domain/result.js +10 -0
- package/dist/domain/result.js.map +1 -0
- package/dist/domain/sha256.d.ts +7 -0
- package/dist/domain/sha256.d.ts.map +1 -0
- package/dist/domain/sha256.js +14 -0
- package/dist/domain/sha256.js.map +1 -0
- package/dist/domain/text.d.ts +6 -0
- package/dist/domain/text.d.ts.map +1 -0
- package/dist/domain/text.js +7 -0
- package/dist/domain/text.js.map +1 -0
- package/dist/engine.d.ts +93 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +119 -0
- package/dist/engine.js.map +1 -0
- package/dist/exit-code.d.ts +22 -0
- package/dist/exit-code.d.ts.map +1 -0
- package/dist/exit-code.js +10 -0
- package/dist/exit-code.js.map +1 -0
- package/dist/facts-file.d.ts +96 -0
- package/dist/facts-file.d.ts.map +1 -0
- package/dist/facts-file.js +134 -0
- package/dist/facts-file.js.map +1 -0
- package/dist/hooks-settings.d.ts +141 -0
- package/dist/hooks-settings.d.ts.map +1 -0
- package/dist/hooks-settings.js +306 -0
- package/dist/hooks-settings.js.map +1 -0
- package/dist/init.d.ts +201 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.js +579 -0
- package/dist/init.js.map +1 -0
- package/dist/latex-log.d.ts +80 -0
- package/dist/latex-log.d.ts.map +1 -0
- package/dist/latex-log.js +187 -0
- package/dist/latex-log.js.map +1 -0
- package/dist/latex-loop.d.ts +129 -0
- package/dist/latex-loop.d.ts.map +1 -0
- package/dist/latex-loop.js +113 -0
- package/dist/latex-loop.js.map +1 -0
- package/dist/link-skills.d.ts +51 -0
- package/dist/link-skills.d.ts.map +1 -0
- package/dist/link-skills.js +199 -0
- package/dist/link-skills.js.map +1 -0
- package/dist/new-paper.d.ts +48 -0
- package/dist/new-paper.d.ts.map +1 -0
- package/dist/new-paper.js +110 -0
- package/dist/new-paper.js.map +1 -0
- package/dist/pdf-facts.d.ts +44 -0
- package/dist/pdf-facts.d.ts.map +1 -0
- package/dist/pdf-facts.js +239 -0
- package/dist/pdf-facts.js.map +1 -0
- package/dist/pdf-geometry.d.ts +170 -0
- package/dist/pdf-geometry.d.ts.map +1 -0
- package/dist/pdf-geometry.js +158 -0
- package/dist/pdf-geometry.js.map +1 -0
- package/dist/ports/download.d.ts +9 -0
- package/dist/ports/download.d.ts.map +1 -0
- package/dist/ports/download.js +2 -0
- package/dist/ports/download.js.map +1 -0
- package/dist/ports/files.d.ts +11 -0
- package/dist/ports/files.d.ts.map +1 -0
- package/dist/ports/files.js +2 -0
- package/dist/ports/files.js.map +1 -0
- package/dist/ports/measure-geometry.d.ts +8 -0
- package/dist/ports/measure-geometry.d.ts.map +1 -0
- package/dist/ports/measure-geometry.js +2 -0
- package/dist/ports/measure-geometry.js.map +1 -0
- package/dist/ports/process.d.ts +45 -0
- package/dist/ports/process.d.ts.map +1 -0
- package/dist/ports/process.js +2 -0
- package/dist/ports/process.js.map +1 -0
- package/dist/ports/tool-installer.d.ts +29 -0
- package/dist/ports/tool-installer.d.ts.map +1 -0
- package/dist/ports/tool-installer.js +2 -0
- package/dist/ports/tool-installer.js.map +1 -0
- package/dist/ports/workspace.d.ts +18 -0
- package/dist/ports/workspace.d.ts.map +1 -0
- package/dist/ports/workspace.js +2 -0
- package/dist/ports/workspace.js.map +1 -0
- package/dist/rules-config.d.ts +34 -0
- package/dist/rules-config.d.ts.map +1 -0
- package/dist/rules-config.js +132 -0
- package/dist/rules-config.js.map +1 -0
- package/dist/structure.d.ts +34 -0
- package/dist/structure.d.ts.map +1 -0
- package/dist/structure.js +149 -0
- package/dist/structure.js.map +1 -0
- package/dist/tex-requirements.d.ts +43 -0
- package/dist/tex-requirements.d.ts.map +1 -0
- package/dist/tex-requirements.js +127 -0
- package/dist/tex-requirements.js.map +1 -0
- package/dist/toolchain.d.ts +159 -0
- package/dist/toolchain.d.ts.map +1 -0
- package/dist/toolchain.js +542 -0
- package/dist/toolchain.js.map +1 -0
- package/dist/types.d.ts +110 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/docs/configuration.md +235 -0
- package/docs/e2e.md +152 -0
- package/docs/incidents.md +59 -0
- package/docs/install.md +170 -0
- package/docs/optional-rules.md +107 -0
- package/docs/package-shape-options.md +262 -0
- package/docs/prior-art/README.md +76 -0
- package/docs/prior-art/blocking-vs-advisory.md +83 -0
- package/docs/prior-art/content-delivery.md +124 -0
- package/docs/prior-art/multi-mode-tools.md +106 -0
- package/docs/prior-art/nondeterministic-checks.md +99 -0
- package/docs/prior-art/package-location.md +422 -0
- package/docs/prior-art/paper-folder-scaffolding.md +538 -0
- package/docs/prior-art/readme-structure.md +69 -0
- package/docs/prior-art/repro/README.md +92 -0
- package/docs/prior-art/repro/claim1-allowedtools.mjs +66 -0
- package/docs/prior-art/repro/claim1-at2.mjs +40 -0
- package/docs/prior-art/repro/claim1-crosschannel.mjs +54 -0
- package/docs/prior-art/repro/claim1-frontmatter.mjs +76 -0
- package/docs/prior-art/repro/claim1-hook-payload-reporter.mjs +10 -0
- package/docs/prior-art/repro/claim1-plugin-frontmatter.mjs +27 -0
- package/docs/prior-art/repro/claim1-plugin-skill.mjs +52 -0
- package/docs/prior-art/repro/claim1-project-skill.mjs +81 -0
- package/docs/prior-art/repro/claim2-marketplace-flat-asclaimed.json +1 -0
- package/docs/prior-art/repro/claim2-marketplace-negative-control.json +1 -0
- package/docs/prior-art/repro/claim2-marketplace-nested-exact.json +9 -0
- package/docs/prior-art/repro/claim2-marketplace-nested-noversion.json +9 -0
- package/docs/prior-art/repro/claim2-marketplace-nested-range.json +1 -0
- package/docs/prior-art/repro/claim3-imports.mjs +50 -0
- package/docs/prior-art/repro/claim4-find-package-json.mjs +8 -0
- package/docs/prior-art/repro/claim4-package-dir.mjs +39 -0
- package/docs/prior-art/repro/claim4-parent-arg.mjs +17 -0
- package/docs/prior-art/repro/claim4-resolve-apis.mjs +21 -0
- package/docs/prior-art/repro/claim4-setup-consumers.mjs +45 -0
- package/docs/prior-art/repro/claim4-yarn-pnp.mjs +70 -0
- package/docs/prior-art/repro/claim5-bin-launch.mjs +39 -0
- package/docs/prior-art/repro/claim5-exports-mutation.mjs +57 -0
- package/docs/prior-art/repro/claim5-resolved-location-and-bin.mjs +33 -0
- package/docs/prior-art/repro/claim6-candidate-ambiguity.mjs +17 -0
- package/docs/prior-art/repro/claim6-doc-path-candidates.mjs +27 -0
- package/docs/prior-art/test-tooling.md +131 -0
- package/docs/rules.md +58 -0
- package/docs/texlive-install-decision.md +230 -0
- package/docs/toolchain.md +152 -0
- package/eslint-rules/doc-fields.harness.mjs +336 -0
- package/eslint-rules/doc-fields.mjs +186 -0
- package/eslint-rules/doc-fields.mutations.mjs +96 -0
- package/eslint-rules/install-path-literals.harness.mjs +121 -0
- package/eslint-rules/install-path-literals.mjs +108 -0
- package/eslint-rules/install-path-literals.mutations.mjs +62 -0
- package/eslint-rules/latex-language.harness.mjs +599 -0
- package/eslint-rules/latex-language.mjs +591 -0
- package/eslint-rules/latex-language.mutations.mjs +196 -0
- package/eslint-rules/paper-research-question.harness.mjs +146 -0
- package/eslint-rules/paper-research-question.mjs +180 -0
- package/eslint-rules/paper-research-question.mutations.mjs +127 -0
- package/eslint-rules/paper-stages.harness.mjs +356 -0
- package/eslint-rules/paper-stages.mjs +455 -0
- package/eslint-rules/paper-stages.mutations.mjs +157 -0
- package/eslint-rules/paper-typography.harness.mjs +291 -0
- package/eslint-rules/paper-typography.mjs +313 -0
- package/eslint-rules/paper-typography.mutations.mjs +131 -0
- package/eslint-rules/papers.harness.mjs +259 -0
- package/eslint-rules/papers.mjs +166 -0
- package/eslint-rules/papers.mutations.mjs +186 -0
- package/eslint-rules/pdf-last-page-balance.harness.mjs +206 -0
- package/eslint-rules/pdf-last-page-balance.mjs +208 -0
- package/eslint-rules/review-findings-cause.harness.mjs +228 -0
- package/eslint-rules/review-findings-cause.mjs +135 -0
- package/eslint-rules/review-findings-cause.mutations.mjs +72 -0
- package/eslint-rules/temp-root-realpath.harness.mjs +176 -0
- package/eslint-rules/temp-root-realpath.mjs +129 -0
- package/eslint-rules/temp-root-realpath.mutations.mjs +99 -0
- package/eslint-rules/tex-build.harness.mjs +753 -0
- package/eslint-rules/tex-build.mjs +322 -0
- package/eslint-rules/tex-build.mutations.mjs +258 -0
- package/eslint.config.mjs +521 -0
- package/fixtures/build-e2e/acmart/PIPELINE-STATUS.md +3 -0
- package/fixtures/build-e2e/acmart/paper.tex +11 -0
- package/fixtures/build-e2e/acmart/venue.json +1 -0
- package/fixtures/build-e2e/broken/PIPELINE-STATUS.md +3 -0
- package/fixtures/build-e2e/broken/paper.tex +7 -0
- package/fixtures/build-e2e/cite/PIPELINE-STATUS.md +3 -0
- package/fixtures/build-e2e/cite/build.sh +5 -0
- package/fixtures/build-e2e/cite/paper.tex +10 -0
- package/fixtures/build-e2e/cite/refs.bib +9 -0
- package/fixtures/build-e2e/empty/PIPELINE-STATUS.md +3 -0
- package/fixtures/build-e2e/empty/paper.tex +6 -0
- package/fixtures/build-e2e/fallback/PIPELINE-STATUS.md +3 -0
- package/fixtures/build-e2e/fallback/paper.tex +11 -0
- package/fixtures/build-e2e/guards/PIPELINE-STATUS.md +3 -0
- package/fixtures/build-e2e/guards/paper.tex +10 -0
- package/fixtures/build-e2e/no-source/PIPELINE-STATUS.md +3 -0
- package/fixtures/build-e2e/unbalanced/PIPELINE-STATUS.md +3 -0
- package/fixtures/build-e2e/unbalanced/paper.tex +28 -0
- package/fixtures/build-e2e/unbalanced/refs.bib +269 -0
- package/fixtures/install-path-literals/clean.fixture.mjs +3 -0
- package/fixtures/install-path-literals/clean.md +15 -0
- package/fixtures/install-path-literals/defect.fixture.mjs +3 -0
- package/fixtures/install-path-literals/defect.md +14 -0
- package/fixtures/latex-language/clean.tex +50 -0
- package/fixtures/latex-language/defect.tex +52 -0
- package/fixtures/paper-research-question/comment-only/PIPELINE-STATUS.md +9 -0
- package/fixtures/paper-research-question/comment-only/paper.tex +7 -0
- package/fixtures/paper-research-question/declared-not-in-paper/PIPELINE-STATUS.md +10 -0
- package/fixtures/paper-research-question/declared-not-in-paper/paper.tex +6 -0
- package/fixtures/paper-research-question/draft/PIPELINE-STATUS.md +6 -0
- package/fixtures/paper-research-question/draft/paper.tex +2 -0
- package/fixtures/paper-research-question/markdown-no-rq/PIPELINE-STATUS.md +9 -0
- package/fixtures/paper-research-question/markdown-no-rq/paper.md +4 -0
- package/fixtures/paper-research-question/shipped-no-rq/PIPELINE-STATUS.md +12 -0
- package/fixtures/paper-research-question/shipped-no-rq/paper.tex +3 -0
- package/fixtures/paper-research-question/shipped-with-rq/PIPELINE-STATUS.md +10 -0
- package/fixtures/paper-research-question/shipped-with-rq/paper.tex +2 -0
- package/fixtures/paper-stages/authors-ran/PIPELINE-STATUS.md +16 -0
- package/fixtures/paper-stages/marker-in-prose/PIPELINE-STATUS.md +17 -0
- package/fixtures/paper-stages/nofile/PIPELINE-STATUS.md +8 -0
- package/fixtures/paper-stages/noheader/PIPELINE-STATUS.md +1 -0
- package/fixtures/paper-stages/noheader/versions/2026-07-22-submitted.pdf +0 -0
- package/fixtures/paper-stages/nothing/PIPELINE-STATUS.md +3 -0
- package/fixtures/paper-stages/ok/PIPELINE-STATUS.md +9 -0
- package/fixtures/paper-stages/ok/versions/2026-07-22-submitted.pdf +0 -0
- package/fixtures/paper-stages/stale/PIPELINE-STATUS.md +1 -0
- package/fixtures/paper-stages/stale/versions/2026-07-22-submitted.STALE-WRONG-FILE.pdf +0 -0
- package/fixtures/paper-stages/twice/PIPELINE-STATUS.md +14 -0
- package/fixtures/paper-stages/twice/versions/2026-08-06-submitted.pdf +0 -0
- package/fixtures/paper-stages/twice/versions/2026-10-24-submitted.pdf +0 -0
- package/fixtures/paper-stages/undeclared/PIPELINE-STATUS.md +8 -0
- package/fixtures/paper-stages/undeclared/versions/2026-07-22-submitted.pdf +0 -0
- package/fixtures/paper-stages/undeclared/versions/2026-08-29-camera-ready.pdf +0 -0
- package/fixtures/paper-stages/wrongsize/PIPELINE-STATUS.md +8 -0
- package/fixtures/paper-stages/wrongsize/versions/2026-07-22-submitted.pdf +0 -0
- package/fixtures/paper-typography/clean-paper/paper.tex +29 -0
- package/fixtures/paper-typography/messy-paper/paper.tex +27 -0
- package/fixtures/pdf-facts/README.md +22 -0
- package/fixtures/pdf-facts/corrupt-font.pdf +0 -0
- package/fixtures/pdf-facts/encrypted.pdf +0 -0
- package/fixtures/pdf-facts/hidden-text.pdf +0 -0
- package/fixtures/pdf-facts/hidden-text.tex +28 -0
- package/fixtures/pdf-facts/t3-all.pdf +0 -0
- package/fixtures/pdf-facts/t3-all.tex +8 -0
- package/fixtures/pdf-facts/t3-mixed.pdf +0 -0
- package/fixtures/pdf-facts/t3-mixed.tex +9 -0
- package/fixtures/pdf-facts/ttf.pdf +2240 -1
- package/fixtures/pdf-facts/ttf.tex +6 -0
- package/fixtures/real-markdown-paper/baseline.json +24 -0
- package/fixtures/real-markdown-paper/baseline.mjs +48 -0
- package/fixtures/render-paper/build-clean.sh +25 -0
- package/fixtures/render-paper/build-defect.sh +15 -0
- package/fixtures/review-findings-cause/clean.md +17 -0
- package/fixtures/review-findings-cause/defect.md +14 -0
- package/fixtures/review-findings-cause/old-debt.md +14 -0
- package/fixtures/review-findings-cause/quiet-in-fence.md +16 -0
- package/fixtures/tex-build/clean.tex +21 -0
- package/fixtures/tex-build/defect.tex +24 -0
- package/fixtures/tex-build/frontmatter-clean.tex +25 -0
- package/fixtures/tex-build/frontmatter-defect.tex +23 -0
- package/fixtures/toolchain-mirror/catalog.txt +5 -0
- package/fixtures/toolchain-mirror/install-tl +27 -0
- package/fixtures/toolchain-mirror/release-texlive.txt +3 -0
- package/fixtures/toolchain-mirror/release-year +1 -0
- package/fixtures/toolchain-mirror/stub-kpsewhich +8 -0
- package/fixtures/toolchain-mirror/stub-pdflatex +3 -0
- package/fixtures/toolchain-mirror/stub-tlmgr +44 -0
- package/hooks/hooks.harness.mjs +713 -0
- package/hooks/hooks.mutations.mjs +337 -0
- package/hooks/paper-edit-guard.hook.d.mts +13 -0
- package/hooks/paper-edit-guard.hook.mjs +457 -0
- package/hooks/paper-skills-nudge.hook.mjs +136 -0
- package/hooks/paper-status-gates.hook.mjs +156 -0
- package/hooks/paper-status-gates.sh +91 -0
- package/lib/agent-cli-version.harness.mjs +165 -0
- package/lib/agent-cli-version.mjs +106 -0
- package/lib/agent-cli-version.mutations.mjs +109 -0
- package/lib/markdown.mjs +386 -0
- package/lib/mutation-driver.harness.mjs +227 -0
- package/lib/mutation-driver.mjs +397 -0
- package/lib/mutation-driver.mutations.mjs +68 -0
- package/lib/paper-config.d.mts +34 -0
- package/lib/paper-config.harness.mjs +286 -0
- package/lib/paper-config.mjs +142 -0
- package/lib/paper-config.mutations.mjs +143 -0
- package/lib/skill-checks.mjs +701 -0
- package/lib/skill-corpus.mjs +403 -0
- package/lib/skill-eval-fixture.mjs +63 -0
- package/lib/skill-eval-kit.mjs +257 -0
- package/lib/skill-trigger-cases.harness.mjs +170 -0
- package/lib/skill-trigger-cases.mjs +446 -0
- package/lib/skill-trigger-cases.mutations.mjs +65 -0
- package/lib/trigger-ledger.mjs +215 -0
- package/package.json +97 -0
- package/plugin/.claude-plugin/plugin.json +8 -0
- package/plugin/hooks/hooks.json +30 -0
- package/scripts/check.harness.mjs +177 -0
- package/scripts/check.mjs +239 -0
- package/scripts/check.mutations.mjs +110 -0
- package/scripts/eslint-report-guard.mjs +82 -0
- package/scripts/exclusive.mjs +138 -0
- package/scripts/harness-api.frozen.json +76 -0
- package/scripts/harness-api.test.ts +175 -0
- package/scripts/layer-legacy-frozen.d.mts +28 -0
- package/scripts/layer-legacy-frozen.mjs +152 -0
- package/scripts/layer-legacy-frozen.test.ts +115 -0
- package/scripts/layer-legacy.frozen.json +50 -0
- package/scripts/mutation-batteries-frozen.harness.mjs +204 -0
- package/scripts/mutation-batteries-frozen.mjs +238 -0
- package/scripts/mutation-batteries.frozen.json +117 -0
- package/scripts/release-config.test.ts +90 -0
- package/scripts/rules-are-content-only.harness.mjs +113 -0
- package/scripts/rules-are-content-only.mjs +138 -0
- package/scripts/rules-are-content-only.mutations.mjs +81 -0
- package/scripts/rules-see-files.harness.mjs +115 -0
- package/scripts/rules-see-files.mjs +99 -0
- package/scripts/rules-see-files.mutations.mjs +131 -0
- package/scripts/run-mutations.mjs +100 -0
- package/scripts/semantic-release-plugins.d.ts +16 -0
- package/skills/README.md +15 -0
- package/skills/analyze-sibling-paper/SKILL.md +170 -0
- package/skills/analyze-sibling-paper/SKILL.md.spec.ts +186 -0
- package/skills/analyze-sibling-paper/analyze-sibling-paper.eval.mjs +19 -0
- package/skills/analyze-sibling-paper/analyze-sibling-paper.harness.mjs +23 -0
- package/skills/argument-arc/SKILL.md +177 -0
- package/skills/argument-arc/SKILL.md.spec.ts +192 -0
- package/skills/argument-arc/argument-arc.eval.mjs +19 -0
- package/skills/argument-arc/argument-arc.harness.mjs +23 -0
- package/skills/build-benchmark/SKILL.md +213 -0
- package/skills/build-benchmark/SKILL.md.spec.ts +220 -0
- package/skills/build-benchmark/build-benchmark.eval.mjs +19 -0
- package/skills/build-benchmark/build-benchmark.harness.mjs +23 -0
- package/skills/build-benchmark/references/adversarial-cold-repro.md +68 -0
- package/skills/camera-ready/SKILL.md +148 -0
- package/skills/camera-ready/SKILL.md.spec.ts +164 -0
- package/skills/camera-ready/camera-ready.eval.mjs +19 -0
- package/skills/camera-ready/camera-ready.harness.mjs +23 -0
- package/skills/cold-read-diff/SKILL.md +160 -0
- package/skills/cold-read-diff/SKILL.md.spec.ts +166 -0
- package/skills/cold-read-diff/cold-read-diff.eval.mjs +19 -0
- package/skills/cold-read-diff/cold-read-diff.harness.mjs +23 -0
- package/skills/draft-paper/SKILL.md +152 -0
- package/skills/draft-paper/SKILL.md.spec.ts +169 -0
- package/skills/draft-paper/draft-paper.eval.mjs +19 -0
- package/skills/draft-paper/draft-paper.harness.mjs +23 -0
- package/skills/extend-paper/SKILL.md +99 -0
- package/skills/extend-paper/SKILL.md.spec.ts +116 -0
- package/skills/extend-paper/extend-paper.eval.mjs +19 -0
- package/skills/extend-paper/extend-paper.harness.mjs +23 -0
- package/skills/find-venue/SKILL.md +128 -0
- package/skills/find-venue/SKILL.md.spec.ts +145 -0
- package/skills/find-venue/find-venue.eval.mjs +19 -0
- package/skills/find-venue/find-venue.harness.mjs +23 -0
- package/skills/grade-paper-writing/SKILL.md +436 -0
- package/skills/grade-paper-writing/SKILL.md.spec.ts +453 -0
- package/skills/grade-paper-writing/fixtures/control_gopen.txt +1 -0
- package/skills/grade-paper-writing/fixtures/control_human_paper.txt +1 -0
- package/skills/grade-paper-writing/fixtures/rewrite.txt +1 -0
- package/skills/grade-paper-writing/fixtures/specimen.txt +1 -0
- package/skills/grade-paper-writing/fixtures/structure-checks.md +22 -0
- package/skills/grade-paper-writing/grade-paper-writing.eval.mjs +19 -0
- package/skills/grade-paper-writing/grade-paper-writing.harness.mjs +23 -0
- package/skills/grade-paper-writing/prose-lint.mjs +713 -0
- package/skills/harden-paper/SKILL.md +318 -0
- package/skills/harden-paper/SKILL.md.spec.ts +336 -0
- package/skills/harden-paper/check-numbers.sh +33 -0
- package/skills/harden-paper/check-release-claims.sh +35 -0
- package/skills/harden-paper/fixtures/uncited-assertions-sample.md +43 -0
- package/skills/harden-paper/fixtures/uncited-assertions-sample.tex +77 -0
- package/skills/harden-paper/harden-paper.eval.mjs +19 -0
- package/skills/harden-paper/harden-paper.harness.mjs +23 -0
- package/skills/map-prior-work/SKILL.md +211 -0
- package/skills/map-prior-work/SKILL.md.spec.ts +227 -0
- package/skills/map-prior-work/map-prior-work.eval.mjs +19 -0
- package/skills/map-prior-work/map-prior-work.harness.mjs +23 -0
- package/skills/osf-artifact-upload/SKILL.md +52 -0
- package/skills/osf-artifact-upload/SKILL.md.spec.ts +59 -0
- package/skills/osf-artifact-upload/osf-artifact-upload.eval.mjs +22 -0
- package/skills/osf-artifact-upload/osf-artifact-upload.harness.mjs +103 -0
- package/skills/paper-adversarial-review/SKILL.md +126 -0
- package/skills/paper-adversarial-review/SKILL.md.spec.ts +142 -0
- package/skills/paper-adversarial-review/paper-adversarial-review.eval.mjs +19 -0
- package/skills/paper-adversarial-review/paper-adversarial-review.harness.mjs +23 -0
- package/skills/paper-pipeline/PIPELINE-MAP.md +371 -0
- package/skills/paper-pipeline/SKILL.md +499 -0
- package/skills/paper-pipeline/SKILL.md.spec.ts +517 -0
- package/skills/paper-pipeline/description-language.eval.mjs +347 -0
- package/skills/paper-pipeline/framing-vs-vocabulary.eval.mjs +891 -0
- package/skills/paper-pipeline/grade-paper-writing-ablation.eval.mjs +1254 -0
- package/skills/paper-pipeline/paper-pipeline.eval.mjs +22 -0
- package/skills/paper-pipeline/paper-pipeline.harness.mjs +143 -0
- package/skills/paper-pipeline/pipeline-firing.baseline.json +270 -0
- package/skills/paper-pipeline/pipeline-firing.eval.mjs +664 -0
- package/skills/paper-pipeline/pipeline-language.eval.mjs +672 -0
- package/skills/paper-pipeline/references/acceptance-gate.md +329 -0
- package/skills/paper-pipeline/references/acl-venue-rules.md +142 -0
- package/skills/paper-pipeline/references/anonymization.md +68 -0
- package/skills/paper-pipeline/references/artifact-checklist.md +93 -0
- package/skills/paper-pipeline/references/body-vs-appendix.md +97 -0
- package/skills/paper-pipeline/references/credit-criteria.md +69 -0
- package/skills/paper-pipeline/references/occupancy-2026-08-06-probe/README.md +35 -0
- package/skills/paper-pipeline/references/occupancy-2026-08-06-probe/run_retext.mjs +24 -0
- package/skills/paper-pipeline/references/occupancy-2026-08-06-probe/sentences.txt +11 -0
- package/skills/paper-pipeline/references/occupancy-2026-08-06-probe/test_sentences.py +25 -0
- package/skills/paper-pipeline/references/occupancy-2026-08-06-prose-checkers.md +538 -0
- package/skills/paper-pipeline/references/occupancy-2026-08-06-reproducible-tooling.md +431 -0
- package/skills/paper-pipeline/references/occupancy-2026-08-06-staleness-and-orchestration.md +592 -0
- package/skills/paper-pipeline/references/pipeline-status-template.md +162 -0
- package/skills/paper-pipeline/references/review-ratchet.md +36 -0
- package/skills/paper-pipeline/references/sweep-2026-08-09-ideal-pipeline.md +585 -0
- package/skills/paper-pipeline/references/writing-craft.md +448 -0
- package/skills/paper-pipeline/repro/2026-08-07-description-language-control.log +63 -0
- package/skills/paper-pipeline/repro/2026-08-07-fork-check.log +52 -0
- package/skills/paper-pipeline/repro/2026-08-07-fork-check2.log +33 -0
- package/skills/paper-pipeline/repro/2026-08-07-language-eval-pilot.log +33 -0
- package/skills/paper-pipeline/repro/2026-08-07-language-eval-raw.log +166 -0
- package/skills/paper-pipeline/repro/2026-08-08-framing-vs-vocabulary-oracle.json +338 -0
- package/skills/paper-pipeline/repro/2026-08-08-framing-vs-vocabulary-oracle.log +118 -0
- package/skills/paper-pipeline/repro/2026-08-08-framing-vs-vocabulary-raw.log +245 -0
- package/skills/paper-pipeline/repro/2026-08-08-framing-vs-vocabulary.json +776 -0
- package/skills/paper-pipeline/repro/2026-08-08-grade-paper-writing-ablation-A6-oracle.log +53 -0
- package/skills/paper-pipeline/repro/2026-08-08-grade-paper-writing-ablation-A6-raw.log +89 -0
- package/skills/paper-pipeline/repro/2026-08-08-grade-paper-writing-ablation-oracle.json +450 -0
- package/skills/paper-pipeline/repro/2026-08-08-grade-paper-writing-ablation-oracle.log +136 -0
- package/skills/paper-pipeline/repro/2026-08-08-grade-paper-writing-ablation-raw.log +242 -0
- package/skills/paper-pipeline/repro/2026-08-08-grade-paper-writing-ablation-setupdiff.log +59 -0
- package/skills/paper-pipeline/repro/2026-08-08-grade-paper-writing-ablation.json +1032 -0
- package/skills/paper-pipeline/repro/2026-08-08-parent-replication-gpw.json +139 -0
- package/skills/paper-pipeline/repro/2026-08-08-parent-replication-gpw.log +98 -0
- package/skills/paper-pipeline/repro/2026-08-08-parent-replication.mjs +92 -0
- package/skills/paper-pipeline/repro/README.md +129 -0
- package/skills/paper-pipeline/repro/analyze-language-eval.py +116 -0
- package/skills/paper-pipeline/scripts/README.md +344 -0
- package/skills/paper-pipeline/scripts/announce.mjs +67 -0
- package/skills/paper-pipeline/scripts/artifact-coverage.harness.mjs +496 -0
- package/skills/paper-pipeline/scripts/artifact-coverage.mjs +397 -0
- package/skills/paper-pipeline/scripts/artifact-coverage.mutations.mjs +218 -0
- package/skills/paper-pipeline/scripts/check-provenance.mjs +184 -0
- package/skills/paper-pipeline/scripts/consumer.d.mts +32 -0
- package/skills/paper-pipeline/scripts/consumer.harness.mjs +562 -0
- package/skills/paper-pipeline/scripts/consumer.mjs +535 -0
- package/skills/paper-pipeline/scripts/consumer.mutations.mjs +190 -0
- package/skills/paper-pipeline/scripts/extract-ref-facts.harness.mjs +457 -0
- package/skills/paper-pipeline/scripts/extract-ref-facts.mjs +656 -0
- package/skills/paper-pipeline/scripts/extract-ref-facts.mutations.mjs +54 -0
- package/skills/paper-pipeline/scripts/fixtures/clean/PIPELINE-STATUS.md +51 -0
- package/skills/paper-pipeline/scripts/fixtures/dirty/PIPELINE-STATUS.md +52 -0
- package/skills/paper-pipeline/scripts/fixtures/dirty/paper.md +6 -0
- package/skills/paper-pipeline/scripts/fixtures/real-bib/refs.bib +153 -0
- package/skills/paper-pipeline/scripts/generated-code.harness.mjs +466 -0
- package/skills/paper-pipeline/scripts/generated-code.mjs +338 -0
- package/skills/paper-pipeline/scripts/generated-code.mutations.mjs +254 -0
- package/skills/paper-pipeline/scripts/ledger.mjs +623 -0
- package/skills/paper-pipeline/scripts/ledger.selftest.mjs +286 -0
- package/skills/paper-pipeline/scripts/pipeline-check.harness.mjs +389 -0
- package/skills/paper-pipeline/scripts/pipeline-check.mjs +737 -0
- package/skills/paper-pipeline/scripts/pipeline-check.mutations.mjs +54 -0
- package/skills/paper-pipeline/scripts/pipeline-edges.mjs +169 -0
- package/skills/paper-pipeline/scripts/population-map.harness.mjs +178 -0
- package/skills/paper-pipeline/scripts/population-map.mjs +181 -0
- package/skills/paper-pipeline/scripts/population-map.mutations.mjs +65 -0
- package/skills/paper-pipeline/scripts/population-map.selftest.mjs +122 -0
- package/skills/paper-pipeline/scripts/provenance.harness.mjs +240 -0
- package/skills/paper-pipeline/scripts/provenance.mutations.mjs +59 -0
- package/skills/paper-pipeline/scripts/round-diff.harness.mjs +881 -0
- package/skills/paper-pipeline/scripts/round-diff.mjs +576 -0
- package/skills/paper-pipeline/scripts/round-diff.mutations.mjs +276 -0
- package/skills/paper-pipeline/scripts/run-mechanical.mjs +633 -0
- package/skills/paper-pipeline/scripts/status.mjs +295 -0
- package/skills/paper-status/SKILL.md +183 -0
- package/skills/paper-status/SKILL.md.spec.ts +190 -0
- package/skills/paper-status/paper-status.eval.mjs +22 -0
- package/skills/paper-status/paper-status.harness.mjs +25 -0
- package/skills/pc-panel-review/SKILL.md +263 -0
- package/skills/pc-panel-review/SKILL.md.spec.ts +280 -0
- package/skills/pc-panel-review/pc-panel-review.eval.mjs +19 -0
- package/skills/pc-panel-review/pc-panel-review.harness.mjs +23 -0
- package/skills/plan-paper-timeline/SKILL.md +182 -0
- package/skills/plan-paper-timeline/SKILL.md.spec.ts +200 -0
- package/skills/plan-paper-timeline/fixtures/fake-google-calendar.mjs +239 -0
- package/skills/plan-paper-timeline/plan-paper-timeline.effects.harness.mjs +431 -0
- package/skills/plan-paper-timeline/plan-paper-timeline.effects.mutations.mjs +65 -0
- package/skills/plan-paper-timeline/plan-paper-timeline.eval.mjs +19 -0
- package/skills/plan-paper-timeline/plan-paper-timeline.harness.mjs +23 -0
- package/skills/render-paper/SKILL.md +159 -0
- package/skills/render-paper/SKILL.md.spec.ts +166 -0
- package/skills/render-paper/check-render.sh +419 -0
- package/skills/render-paper/checkers-requirements.txt +55 -0
- package/skills/render-paper/ensure-checkers.sh +69 -0
- package/skills/render-paper/extract-pdf-facts.harness.mjs +166 -0
- package/skills/render-paper/extract-pdf-facts.mjs +144 -0
- package/skills/render-paper/render-paper.eval.mjs +19 -0
- package/skills/render-paper/render-paper.harness.mjs +339 -0
- package/skills/research-ideate/SKILL.md +136 -0
- package/skills/research-ideate/SKILL.md.spec.ts +152 -0
- package/skills/research-ideate/research-ideate.eval.mjs +19 -0
- package/skills/research-ideate/research-ideate.harness.mjs +23 -0
- package/skills/skill-contract.mutations.mjs +179 -0
- package/skills/study-accepted-papers/SKILL.md +206 -0
- package/skills/study-accepted-papers/SKILL.md.spec.ts +223 -0
- package/skills/study-accepted-papers/study-accepted-papers.eval.mjs +19 -0
- package/skills/study-accepted-papers/study-accepted-papers.harness.mjs +23 -0
- package/skills/submit-paper/SKILL.md +182 -0
- package/skills/submit-paper/SKILL.md.spec.ts +199 -0
- package/skills/submit-paper/check-deanon.sh +149 -0
- package/skills/submit-paper/references/publishers/acm.md +92 -0
- package/skills/submit-paper/references/venues/agenticdev.jsonc +108 -0
- package/skills/submit-paper/references/venues/agenticdev.md +139 -0
- package/skills/submit-paper/references/venues/agenticdev.tex +19 -0
- package/skills/submit-paper/references/venues/aisec.jsonc +101 -0
- package/skills/submit-paper/references/venues/aisec.md +105 -0
- package/skills/submit-paper/references/venues/paper-guards.tex +41 -0
- package/skills/submit-paper/references/venues/realm.jsonc +81 -0
- package/skills/submit-paper/references/venues/realm.md +155 -0
- package/skills/submit-paper/references/venues/tex-base.jsonc +50 -0
- package/skills/submit-paper/references/venues/venue-profile.schema.json +74 -0
- package/skills/submit-paper/submit-paper.eval.mjs +19 -0
- package/skills/submit-paper/submit-paper.harness.mjs +23 -0
- package/skills/sweep-design-space/SKILL.md +269 -0
- package/skills/sweep-design-space/SKILL.md.spec.ts +285 -0
- package/skills/sweep-design-space/sweep-design-space.eval.mjs +19 -0
- package/skills/sweep-design-space/sweep-design-space.harness.mjs +23 -0
- package/skills/tighten-paper/SKILL.md +368 -0
- package/skills/tighten-paper/SKILL.md.spec.ts +384 -0
- package/skills/tighten-paper/structure.mjs +371 -0
- package/skills/tighten-paper/tighten-paper.eval.mjs +19 -0
- package/skills/tighten-paper/tighten-paper.harness.mjs +23 -0
- package/skills/verify-citations/SKILL.md +328 -0
- package/skills/verify-citations/SKILL.md.spec.ts +345 -0
- package/skills/verify-citations/scripts/bib-authors.mjs +479 -0
- package/skills/verify-citations/scripts/bib-authors.test.mjs +175 -0
- package/skills/verify-citations/scripts/verify-cites.mjs +1108 -0
- package/skills/verify-citations/scripts/verify-cites.test.mjs +735 -0
- package/skills/verify-citations/verify-citations.eval.mjs +19 -0
- package/skills/verify-citations/verify-citations.harness.mjs +23 -0
- package/src/CLAUDE.md +51 -0
- package/src/action-ref.test.ts +26 -0
- package/src/action-ref.ts +15 -0
- package/src/adapters/banal/failure.test.ts +63 -0
- package/src/adapters/banal/failure.ts +118 -0
- package/src/adapters/banal/index.test.ts +119 -0
- package/src/adapters/banal/index.ts +100 -0
- package/src/adapters/banal/install.test.ts +20 -0
- package/src/adapters/banal/install.ts +41 -0
- package/src/adapters/banal/invocation.test.ts +74 -0
- package/src/adapters/banal/invocation.ts +95 -0
- package/src/adapters/banal/locate.test.ts +52 -0
- package/src/adapters/banal/locate.ts +84 -0
- package/src/adapters/banal/output.test.ts +140 -0
- package/src/adapters/banal/output.ts +141 -0
- package/src/adapters/banal/pin.ts +30 -0
- package/src/adapters/banal/probe.ts +35 -0
- package/src/adapters/banal/run.test.ts +191 -0
- package/src/adapters/banal/run.ts +244 -0
- package/src/adapters/banal/settings.test.ts +31 -0
- package/src/adapters/banal/settings.ts +55 -0
- package/src/adapters/banal/xml.test.ts +111 -0
- package/src/adapters/banal/xml.ts +112 -0
- package/src/adapters/curl/download.io.ts +73 -0
- package/src/adapters/curl/download.test.ts +55 -0
- package/src/adapters/curl/index.ts +5 -0
- package/src/adapters/memory/index.ts +131 -0
- package/src/adapters/node/files.io.ts +39 -0
- package/src/adapters/node/files.test.ts +28 -0
- package/src/adapters/node/host.io.ts +15 -0
- package/src/adapters/node/index.ts +36 -0
- package/src/adapters/node/process.io.ts +49 -0
- package/src/adapters/node/process.test.ts +46 -0
- package/src/adapters/node/workspace.io.ts +40 -0
- package/src/adapters/node/workspace.test.ts +58 -0
- package/src/adapters/pdfjs/fill.test.ts +111 -0
- package/src/adapters/pdfjs/fill.ts +141 -0
- package/src/build-engine.harness.mjs +314 -0
- package/src/build-engine.ts +219 -0
- package/src/build.harness.mjs +631 -0
- package/src/build.mutations.mjs +195 -0
- package/src/build.ts +793 -0
- package/src/cli.harness.mjs +2007 -0
- package/src/cli.mutations.mjs +448 -0
- package/src/cli.ts +1189 -0
- package/src/doctor.harness.mjs +396 -0
- package/src/doctor.mutations.mjs +175 -0
- package/src/doctor.ts +356 -0
- package/src/domain/geometry.ts +108 -0
- package/src/domain/host.ts +23 -0
- package/src/domain/page-layout.ts +32 -0
- package/src/domain/paths.ts +5 -0
- package/src/domain/result.test.ts +26 -0
- package/src/domain/result.ts +29 -0
- package/src/domain/sha256.test.ts +12 -0
- package/src/domain/sha256.ts +21 -0
- package/src/domain/text.ts +11 -0
- package/src/engine.harness.mjs +252 -0
- package/src/engine.ts +176 -0
- package/src/exit-code.test.ts +21 -0
- package/src/exit-code.ts +38 -0
- package/src/facts-file.test.ts +240 -0
- package/src/facts-file.ts +241 -0
- package/src/hooks-settings.harness.mjs +386 -0
- package/src/hooks-settings.mutations.mjs +116 -0
- package/src/hooks-settings.ts +434 -0
- package/src/init.ts +900 -0
- package/src/latex-log.harness.mjs +226 -0
- package/src/latex-log.ts +234 -0
- package/src/latex-loop.harness.mjs +449 -0
- package/src/latex-loop.ts +211 -0
- package/src/link-skills.harness.mjs +273 -0
- package/src/link-skills.mutations.mjs +136 -0
- package/src/link-skills.ts +258 -0
- package/src/new-paper.harness.mjs +216 -0
- package/src/new-paper.mutations.mjs +79 -0
- package/src/new-paper.ts +158 -0
- package/src/pdf-facts.harness.mjs +188 -0
- package/src/pdf-facts.ts +327 -0
- package/src/pdf-geometry.harness.mjs +254 -0
- package/src/pdf-geometry.ts +300 -0
- package/src/ports/download.ts +10 -0
- package/src/ports/files.ts +11 -0
- package/src/ports/measure-geometry.ts +8 -0
- package/src/ports/process.ts +46 -0
- package/src/ports/tool-installer.ts +33 -0
- package/src/ports/workspace.ts +20 -0
- package/src/rules-config.harness.mjs +114 -0
- package/src/rules-config.ts +178 -0
- package/src/structure.harness.mjs +179 -0
- package/src/structure.mutations.mjs +83 -0
- package/src/structure.ts +166 -0
- package/src/tex-requirements.harness.mjs +238 -0
- package/src/tex-requirements.ts +181 -0
- package/src/toolchain.harness.mjs +651 -0
- package/src/toolchain.ts +755 -0
- package/src/types.ts +106 -0
- package/templates/paper/PIPELINE-STATUS.md +72 -0
- package/templates/paper/paper.md +4 -0
- package/templates/paper/paper.tex +8 -0
- package/tsconfig.json +23 -0
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: study-accepted-papers
|
|
3
|
+
description: "Mine a target venue's ACCEPTED-paper corpus to learn what makes papers STRONG there, then turn that into concrete strengthening levers for your own draft — the move from a plain \"Accept\" toward \"Strong Accept\". Fetch 8-12 real recently-accepted papers at the venue (ACM DL / IEEE Xplore / venue program pages / arXiv), prioritizing the same paper-type and topic as yours (measurement/benchmark/SoK/security-critique), and for each extract WHAT MADE IT STRONG (adaptive evaluation, explicit threat model, reusable released artifact, real-world grounding, a memorable framing/coined handle, a released dataset, honest limitations). Cross-read the venue CFP + PC-chair research tastes + any best-paper criteria. Then diff your draft against those patterns and emit ranked levers split into CHEAP (framing/prose/citation, safe before a deadline) vs EXPENSIVE (new experiments/data). Use when a paper is drafted and you want venue-specific polish grounded in what actually lands there — NOT generic writing advice. Distinct from find-venue (picks WHERE), research-ideate (validates the idea), and pc-panel-review / paper-adversarial-review (red-team YOUR draft): this one studies the VENUE's own bar. Compose with those + harden-paper + verify-citations + extend-paper."
|
|
4
|
+
context: fork
|
|
5
|
+
allowed-tools: [Read, Write, Edit, Grep, Glob, Bash, WebSearch, WebFetch, Agent]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
<!-- vigiles:sha256:eb77acd927708132 compiled from skills/study-accepted-papers/SKILL.md.spec.ts -->
|
|
9
|
+
|
|
10
|
+
# study-accepted-papers — learn the venue's bar from its own accepted corpus, then lever your draft up
|
|
11
|
+
|
|
12
|
+
## Run me
|
|
13
|
+
|
|
14
|
+
🔴 FIRST, before any other step:
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
node .claude/skills/paper-pipeline/scripts/announce.mjs study-accepted-papers <paper-dir>
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
An advisory pass cannot be observed failing — silence is both its error state and its normal
|
|
21
|
+
state — so starting is an event, and events get written down.
|
|
22
|
+
|
|
23
|
+
Reviewers don't score in a vacuum — they score against the papers that got in last cycle. This skill
|
|
24
|
+
makes that reference standard explicit: pull the venue's **actually-accepted** papers of your type,
|
|
25
|
+
extract the concrete properties that separated the strong ones from the weak-accepts, and diff your
|
|
26
|
+
draft against them to produce **specific, sourced levers** — not "add more rigor" but "AISec strong
|
|
27
|
+
accepts in this lane all carry an adaptive-attacker evaluation; yours has static mutation only — here's
|
|
28
|
+
the cheap version you can add and the expensive version you can't."
|
|
29
|
+
|
|
30
|
+
It answers a different question than the neighboring skills:
|
|
31
|
+
- `find-venue` → *where* should this go? (ranks venues)
|
|
32
|
+
- `research-ideate` → is the *idea* worth doing? (go/no-go on the contribution)
|
|
33
|
+
- `pc-panel-review` / `paper-adversarial-review` → what's wrong with *my draft*? (red-team your text)
|
|
34
|
+
- **`study-accepted-papers` → what does it take to be *strong* at THIS venue, judged by its own accepted papers?**
|
|
35
|
+
|
|
36
|
+
Grounding: the authorship criterion — why a *strong* accept at an indexed venue is
|
|
37
|
+
worth more to the dossier than a borderline one — reviewer enthusiasm shows up in the acceptance and in
|
|
38
|
+
letters), and the venue data card `../submit-paper/references/venues/<venue>.md` if one exists.
|
|
39
|
+
|
|
40
|
+
## Step 1 — pin the venue's stated bar (fetch, don't guess)
|
|
41
|
+
|
|
42
|
+
`WebFetch` the current CFP and, if separate, the reviewer-guidelines / call-for-benchmark-papers page.
|
|
43
|
+
Capture what the venue *says* it rewards, in its own words:
|
|
44
|
+
- **Track requirements** — e.g. a benchmark track that demands a functional artifact link, a named
|
|
45
|
+
reusable benchmark, a metric definition, a leaderboard. Missing a *required* element of your track is
|
|
46
|
+
a desk-reject, never a weak-accept — check these first.
|
|
47
|
+
- **Stated review criteria / scoring rubric** — novelty vs systematization vs reproducibility weighting.
|
|
48
|
+
- **Best-paper / distinguished-artifact criteria** if published — these name the top-end bar directly.
|
|
49
|
+
- **PC chairs + steering committee + recent PC** — look up their research areas. A PC heavy on
|
|
50
|
+
adversarial-ML will punish a non-adaptive evaluation; a PC heavy on systems will want real deployment
|
|
51
|
+
grounding. Taste is a real, findable signal.
|
|
52
|
+
|
|
53
|
+
## Step 2 — pull the corpus. **Measure ALL of it; deep-read 8-12.**
|
|
54
|
+
|
|
55
|
+
🔴 **Two tiers, and the first one is not optional.** The single most valuable output of this skill is
|
|
56
|
+
a *denominator* — "33 of 34 accepted papers have at least one figure", "confidence intervals appear
|
|
57
|
+
in 1 of 34", "control arms in 0 of 34". **A sample of 8-12 cannot produce a denominator.** It gives
|
|
58
|
+
you impressions; the whole point of this skill is to replace impressions with the venue's own
|
|
59
|
+
distribution.
|
|
60
|
+
|
|
61
|
+
| tier | how many | what you get |
|
|
62
|
+
|---|---|---|
|
|
63
|
+
| **measure** | **all of them** | figure count · table count · page count · section word counts · greps for confidence intervals, statistical tests, control/placebo arms, artifact URLs · abstract length. Mechanical, scriptable, cheap. |
|
|
64
|
+
| **deep-read** | **8-12**, chosen by relevance | contribution, what made it strong, framing, how limitations are handled. Judgement, expensive. |
|
|
65
|
+
|
|
66
|
+
**How many is "all"?** A workshop's accepted volume is **30-60 papers** — download the lot, it costs
|
|
67
|
+
minutes and a few hundred MB. For a main conference (1000+), "all" means *all in your track or topic*,
|
|
68
|
+
capped at ~100, and **you must state what you capped and why** — a silently truncated corpus produces
|
|
69
|
+
denominators that are quietly wrong.
|
|
70
|
+
|
|
71
|
+
**Cross tier with archival status before calibrating.** Oral/spotlight/poster and archival/non-archival
|
|
72
|
+
are different axes, and they interact: at REALM 2025 most orals were **non-archival**, so the honest
|
|
73
|
+
"what a strong archival paper looks like" set was **six** papers, not eleven. Calibrating against the
|
|
74
|
+
wrong subset is worse than not calibrating.
|
|
75
|
+
|
|
76
|
+
**Do not quote an acceptance rate unless the venue publishes the submission count.** Accepted counts
|
|
77
|
+
are public; submitted counts usually are not. An invented rate is the kind of number that gets
|
|
78
|
+
repeated for weeks — it was, on `compile-rules-2026`, by this pipeline, until the corpus pass
|
|
79
|
+
checked.
|
|
80
|
+
|
|
81
|
+
🔴 **Save the corpus WITH the paper, not in a scratchpad.** See "Where the output lives" below. A run
|
|
82
|
+
that returns only prose has destroyed its own evidence.
|
|
83
|
+
|
|
84
|
+
`WebSearch` / `WebFetch` the venue's recent proceedings (ACM DL, IEEE Xplore, the venue program pages,
|
|
85
|
+
or arXiv copies). For the **deep-read** tier select **8-12 actually-accepted papers**, prioritizing:
|
|
86
|
+
1. Same **paper type** as yours (measurement / benchmark / SoK / empirical-critique / defense-eval).
|
|
87
|
+
2. Same **topic lane** (for a security venue: LLM/agent security, guardrail evaluation, jailbreak
|
|
88
|
+
robustness, "X is security theater"-style critiques).
|
|
89
|
+
3. Any **best-paper / award / highly-cited** ones — these are the calibrated top of the distribution.
|
|
90
|
+
|
|
91
|
+
For **each** paper, extract not just the contribution but **what made it strong** — the property a
|
|
92
|
+
reviewer would have written in the "strengths" box:
|
|
93
|
+
- adaptive / adversarial evaluation (an *adaptive attacker*, not just static perturbation);
|
|
94
|
+
- an explicit, scoped **threat model** stated up front;
|
|
95
|
+
- a **reusable, released artifact / dataset** (not a one-off script);
|
|
96
|
+
- **real-world grounding** (real incidents, real deployed tools, a real corpus vs hand-built toys);
|
|
97
|
+
- a **memorable framing or coined handle** that makes the paper travel (and get cited);
|
|
98
|
+
- **baseline comparisons** against the obvious prior defenses/benchmarks;
|
|
99
|
+
- **honest, self-aware limitations** that pre-empt the reviewer's objection.
|
|
100
|
+
|
|
101
|
+
Record each as a row: `title | year | contribution | what made it STRONG`. Never invent a paper or a
|
|
102
|
+
citation — if you can't verify it exists, drop it or mark it VERIFY.
|
|
103
|
+
|
|
104
|
+
## Step 3 — diff your draft against the pattern
|
|
105
|
+
|
|
106
|
+
Lay your draft's properties beside the strong-accept pattern from Step 2. For every property the strong
|
|
107
|
+
papers share that yours lacks or does weakly, that's a **lever**. Rank levers by how much *this venue's*
|
|
108
|
+
PC weights the axis (from Step 1's chairs/rubric), not by generic importance. For a security venue,
|
|
109
|
+
weight **adaptive evaluation** and **threat-model clarity** heavily — they are the usual difference
|
|
110
|
+
between 4/5 and 5/5, and the usual reason an empirical security paper is held at weak-accept.
|
|
111
|
+
|
|
112
|
+
## Step 4 — split levers CHEAP vs EXPENSIVE (respect the deadline and the anti-cram rule)
|
|
113
|
+
|
|
114
|
+
Every lever gets tagged:
|
|
115
|
+
- **CHEAP** — framing, prose, a reordered abstract, a coined handle, an explicit threat-model paragraph,
|
|
116
|
+
a missing-but-expected citation, promoting an existing number into the abstract, making an already-run
|
|
117
|
+
robustness result read as "adaptive". Safe to land days before a deadline.
|
|
118
|
+
- **EXPENSIVE** — needs new experiments, a bigger/external corpus, an actual adaptive-attacker study, a
|
|
119
|
+
new baseline run. These usually **do NOT belong in a near-done paper under deadline pressure** — the
|
|
120
|
+
anti-cram rule (two clean accepted works beat one overstuffed one) means an
|
|
121
|
+
expensive lever is normally an **`extend-paper` task for the follow-on**, not a pre-deadline edit.
|
|
122
|
+
Say so explicitly; don't let a tempting expensive lever destabilize a shippable Accept.
|
|
123
|
+
|
|
124
|
+
## Output
|
|
125
|
+
|
|
126
|
+
1. **Venue-bar summary** — what this venue rewards, its track requirements, its PC's taste (2-4 lines,
|
|
127
|
+
each sourced).
|
|
128
|
+
2. **Strong-accepted-paper table** — `title | year | contribution | what made it STRONG`, with URLs.
|
|
129
|
+
3. **Ranked levers for your draft** — each: the gap, the strong-paper precedent it's drawn from,
|
|
130
|
+
CHEAP/EXPENSIVE tag, and the concrete edit (or the extend-paper deferral). Most-impactful first.
|
|
131
|
+
4. **Citation gaps** — specific real papers (arXiv id / DOI) a reviewer at this venue would expect and
|
|
132
|
+
ding you for missing, each with why. Hand these to `verify-citations`.
|
|
133
|
+
5. **Corpus-level distribution** — the denominators, each traceable to the measurement file: how many
|
|
134
|
+
papers have a figure and the median count, how many report confidence intervals, how many run a
|
|
135
|
+
statistical test, how many have a control or placebo arm, section-length norms, abstract-length
|
|
136
|
+
range. **These are what change decisions**, because they say whether your draft is normal, an
|
|
137
|
+
outlier, or quietly ahead.
|
|
138
|
+
|
|
139
|
+
## 🔴 Where the output lives — three homes, and all three are required
|
|
140
|
+
|
|
141
|
+
A run that returns only a write-up has destroyed its own evidence. Observed on `compile-rules-2026`
|
|
142
|
+
2026-08-03: the pass measured 34 PDFs and returned excellent prose, and what survived into the repo
|
|
143
|
+
was **two scripts, 16 KB**. The corpus, the extracted text and the measurement table were in a
|
|
144
|
+
scratchpad that gets wiped. Every denominator in the write-up was, an hour later, unverifiable.
|
|
145
|
+
|
|
146
|
+
| home | what goes there | why there |
|
|
147
|
+
|---|---|---|
|
|
148
|
+
| **`<paper-dir>/venue-corpus/`** | `measurements.json` (one row per paper — the denominators' source) · `text/*.txt` (extractions: the quotable primary source) · the fetch/measure scripts · `MANIFEST.md` | data. **PDFs are NOT committed** — they regenerate from the proceedings; record the IDs and the command instead. Text extractions ARE committed: a few MB, and they are what makes a quote re-checkable. |
|
|
149
|
+
| **`<paper-dir>/reviews/<date>-study-accepted-<venue>.md`** | the full analysis: per-paper reading, the whole lever list, the reasoning | the record. **The EXPENSIVE levers are the `extend-paper` roadmap** and are worthless if they evaporate. |
|
|
150
|
+
| 🔴 **`<paper-dir>/CLAUDE.md`** | **the 3-5 findings that change decisions while writing**, plus an explicit "what NOT to do" | **it auto-loads whenever anyone works on this paper.** A finding in `reviews/` is read when someone goes looking; a finding here is read *every time the draft is edited*. That is the difference between knowing the venue's bar and applying it. |
|
|
151
|
+
|
|
152
|
+
Then link all three from `PIPELINE-STATUS.md` (**`venuebar`** row — "venue bar / levers", in SETUP).
|
|
153
|
+
|
|
154
|
+
**What belongs in `<paper-dir>/CLAUDE.md` and what does not.** It is not a summary of the analysis —
|
|
155
|
+
it is the operative subset: the structural mismatch to fix, the strength being under-sold, the norm
|
|
156
|
+
being violated, and the **things previously believed that the corpus disproved** (those are the most
|
|
157
|
+
valuable lines in the file, because without them the pipeline re-derives the wrong belief). Keep it
|
|
158
|
+
short enough that it survives being loaded into every session.
|
|
159
|
+
|
|
160
|
+
## Record the verdict
|
|
161
|
+
|
|
162
|
+
🔴 LAST step, once the deliverable exists:
|
|
163
|
+
|
|
164
|
+
```
|
|
165
|
+
node .claude/skills/paper-pipeline/scripts/ledger.mjs record study-accepted-papers <paper-dir> FINDING <count> <report-path>
|
|
166
|
+
node .claude/skills/paper-pipeline/scripts/ledger.mjs record study-accepted-papers <paper-dir> ABSTAINED <reason> "<one line>"
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
**FINDING** — `<count>` is the number of levers, `<report-path>` the ranked CHEAP/EXPENSIVE list.
|
|
170
|
+
Add `--blocking` when the draft is missing something the track *requires* (an artifact link, a named
|
|
171
|
+
benchmark, a metric definition): a desk-reject, never a weak accept, and worth the loudest thing
|
|
172
|
+
this skill can say.
|
|
173
|
+
**ABSTAINED** — `no-witness`: the corpus was read and no lever came out of it. `input-missing`: the
|
|
174
|
+
venue publishes no accepted papers to mine.
|
|
175
|
+
|
|
176
|
+
🔴 **There is no PASS**, and the reason is visible here. "The draft already sits at the venue's bar"
|
|
177
|
+
is only meaningful next to the corpus it was measured against — *33 of 34 accepted papers*, not
|
|
178
|
+
*most of them* — and a stored acquittal carried that denominator nowhere. Put the corpus size in the
|
|
179
|
+
`ABSTAINED` note and in the report; without it the row is an impression with a machine-readable
|
|
180
|
+
label on it.
|
|
181
|
+
|
|
182
|
+
## Rules
|
|
183
|
+
- **Fetch real accepted papers.** Never fabricate a title, author, or "what made it strong". Unverifiable → drop or mark VERIFY.
|
|
184
|
+
- **A lever-proposed citation is not written into the `.tex`/bib until `verify-citations` confirms it** (real
|
|
185
|
+
arXiv-id/DOI + correct author/title/venue). If added provisionally, mark `% VERIFY` at the cite site; a
|
|
186
|
+
surviving `% VERIFY` at submit is a bug. Order: propose → verify → then add — never propose → add.
|
|
187
|
+
- **"Accepted" is the reference, but "strong" is the target** — don't just describe what got in; isolate what got in *enthusiastically*. Awards and heavy citation are your calibration for the top end.
|
|
188
|
+
- **Venue-specific, not generic.** A lever only counts if it's grounded in this venue's rubric, PC taste, or its own accepted papers. Generic "tighten the writing" is out of scope (that's `grade-paper-writing` / `tighten-paper`).
|
|
189
|
+
- **Security venues:** treat adaptive-attacker evaluation and an explicit threat model as first-class — they are the most common weak-accept→strong-accept axis and the most common reviewer complaint.
|
|
190
|
+
- **Respect the anti-cram rule.** Flag expensive levers as extension material by default; protect a shippable Accept from deadline-driven destabilization.
|
|
191
|
+
- Convert any newly-surfaced deadline to the author's own zone and hand it to `plan-paper-timeline`.
|
|
192
|
+
|
|
193
|
+
## Compose with
|
|
194
|
+
- `harden-paper` — the multi-axis pre-submit gate; this skill feeds it the venue-specific axis (what *this* PC rewards) that a generic hardening pass misses.
|
|
195
|
+
- `pc-panel-review` / `paper-adversarial-review` — run those to red-team the draft; run this to learn the bar the red-team should hold it to. Complementary, not redundant.
|
|
196
|
+
- `verify-citations` — consumes the Step-4 citation gaps.
|
|
197
|
+
- `extend-paper` — the natural home for every EXPENSIVE lever this skill surfaces.
|
|
198
|
+
- `submit-paper` venue data card (`submit-paper/references/venues/<venue>.md`) — save durable venue-bar findings there as data, not as a new skill per venue.
|
|
199
|
+
|
|
200
|
+
## Provenance
|
|
201
|
+
Built from the **AISec 2026 @ ACM CCS** polish run (2026-07): the "Safety Theater in Agentic Coding /
|
|
202
|
+
GateBench" paper sat at ~Accept (pc-panel ~0.72), and the task was to find what would push it toward a
|
|
203
|
+
strong accept without cramming new contributions before the 2026-07-24 deadline. The workflow that
|
|
204
|
+
produced the levers — pull AISec's accepted measurement/benchmark security papers, isolate the
|
|
205
|
+
adaptive-evaluation + threat-model + reusable-artifact pattern that the strong ones share, then split
|
|
206
|
+
fixes into cheap-prose vs expensive-experiment — is exactly what this skill encodes.
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
// Compiled to SKILL.md by `vigiles compile`. Edit THIS file, never the markdown.
|
|
2
|
+
//
|
|
3
|
+
// Adopted 2026-08-17 (batch 3). Body carried over VERBATIM so the compiled diff shows
|
|
4
|
+
// only what the compiler adds. No `disallowedTools` fence yet — the field landed on
|
|
5
|
+
// `SkillSpec` in vigiles branch `claude/skill-disallowed-tools` and is not in a release
|
|
6
|
+
// this repo installs, so writing one here would not compile.
|
|
7
|
+
import { experimental_skill } from "vigiles/spec";
|
|
8
|
+
|
|
9
|
+
export default experimental_skill({
|
|
10
|
+
name: "study-accepted-papers",
|
|
11
|
+
description:
|
|
12
|
+
'Mine a target venue\'s ACCEPTED-paper corpus to learn what makes papers STRONG there, then turn that into concrete strengthening levers for your own draft — the move from a plain "Accept" toward "Strong Accept". Fetch 8-12 real recently-accepted papers at the venue (ACM DL / IEEE Xplore / venue program pages / arXiv), prioritizing the same paper-type and topic as yours (measurement/benchmark/SoK/security-critique), and for each extract WHAT MADE IT STRONG (adaptive evaluation, explicit threat model, reusable released artifact, real-world grounding, a memorable framing/coined handle, a released dataset, honest limitations). Cross-read the venue CFP + PC-chair research tastes + any best-paper criteria. Then diff your draft against those patterns and emit ranked levers split into CHEAP (framing/prose/citation, safe before a deadline) vs EXPENSIVE (new experiments/data). Use when a paper is drafted and you want venue-specific polish grounded in what actually lands there — NOT generic writing advice. Distinct from find-venue (picks WHERE), research-ideate (validates the idea), and pc-panel-review / paper-adversarial-review (red-team YOUR draft): this one studies the VENUE\'s own bar. Compose with those + harden-paper + verify-citations + extend-paper.',
|
|
13
|
+
context: "fork",
|
|
14
|
+
tools: [
|
|
15
|
+
"Read",
|
|
16
|
+
"Write",
|
|
17
|
+
"Edit",
|
|
18
|
+
"Grep",
|
|
19
|
+
"Glob",
|
|
20
|
+
"Bash",
|
|
21
|
+
"WebSearch",
|
|
22
|
+
"WebFetch",
|
|
23
|
+
"Agent",
|
|
24
|
+
],
|
|
25
|
+
body: `
|
|
26
|
+
# study-accepted-papers — learn the venue's bar from its own accepted corpus, then lever your draft up
|
|
27
|
+
|
|
28
|
+
## Run me
|
|
29
|
+
|
|
30
|
+
🔴 FIRST, before any other step:
|
|
31
|
+
|
|
32
|
+
\`\`\`
|
|
33
|
+
node .claude/skills/paper-pipeline/scripts/announce.mjs study-accepted-papers <paper-dir>
|
|
34
|
+
\`\`\`
|
|
35
|
+
|
|
36
|
+
An advisory pass cannot be observed failing — silence is both its error state and its normal
|
|
37
|
+
state — so starting is an event, and events get written down.
|
|
38
|
+
|
|
39
|
+
Reviewers don't score in a vacuum — they score against the papers that got in last cycle. This skill
|
|
40
|
+
makes that reference standard explicit: pull the venue's **actually-accepted** papers of your type,
|
|
41
|
+
extract the concrete properties that separated the strong ones from the weak-accepts, and diff your
|
|
42
|
+
draft against them to produce **specific, sourced levers** — not "add more rigor" but "AISec strong
|
|
43
|
+
accepts in this lane all carry an adaptive-attacker evaluation; yours has static mutation only — here's
|
|
44
|
+
the cheap version you can add and the expensive version you can't."
|
|
45
|
+
|
|
46
|
+
It answers a different question than the neighboring skills:
|
|
47
|
+
- \`find-venue\` → *where* should this go? (ranks venues)
|
|
48
|
+
- \`research-ideate\` → is the *idea* worth doing? (go/no-go on the contribution)
|
|
49
|
+
- \`pc-panel-review\` / \`paper-adversarial-review\` → what's wrong with *my draft*? (red-team your text)
|
|
50
|
+
- **\`study-accepted-papers\` → what does it take to be *strong* at THIS venue, judged by its own accepted papers?**
|
|
51
|
+
|
|
52
|
+
Grounding: the authorship criterion — why a *strong* accept at an indexed venue is
|
|
53
|
+
worth more to the dossier than a borderline one — reviewer enthusiasm shows up in the acceptance and in
|
|
54
|
+
letters), and the venue data card \`../submit-paper/references/venues/<venue>.md\` if one exists.
|
|
55
|
+
|
|
56
|
+
## Step 1 — pin the venue's stated bar (fetch, don't guess)
|
|
57
|
+
|
|
58
|
+
\`WebFetch\` the current CFP and, if separate, the reviewer-guidelines / call-for-benchmark-papers page.
|
|
59
|
+
Capture what the venue *says* it rewards, in its own words:
|
|
60
|
+
- **Track requirements** — e.g. a benchmark track that demands a functional artifact link, a named
|
|
61
|
+
reusable benchmark, a metric definition, a leaderboard. Missing a *required* element of your track is
|
|
62
|
+
a desk-reject, never a weak-accept — check these first.
|
|
63
|
+
- **Stated review criteria / scoring rubric** — novelty vs systematization vs reproducibility weighting.
|
|
64
|
+
- **Best-paper / distinguished-artifact criteria** if published — these name the top-end bar directly.
|
|
65
|
+
- **PC chairs + steering committee + recent PC** — look up their research areas. A PC heavy on
|
|
66
|
+
adversarial-ML will punish a non-adaptive evaluation; a PC heavy on systems will want real deployment
|
|
67
|
+
grounding. Taste is a real, findable signal.
|
|
68
|
+
|
|
69
|
+
## Step 2 — pull the corpus. **Measure ALL of it; deep-read 8-12.**
|
|
70
|
+
|
|
71
|
+
🔴 **Two tiers, and the first one is not optional.** The single most valuable output of this skill is
|
|
72
|
+
a *denominator* — "33 of 34 accepted papers have at least one figure", "confidence intervals appear
|
|
73
|
+
in 1 of 34", "control arms in 0 of 34". **A sample of 8-12 cannot produce a denominator.** It gives
|
|
74
|
+
you impressions; the whole point of this skill is to replace impressions with the venue's own
|
|
75
|
+
distribution.
|
|
76
|
+
|
|
77
|
+
| tier | how many | what you get |
|
|
78
|
+
|---|---|---|
|
|
79
|
+
| **measure** | **all of them** | figure count · table count · page count · section word counts · greps for confidence intervals, statistical tests, control/placebo arms, artifact URLs · abstract length. Mechanical, scriptable, cheap. |
|
|
80
|
+
| **deep-read** | **8-12**, chosen by relevance | contribution, what made it strong, framing, how limitations are handled. Judgement, expensive. |
|
|
81
|
+
|
|
82
|
+
**How many is "all"?** A workshop's accepted volume is **30-60 papers** — download the lot, it costs
|
|
83
|
+
minutes and a few hundred MB. For a main conference (1000+), "all" means *all in your track or topic*,
|
|
84
|
+
capped at ~100, and **you must state what you capped and why** — a silently truncated corpus produces
|
|
85
|
+
denominators that are quietly wrong.
|
|
86
|
+
|
|
87
|
+
**Cross tier with archival status before calibrating.** Oral/spotlight/poster and archival/non-archival
|
|
88
|
+
are different axes, and they interact: at REALM 2025 most orals were **non-archival**, so the honest
|
|
89
|
+
"what a strong archival paper looks like" set was **six** papers, not eleven. Calibrating against the
|
|
90
|
+
wrong subset is worse than not calibrating.
|
|
91
|
+
|
|
92
|
+
**Do not quote an acceptance rate unless the venue publishes the submission count.** Accepted counts
|
|
93
|
+
are public; submitted counts usually are not. An invented rate is the kind of number that gets
|
|
94
|
+
repeated for weeks — it was, on \`compile-rules-2026\`, by this pipeline, until the corpus pass
|
|
95
|
+
checked.
|
|
96
|
+
|
|
97
|
+
🔴 **Save the corpus WITH the paper, not in a scratchpad.** See "Where the output lives" below. A run
|
|
98
|
+
that returns only prose has destroyed its own evidence.
|
|
99
|
+
|
|
100
|
+
\`WebSearch\` / \`WebFetch\` the venue's recent proceedings (ACM DL, IEEE Xplore, the venue program pages,
|
|
101
|
+
or arXiv copies). For the **deep-read** tier select **8-12 actually-accepted papers**, prioritizing:
|
|
102
|
+
1. Same **paper type** as yours (measurement / benchmark / SoK / empirical-critique / defense-eval).
|
|
103
|
+
2. Same **topic lane** (for a security venue: LLM/agent security, guardrail evaluation, jailbreak
|
|
104
|
+
robustness, "X is security theater"-style critiques).
|
|
105
|
+
3. Any **best-paper / award / highly-cited** ones — these are the calibrated top of the distribution.
|
|
106
|
+
|
|
107
|
+
For **each** paper, extract not just the contribution but **what made it strong** — the property a
|
|
108
|
+
reviewer would have written in the "strengths" box:
|
|
109
|
+
- adaptive / adversarial evaluation (an *adaptive attacker*, not just static perturbation);
|
|
110
|
+
- an explicit, scoped **threat model** stated up front;
|
|
111
|
+
- a **reusable, released artifact / dataset** (not a one-off script);
|
|
112
|
+
- **real-world grounding** (real incidents, real deployed tools, a real corpus vs hand-built toys);
|
|
113
|
+
- a **memorable framing or coined handle** that makes the paper travel (and get cited);
|
|
114
|
+
- **baseline comparisons** against the obvious prior defenses/benchmarks;
|
|
115
|
+
- **honest, self-aware limitations** that pre-empt the reviewer's objection.
|
|
116
|
+
|
|
117
|
+
Record each as a row: \`title | year | contribution | what made it STRONG\`. Never invent a paper or a
|
|
118
|
+
citation — if you can't verify it exists, drop it or mark it VERIFY.
|
|
119
|
+
|
|
120
|
+
## Step 3 — diff your draft against the pattern
|
|
121
|
+
|
|
122
|
+
Lay your draft's properties beside the strong-accept pattern from Step 2. For every property the strong
|
|
123
|
+
papers share that yours lacks or does weakly, that's a **lever**. Rank levers by how much *this venue's*
|
|
124
|
+
PC weights the axis (from Step 1's chairs/rubric), not by generic importance. For a security venue,
|
|
125
|
+
weight **adaptive evaluation** and **threat-model clarity** heavily — they are the usual difference
|
|
126
|
+
between 4/5 and 5/5, and the usual reason an empirical security paper is held at weak-accept.
|
|
127
|
+
|
|
128
|
+
## Step 4 — split levers CHEAP vs EXPENSIVE (respect the deadline and the anti-cram rule)
|
|
129
|
+
|
|
130
|
+
Every lever gets tagged:
|
|
131
|
+
- **CHEAP** — framing, prose, a reordered abstract, a coined handle, an explicit threat-model paragraph,
|
|
132
|
+
a missing-but-expected citation, promoting an existing number into the abstract, making an already-run
|
|
133
|
+
robustness result read as "adaptive". Safe to land days before a deadline.
|
|
134
|
+
- **EXPENSIVE** — needs new experiments, a bigger/external corpus, an actual adaptive-attacker study, a
|
|
135
|
+
new baseline run. These usually **do NOT belong in a near-done paper under deadline pressure** — the
|
|
136
|
+
anti-cram rule (two clean accepted works beat one overstuffed one) means an
|
|
137
|
+
expensive lever is normally an **\`extend-paper\` task for the follow-on**, not a pre-deadline edit.
|
|
138
|
+
Say so explicitly; don't let a tempting expensive lever destabilize a shippable Accept.
|
|
139
|
+
|
|
140
|
+
## Output
|
|
141
|
+
|
|
142
|
+
1. **Venue-bar summary** — what this venue rewards, its track requirements, its PC's taste (2-4 lines,
|
|
143
|
+
each sourced).
|
|
144
|
+
2. **Strong-accepted-paper table** — \`title | year | contribution | what made it STRONG\`, with URLs.
|
|
145
|
+
3. **Ranked levers for your draft** — each: the gap, the strong-paper precedent it's drawn from,
|
|
146
|
+
CHEAP/EXPENSIVE tag, and the concrete edit (or the extend-paper deferral). Most-impactful first.
|
|
147
|
+
4. **Citation gaps** — specific real papers (arXiv id / DOI) a reviewer at this venue would expect and
|
|
148
|
+
ding you for missing, each with why. Hand these to \`verify-citations\`.
|
|
149
|
+
5. **Corpus-level distribution** — the denominators, each traceable to the measurement file: how many
|
|
150
|
+
papers have a figure and the median count, how many report confidence intervals, how many run a
|
|
151
|
+
statistical test, how many have a control or placebo arm, section-length norms, abstract-length
|
|
152
|
+
range. **These are what change decisions**, because they say whether your draft is normal, an
|
|
153
|
+
outlier, or quietly ahead.
|
|
154
|
+
|
|
155
|
+
## 🔴 Where the output lives — three homes, and all three are required
|
|
156
|
+
|
|
157
|
+
A run that returns only a write-up has destroyed its own evidence. Observed on \`compile-rules-2026\`
|
|
158
|
+
2026-08-03: the pass measured 34 PDFs and returned excellent prose, and what survived into the repo
|
|
159
|
+
was **two scripts, 16 KB**. The corpus, the extracted text and the measurement table were in a
|
|
160
|
+
scratchpad that gets wiped. Every denominator in the write-up was, an hour later, unverifiable.
|
|
161
|
+
|
|
162
|
+
| home | what goes there | why there |
|
|
163
|
+
|---|---|---|
|
|
164
|
+
| **\`<paper-dir>/venue-corpus/\`** | \`measurements.json\` (one row per paper — the denominators' source) · \`text/*.txt\` (extractions: the quotable primary source) · the fetch/measure scripts · \`MANIFEST.md\` | data. **PDFs are NOT committed** — they regenerate from the proceedings; record the IDs and the command instead. Text extractions ARE committed: a few MB, and they are what makes a quote re-checkable. |
|
|
165
|
+
| **\`<paper-dir>/reviews/<date>-study-accepted-<venue>.md\`** | the full analysis: per-paper reading, the whole lever list, the reasoning | the record. **The EXPENSIVE levers are the \`extend-paper\` roadmap** and are worthless if they evaporate. |
|
|
166
|
+
| 🔴 **\`<paper-dir>/CLAUDE.md\`** | **the 3-5 findings that change decisions while writing**, plus an explicit "what NOT to do" | **it auto-loads whenever anyone works on this paper.** A finding in \`reviews/\` is read when someone goes looking; a finding here is read *every time the draft is edited*. That is the difference between knowing the venue's bar and applying it. |
|
|
167
|
+
|
|
168
|
+
Then link all three from \`PIPELINE-STATUS.md\` (**\`venuebar\`** row — "venue bar / levers", in SETUP).
|
|
169
|
+
|
|
170
|
+
**What belongs in \`<paper-dir>/CLAUDE.md\` and what does not.** It is not a summary of the analysis —
|
|
171
|
+
it is the operative subset: the structural mismatch to fix, the strength being under-sold, the norm
|
|
172
|
+
being violated, and the **things previously believed that the corpus disproved** (those are the most
|
|
173
|
+
valuable lines in the file, because without them the pipeline re-derives the wrong belief). Keep it
|
|
174
|
+
short enough that it survives being loaded into every session.
|
|
175
|
+
|
|
176
|
+
## Record the verdict
|
|
177
|
+
|
|
178
|
+
🔴 LAST step, once the deliverable exists:
|
|
179
|
+
|
|
180
|
+
\`\`\`
|
|
181
|
+
node .claude/skills/paper-pipeline/scripts/ledger.mjs record study-accepted-papers <paper-dir> FINDING <count> <report-path>
|
|
182
|
+
node .claude/skills/paper-pipeline/scripts/ledger.mjs record study-accepted-papers <paper-dir> ABSTAINED <reason> "<one line>"
|
|
183
|
+
\`\`\`
|
|
184
|
+
|
|
185
|
+
**FINDING** — \`<count>\` is the number of levers, \`<report-path>\` the ranked CHEAP/EXPENSIVE list.
|
|
186
|
+
Add \`--blocking\` when the draft is missing something the track *requires* (an artifact link, a named
|
|
187
|
+
benchmark, a metric definition): a desk-reject, never a weak accept, and worth the loudest thing
|
|
188
|
+
this skill can say.
|
|
189
|
+
**ABSTAINED** — \`no-witness\`: the corpus was read and no lever came out of it. \`input-missing\`: the
|
|
190
|
+
venue publishes no accepted papers to mine.
|
|
191
|
+
|
|
192
|
+
🔴 **There is no PASS**, and the reason is visible here. "The draft already sits at the venue's bar"
|
|
193
|
+
is only meaningful next to the corpus it was measured against — *33 of 34 accepted papers*, not
|
|
194
|
+
*most of them* — and a stored acquittal carried that denominator nowhere. Put the corpus size in the
|
|
195
|
+
\`ABSTAINED\` note and in the report; without it the row is an impression with a machine-readable
|
|
196
|
+
label on it.
|
|
197
|
+
|
|
198
|
+
## Rules
|
|
199
|
+
- **Fetch real accepted papers.** Never fabricate a title, author, or "what made it strong". Unverifiable → drop or mark VERIFY.
|
|
200
|
+
- **A lever-proposed citation is not written into the \`.tex\`/bib until \`verify-citations\` confirms it** (real
|
|
201
|
+
arXiv-id/DOI + correct author/title/venue). If added provisionally, mark \`% VERIFY\` at the cite site; a
|
|
202
|
+
surviving \`% VERIFY\` at submit is a bug. Order: propose → verify → then add — never propose → add.
|
|
203
|
+
- **"Accepted" is the reference, but "strong" is the target** — don't just describe what got in; isolate what got in *enthusiastically*. Awards and heavy citation are your calibration for the top end.
|
|
204
|
+
- **Venue-specific, not generic.** A lever only counts if it's grounded in this venue's rubric, PC taste, or its own accepted papers. Generic "tighten the writing" is out of scope (that's \`grade-paper-writing\` / \`tighten-paper\`).
|
|
205
|
+
- **Security venues:** treat adaptive-attacker evaluation and an explicit threat model as first-class — they are the most common weak-accept→strong-accept axis and the most common reviewer complaint.
|
|
206
|
+
- **Respect the anti-cram rule.** Flag expensive levers as extension material by default; protect a shippable Accept from deadline-driven destabilization.
|
|
207
|
+
- Convert any newly-surfaced deadline to the author's own zone and hand it to \`plan-paper-timeline\`.
|
|
208
|
+
|
|
209
|
+
## Compose with
|
|
210
|
+
- \`harden-paper\` — the multi-axis pre-submit gate; this skill feeds it the venue-specific axis (what *this* PC rewards) that a generic hardening pass misses.
|
|
211
|
+
- \`pc-panel-review\` / \`paper-adversarial-review\` — run those to red-team the draft; run this to learn the bar the red-team should hold it to. Complementary, not redundant.
|
|
212
|
+
- \`verify-citations\` — consumes the Step-4 citation gaps.
|
|
213
|
+
- \`extend-paper\` — the natural home for every EXPENSIVE lever this skill surfaces.
|
|
214
|
+
- \`submit-paper\` venue data card (\`submit-paper/references/venues/<venue>.md\`) — save durable venue-bar findings there as data, not as a new skill per venue.
|
|
215
|
+
|
|
216
|
+
## Provenance
|
|
217
|
+
Built from the **AISec 2026 @ ACM CCS** polish run (2026-07): the "Safety Theater in Agentic Coding /
|
|
218
|
+
GateBench" paper sat at ~Accept (pc-panel ~0.72), and the task was to find what would push it toward a
|
|
219
|
+
strong accept without cramming new contributions before the 2026-07-24 deadline. The workflow that
|
|
220
|
+
produced the levers — pull AISec's accepted measurement/benchmark security papers, isolate the
|
|
221
|
+
adaptive-evaluation + threat-model + reusable-artifact pattern that the strong ones share, then split
|
|
222
|
+
fixes into cheap-prose vs expensive-experiment — is exactly what this skill encodes.`,
|
|
223
|
+
});
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* study-accepted-papers — the PAID tier: does this skill's description actually fire?
|
|
3
|
+
*
|
|
4
|
+
* COLOCATED ON PURPOSE (vigiles decides coverage by placement as of 2026-08-11).
|
|
5
|
+
* The prompts live in `.claude/lib/skill-trigger-cases.mjs` so all 21 cases
|
|
6
|
+
* are reviewed as one table where collisions between siblings are visible;
|
|
7
|
+
* copying them here would recreate the drift that rule exists to prevent.
|
|
8
|
+
*
|
|
9
|
+
* Measures recall (fires on its own territory) AND precision (stays quiet on a
|
|
10
|
+
* colliding sibling's territory), against the REAL `.claude` harness so the skill
|
|
11
|
+
* competes with every other installed description — an isolated run overstates
|
|
12
|
+
* recall and understates false positives.
|
|
13
|
+
*
|
|
14
|
+
* Costs money; not CI.
|
|
15
|
+
* node .claude/skills/study-accepted-papers/study-accepted-papers.eval.mjs [trials]
|
|
16
|
+
*/
|
|
17
|
+
import { runSkillTriggerEval } from "../../lib/skill-eval-kit.mjs";
|
|
18
|
+
|
|
19
|
+
await runSkillTriggerEval("study-accepted-papers");
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* study-accepted-papers — the free, deterministic tier. No model, no network.
|
|
3
|
+
*
|
|
4
|
+
* COLOCATED ON PURPOSE. vigiles decides coverage by PLACEMENT as of 2026-08-11:
|
|
5
|
+
* a test that merely names a surface no longer counts, because that tier was
|
|
6
|
+
* crediting surfaces nothing touched. So each skill needs a file inside its own
|
|
7
|
+
* directory — this one.
|
|
8
|
+
*
|
|
9
|
+
* The assertions live in `.claude/lib/skill-checks.mjs` and are CALLED here with
|
|
10
|
+
* this skill's name. They are not copied: 22 copies of the same checks is the drift that
|
|
11
|
+
* module exists to avoid. (Until 2026-08-11 this was an env-var side channel into a
|
|
12
|
+
* 614-line file named after no surface; it is a function call now.)
|
|
13
|
+
*
|
|
14
|
+
* What this proves: this skill's frontmatter parses as strict YAML, its declared
|
|
15
|
+
* tool contract is sane, its pipeline wiring points at scripts that exist, and it
|
|
16
|
+
* announces/records under ITS OWN identity rather than a sibling's.
|
|
17
|
+
*
|
|
18
|
+
* What it does NOT prove: that the skill fires, or that its guidance produces a
|
|
19
|
+
* good result. Those need a real model — see `study-accepted-papers.eval.mjs`.
|
|
20
|
+
*/
|
|
21
|
+
import { checkSkill } from "../../lib/skill-checks.mjs";
|
|
22
|
+
|
|
23
|
+
await checkSkill("study-accepted-papers");
|