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,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* osf-artifact-upload — the free, deterministic tier. No model, no network, no OSF.
|
|
3
|
+
*
|
|
4
|
+
* WHY THIS ONE IS NOT A `checkSkill()` ONE-LINER. It carries no
|
|
5
|
+
* `announce.mjs <self>` line, so by the pipeline's own membership contract it is
|
|
6
|
+
* not a stage — it is a utility `submit-paper` composes with, and the shared
|
|
7
|
+
* per-skill checks would (correctly) reject it.
|
|
8
|
+
*
|
|
9
|
+
* WHAT IT CHECKS: the two rules this skill states about its OWN commands, in its
|
|
10
|
+
* own §gotchas — that every `curl` carries `-g` (bracketed OSF params glob and
|
|
11
|
+
* the request fails SILENTLY: empty body, no status) and `--cacert` (this
|
|
12
|
+
* environment's proxy). The rule and its violation would live in the same file
|
|
13
|
+
* three paragraphs apart, with nothing comparing them. That is `prose isn't
|
|
14
|
+
* policy` at its smallest, applied to us.
|
|
15
|
+
*
|
|
16
|
+
* 🔴 THIS FILE WAS ~100 LINES ON 2026-08-11 AND IS NOW ~30. The difference is not
|
|
17
|
+
* cleverness, it is that the parsing moved into vigiles (`commandsIn` /
|
|
18
|
+
* `mustInclude`, shipped the same day for this reason). What remains is the rule
|
|
19
|
+
* itself. That is the whole test of "mechanism in vigiles, data here": the
|
|
20
|
+
* markdown parsing, the prose-vs-command distinction and the message formatting
|
|
21
|
+
* are the same for anyone; the flags are ours.
|
|
22
|
+
*
|
|
23
|
+
* What it does NOT prove: that an upload works. That needs a live OSF project
|
|
24
|
+
* and a real token, deliberately out of scope.
|
|
25
|
+
*/
|
|
26
|
+
import { readFileSync } from "node:fs";
|
|
27
|
+
import { dirname, join } from "node:path";
|
|
28
|
+
import { fileURLToPath } from "node:url";
|
|
29
|
+
// ⚠️ `commandsIn`/`mustInclude` shipped AFTER vigiles 15.0.2. A test that simply
|
|
30
|
+
// threw on the import would read as "this skill is broken"; the honest state is
|
|
31
|
+
// "the check exists and its library is not here yet", so it SKIPS with exit 77 —
|
|
32
|
+
// the documented convention, which the runner surfaces as a loud ⊘ rather than a
|
|
33
|
+
// silent ✓. The guard stays even though 16.0.1 ships all three: it is what turns a
|
|
34
|
+
// future removal into a legible message instead of a stack trace.
|
|
35
|
+
//
|
|
36
|
+
// The subpath was `vigiles/testing` until v16 split the exports BY COST (#149) —
|
|
37
|
+
// free deterministic testing is now the root barrel, and anything that spends money
|
|
38
|
+
// lives in `vigiles/eval` behind a `paid_` prefix. These three are free.
|
|
39
|
+
const testing = await import("vigiles");
|
|
40
|
+
const { commandsIn, mustInclude, mustNotInclude, assertChecks, recordCheck } =
|
|
41
|
+
testing;
|
|
42
|
+
if (typeof commandsIn !== "function") {
|
|
43
|
+
console.log(
|
|
44
|
+
"⊘ SKIP osf-artifact-upload: needs `commandsIn`/`mustInclude` from vigiles " +
|
|
45
|
+
"(newer than the installed 15.0.2). The rules below are the test; only the " +
|
|
46
|
+
"library that evaluates them is missing.",
|
|
47
|
+
);
|
|
48
|
+
process.exit(77);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const src = readFileSync(
|
|
52
|
+
join(dirname(fileURLToPath(import.meta.url)), "SKILL.md"),
|
|
53
|
+
"utf-8",
|
|
54
|
+
);
|
|
55
|
+
const curls = commandsIn(src, /(^|[|;&]\s*)curl\b/);
|
|
56
|
+
|
|
57
|
+
assertChecks(curls, [
|
|
58
|
+
mustInclude(
|
|
59
|
+
"-g",
|
|
60
|
+
"the skill's own §gotchas: bracketed OSF params (?page[size]=50) glob and the " +
|
|
61
|
+
"request fails SILENTLY — empty body, no status code. Silent is why this is " +
|
|
62
|
+
"asserted rather than trusted.",
|
|
63
|
+
),
|
|
64
|
+
mustInclude(
|
|
65
|
+
"--cacert",
|
|
66
|
+
"the skill's own §gotchas: this environment's proxy needs the CA bundle on every curl.",
|
|
67
|
+
),
|
|
68
|
+
// Not stated in the file, and it should never need to be: this skill sends an
|
|
69
|
+
// OSF bearer token, so an example that disabled TLS verification would teach
|
|
70
|
+
// the agent to leak it on any hostile network.
|
|
71
|
+
mustNotInclude(
|
|
72
|
+
"-k",
|
|
73
|
+
"this skill sends a bearer token; -k/--insecure disables verification and hands it to any proxy.",
|
|
74
|
+
),
|
|
75
|
+
]);
|
|
76
|
+
|
|
77
|
+
// The token check has no home in the command vocabulary — it is about the file's
|
|
78
|
+
// prose, not its commands. The skill's own instruction is "NEVER commit it,
|
|
79
|
+
// never echo it", and this file IS committed.
|
|
80
|
+
const literal = /\b[0-9a-fA-F]{40,}\b/.exec(src);
|
|
81
|
+
if (literal)
|
|
82
|
+
throw new Error(
|
|
83
|
+
`a literal credential-shaped string is present (${literal[0].slice(0, 12)}…). ` +
|
|
84
|
+
`This skill's own text says "NEVER commit it, never echo it".`,
|
|
85
|
+
);
|
|
86
|
+
|
|
87
|
+
// 🔴 WITHOUT THIS THE RUNNER READS THIS FILE AS DOING NOTHING, and says so:
|
|
88
|
+
// `∅ 0 CHECKS (it ran clean and verified nothing)` — and exits 1 on it, which is
|
|
89
|
+
// the whole job red. Everything above DOES assert; it just asserts through
|
|
90
|
+
// `assertChecks` and a thrown Error, neither of which increments the counter the
|
|
91
|
+
// runner reads. So the file was simultaneously the strictest thing here (it is the
|
|
92
|
+
// only guard standing between a bearer token and `-k`) and the reason CI was red.
|
|
93
|
+
//
|
|
94
|
+
// `recordCheck` exists for exactly this — its own doc says to call it "when you
|
|
95
|
+
// assert some OTHER way … instead of leaving it to conclude the file did nothing".
|
|
96
|
+
// Counted, not guessed: three command properties (-g, --cacert, no -k) across the
|
|
97
|
+
// curls, plus the one credential check over the file.
|
|
98
|
+
recordCheck(3 * curls.length + 1);
|
|
99
|
+
|
|
100
|
+
console.log(
|
|
101
|
+
`✓ osf-artifact-upload: ${String(curls.length)} curl command(s) carry -g and --cacert, ` +
|
|
102
|
+
`none disable TLS, no pasted credential`,
|
|
103
|
+
);
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: paper-adversarial-review
|
|
3
|
+
description: Use when asking "red-team this paper" / "what would Reviewer 2 attack?" / "find the weaknesses before I submit" — ONE fast hostile-but-fair review of a paper draft. Surfaces overclaims, methodology holes, missing baselines/citations, novelty concerns, threats to validity, and desk-reject risks, with concrete fixes, led by a multi-axis 1–5 scorecard whose card composes into a pc-panel-review panel. NOT the multi-reviewer accept/reject decision (pc-panel-review), a writing grade (grade-paper-writing — this skill consumes its stall inventory rather than re-grading prose), or the full pre-submit gate (harden-paper). Especially for security and agentic-coding measurement papers.
|
|
4
|
+
context: fork
|
|
5
|
+
allowed-tools: [Read, Write, Grep, Glob, Agent, Skill, Bash(node .claude/skills/paper-pipeline/scripts/announce.mjs:*), Bash(node .claude/skills/paper-pipeline/scripts/ledger.mjs:*)]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
<!-- vigiles:sha256:2da081a03ae7fee3 compiled from skills/paper-adversarial-review/SKILL.md.spec.ts -->
|
|
9
|
+
|
|
10
|
+
# paper-adversarial-review — be the reviewer who wants to reject it
|
|
11
|
+
|
|
12
|
+
> **Which review skill?** `paper-adversarial-review` (you are here) = one hostile reviewer, fast defect
|
|
13
|
+
> hunt. `pc-panel-review` = the whole PC (N independent lenses incl. an artifact-runner) + a chair
|
|
14
|
+
> meta-review — the real pre-submission GATE, run LAST; its **venue-fit mode** is the one-reviewer
|
|
15
|
+
> CFP-fit score (formerly `venue-review-sim`). Reach for an atom (this, or venue-fit mode) for a quick
|
|
16
|
+
> spot-check; run the panel for the decision.
|
|
17
|
+
|
|
18
|
+
## Run me
|
|
19
|
+
|
|
20
|
+
🔴 FIRST, before any other step:
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
node .claude/skills/paper-pipeline/scripts/announce.mjs paper-adversarial-review <paper-dir>
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
An advisory pass cannot be observed failing — silence is both its error state and its normal
|
|
27
|
+
state — so starting is an event, and events get written down.
|
|
28
|
+
|
|
29
|
+
Purpose: catch what a real peer reviewer will hit, while it's still fixable. Peer review is
|
|
30
|
+
**read, not run** — reviewers judge the *text, figures, and reported numbers*, rarely execute code.
|
|
31
|
+
So the paper must be self-contained and airtight on its face. This skill simulates the skeptical
|
|
32
|
+
reviewer and returns an actionable critique.
|
|
33
|
+
|
|
34
|
+
## How to run it
|
|
35
|
+
Prefer a **separate model as the reviewer** (e.g. Fable via a subagent) so it's not the author
|
|
36
|
+
grading itself. Give the reviewer the full paper text (Read the `.tex`/`.md`/PDF) and the target
|
|
37
|
+
venue + paper type (short/full/position/benchmark). Ask for the structured output below.
|
|
38
|
+
|
|
39
|
+
## The review must cover (ranked by how often it kills a paper)
|
|
40
|
+
|
|
41
|
+
1. **"So what / is this enough?" (contribution & novelty).** State the single contribution in one
|
|
42
|
+
sentence. Is it enough for *this venue and paper type*? Distinguish: a **methodology/benchmark**
|
|
43
|
+
contribution (a reusable way to measure X) vs a **result** ("tool Y is bad") — the former survives
|
|
44
|
+
review, the latter reads as a blog post. If the paper is really "X doesn't work," is the
|
|
45
|
+
*method/finding* generalizable beyond the one target? Name the weakest framing and the strongest
|
|
46
|
+
available reframing.
|
|
47
|
+
2. **Overclaims.** Every sentence stronger than the evidence. Hunt for: absolutes, causal claims from
|
|
48
|
+
correlational data, "always/never," headline numbers not backed by the reported stats, a title that
|
|
49
|
+
promises more than the body delivers. For each hit, propose the fix by the **review-ratchet rule** —
|
|
50
|
+
tighten → cut → move to Threats → only then inline-hedge, and run `tighten-paper` after the round to
|
|
51
|
+
strip what it deposited. Full rule: `paper-pipeline/references/review-ratchet.md`.
|
|
52
|
+
3. **Methodology holes a reviewer will poke.** Missing baseline, sample size / power, confounds,
|
|
53
|
+
cherry-picked tasks, unfair comparison, statistics misused (n, variance, multiple comparisons),
|
|
54
|
+
reproducibility gaps. For measurement papers: construct validity — are you measuring what you claim?
|
|
55
|
+
4. **Threats to validity — are they honest and complete?** What did the authors *not* list that a
|
|
56
|
+
reviewer will? Adaptive attackers, generalization, single-model/single-dataset, convenience sample.
|
|
57
|
+
5. **Related work gaps.** What obvious prior work is uncited? Would a reviewer say "this was already
|
|
58
|
+
done by ___"? Is the delta over the nearest neighbor explicit?
|
|
59
|
+
6. **Presentation / desk-reject risks.** Over/under length, format (ACM/IEEE), anonymization for
|
|
60
|
+
double-blind (self-citations, repo links, "our tool X" naming that de-anonymizes), figures
|
|
61
|
+
unreadable, tables inconsistent with text, TMI/self-indulgent passages that waste a short paper's
|
|
62
|
+
space.
|
|
63
|
+
6b. **Readability's implicit drag (the halo effect) — CONSUME the persona inventory, don't re-run the
|
|
64
|
+
pass.** A reviewer who finds the paper a slog loses confidence in the *science* and marks it down
|
|
65
|
+
overall, usually citing "methodology" rather than "writing." This skill's unique job here is to model
|
|
66
|
+
that drag on the OVERALL score — NOT to judge readability by its own read: a frontier reviewer knows
|
|
67
|
+
every term and cannot experience reader fatigue, so an inline cold-read (no persona, no per-section
|
|
68
|
+
chunking, no mechanical triggers, no hard caps) systematically under-fires — exactly the config that
|
|
69
|
+
once waved a bloated paper through. Take `grade-paper-writing`'s PERSONA stall inventory + scorecard
|
|
70
|
+
as the input — **if none exists for this draft, spawn `grade-paper-writing` first** — and state how
|
|
71
|
+
much the writing, per that inventory (stall density, walls, spec-sheet paragraphs), would drag a
|
|
72
|
+
real reviewer's overall score. Bad writing is a silent score-killer, not just a desk-reject flag.
|
|
73
|
+
7. **Ethics / responsible-disclosure / tone** (security & measurement papers). Naming small hobbyist
|
|
74
|
+
projects as "insecure/broken" = punching down + disclosure risk → prefer aggregate stats + one
|
|
75
|
+
representative named example. Dunk on the *claim*, credit the *humans*. Flag any hater-tone.
|
|
76
|
+
|
|
77
|
+
## Output format
|
|
78
|
+
- **Scorecard (lead with this) — every axis, 1–5, one-line why each.** A graded card, not just prose, so
|
|
79
|
+
a weak axis is visible at a glance (e.g. "Readability 2/5 — abstract is a stat-wall, point arrives on
|
|
80
|
+
p.3"). Score all of: **Novelty/contribution · Technical rigor/methodology · Evidence strength** (stats,
|
|
81
|
+
sample size, baselines; for security: adaptive-attacker eval + threat model) **· Positioning/related
|
|
82
|
+
work** (delta over nearest neighbor) **· Readability/prose** (pull from `grade-paper-writing`'s rubric)
|
|
83
|
+
**· Reproducibility/artifact · Honesty/claim-scoping** (overclaim vs hedged) **· Presentation/desk-reject
|
|
84
|
+
risk**. End with an **Overall 1–5**. Keep the same 1–5 scale the other skills use so cards compose into a
|
|
85
|
+
`pc-panel-review` panel; the lowest 1–2 axes are the real story, not the average.
|
|
86
|
+
- **Verdict leaning:** (strong accept / weak accept / borderline / weak reject / reject) + one-line why.
|
|
87
|
+
- **The one contribution, in one sentence** (as a reviewer would paraphrase it — often less than the authors think).
|
|
88
|
+
- **Top 5 weaknesses, ranked**, each: the attack (how a reviewer phrases it) → severity → concrete fix.
|
|
89
|
+
- **Line/section-level nits** (overclaims, TMI, inconsistencies) as a checklist.
|
|
90
|
+
- **Missing citations** (specific, real — do not invent).
|
|
91
|
+
- **Strongest reframing** if the contribution is undersold or misframed.
|
|
92
|
+
- **What to cut** (for length / TMI) and **what to add** (for soundness).
|
|
93
|
+
|
|
94
|
+
## Record the verdict
|
|
95
|
+
|
|
96
|
+
🔴 LAST step, once the deliverable exists:
|
|
97
|
+
|
|
98
|
+
```
|
|
99
|
+
node .claude/skills/paper-pipeline/scripts/ledger.mjs record paper-adversarial-review <paper-dir> FINDING <count> <report-path>
|
|
100
|
+
node .claude/skills/paper-pipeline/scripts/ledger.mjs record paper-adversarial-review <paper-dir> ABSTAINED <reason> "<one line>"
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
**FINDING** — `<count>` is the number of ranked weaknesses, `<report-path>` the review with its
|
|
104
|
+
scorecard. Add `--blocking` when the leaning is reject, or there is a live desk-reject risk.
|
|
105
|
+
**ABSTAINED** — `no-witness`: the hostile read found nothing. `blocked`: there was no rendered
|
|
106
|
+
draft to attack.
|
|
107
|
+
|
|
108
|
+
🔴 **There is no PASS, and this skill is the reason the word was dangerous.** A hostile read that
|
|
109
|
+
found nothing either met a very good paper or was not hostile, and the old vocabulary wrote the
|
|
110
|
+
same word for both. `no-witness` says the true thing — this reader has no witness for the paper
|
|
111
|
+
being sound — and leaves the second possibility standing where it belongs, in view.
|
|
112
|
+
|
|
113
|
+
Record the weakness count, not the Overall 1–5. The average is exactly what this skill tells its own
|
|
114
|
+
reviewer to distrust — the lowest one or two axes are the story.
|
|
115
|
+
|
|
116
|
+
## Rules
|
|
117
|
+
- Be adversarial but *fair* and *specific* — "weak" is useless; "the 65% claim in the abstract isn't
|
|
118
|
+
supported because the pooled bill is −1%, reword to X" is useful.
|
|
119
|
+
- Do **not** fabricate citations or facts. If unsure a paper exists, say "verify."
|
|
120
|
+
- Undersell nothing to spare feelings; the point is to fail it now, not at the venue.
|
|
121
|
+
- If the paper is genuinely strong, say so — don't manufacture problems.
|
|
122
|
+
|
|
123
|
+
## Compose with
|
|
124
|
+
- `grade-paper-writing` — the Readability/prose axis of the scorecard defers to its 9-dim rubric; run it for the sentence-level fixes behind a low readability score.
|
|
125
|
+
- `pc-panel-review` — this atom's scorecard is one reviewer's card; the panel aggregates N of them (same 1–5 scale) into the decision.
|
|
126
|
+
- The venue CFP (fit/format). Prose QA for papers routes to `grade-paper-writing` + `paper-pipeline/references/writing-craft.md` — NOT the site repo's `writing-quality` / `audience-test` skills (those are for blog posts only; the paper suite's persona pass supersedes them here).
|
|
@@ -0,0 +1,142 @@
|
|
|
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: "paper-adversarial-review",
|
|
11
|
+
description:
|
|
12
|
+
'Use when asking "red-team this paper" / "what would Reviewer 2 attack?" / "find the weaknesses before I submit" — ONE fast hostile-but-fair review of a paper draft. Surfaces overclaims, methodology holes, missing baselines/citations, novelty concerns, threats to validity, and desk-reject risks, with concrete fixes, led by a multi-axis 1–5 scorecard whose card composes into a pc-panel-review panel. NOT the multi-reviewer accept/reject decision (pc-panel-review), a writing grade (grade-paper-writing — this skill consumes its stall inventory rather than re-grading prose), or the full pre-submit gate (harden-paper). Especially for security and agentic-coding measurement papers.',
|
|
13
|
+
context: "fork",
|
|
14
|
+
tools: [
|
|
15
|
+
"Read",
|
|
16
|
+
"Write",
|
|
17
|
+
"Grep",
|
|
18
|
+
"Glob",
|
|
19
|
+
"Agent",
|
|
20
|
+
"Skill",
|
|
21
|
+
"Bash(node .claude/skills/paper-pipeline/scripts/announce.mjs:*)",
|
|
22
|
+
"Bash(node .claude/skills/paper-pipeline/scripts/ledger.mjs:*)",
|
|
23
|
+
],
|
|
24
|
+
body: `
|
|
25
|
+
# paper-adversarial-review — be the reviewer who wants to reject it
|
|
26
|
+
|
|
27
|
+
> **Which review skill?** \`paper-adversarial-review\` (you are here) = one hostile reviewer, fast defect
|
|
28
|
+
> hunt. \`pc-panel-review\` = the whole PC (N independent lenses incl. an artifact-runner) + a chair
|
|
29
|
+
> meta-review — the real pre-submission GATE, run LAST; its **venue-fit mode** is the one-reviewer
|
|
30
|
+
> CFP-fit score (formerly \`venue-review-sim\`). Reach for an atom (this, or venue-fit mode) for a quick
|
|
31
|
+
> spot-check; run the panel for the decision.
|
|
32
|
+
|
|
33
|
+
## Run me
|
|
34
|
+
|
|
35
|
+
🔴 FIRST, before any other step:
|
|
36
|
+
|
|
37
|
+
\`\`\`
|
|
38
|
+
node .claude/skills/paper-pipeline/scripts/announce.mjs paper-adversarial-review <paper-dir>
|
|
39
|
+
\`\`\`
|
|
40
|
+
|
|
41
|
+
An advisory pass cannot be observed failing — silence is both its error state and its normal
|
|
42
|
+
state — so starting is an event, and events get written down.
|
|
43
|
+
|
|
44
|
+
Purpose: catch what a real peer reviewer will hit, while it's still fixable. Peer review is
|
|
45
|
+
**read, not run** — reviewers judge the *text, figures, and reported numbers*, rarely execute code.
|
|
46
|
+
So the paper must be self-contained and airtight on its face. This skill simulates the skeptical
|
|
47
|
+
reviewer and returns an actionable critique.
|
|
48
|
+
|
|
49
|
+
## How to run it
|
|
50
|
+
Prefer a **separate model as the reviewer** (e.g. Fable via a subagent) so it's not the author
|
|
51
|
+
grading itself. Give the reviewer the full paper text (Read the \`.tex\`/\`.md\`/PDF) and the target
|
|
52
|
+
venue + paper type (short/full/position/benchmark). Ask for the structured output below.
|
|
53
|
+
|
|
54
|
+
## The review must cover (ranked by how often it kills a paper)
|
|
55
|
+
|
|
56
|
+
1. **"So what / is this enough?" (contribution & novelty).** State the single contribution in one
|
|
57
|
+
sentence. Is it enough for *this venue and paper type*? Distinguish: a **methodology/benchmark**
|
|
58
|
+
contribution (a reusable way to measure X) vs a **result** ("tool Y is bad") — the former survives
|
|
59
|
+
review, the latter reads as a blog post. If the paper is really "X doesn't work," is the
|
|
60
|
+
*method/finding* generalizable beyond the one target? Name the weakest framing and the strongest
|
|
61
|
+
available reframing.
|
|
62
|
+
2. **Overclaims.** Every sentence stronger than the evidence. Hunt for: absolutes, causal claims from
|
|
63
|
+
correlational data, "always/never," headline numbers not backed by the reported stats, a title that
|
|
64
|
+
promises more than the body delivers. For each hit, propose the fix by the **review-ratchet rule** —
|
|
65
|
+
tighten → cut → move to Threats → only then inline-hedge, and run \`tighten-paper\` after the round to
|
|
66
|
+
strip what it deposited. Full rule: \`paper-pipeline/references/review-ratchet.md\`.
|
|
67
|
+
3. **Methodology holes a reviewer will poke.** Missing baseline, sample size / power, confounds,
|
|
68
|
+
cherry-picked tasks, unfair comparison, statistics misused (n, variance, multiple comparisons),
|
|
69
|
+
reproducibility gaps. For measurement papers: construct validity — are you measuring what you claim?
|
|
70
|
+
4. **Threats to validity — are they honest and complete?** What did the authors *not* list that a
|
|
71
|
+
reviewer will? Adaptive attackers, generalization, single-model/single-dataset, convenience sample.
|
|
72
|
+
5. **Related work gaps.** What obvious prior work is uncited? Would a reviewer say "this was already
|
|
73
|
+
done by ___"? Is the delta over the nearest neighbor explicit?
|
|
74
|
+
6. **Presentation / desk-reject risks.** Over/under length, format (ACM/IEEE), anonymization for
|
|
75
|
+
double-blind (self-citations, repo links, "our tool X" naming that de-anonymizes), figures
|
|
76
|
+
unreadable, tables inconsistent with text, TMI/self-indulgent passages that waste a short paper's
|
|
77
|
+
space.
|
|
78
|
+
6b. **Readability's implicit drag (the halo effect) — CONSUME the persona inventory, don't re-run the
|
|
79
|
+
pass.** A reviewer who finds the paper a slog loses confidence in the *science* and marks it down
|
|
80
|
+
overall, usually citing "methodology" rather than "writing." This skill's unique job here is to model
|
|
81
|
+
that drag on the OVERALL score — NOT to judge readability by its own read: a frontier reviewer knows
|
|
82
|
+
every term and cannot experience reader fatigue, so an inline cold-read (no persona, no per-section
|
|
83
|
+
chunking, no mechanical triggers, no hard caps) systematically under-fires — exactly the config that
|
|
84
|
+
once waved a bloated paper through. Take \`grade-paper-writing\`'s PERSONA stall inventory + scorecard
|
|
85
|
+
as the input — **if none exists for this draft, spawn \`grade-paper-writing\` first** — and state how
|
|
86
|
+
much the writing, per that inventory (stall density, walls, spec-sheet paragraphs), would drag a
|
|
87
|
+
real reviewer's overall score. Bad writing is a silent score-killer, not just a desk-reject flag.
|
|
88
|
+
7. **Ethics / responsible-disclosure / tone** (security & measurement papers). Naming small hobbyist
|
|
89
|
+
projects as "insecure/broken" = punching down + disclosure risk → prefer aggregate stats + one
|
|
90
|
+
representative named example. Dunk on the *claim*, credit the *humans*. Flag any hater-tone.
|
|
91
|
+
|
|
92
|
+
## Output format
|
|
93
|
+
- **Scorecard (lead with this) — every axis, 1–5, one-line why each.** A graded card, not just prose, so
|
|
94
|
+
a weak axis is visible at a glance (e.g. "Readability 2/5 — abstract is a stat-wall, point arrives on
|
|
95
|
+
p.3"). Score all of: **Novelty/contribution · Technical rigor/methodology · Evidence strength** (stats,
|
|
96
|
+
sample size, baselines; for security: adaptive-attacker eval + threat model) **· Positioning/related
|
|
97
|
+
work** (delta over nearest neighbor) **· Readability/prose** (pull from \`grade-paper-writing\`'s rubric)
|
|
98
|
+
**· Reproducibility/artifact · Honesty/claim-scoping** (overclaim vs hedged) **· Presentation/desk-reject
|
|
99
|
+
risk**. End with an **Overall 1–5**. Keep the same 1–5 scale the other skills use so cards compose into a
|
|
100
|
+
\`pc-panel-review\` panel; the lowest 1–2 axes are the real story, not the average.
|
|
101
|
+
- **Verdict leaning:** (strong accept / weak accept / borderline / weak reject / reject) + one-line why.
|
|
102
|
+
- **The one contribution, in one sentence** (as a reviewer would paraphrase it — often less than the authors think).
|
|
103
|
+
- **Top 5 weaknesses, ranked**, each: the attack (how a reviewer phrases it) → severity → concrete fix.
|
|
104
|
+
- **Line/section-level nits** (overclaims, TMI, inconsistencies) as a checklist.
|
|
105
|
+
- **Missing citations** (specific, real — do not invent).
|
|
106
|
+
- **Strongest reframing** if the contribution is undersold or misframed.
|
|
107
|
+
- **What to cut** (for length / TMI) and **what to add** (for soundness).
|
|
108
|
+
|
|
109
|
+
## Record the verdict
|
|
110
|
+
|
|
111
|
+
🔴 LAST step, once the deliverable exists:
|
|
112
|
+
|
|
113
|
+
\`\`\`
|
|
114
|
+
node .claude/skills/paper-pipeline/scripts/ledger.mjs record paper-adversarial-review <paper-dir> FINDING <count> <report-path>
|
|
115
|
+
node .claude/skills/paper-pipeline/scripts/ledger.mjs record paper-adversarial-review <paper-dir> ABSTAINED <reason> "<one line>"
|
|
116
|
+
\`\`\`
|
|
117
|
+
|
|
118
|
+
**FINDING** — \`<count>\` is the number of ranked weaknesses, \`<report-path>\` the review with its
|
|
119
|
+
scorecard. Add \`--blocking\` when the leaning is reject, or there is a live desk-reject risk.
|
|
120
|
+
**ABSTAINED** — \`no-witness\`: the hostile read found nothing. \`blocked\`: there was no rendered
|
|
121
|
+
draft to attack.
|
|
122
|
+
|
|
123
|
+
🔴 **There is no PASS, and this skill is the reason the word was dangerous.** A hostile read that
|
|
124
|
+
found nothing either met a very good paper or was not hostile, and the old vocabulary wrote the
|
|
125
|
+
same word for both. \`no-witness\` says the true thing — this reader has no witness for the paper
|
|
126
|
+
being sound — and leaves the second possibility standing where it belongs, in view.
|
|
127
|
+
|
|
128
|
+
Record the weakness count, not the Overall 1–5. The average is exactly what this skill tells its own
|
|
129
|
+
reviewer to distrust — the lowest one or two axes are the story.
|
|
130
|
+
|
|
131
|
+
## Rules
|
|
132
|
+
- Be adversarial but *fair* and *specific* — "weak" is useless; "the 65% claim in the abstract isn't
|
|
133
|
+
supported because the pooled bill is −1%, reword to X" is useful.
|
|
134
|
+
- Do **not** fabricate citations or facts. If unsure a paper exists, say "verify."
|
|
135
|
+
- Undersell nothing to spare feelings; the point is to fail it now, not at the venue.
|
|
136
|
+
- If the paper is genuinely strong, say so — don't manufacture problems.
|
|
137
|
+
|
|
138
|
+
## Compose with
|
|
139
|
+
- \`grade-paper-writing\` — the Readability/prose axis of the scorecard defers to its 9-dim rubric; run it for the sentence-level fixes behind a low readability score.
|
|
140
|
+
- \`pc-panel-review\` — this atom's scorecard is one reviewer's card; the panel aggregates N of them (same 1–5 scale) into the decision.
|
|
141
|
+
- The venue CFP (fit/format). Prose QA for papers routes to \`grade-paper-writing\` + \`paper-pipeline/references/writing-craft.md\` — NOT the site repo's \`writing-quality\` / \`audience-test\` skills (those are for blog posts only; the paper suite's persona pass supersedes them here).`,
|
|
142
|
+
});
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* paper-adversarial-review — 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/paper-adversarial-review/paper-adversarial-review.eval.mjs [trials]
|
|
16
|
+
*/
|
|
17
|
+
import { runSkillTriggerEval } from "../../lib/skill-eval-kit.mjs";
|
|
18
|
+
|
|
19
|
+
await runSkillTriggerEval("paper-adversarial-review");
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* paper-adversarial-review — 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 `paper-adversarial-review.eval.mjs`.
|
|
20
|
+
*/
|
|
21
|
+
import { checkSkill } from "../../lib/skill-checks.mjs";
|
|
22
|
+
|
|
23
|
+
await checkSkill("paper-adversarial-review");
|