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,159 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: render-paper
|
|
3
|
+
description: Compile a LaTeX paper (ACM/IEEE/arXiv) to PDF and render its pages to high-DPI PNGs for mobile/on-screen review. Use whenever asked to "render / compile / show / screenshot" a .tex paper, or to produce phone-readable page images of a draft (e.g. ACM/IEEE workshop submissions). Encodes the toolchain + the gotchas already hit (font-expansion crash, filecontents bib, bibtex cycle).
|
|
4
|
+
allowed-tools: [Read, Write, Edit, Grep, Glob, Bash, SendUserFile]
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
<!-- vigiles:sha256:e8f75efdcbdd7890 compiled from skills/render-paper/SKILL.md.spec.ts -->
|
|
8
|
+
|
|
9
|
+
# render-paper — .tex → PDF → readable page PNGs
|
|
10
|
+
|
|
11
|
+
## Run me
|
|
12
|
+
|
|
13
|
+
🔴 FIRST, before any other step:
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
node .claude/skills/paper-pipeline/scripts/announce.mjs render-paper <paper-dir>
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
An advisory pass cannot be observed failing — silence is both its error state and its normal
|
|
20
|
+
state — so starting is an event, and events get written down.
|
|
21
|
+
|
|
22
|
+
Turns a LaTeX source into (a) a compiled PDF and (b) per-page PNG images crisp enough to read
|
|
23
|
+
the font on a phone. Encodes the exact toolchain and the failures already debugged, so it works
|
|
24
|
+
first try.
|
|
25
|
+
|
|
26
|
+
## 🔴 This is a COMMAND, not a stage
|
|
27
|
+
|
|
28
|
+
You run it twenty times a day. It has no position in the pipeline and nothing waits its turn to reach
|
|
29
|
+
it: **any `.tex` / `paper.md` edit is the trigger** — render, then eyeball pages 1–2 before believing
|
|
30
|
+
anything you say about the paper. Scorecard row **`render`** (in the CONTINUOUS section of
|
|
31
|
+
`paper-pipeline`) records the last render and its page count; that page count is the hard input the
|
|
32
|
+
`tighten-paper` structure gate is blocked on, which is the only sense in which anything "comes after"
|
|
33
|
+
this.
|
|
34
|
+
|
|
35
|
+
*It used to carry a number in a stage list, which made a compile look like a milestone you pass once.
|
|
36
|
+
That list was replaced on 2026-08-03; nothing about the toolchain below changed.*
|
|
37
|
+
|
|
38
|
+
## Toolchain (one command, not a checklist)
|
|
39
|
+
- **Compiler:** TeX Live, installed by paperlint with exactly the packages the venue profiles declare:
|
|
40
|
+
```
|
|
41
|
+
npx paperlint toolchain # into ~/.cache/rpp/texlive (RPP_TEXLIVE_DIR overrides); idempotent
|
|
42
|
+
npx paperlint toolchain --check # report what is missing, change nothing
|
|
43
|
+
```
|
|
44
|
+
Measured 2026-09-24: 3 min from an empty directory, 269 MB, TeX Live 2026, 47 packages verified
|
|
45
|
+
by `kpsewhich` against the files each profile names. The last line it prints is `bin: <dir>` —
|
|
46
|
+
put that directory first on PATH before calling `pdflatex` or `check-render.sh` by hand.
|
|
47
|
+
|
|
48
|
+
🔴 The package list lives in the venue profiles (`submit-paper/references/venues/*.jsonc`, the
|
|
49
|
+
`tex` block; `tex-base.jsonc` for every paper) and nowhere else. A new venue that needs a new
|
|
50
|
+
package gets it there — never in a script, never here. A TeX Live without `libertine` builds an
|
|
51
|
+
acmart paper GREEN in Computer Modern; that is why the files are checked, not the exit code.
|
|
52
|
+
- **Reading the PDF** needs nothing installed: `paperlint build` and `extract-pdf-facts.mjs` use pdf.js,
|
|
53
|
+
which comes with rpp. Page size, columns and font sizes come from banal (HotCRP's page-geometry
|
|
54
|
+
script), which `npx paperlint toolchain` installs and which runs on pdf.js output — it needs `perl`,
|
|
55
|
+
and no poppler. Without banal those facts are `null` and the build says so.
|
|
56
|
+
- **Renderer:** `pip install --quiet pymupdf` (system rasterizers and ghostscript are often missing or
|
|
57
|
+
404 on apt here; pymupdf is reliable). No `playwright install`, no external fetches.
|
|
58
|
+
|
|
59
|
+
## Compile (full bibtex cycle — needed or citations show as `[?]`)
|
|
60
|
+
```
|
|
61
|
+
npx paperlint build <paper-dir>
|
|
62
|
+
```
|
|
63
|
+
It picks a TeX Live that has every package the venue declares (paperlint's own, else one on PATH),
|
|
64
|
+
runs pdflatex and bibtex until the references settle, fails on an undefined `\ref`/`\cite`
|
|
65
|
+
through `paper-guards.tex`, then measures the PDF into `_build/paper.facts.json` (fonts, Type 3,
|
|
66
|
+
the last page's column heights). It judges nothing: a venue that needs a balanced last page turns
|
|
67
|
+
on the optional lint rule `pdf/last-page-balance` (see `docs/optional-rules.md` in the package). Without a
|
|
68
|
+
terminal and without a qualifying TeX Live it stops with one line naming `npx paperlint toolchain`.
|
|
69
|
+
Check the last log anyway: `grep -iE "Fatal|Output written" ` and
|
|
70
|
+
`grep -ciE "Undefined control|Citation.*undefined|Reference.*undefined"` (must be 0).
|
|
71
|
+
|
|
72
|
+
### MECHANICAL RENDER GATE (run this — do not just eyeball)
|
|
73
|
+
Eyeballing a page or two misses `Overfull \hbox` defects on later pages (text/tables bleeding
|
|
74
|
+
past the column into the margin — the #1 "wtf, formatting is broken" bug). LaTeX reports every one
|
|
75
|
+
in the `.log`; **`check-render.sh` parses them so it's a checked fact, not a hope:**
|
|
76
|
+
```
|
|
77
|
+
bash .claude/skills/render-paper/check-render.sh <paper-dir> [texbasename=paper] [threshold_pt=5]
|
|
78
|
+
```
|
|
79
|
+
It compiles, then FAILS (exit 1) on: any `Overfull \hbox` ≥ threshold (visible overflow), any
|
|
80
|
+
`Overfull \vbox`, or any undefined reference/citation/control-sequence. **A paper is not "renders
|
|
81
|
+
clean" until this exits 0.** Common fixes when it fails:
|
|
82
|
+
- **Long `\texttt{...}` / literal commands / URLs overflowing** → wrap in `\seqsplit{}`, or use
|
|
83
|
+
`\url{}` (breakable), or a `p{width}`/`>{\ttfamily\small}p{width}` table column instead of `l`,
|
|
84
|
+
or shrink the block with `\small`/`\footnotesize`.
|
|
85
|
+
- **Wide table** → `\small` + fixed-width `p{}` columns so cells wrap; or `\resizebox{\columnwidth}{!}{...}`.
|
|
86
|
+
- Re-run the gate until PASS.
|
|
87
|
+
|
|
88
|
+
## KNOWN GOTCHAS (already hit — apply proactively)
|
|
89
|
+
1. **`pdfTeX error (font expansion): auto expansion is only possible with scalable fonts`** — acmart +
|
|
90
|
+
microtype want Libertine outlines that `texlive-fonts-recommended` may lack. Fix: add
|
|
91
|
+
`\microtypesetup{expansion=false}` in the preamble (after `\documentclass`). This is the #1 crash.
|
|
92
|
+
2. **`Undefined control sequence \lesssim` / `\gtrsim`** — need `amssymb`; either `\usepackage{amssymb}`
|
|
93
|
+
or replace with `\le`/`\ge`.
|
|
94
|
+
3. **Bibliography via embedded `\begin{filecontents*}[overwrite]{refs.bib}...`** before
|
|
95
|
+
`\documentclass` works and keeps the paper one-file; still run the full bibtex cycle above.
|
|
96
|
+
⚠️ **The block IS the source of truth — it `overwrite`s `refs.bib` on every build.** Editing `refs.bib`
|
|
97
|
+
directly does nothing (regenerated away); fix citations INSIDE the filecontents block in the `.tex`.
|
|
98
|
+
Consider `.gitignore`-ing the generated `refs.bib` so it can't drift from the block.
|
|
99
|
+
4. **Double-blind:** ACM uses `\documentclass[sigconf,review,anonymous]{acmart}`; keep author
|
|
100
|
+
`Anonymous Author(s)` for the review PDF.
|
|
101
|
+
5. **`.gitignore`** the build junk (`*.aux *.log *.out *.bbl *.blg`); keep `paper.pdf` if you want it
|
|
102
|
+
version-controlled, else ignore it too.
|
|
103
|
+
6. **Multi-token shell commands in `\texttt{}` break at their internal space** — `\texttt{rm -rf}` can wrap
|
|
104
|
+
as `rm` ⏎ `-rf`, which reads as broken typesetting. This is a LEGAL break, so it raises **no** Overfull
|
|
105
|
+
warning and the render gate is blind to it. Fix: non-breaking ties — `\texttt{rm~-rf~/}` (or wrap in
|
|
106
|
+
`\mbox{}`). The space *before an argument* (`rm~-rf node\_modules`) stays breakable — only tie the
|
|
107
|
+
command tokens. `check-render.sh` now greps for a literal space inside `\texttt{…}` and warns.
|
|
108
|
+
7. **Page-limit / body-end: trust the RENDERED References-start page, NOT `\newlabel{tmpbodyend}` in the
|
|
109
|
+
`.aux`.** The aux label lags one compile (it reflects the *previous* build's pagination), so it triggers
|
|
110
|
+
false page-limit alarms — this session it read "p11" while the body genuinely ended on p10. To check the
|
|
111
|
+
body length: open the built PDF, find the page where the `\section*{References}`/`REFERENCES` heading
|
|
112
|
+
first appears (that page = last body page). `python3 -c "import fitz;d=fitz.open('paper.pdf');[print('refs p',i+1) for i in range(d.page_count) if 'REFERENCES' in d[i].get_text()][:1]"`. Never gate a page-limit decision on the aux value.
|
|
113
|
+
|
|
114
|
+
## Render pages to PNGs
|
|
115
|
+
```
|
|
116
|
+
python3 -c "import fitz; d=fitz.open('paper.pdf'); \
|
|
117
|
+
[d[i].get_pixmap(dpi=200).save(f'/<scratch>/p{i+1}.png') for i in range(d.page_count)]; \
|
|
118
|
+
print('rendered', d.page_count)"
|
|
119
|
+
```
|
|
120
|
+
- **DPI 200** = phone-readable (zoomable); use 150 for quick previews, 300 for print-check.
|
|
121
|
+
- Write PNGs to the session scratchpad, not the repo.
|
|
122
|
+
- **The mechanical gate above (`check-render.sh`) is the primary defense** for text/table overflow and
|
|
123
|
+
undefined refs — run it first, on the whole document, and get it to PASS.
|
|
124
|
+
- **Then eyeball EVERY page** (not just 1–2) for the defects the log CANNOT flag: **figure-internal
|
|
125
|
+
label collisions** (TikZ/pgfplots nodes overlapping axis labels or each other — e.g. a legend
|
|
126
|
+
landing on an axis tick), color/legibility, misaligned sub-figures. These do not raise an Overfull
|
|
127
|
+
warning, so a human scan of each figure is still required. Fix and re-render until clean.
|
|
128
|
+
|
|
129
|
+
## Deliver
|
|
130
|
+
- Send the PNGs with `SendUserFile` (`display: render`) so the user can read on phone; caption what
|
|
131
|
+
changed since the last render. Send the PDF too (`display: attach`) if they want the file.
|
|
132
|
+
|
|
133
|
+
## Record the verdict
|
|
134
|
+
|
|
135
|
+
🔴 LAST step, once the deliverable exists:
|
|
136
|
+
|
|
137
|
+
```
|
|
138
|
+
node .claude/skills/paper-pipeline/scripts/ledger.mjs record render-paper <paper-dir> FINDING <count> <report-path>
|
|
139
|
+
node .claude/skills/paper-pipeline/scripts/ledger.mjs record render-paper <paper-dir> ABSTAINED <reason> "<one line>"
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
🔴 **There is no PASS**, not even here, where the temptation is strongest — an exit code of 0 from
|
|
143
|
+
`check-render.sh` means the parser found no defect in the log, which is not the same as the page
|
|
144
|
+
being right, and the delivered-PDF check exists because that difference once put `7 x 10^13` on
|
|
145
|
+
page one.
|
|
146
|
+
|
|
147
|
+
**FINDING** — `check-render.sh` exited non-zero; `<count>` is Overfull boxes plus undefined
|
|
148
|
+
refs/citations and `<report-path>` is the log. Always `--blocking`: every one of these is a fact
|
|
149
|
+
about the artifact, never a matter of taste.
|
|
150
|
+
**ABSTAINED** — `no-witness`: it compiled and the log parser found nothing. `input-missing`: there
|
|
151
|
+
is no `.tex` to compile. `crashed`: no LaTeX toolchain on this machine, which must never be read
|
|
152
|
+
as a clean render.
|
|
153
|
+
|
|
154
|
+
It runs twenty times a day, so the ledger fills with rows, and that is fine: each row pins a page count
|
|
155
|
+
to a specific set of paper bytes, which is exactly what the `tighten-paper` structure gate is blocked
|
|
156
|
+
on and what a remembered page count keeps getting wrong.
|
|
157
|
+
|
|
158
|
+
## Compose with
|
|
159
|
+
- `paper-adversarial-review` / `pc-panel-review` (incl. its venue-fit mode) — review the rendered draft.
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
// Compiled to SKILL.md by `vigiles compile`. Edit THIS file, never the markdown.
|
|
2
|
+
//
|
|
3
|
+
// Adopted 2026-08-17 as part of the second batch. The body is the previous SKILL.md
|
|
4
|
+
// VERBATIM, so the compiled diff shows only what the compiler adds. No `disallowedTools`
|
|
5
|
+
// fence yet: the field exists on `SkillSpec` as of the branch `claude/skill-disallowed-tools`
|
|
6
|
+
// but is not in a release `mine` installs, so adding it here would not compile.
|
|
7
|
+
import { experimental_skill } from "vigiles/spec";
|
|
8
|
+
|
|
9
|
+
export default experimental_skill({
|
|
10
|
+
name: "render-paper",
|
|
11
|
+
description:
|
|
12
|
+
'Compile a LaTeX paper (ACM/IEEE/arXiv) to PDF and render its pages to high-DPI PNGs for mobile/on-screen review. Use whenever asked to "render / compile / show / screenshot" a .tex paper, or to produce phone-readable page images of a draft (e.g. ACM/IEEE workshop submissions). Encodes the toolchain + the gotchas already hit (font-expansion crash, filecontents bib, bibtex cycle).',
|
|
13
|
+
tools: ["Read", "Write", "Edit", "Grep", "Glob", "Bash", "SendUserFile"],
|
|
14
|
+
body: `
|
|
15
|
+
# render-paper — .tex → PDF → readable page PNGs
|
|
16
|
+
|
|
17
|
+
## Run me
|
|
18
|
+
|
|
19
|
+
🔴 FIRST, before any other step:
|
|
20
|
+
|
|
21
|
+
\`\`\`
|
|
22
|
+
node .claude/skills/paper-pipeline/scripts/announce.mjs render-paper <paper-dir>
|
|
23
|
+
\`\`\`
|
|
24
|
+
|
|
25
|
+
An advisory pass cannot be observed failing — silence is both its error state and its normal
|
|
26
|
+
state — so starting is an event, and events get written down.
|
|
27
|
+
|
|
28
|
+
Turns a LaTeX source into (a) a compiled PDF and (b) per-page PNG images crisp enough to read
|
|
29
|
+
the font on a phone. Encodes the exact toolchain and the failures already debugged, so it works
|
|
30
|
+
first try.
|
|
31
|
+
|
|
32
|
+
## 🔴 This is a COMMAND, not a stage
|
|
33
|
+
|
|
34
|
+
You run it twenty times a day. It has no position in the pipeline and nothing waits its turn to reach
|
|
35
|
+
it: **any \`.tex\` / \`paper.md\` edit is the trigger** — render, then eyeball pages 1–2 before believing
|
|
36
|
+
anything you say about the paper. Scorecard row **\`render\`** (in the CONTINUOUS section of
|
|
37
|
+
\`paper-pipeline\`) records the last render and its page count; that page count is the hard input the
|
|
38
|
+
\`tighten-paper\` structure gate is blocked on, which is the only sense in which anything "comes after"
|
|
39
|
+
this.
|
|
40
|
+
|
|
41
|
+
*It used to carry a number in a stage list, which made a compile look like a milestone you pass once.
|
|
42
|
+
That list was replaced on 2026-08-03; nothing about the toolchain below changed.*
|
|
43
|
+
|
|
44
|
+
## Toolchain (one command, not a checklist)
|
|
45
|
+
- **Compiler:** TeX Live, installed by paperlint with exactly the packages the venue profiles declare:
|
|
46
|
+
\`\`\`
|
|
47
|
+
npx paperlint toolchain # into ~/.cache/rpp/texlive (RPP_TEXLIVE_DIR overrides); idempotent
|
|
48
|
+
npx paperlint toolchain --check # report what is missing, change nothing
|
|
49
|
+
\`\`\`
|
|
50
|
+
Measured 2026-09-24: 3 min from an empty directory, 269 MB, TeX Live 2026, 47 packages verified
|
|
51
|
+
by \`kpsewhich\` against the files each profile names. The last line it prints is \`bin: <dir>\` —
|
|
52
|
+
put that directory first on PATH before calling \`pdflatex\` or \`check-render.sh\` by hand.
|
|
53
|
+
|
|
54
|
+
🔴 The package list lives in the venue profiles (\`submit-paper/references/venues/*.jsonc\`, the
|
|
55
|
+
\`tex\` block; \`tex-base.jsonc\` for every paper) and nowhere else. A new venue that needs a new
|
|
56
|
+
package gets it there — never in a script, never here. A TeX Live without \`libertine\` builds an
|
|
57
|
+
acmart paper GREEN in Computer Modern; that is why the files are checked, not the exit code.
|
|
58
|
+
- **Reading the PDF** needs nothing installed: \`paperlint build\` and \`extract-pdf-facts.mjs\` use pdf.js,
|
|
59
|
+
which comes with rpp. Page size, columns and font sizes come from banal (HotCRP's page-geometry
|
|
60
|
+
script), which \`npx paperlint toolchain\` installs and which runs on pdf.js output — it needs \`perl\`,
|
|
61
|
+
and no poppler. Without banal those facts are \`null\` and the build says so.
|
|
62
|
+
- **Renderer:** \`pip install --quiet pymupdf\` (system rasterizers and ghostscript are often missing or
|
|
63
|
+
404 on apt here; pymupdf is reliable). No \`playwright install\`, no external fetches.
|
|
64
|
+
|
|
65
|
+
## Compile (full bibtex cycle — needed or citations show as \`[?]\`)
|
|
66
|
+
\`\`\`
|
|
67
|
+
npx paperlint build <paper-dir>
|
|
68
|
+
\`\`\`
|
|
69
|
+
It picks a TeX Live that has every package the venue declares (paperlint's own, else one on PATH),
|
|
70
|
+
runs pdflatex and bibtex until the references settle, fails on an undefined \`\\ref\`/\`\\cite\`
|
|
71
|
+
through \`paper-guards.tex\`, then measures the PDF into \`_build/paper.facts.json\` (fonts, Type 3,
|
|
72
|
+
the last page's column heights). It judges nothing: a venue that needs a balanced last page turns
|
|
73
|
+
on the optional lint rule \`pdf/last-page-balance\` (see \`docs/optional-rules.md\` in the package). Without a
|
|
74
|
+
terminal and without a qualifying TeX Live it stops with one line naming \`npx paperlint toolchain\`.
|
|
75
|
+
Check the last log anyway: \`grep -iE "Fatal|Output written" \` and
|
|
76
|
+
\`grep -ciE "Undefined control|Citation.*undefined|Reference.*undefined"\` (must be 0).
|
|
77
|
+
|
|
78
|
+
### MECHANICAL RENDER GATE (run this — do not just eyeball)
|
|
79
|
+
Eyeballing a page or two misses \`Overfull \\hbox\` defects on later pages (text/tables bleeding
|
|
80
|
+
past the column into the margin — the #1 "wtf, formatting is broken" bug). LaTeX reports every one
|
|
81
|
+
in the \`.log\`; **\`check-render.sh\` parses them so it's a checked fact, not a hope:**
|
|
82
|
+
\`\`\`
|
|
83
|
+
bash .claude/skills/render-paper/check-render.sh <paper-dir> [texbasename=paper] [threshold_pt=5]
|
|
84
|
+
\`\`\`
|
|
85
|
+
It compiles, then FAILS (exit 1) on: any \`Overfull \\hbox\` ≥ threshold (visible overflow), any
|
|
86
|
+
\`Overfull \\vbox\`, or any undefined reference/citation/control-sequence. **A paper is not "renders
|
|
87
|
+
clean" until this exits 0.** Common fixes when it fails:
|
|
88
|
+
- **Long \`\\texttt{...}\` / literal commands / URLs overflowing** → wrap in \`\\seqsplit{}\`, or use
|
|
89
|
+
\`\\url{}\` (breakable), or a \`p{width}\`/\`>{\\ttfamily\\small}p{width}\` table column instead of \`l\`,
|
|
90
|
+
or shrink the block with \`\\small\`/\`\\footnotesize\`.
|
|
91
|
+
- **Wide table** → \`\\small\` + fixed-width \`p{}\` columns so cells wrap; or \`\\resizebox{\\columnwidth}{!}{...}\`.
|
|
92
|
+
- Re-run the gate until PASS.
|
|
93
|
+
|
|
94
|
+
## KNOWN GOTCHAS (already hit — apply proactively)
|
|
95
|
+
1. **\`pdfTeX error (font expansion): auto expansion is only possible with scalable fonts\`** — acmart +
|
|
96
|
+
microtype want Libertine outlines that \`texlive-fonts-recommended\` may lack. Fix: add
|
|
97
|
+
\`\\microtypesetup{expansion=false}\` in the preamble (after \`\\documentclass\`). This is the #1 crash.
|
|
98
|
+
2. **\`Undefined control sequence \\lesssim\` / \`\\gtrsim\`** — need \`amssymb\`; either \`\\usepackage{amssymb}\`
|
|
99
|
+
or replace with \`\\le\`/\`\\ge\`.
|
|
100
|
+
3. **Bibliography via embedded \`\\begin{filecontents*}[overwrite]{refs.bib}...\`** before
|
|
101
|
+
\`\\documentclass\` works and keeps the paper one-file; still run the full bibtex cycle above.
|
|
102
|
+
⚠️ **The block IS the source of truth — it \`overwrite\`s \`refs.bib\` on every build.** Editing \`refs.bib\`
|
|
103
|
+
directly does nothing (regenerated away); fix citations INSIDE the filecontents block in the \`.tex\`.
|
|
104
|
+
Consider \`.gitignore\`-ing the generated \`refs.bib\` so it can't drift from the block.
|
|
105
|
+
4. **Double-blind:** ACM uses \`\\documentclass[sigconf,review,anonymous]{acmart}\`; keep author
|
|
106
|
+
\`Anonymous Author(s)\` for the review PDF.
|
|
107
|
+
5. **\`.gitignore\`** the build junk (\`*.aux *.log *.out *.bbl *.blg\`); keep \`paper.pdf\` if you want it
|
|
108
|
+
version-controlled, else ignore it too.
|
|
109
|
+
6. **Multi-token shell commands in \`\\texttt{}\` break at their internal space** — \`\\texttt{rm -rf}\` can wrap
|
|
110
|
+
as \`rm\` ⏎ \`-rf\`, which reads as broken typesetting. This is a LEGAL break, so it raises **no** Overfull
|
|
111
|
+
warning and the render gate is blind to it. Fix: non-breaking ties — \`\\texttt{rm~-rf~/}\` (or wrap in
|
|
112
|
+
\`\\mbox{}\`). The space *before an argument* (\`rm~-rf node\\_modules\`) stays breakable — only tie the
|
|
113
|
+
command tokens. \`check-render.sh\` now greps for a literal space inside \`\\texttt{…}\` and warns.
|
|
114
|
+
7. **Page-limit / body-end: trust the RENDERED References-start page, NOT \`\\newlabel{tmpbodyend}\` in the
|
|
115
|
+
\`.aux\`.** The aux label lags one compile (it reflects the *previous* build's pagination), so it triggers
|
|
116
|
+
false page-limit alarms — this session it read "p11" while the body genuinely ended on p10. To check the
|
|
117
|
+
body length: open the built PDF, find the page where the \`\\section*{References}\`/\`REFERENCES\` heading
|
|
118
|
+
first appears (that page = last body page). \`python3 -c "import fitz;d=fitz.open('paper.pdf');[print('refs p',i+1) for i in range(d.page_count) if 'REFERENCES' in d[i].get_text()][:1]"\`. Never gate a page-limit decision on the aux value.
|
|
119
|
+
|
|
120
|
+
## Render pages to PNGs
|
|
121
|
+
\`\`\`
|
|
122
|
+
python3 -c "import fitz; d=fitz.open('paper.pdf'); \\
|
|
123
|
+
[d[i].get_pixmap(dpi=200).save(f'/<scratch>/p{i+1}.png') for i in range(d.page_count)]; \\
|
|
124
|
+
print('rendered', d.page_count)"
|
|
125
|
+
\`\`\`
|
|
126
|
+
- **DPI 200** = phone-readable (zoomable); use 150 for quick previews, 300 for print-check.
|
|
127
|
+
- Write PNGs to the session scratchpad, not the repo.
|
|
128
|
+
- **The mechanical gate above (\`check-render.sh\`) is the primary defense** for text/table overflow and
|
|
129
|
+
undefined refs — run it first, on the whole document, and get it to PASS.
|
|
130
|
+
- **Then eyeball EVERY page** (not just 1–2) for the defects the log CANNOT flag: **figure-internal
|
|
131
|
+
label collisions** (TikZ/pgfplots nodes overlapping axis labels or each other — e.g. a legend
|
|
132
|
+
landing on an axis tick), color/legibility, misaligned sub-figures. These do not raise an Overfull
|
|
133
|
+
warning, so a human scan of each figure is still required. Fix and re-render until clean.
|
|
134
|
+
|
|
135
|
+
## Deliver
|
|
136
|
+
- Send the PNGs with \`SendUserFile\` (\`display: render\`) so the user can read on phone; caption what
|
|
137
|
+
changed since the last render. Send the PDF too (\`display: attach\`) if they want the file.
|
|
138
|
+
|
|
139
|
+
## Record the verdict
|
|
140
|
+
|
|
141
|
+
🔴 LAST step, once the deliverable exists:
|
|
142
|
+
|
|
143
|
+
\`\`\`
|
|
144
|
+
node .claude/skills/paper-pipeline/scripts/ledger.mjs record render-paper <paper-dir> FINDING <count> <report-path>
|
|
145
|
+
node .claude/skills/paper-pipeline/scripts/ledger.mjs record render-paper <paper-dir> ABSTAINED <reason> "<one line>"
|
|
146
|
+
\`\`\`
|
|
147
|
+
|
|
148
|
+
🔴 **There is no PASS**, not even here, where the temptation is strongest — an exit code of 0 from
|
|
149
|
+
\`check-render.sh\` means the parser found no defect in the log, which is not the same as the page
|
|
150
|
+
being right, and the delivered-PDF check exists because that difference once put \`7 x 10^13\` on
|
|
151
|
+
page one.
|
|
152
|
+
|
|
153
|
+
**FINDING** — \`check-render.sh\` exited non-zero; \`<count>\` is Overfull boxes plus undefined
|
|
154
|
+
refs/citations and \`<report-path>\` is the log. Always \`--blocking\`: every one of these is a fact
|
|
155
|
+
about the artifact, never a matter of taste.
|
|
156
|
+
**ABSTAINED** — \`no-witness\`: it compiled and the log parser found nothing. \`input-missing\`: there
|
|
157
|
+
is no \`.tex\` to compile. \`crashed\`: no LaTeX toolchain on this machine, which must never be read
|
|
158
|
+
as a clean render.
|
|
159
|
+
|
|
160
|
+
It runs twenty times a day, so the ledger fills with rows, and that is fine: each row pins a page count
|
|
161
|
+
to a specific set of paper bytes, which is exactly what the \`tighten-paper\` structure gate is blocked
|
|
162
|
+
on and what a remembered page count keeps getting wrong.
|
|
163
|
+
|
|
164
|
+
## Compose with
|
|
165
|
+
- \`paper-adversarial-review\` / \`pc-panel-review\` (incl. its venue-fit mode) — review the rendered draft.`,
|
|
166
|
+
});
|