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,371 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Paper pipeline map โ what runs where"
|
|
3
|
+
created: 2026-08-26
|
|
4
|
+
updated: 2026-08-26
|
|
5
|
+
tags: [paper-pipeline, ci, hooks, map]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# What runs where: the pipeline map
|
|
9
|
+
|
|
10
|
+
Assembled 2026-08-26 **from facts** โ `.claude/settings.json` and
|
|
11
|
+
`.github/workflows/paper-gates.yml` โ not from memory. Occasion (translated from Russian): "I have
|
|
12
|
+
no fucking idea how the pipeline works right now."
|
|
13
|
+
|
|
14
|
+
> โญ **How to build checks** (the ladder, occupancy across 14 tools, measurements) โ
|
|
15
|
+
> in the author's private notes: `<papers-root>/research/2026-08-26-sessiya-arhitektura-payplayna.md`
|
|
16
|
+
|
|
17
|
+
## Four tiers, and they fire at different times
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
โโ TIER 1: WHILE WRITING โโโโโโโโโโโโโโโโโโโโโโ instant, in-session โโโ
|
|
21
|
+
โ โ
|
|
22
|
+
โ you edit paper.md / paper.tex โ
|
|
23
|
+
โ โ โ
|
|
24
|
+
โ โโ PreToolUse โ paper-lint pre ๐ THE ONLY BLOCKER โ
|
|
25
|
+
โ โ paragraph >200 words ยท โฅ9 numbers ยท โ
|
|
26
|
+
โ โ sentence >55 words ยท refuses the edit โ
|
|
27
|
+
โ โ outright โ
|
|
28
|
+
โ โ โ
|
|
29
|
+
โ โโ PreToolUse โ paper-edit-guard ๐ a write from Bash โ
|
|
30
|
+
โ โ (bypassing PostToolUse gates) โ deny โ
|
|
31
|
+
โ โ โ
|
|
32
|
+
โ โโ PostToolUse โ paper-lint post โ ๏ธ nudges only โ
|
|
33
|
+
โ plain-language ยท carries: ยท SHAVE โ
|
|
34
|
+
โ prose-lint ยท the numbers gate โ
|
|
35
|
+
โ โ
|
|
36
|
+
โ end of response โ Stop โ paper-lint stop (throttled to 1 hour) โ
|
|
37
|
+
โ 15 checks across all papers โ
|
|
38
|
+
โ + kb-lint stop: 12 checks across the base โ
|
|
39
|
+
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
40
|
+
โ
|
|
41
|
+
โผ
|
|
42
|
+
โโ TIER 2: BUILD โโโโโโโโโโโโโโโโโโโโโ when you run pdflatex โโโโโโโโโโ
|
|
43
|
+
โ โ
|
|
44
|
+
โ paper.tex โ
|
|
45
|
+
โ โ โ
|
|
46
|
+
โ โผ โ
|
|
47
|
+
โ pdflatex โโโฌโโ INSIDE, acmart runs (the document class) โ
|
|
48
|
+
โ โ it's the same thing that complains in the log: โ
|
|
49
|
+
โ โ no CCS ยท no libertine ยท โ
|
|
50
|
+
โ โ ยซACM reference format is mandatoryยป โ
|
|
51
|
+
โ โ โ
|
|
52
|
+
โ โโโ paper.pdf โ the final artifact, fonts EMBEDDED โ
|
|
53
|
+
โ โโโ paper.log โ acmart writes its warnings here โ
|
|
54
|
+
โ โโโ paper.blg โ bibtex writes bibliography errors hereโ
|
|
55
|
+
โ โ
|
|
56
|
+
โ check-render.sh reads ALL THREE: โ
|
|
57
|
+
โ log โ overfull ยท undefined refs ยท class warnings โ
|
|
58
|
+
โ blg โ dropped entries ยท cited-but-absent โ
|
|
59
|
+
โ pdf โ fonts (LinLibertine/LinBiolinum) โ added 25.08 โ
|
|
60
|
+
โ + chktex on the .tex, if installed (advisory) โ
|
|
61
|
+
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
62
|
+
โ
|
|
63
|
+
โผ
|
|
64
|
+
โโ TIER 3: CI โโโโโโโโโโโโโโโ on push/PR, 7 jobs โโโโโโโโโโโโโโโโโโโโโโโ
|
|
65
|
+
โ โ
|
|
66
|
+
โ changes โโโ a path classifier, ~10s, WITHOUT a checkout โ
|
|
67
|
+
โ โ decides which jobs even run โ
|
|
68
|
+
โ โผ โ
|
|
69
|
+
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
|
|
70
|
+
โ โ prose eslint(md) ยท paper-lint --gate ๐ ยท bib-authors โ โ
|
|
71
|
+
โ โ prose-lint ยท artifact coverage ยท population map โ โ
|
|
72
|
+
โ โ structure ยท provenance ยท verify-cites ยท scorecardโ โ
|
|
73
|
+
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค โ
|
|
74
|
+
โ โ numbers paper_numbers selftest โ gate โ โ
|
|
75
|
+
โ โ artifact/reproduce.py โ wired in 26.08 โ โ
|
|
76
|
+
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค โ
|
|
77
|
+
โ โ anonymity check-anon over the bundle + every *.selftest.{sh,mjs} โ
|
|
78
|
+
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค โ
|
|
79
|
+
โ โ build texlive/texlive:latest container โ FONTS LIVE HEREโ โ
|
|
80
|
+
โ โ aclpubcheck (optional) ยท builds ยท check-render โ โ
|
|
81
|
+
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค โ
|
|
82
|
+
โ โ hooks vigiles lint ๐ ยท every harness on disk โ โ
|
|
83
|
+
โ โ TeXtidote (pinned jar) ยท ledger selftest โ โ
|
|
84
|
+
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค โ
|
|
85
|
+
โ โ skill-firing once a week, a real model โ โ
|
|
86
|
+
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
|
|
87
|
+
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
88
|
+
โ
|
|
89
|
+
โผ
|
|
90
|
+
โโ TIER 4: THE VENUE โโโโโโโโ the one verdict that actually decides โโโ
|
|
91
|
+
โ โ
|
|
92
|
+
โ eRights (ACM) โโโ issues a block of copyright commands โ
|
|
93
|
+
โ โ โ paste into paper.tex, REBUILD โ
|
|
94
|
+
โ โผ โ
|
|
95
|
+
โ upload goes to TWO PLACES: โ
|
|
96
|
+
โ โข conference-publishing.com โ goes to typesetting and ACM DL โ
|
|
97
|
+
โ โข HotCRP paper/20/edit โ a copy for the workshop chairs โ
|
|
98
|
+
โ โ โ
|
|
99
|
+
โ โผ โ
|
|
100
|
+
โ their checker (TAPS / the portal's format checker) โ closed-source โ
|
|
101
|
+
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## What only runs by hand
|
|
105
|
+
|
|
106
|
+
Skills (`grade-paper-writing`, `tighten-paper`, `pc-panel-review`, `cold-read-diff`,
|
|
107
|
+
`verify-citations`, `argument-arc`, `harden-paper`โฆ) are **not invoked by any event**. A human calls
|
|
108
|
+
them. This is the judgment layer; its mechanical parts should keep getting pushed down into tiers
|
|
109
|
+
1โ3.
|
|
110
|
+
|
|
111
|
+
## Where each tier catches the same thing
|
|
112
|
+
|
|
113
|
+
| defect | caught by |
|
|
114
|
+
| ------------------------------------- | ---------------------------------------------------------------------------- |
|
|
115
|
+
| a wall-of-text paragraph on insertion | tier 1, blocks |
|
|
116
|
+
| a number that doesn't match the data | tier 1 (post) and tier 3 (numbers) |
|
|
117
|
+
| a reference dropped by bibtex | tier 2 (`.blg`) โ tier 3 (build) |
|
|
118
|
+
| **wrong font** | tier 2 (the facts' font list) โ but it's PREVENTED by tier 3 (the container) |
|
|
119
|
+
| a stage declared with no PDF | tier 3, `paper-lint --gate` ๐ |
|
|
120
|
+
| ACM format compliance | **tier 4, and only tier 4** |
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
# ๐บ๏ธ Roadmap: what is NOT built
|
|
125
|
+
|
|
126
|
+
## 1. ๐ด A requirement as a BUILD FAILURE, not a check afterward (the author's idea, 26.08)
|
|
127
|
+
|
|
128
|
+
Right now almost everything is caught **after** the build. But `acmart` already knows how to fail
|
|
129
|
+
the build โ it does exactly that on missing CCS concepts (_"CCS concepts are mandatory for papers
|
|
130
|
+
over two pages"_). So the mechanism exists, and we're not using it.
|
|
131
|
+
|
|
132
|
+
**Rung 2 of the ladder instead of rung 3:** there's nothing to check in something that can't even be
|
|
133
|
+
built.
|
|
134
|
+
|
|
135
|
+
| requirement | how to turn it into a build failure |
|
|
136
|
+
| --------------------- | ---------------------------------------------------------------------------------------------------------------- |
|
|
137
|
+
| **fonts** | `fontspec` + a font by path โ file missing โ the build fails instead of silently falling back to Computer Modern |
|
|
138
|
+
| page limit | `\AtEndDocument` + a check on `\thepage` โ `\PackageError` |
|
|
139
|
+
| text-block dimensions | the class sets these; catch the fact that they were overridden |
|
|
140
|
+
| no page numbers | check `\thepage` in the output |
|
|
141
|
+
|
|
142
|
+
๐ด **MEASURED on 2026-08-26, not assumed: `fontspec` with `pdflatex` DOES NOT WORK.** A minimal
|
|
143
|
+
document, a `pdflatex` run, exit code 1, verbatim from the log:
|
|
144
|
+
|
|
145
|
+
```
|
|
146
|
+
Package: fontspec Font selection for XeLaTeX and LuaLaTeX
|
|
147
|
+
! Fatal Package fontspec Error: The fontspec package requires either XeTeX or LuaTeX.
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
โ The whole chain: only `fontspec` can load a font by path โ `fontspec` requires XeLaTeX or LuaLaTeX
|
|
151
|
+
โ we run `pdflatex` โ **the construction requires SWITCHING THE BUILD ENGINE**, not adding a
|
|
152
|
+
package. That moves the item from "add a line" to "change the program that builds the paper."
|
|
153
|
+
|
|
154
|
+
โ ๏ธ **Three unverified things that decide whether the first row is even feasible** (these are
|
|
155
|
+
unknowns, not objections): `fontspec` requires XeLaTeX/LuaLaTeX instead of pdflatex ยท `acmart`
|
|
156
|
+
assigns its own fonts and might conflict ยท whether the TAPS pipeline will even accept a LuaLaTeX
|
|
157
|
+
source. Plus a risk: switching engines changes how microtype is handled, and there's no page-count
|
|
158
|
+
slack.
|
|
159
|
+
|
|
160
|
+
**Checked by a cheap spike** โ build a copy in scratch, see whether the class fights back and
|
|
161
|
+
whether the layout shifts. Do this AFTER the 29.08 submission.
|
|
162
|
+
|
|
163
|
+
## 2. Mechanical camera-ready compliance โ 1 requirement out of ~25 is checked
|
|
164
|
+
|
|
165
|
+
ACM's instructions list ~25 mechanical requirements. Checked: fonts. The rest โ text-block geometry,
|
|
166
|
+
9pt/8pt type size, column balance, DOIs on references, captions above tables and below figures,
|
|
167
|
+
capitalization, section ordering โ **nothing checks any of it**.
|
|
168
|
+
|
|
169
|
+
**A construction found and verified against source (26.08):**
|
|
170
|
+
|
|
171
|
+
```
|
|
172
|
+
banal -json + pdf.js โ paper.facts.json โ @eslint/json
|
|
173
|
+
(geometry) (fonts) (plain JSON) (the official plugin)
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
- **`banal`** โ [kohler/hotcrp/src/banal](https://github.com/kohler/hotcrp/blob/master/src/banal),
|
|
177
|
+
1901 lines of Perl, dependencies are core Perl + `pdftohtml`. Standalone, alive (commits on
|
|
178
|
+
03.08.2026). paperlint feeds it pdftohtml-style XML written from pdf.js instead, so poppler is not
|
|
179
|
+
needed (`src/adapters/banal/`: `xml.ts` writes it, `run.ts` runs banal; issue #61). Gives you `papersize`, `margin`, `bodyfontsize`, `leading`, `columns`, `npages`,
|
|
180
|
+
`reffontsize`. It **doesn't know about fonts by construction** โ the words `type3`/`embed` don't
|
|
181
|
+
appear in the file at all.
|
|
182
|
+
- **banal does not accept a spec** โ the comparison lives in `checkformat.php`, the profile grammar
|
|
183
|
+
is `papersize;pagelimit;columns;textblock;bodyfontsize;bodylineheight`. For ACM โ
|
|
184
|
+
`letter;;2;18x23.5cm;9`.
|
|
185
|
+
- **Why through JSON and not an ESLint language plugin:** `fileType: "binary"` in ESLint is **not
|
|
186
|
+
implemented**, the docs say verbatim โ _"should be 'text' (in the future, we will also support
|
|
187
|
+
'binary')"_, and the runtime reads the file unconditionally as UTF-8 (`eslint-helpers.js:1281`),
|
|
188
|
+
irreversibly mangling PDF bytes into U+FFFD. A hack is possible (`parse()` reads the disk itself),
|
|
189
|
+
but it breaks `--fix`, the cache, and `eslint-disable` โ there's nowhere to put a directive inside
|
|
190
|
+
a PDF.
|
|
191
|
+
- **veraPDF is built the same way** โ the one PDF validator with user-defined rules: _"doesn't parse
|
|
192
|
+
PDF documents directly. Instead it processes the machine readable report output"_. Matching the
|
|
193
|
+
architecture of an industrial tool is a sign the construction is right.
|
|
194
|
+
|
|
195
|
+
**Occupancy checked:** `eslint-plugin-pdf` โ E404 ยท `textlint` accepts its own format but requires
|
|
196
|
+
conversion to text first (precedent: `textlint-plugin-pptx`) ยท `Vale` won't take a custom parser ยท
|
|
197
|
+
`MegaLinter`/`super-linter`/`reviewdog` are orchestrators, they won't give us a rule registry for our
|
|
198
|
+
format.
|
|
199
|
+
|
|
200
|
+
## 3. Venue constants belong in a card, not in code
|
|
201
|
+
|
|
202
|
+
Right now `LinLibertine`, `LinBiolinum`, `acmart` are hardcoded into `check-render.sh`. This is
|
|
203
|
+
**venue data**, and it belongs in
|
|
204
|
+
`.claude/skills/submit-paper/references/venues/<venue>.md`:
|
|
205
|
+
|
|
206
|
+
```yaml
|
|
207
|
+
venue:
|
|
208
|
+
template: acmart
|
|
209
|
+
page_size: letter
|
|
210
|
+
fonts: { text: LinLibertine, title: LinBiolinum }
|
|
211
|
+
textblock: 18x23.5cm
|
|
212
|
+
body_pt: 9
|
|
213
|
+
body_limit: 5
|
|
214
|
+
extra_ref_pages: 2
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
The second consumer of this block is the comparison against `banal`'s output (six numbers). The
|
|
218
|
+
first is the page limit, which currently exists in **four copies**, and they have already drifted
|
|
219
|
+
apart (`venues/realm.md` says 8, `build-submission.sh` hardcodes 8, `PIPELINE-STATUS` writes "body
|
|
220
|
+
8/8," and the build prints 9).
|
|
221
|
+
|
|
222
|
+
## 4. `check-render.sh` โ 244 lines of bash full of greps
|
|
223
|
+
|
|
224
|
+
The place is right (nothing else reads the build artifacts, and no offline ACM checker exists),
|
|
225
|
+
**the form isn't**: no check registry, no config, no severity, thresholds are hardcoded. Bolting 25
|
|
226
|
+
more greps onto it is the path we're getting off of. Deal with it together with items 2 and 3.
|
|
227
|
+
|
|
228
|
+
## 5. Check occupancy BEFORE writing โ the rule exists, it's rung 4
|
|
229
|
+
|
|
230
|
+
Written down twice (05.08, 24.08), and the `sweep-design-space` skill exists. **It was violated
|
|
231
|
+
three times overnight on 25/26.08** โ meaning prose and a skill don't work, both are rung 4.
|
|
232
|
+
|
|
233
|
+
**Proposed construction:** a new check-file must carry an `occupancy:` line โ what was searched and
|
|
234
|
+
why it didn't fit; the linter requires its presence. Same form as `carries:` for sections and
|
|
235
|
+
`Cause:` for re-check findings. To be honest: this is rung 3, not 2 โ it doesn't stop you from
|
|
236
|
+
skipping the search, but it makes **the absence of evidence visible**.
|
|
237
|
+
|
|
238
|
+
---
|
|
239
|
+
|
|
240
|
+
# ๐ง FREEZE on the current ad hoc state (the author's decision, 2026-08-26)
|
|
241
|
+
|
|
242
|
+
Verbatim (translated from Russian): _"mark the current pipeline as shit by rule โ don't expand it as
|
|
243
|
+
it is, only allow new, proper stuff."_
|
|
244
|
+
|
|
245
|
+
> **Fixes โ yes. New checks โ no.**
|
|
246
|
+
> A new check goes only in the new form โ but **only where the new form already exists.**
|
|
247
|
+
|
|
248
|
+
Without the second half the rule is incoherent, and I slipped on it that same evening: announced the
|
|
249
|
+
freeze and, two messages later, proposed bolting a check onto `paper-lint`.
|
|
250
|
+
|
|
251
|
+
| check category | new form | where a new one goes |
|
|
252
|
+
| ------------------------------- | --------------------------------------- | -------------------------------------------------------------- |
|
|
253
|
+
| a single document: markdown, JS | **exists** โ ESLint | ๐ not allowed into the old form |
|
|
254
|
+
| an artifact: PDF | **exists** โ venue profile + checker | ๐ not allowed into the old form |
|
|
255
|
+
| cross-file, filesystem-shaped | **doesn't exist and isn't expected to** | stays a script โ that is the rule's boundary, not a workaround |
|
|
256
|
+
|
|
257
|
+
**Enforcement:** `paper-lint.mjs` currently has exactly **18** check functions. The "there are 18"
|
|
258
|
+
test fails on the nineteenth and forces an answer to "why isn't this in the new form." Small and
|
|
259
|
+
readable, unlike a 27-entry debt ledger that would get muted within a day.
|
|
260
|
+
|
|
261
|
+
๐ด **The order is mandatory: freeze AFTER at least half is in the new form.** Right now it's one
|
|
262
|
+
rule out of fifteen. Freezing before the new form becomes more convenient than the old one means
|
|
263
|
+
getting a workaround and a dead rule. That has already happened in this repo three times.
|
|
264
|
+
|
|
265
|
+
---
|
|
266
|
+
|
|
267
|
+
# ๐ Work queue, cheapest to most expensive
|
|
268
|
+
|
|
269
|
+
## 1. A marker instead of a blocklist โ one line
|
|
270
|
+
|
|
271
|
+
`paperDirs()` today: `.filter((e) => e.name !== "research" && e.name !== "drafts")`. A hand-written
|
|
272
|
+
list of two names; everything else under `papers/` is automatically counted as a paper.
|
|
273
|
+
|
|
274
|
+
**Measured 2026-08-26:**
|
|
275
|
+
|
|
276
|
+
| folder | `PIPELINE-STATUS.md` | counted as a paper today |
|
|
277
|
+
| --------------------------------------------------- | -------------------- | ------------------------ |
|
|
278
|
+
| `agenticdev-2026` `aisec-2026` `compile-rules-2026` | โ
| โ
correctly |
|
|
279
|
+
| `scored-2026` | โ | ๐ด **yes, wrongly** |
|
|
280
|
+
| `extension-shell-ifc` | โ | ๐ด **yes, wrongly** |
|
|
281
|
+
| `research` `drafts` | โ | no (on the blocklist) |
|
|
282
|
+
|
|
283
|
+
**The marker: a paper folder is one that has a `PIPELINE-STATUS.md`.** This has already been our
|
|
284
|
+
convention since 22.07 ("every paper carries a PIPELINE-STATUS.md"), the code just doesn't use it.
|
|
285
|
+
Self-declaration instead of a list: a new paper enters the checks the day it gets a scorecard.
|
|
286
|
+
|
|
287
|
+
โ ๏ธ **Do NOT move the three papers into a separate subfolder.** The marker solves the same problem in
|
|
288
|
+
one line, while a move breaks every form of reference โ when `.claude/pipeline/` was resettled there
|
|
289
|
+
were 134 literal ones, and that wasn't even the whole count (paths built from segments, relative
|
|
290
|
+
imports, paths inside regexes).
|
|
291
|
+
|
|
292
|
+
## 2. One build entry point for all papers, not one per paper
|
|
293
|
+
|
|
294
|
+
> **Done (#59, 2026-09-24).** `paperlint build <paper>` is the entry point, and `paperlint toolchain` installs
|
|
295
|
+
> TeX Live with the packages the venue profiles declare; `ensure-toolchain.sh` and
|
|
296
|
+
> `ci-install-texlive.sh` are deleted. What follows is the plan as it was written.
|
|
297
|
+
|
|
298
|
+
**The hole:** `compile-rules` has `repro/build-submission.sh`, which calls `ensure-toolchain.sh`.
|
|
299
|
+
**`agenticdev` has no entry point at all** โ it's built by hand with `pdflatex`, and nothing
|
|
300
|
+
guarantees the fonts except the CI container. That's how the submitted `aisec` went out wrong.
|
|
301
|
+
|
|
302
|
+
**The fix โ generalize the existing script to any paper folder**, instead of giving each one its own
|
|
303
|
+
Makefile. It decides how to build from the files present: `paper.tex` exists โ `pdflatex`;
|
|
304
|
+
`paper.md` exists โ the jinja2 pipeline. Three Makefiles would drift apart the same way the four
|
|
305
|
+
copies of the page limit and the five copies of the package list already have.
|
|
306
|
+
|
|
307
|
+
**Don't conflate the layers:**
|
|
308
|
+
|
|
309
|
+
```
|
|
310
|
+
packages and fonts exist โ the texlive container or ensure-toolchain.sh (apt)
|
|
311
|
+
the compile cycle โ latexmk (not in the toolchain yet, add it)
|
|
312
|
+
fail if fonts are missing โ \IfFileExists in paper.tex (done 26.08)
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
`latexmk` replaces **only the middle layer** โ it does not install fonts.
|
|
316
|
+
|
|
317
|
+
**There's then no need to check "does this folder have a Makefile"** โ there's one shared entry
|
|
318
|
+
point. Nothing to check.
|
|
319
|
+
|
|
320
|
+
## 3. Remove duplicated constants
|
|
321
|
+
|
|
322
|
+
| fact | how many copies | where they diverge |
|
|
323
|
+
| -------------------- | --------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
|
|
324
|
+
| page limit | **4** | `venues/realm.md` 8 ยท `build-submission.sh` 8 ยท `PIPELINE-STATUS` "8/8" ยท the build prints **9** |
|
|
325
|
+
| the TeX package list | **5** | `ensure-toolchain.sh` (executable) ยท `SKILL.md` ยท `render-paper.harness.mjs` (pins it โ
) ยท `build-submission.sh` ยท `PIPELINE-STATUS` |
|
|
326
|
+
|
|
327
|
+
The canonical source is the venue card (`venues/<venue>.md`, the `<!-- venue-profile -->` block) for
|
|
328
|
+
format, and โ since 2026-09-24 โ the `tex` block of `venues/<venue>.jsonc` (plus `tex-base.jsonc`)
|
|
329
|
+
for packages; `ensure-toolchain.sh` held them until then. Everything else is a pointer.
|
|
330
|
+
|
|
331
|
+
## 3-ter. Drop the font gate from `check-render.sh` once the rules run in CI
|
|
332
|
+
|
|
333
|
+
The `pdffonts` block was added to `check-render.sh` on 25.08, and once the judgment moves into rules
|
|
334
|
+
it becomes **a second source of truth about the same fonts**. Removing it shrinks the frozen script
|
|
335
|
+
rather than extending it, so it does not break the freeze.
|
|
336
|
+
|
|
337
|
+
โ ๏ธ **But not before the rules are actually running in CI.** Today `check-render.sh` is the only
|
|
338
|
+
thing in CI that even looks at `agenticdev-2026` (the `build` job only builds papers that have
|
|
339
|
+
`repro/build-submission.sh`, and that's one out of five). Removing it before the replacement is in
|
|
340
|
+
place means trading a duplicate for a hole.
|
|
341
|
+
|
|
342
|
+
## 3-bis. ๐ด Remove the venue-profile duplicate by GENERATING it, not guarding it with an assert
|
|
343
|
+
|
|
344
|
+
The venue numbers live in two places: `<venue>.yaml` (read by the rules) and `<venue>.tex` (read by
|
|
345
|
+
LaTeX itself, which can't do YAML). On 26.08 `texMismatch()` inside `check-geometry.mjs` guarded
|
|
346
|
+
against the drift โ **the script was torn out on 26.08, along with it**, because the whole thing was
|
|
347
|
+
rung 5.
|
|
348
|
+
|
|
349
|
+
**The assert was the wrong answer from the start.** It guards a duplicate instead of there being no
|
|
350
|
+
duplicate. The right form is the same one we arrived at for the PDF facts: **`<venue>.tex` IS
|
|
351
|
+
GENERATED from `<venue>.yaml` in the same step that builds the paper**, lives in `_build/`, and
|
|
352
|
+
never enters git. Then the drift is unrepresentable, and there's nothing to guard โ rung 1, not rung 5.
|
|
353
|
+
|
|
354
|
+
โ ๏ธ The objection "a generated file goes stale silently" **does not apply** here, and the distinction
|
|
355
|
+
matters: what goes stale is a file that's committed and regenerated only occasionally. This one
|
|
356
|
+
regenerates on every build, like the PDF facts do. Silent staleness requires that someone be able to
|
|
357
|
+
read the OLD copy โ and there is nowhere to get one.
|
|
358
|
+
|
|
359
|
+
**Until this is done, NOBODY guards the duplicate.** Recorded deliberately: the cost is a mismatch
|
|
360
|
+
between the preamble guards and the rules; the odds are low โ profile edits happen about once per
|
|
361
|
+
venue.
|
|
362
|
+
|
|
363
|
+
## 4. Tools: what's been checked and decided
|
|
364
|
+
|
|
365
|
+
| | verdict |
|
|
366
|
+
| ------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
367
|
+
| **`eslint-plugin-project-structure`** | **can do** conditional "if A then B" (`enforceExistence`, via a real `fs.existsSync`), and it ships a dummy parser + `files: ["**"]`, so it sees folders with not a single JS file. **But there's no OR semantics** โ "Makefile OR justfile" is not expressible. We don't need it after item 2; a candidate for other structural rules |
|
|
368
|
+
| **`steiger`** | โ dropped โ its own README says _"not extendable with more rules"_, plus it's about FSD in JS |
|
|
369
|
+
| **an ESLint config inside a paper folder** | โ **doesn't work in this repository**: there are **233** configs here, **2** of them ours โ the other 231 sit inside `compile-rules-2026/repro/` (other people's repos, pulled in). A nested lookup would pick up every one of them, which is exactly why we run with `--no-config-lookup`. The same result comes from a `files: ["<papers-root>/<paper>/**"]` section in the root config |
|
|
370
|
+
| **`banal`** | โ
adopted โ fetched by `paperlint toolchain` at a pinned HotCRP commit (GPL; not vendored into paperlint), run on pdf.js-written XML by `paperlint build` and `extract-pdf-facts.mjs` (measurement only; the ESLint rules do the judging) |
|
|
371
|
+
| **`latexmk`** | superseded: `paperlint build` runs its own loop (`src/latex-loop.ts`) |
|