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,108 @@
|
|
|
1
|
+
// Venue format profile — DATA read by the `pdf/profile` rule in eslint-rules/pdf-facts.mjs.
|
|
2
|
+
// Prose about the venue is in agenticdev.md nearby.
|
|
3
|
+
// Source for the numbers: the Conference Publishing author instructions 2026-08-25 + ACM's
|
|
4
|
+
// requirements.
|
|
5
|
+
//
|
|
6
|
+
// 🔴 Why JSONC and not YAML (decided 08-26). I had this in YAML, justifying it with "JSON has no
|
|
7
|
+
// comments, and every number here carries a quote from the instructions." That objection turned
|
|
8
|
+
// out to be false: @eslint/json ships three languages — json, jsonc, json5 — and jsonc is exactly
|
|
9
|
+
// JSON with comments. So the quotes stay in place, the file is read by a real parser
|
|
10
|
+
// (@humanwhocodes/momoa, already a transitive dependency), AND it's linted by the same engine as
|
|
11
|
+
// everything else. One extra dependency (js-yaml on this path) goes away.
|
|
12
|
+
{
|
|
13
|
+
"template": "acmart",
|
|
14
|
+
|
|
15
|
+
// TeX Live packages the acmart template needs ON TOP OF tex-base.jsonc, each with the files that
|
|
16
|
+
// prove it is present (checked with kpsewhich after every install). Read by `paperlint toolchain` and
|
|
17
|
+
// `paperlint build`; the shape is venue-profile.schema.json.
|
|
18
|
+
// libertine · inconsolata (zi4) · newtx — acmart.cls checks ALL THREE and, if ANY is missing,
|
|
19
|
+
// silently falls back to Computer Modern: the PDF compiles, looks normal, is set in the wrong
|
|
20
|
+
// font, and the other metric gives another pagination. A submitted paper went out that way.
|
|
21
|
+
// kastrup (binhex.tex) — pulled in by newtx. Missing it is a HARD stop, so adding the fonts
|
|
22
|
+
// without it breaks a build that worked.
|
|
23
|
+
// fancyhdr — required by acmart itself; present on most images by accident, absent on a
|
|
24
|
+
// minimal one ("File `fancyhdr.sty' not found", measured on TinyTeX, issue #37).
|
|
25
|
+
// the rest — pulled in by acmart ITSELF, not by the paper, so reading \usepackage never finds
|
|
26
|
+
// them. Found 2026-09-01 by the loop build → missing file → tlmgr search --file → install.
|
|
27
|
+
"tex": {
|
|
28
|
+
"packages": {
|
|
29
|
+
"acmart": ["acmart.cls"],
|
|
30
|
+
"amscls": ["amsart.cls"],
|
|
31
|
+
"libertine": ["libertine.sty"],
|
|
32
|
+
"inconsolata": ["zi4.sty"],
|
|
33
|
+
"newtx": ["newtxmath.sty"],
|
|
34
|
+
"kastrup": ["binhex.tex"],
|
|
35
|
+
"fancyhdr": ["fancyhdr.sty"],
|
|
36
|
+
"totpages": ["totpages.sty"],
|
|
37
|
+
"environ": ["environ.sty"],
|
|
38
|
+
"preprint": ["balance.sty"],
|
|
39
|
+
// acmart's `pbalance` option (the vendor's first fix for an unbalanced last page, which the
|
|
40
|
+
// optional rule `pdf/last-page-balance` recommends) loads pbalance, which needs filehook and
|
|
41
|
+
// zref. Measured 2026-09-25 on an acmart sigconf camera-ready: without them the option stops
|
|
42
|
+
// the build; with them the last page went from 639.6 / 224.1 to 424.4 / 439.2 pt, same page count.
|
|
43
|
+
"pbalance": ["pbalance.sty"],
|
|
44
|
+
"filehook": ["filehook.sty"],
|
|
45
|
+
"zref": ["zref-abspage.sty"],
|
|
46
|
+
"xstring": ["xstring.sty"],
|
|
47
|
+
"everyshi": ["everyshi.sty"],
|
|
48
|
+
"hyperxmp": ["hyperxmp.sty"],
|
|
49
|
+
"ncctools": ["manyfoot.sty"],
|
|
50
|
+
"cmap": ["cmap.sty"],
|
|
51
|
+
"float": ["float.sty"],
|
|
52
|
+
"comment": ["comment.sty"],
|
|
53
|
+
"upquote": ["upquote.sty"],
|
|
54
|
+
"doclicense": ["doclicense.sty"],
|
|
55
|
+
"textcase": ["textcase.sty"],
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
|
|
59
|
+
// 8.5 x 11 in
|
|
60
|
+
"page_size": "letter",
|
|
61
|
+
"page_w_in": 8.5,
|
|
62
|
+
"page_h_in": 11.0,
|
|
63
|
+
|
|
64
|
+
// «text width must not exceed 18 cm»
|
|
65
|
+
"textblock_w_in": 7.087,
|
|
66
|
+
// «text height must not exceed 23.5 cm»
|
|
67
|
+
"textblock_h_in": 9.252,
|
|
68
|
+
// Last-page balance is NOT a profile field. It is the optional lint rule pdf/last-page-balance,
|
|
69
|
+
// which a consumer turns on for the papers whose publisher asks (Conference Publishing bounced
|
|
70
|
+
// an accepted paper for it on 08-29: "Please correct the last page balancing") — see
|
|
71
|
+
// docs/optional-rules.md.
|
|
72
|
+
|
|
73
|
+
"columns": 2,
|
|
74
|
+
|
|
75
|
+
// «font size is 9 pt for all body text»
|
|
76
|
+
"body_pt": 9,
|
|
77
|
+
// banal measures the MODE of the rendered text, not the declared size (measured 08-26: 9.30 at
|
|
78
|
+
// acmart's declared 9). Hence the tolerance — and hence why body size stays a nudge, not a gate.
|
|
79
|
+
"body_pt_tol": 0.5,
|
|
80
|
+
|
|
81
|
+
// «font size of the references can be from 7 pt to 9 pt»
|
|
82
|
+
"ref_pt_min": 7,
|
|
83
|
+
"ref_pt_max": 9,
|
|
84
|
+
|
|
85
|
+
// «text must be in serif font (Libertine)»
|
|
86
|
+
"fonts_text": "LinLibertine",
|
|
87
|
+
// «The title must be in sans-serif font (Biolinum)»
|
|
88
|
+
"fonts_title": "LinBiolinum",
|
|
89
|
+
|
|
90
|
+
// The limits are a property of the paper's TYPE at this venue, not of the venue itself.
|
|
91
|
+
// A given paper's type is stated in its <paper-dir>/venue.json.
|
|
92
|
+
"kinds": {
|
|
93
|
+
"short": {
|
|
94
|
+
"body_pages_max": 5,
|
|
95
|
+
// «up to 2 extra pages of references»
|
|
96
|
+
"ref_pages_max": 2,
|
|
97
|
+
},
|
|
98
|
+
"full": {
|
|
99
|
+
// «Full ≤10pp (mature)»
|
|
100
|
+
"body_pages_max": 10,
|
|
101
|
+
"ref_pages_max": 2,
|
|
102
|
+
},
|
|
103
|
+
"demo": {
|
|
104
|
+
"body_pages_max": 5,
|
|
105
|
+
"ref_pages_max": 2,
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "AgenticDev @ ASE — venue card (data)"
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# AgenticDev @ ASE venue card
|
|
6
|
+
|
|
7
|
+
> **This is a venue DATA file, not a skill.** Follow the `submit-paper` skill for the end-to-end
|
|
8
|
+
> mechanics; the facts below are the venue-specific data. (Formerly the `submit-paper-agenticdev` skill;
|
|
9
|
+
> demoted to a reference doc so venue data doesn't proliferate the skill namespace.) **Re-verify the
|
|
10
|
+
> CFP each year** (`conf.researchr.org/home/ase-2026/agenticdev-2026`).
|
|
11
|
+
|
|
12
|
+
## The facts (2026 edition)
|
|
13
|
+
|
|
14
|
+
- **Venue**: Workshop on Agentic AI for Next-Generation Software Development, co-located with **ASE**
|
|
15
|
+
(Automated Software Engineering), Munich, Oct 2026.
|
|
16
|
+
- **HotCRP**: `https://agenticdev2026.hotcrp.com/paper/new`.
|
|
17
|
+
- **Deadline**: **July 15, 2026, AoE** (≈ 9 AM July 16 at UTC+5). Notify Aug 21, camera-ready Aug 28.
|
|
18
|
+
- **Types / limits**: Full ≤10pp (mature); **Short ≤5pp** (WIP / vision / position); Demo/Tool ≤5pp.
|
|
19
|
+
Up to **2 extra pages of references** on top.
|
|
20
|
+
- **Format**: ACM `\documentclass[sigconf,review,anonymous]{acmart}` → **double-blind**. Build:
|
|
21
|
+
`pdflatex; bibtex; pdflatex; pdflatex`; add `\microtypesetup{expansion=false}` (the #1 acmart crash).
|
|
22
|
+
- **Archival**: accepted papers → **ASE workshop proceedings, DOI**. 🔴 **Correction 2026-08-26: the
|
|
23
|
+
earlier wording "ACM DL / IEEE Xplore" is FALSE — there is no dual publication.** ASE's publisher
|
|
24
|
+
**alternates by year**: ASEW '24 — ACM (`10.1145/3691621.*`, ISBN 979-8-4007-1249-4), ASE 2025
|
|
25
|
+
Workshops — **IEEE** (`csdl/proceedings/asew/2025`, ISBN 979-8-3315-8503-7). The main track does the
|
|
26
|
+
same: '22 ACM, '23 IEEE, '24 ACM, '25 IEEE. The `10.5555` prefix in ACM DL is a Guide catalog
|
|
27
|
+
entry, NOT an ACM publication. By the alternation pattern, **ACM is expected for 2026**, which
|
|
28
|
+
lines up with an APC even being charged — but ⚠️ **no verbatim statement from ASE 2026 about the
|
|
29
|
+
publisher was found**. If it turns out to be IEEE, the ACM-APC question is moot entirely. Confirm
|
|
30
|
+
with the chairs before paying; selected papers
|
|
31
|
+
invited to a **journal special issue**. This is real authorship-criterion evidence.
|
|
32
|
+
- **⚠️ No supplementary-material upload field** on the HotCRP form (fields are just Title, Submission,
|
|
33
|
+
Abstract, Authors, ACM corresponding, Contacts, PC conflicts). → **Host the artifact externally** (OSF
|
|
34
|
+
anonymized view-only link) and `\url{}` it in the paper's Availability. See `submit-paper` §2.
|
|
35
|
+
- **Remote presentation**: CFP doesn't state a policy; what counts is the indexed
|
|
36
|
+
publication, not attendance. Only ask organizers about remote _after_ acceptance (don't draw attention
|
|
37
|
+
pre-decision under double-blind).
|
|
38
|
+
|
|
39
|
+
## 🔴 How to name the venue — what CAN and CANNOT be claimed
|
|
40
|
+
|
|
41
|
+
The question came up on 2026-08-24 and will come up every time (a post, a site, a résumé, an
|
|
42
|
+
application). Checked against primary sources, not a search-engine summary.
|
|
43
|
+
|
|
44
|
+
**Facts:**
|
|
45
|
+
|
|
46
|
+
- **ASE is CORE A\*** (top tier), together with ICSE and FSE it's software engineering's "big
|
|
47
|
+
three."
|
|
48
|
+
- **AgenticDev is an ASE 2026 workshop**, officially listed on ASE's own _Co-Located Events_ page
|
|
49
|
+
(`conf.researchr.org/track/ase-2026/ase-2026-workshops`). It is not a third-party conference
|
|
50
|
+
that rented a room nearby, and it is not "sponsorship" — the workshop runs under ASE's umbrella.
|
|
51
|
+
- **Proceedings:** accepted papers go into the **ASE 2026 Workshop Proceedings** (ACM DL, DOI).
|
|
52
|
+
- **But it is NOT the ASE main track.** The main track has its own program, its own PC, and its
|
|
53
|
+
own selectivity; the workshop is reviewed separately and more leniently.
|
|
54
|
+
|
|
55
|
+
| ✅ OK to write | ❌ NOT OK |
|
|
56
|
+
| -------------------------------------------------------- | ------------------------------------ |
|
|
57
|
+
| "accepted at AgenticDev 2026, a workshop of ASE 2026" | "accepted at ASE 2026" |
|
|
58
|
+
| "workshop paper, ASE 2026 workshop proceedings (ACM DL)" | "published at a CORE A\* conference" |
|
|
59
|
+
| "ASE is CORE A\*; AgenticDev is one of its workshops" | "my paper is CORE A\*" |
|
|
60
|
+
|
|
61
|
+
⚠️ **Why this isn't pedantry:** a mismatch in how the narrative is framed is a recorded reason
|
|
62
|
+
reviewers reject any claimed credentials. A reviewer sees the "workshop vs. main track"
|
|
63
|
+
distinction in one minute by checking the conference program, and the cost is trust in the whole
|
|
64
|
+
application, not just one line. The phrasing "a workshop of ASE 2026" is not weaker — it carries
|
|
65
|
+
ASE's weight on its own while staying accurate.
|
|
66
|
+
|
|
67
|
+
## Attendance, registration, and proceedings — what affects what
|
|
68
|
+
|
|
69
|
+
- **Traveling to present does NOT affect the credit.** What counts is _authorship of scholarly
|
|
70
|
+
articles_ — that is, **the publication**, not attendance. "Presented at a conference" isn't on
|
|
71
|
+
the list of countable achievements at all.
|
|
72
|
+
- 🔴 **What DOES matter: whether payment becomes a condition of MAKING IT INTO proceedings.** Many
|
|
73
|
+
venues require at least one author to register, or the paper gets pulled from the proceedings.
|
|
74
|
+
In that case what disappears isn't the trip, it's the proof itself. That's the exact question
|
|
75
|
+
put to the chairs on 2026-08-24, and it matters more than the money.
|
|
76
|
+
- Cost for 2026: **APC $350** (ACM went fully open-access as of 2026-01-01) + registration €350
|
|
77
|
+
(early rate through 08-31). The correspondence with the chairs is broken down in the author's
|
|
78
|
+
private notes (`<paper>/reviews/2026-08-24-perepiska-cheyry.md`).
|
|
79
|
+
|
|
80
|
+
## PC members (for the "PC conflicts" field) — 2026
|
|
81
|
+
|
|
82
|
+
Andrea Rosani (Free U Bozen/Bolzano) · Giuseppe Di Fatta (Free U Bozen/Bolzano) · Jean Marie Mottu
|
|
83
|
+
(Nantes U) · Paolo Papotti (Eurecom) · Simos Gerasimou (Cyprus U of Technology). An independent author
|
|
84
|
+
with no ties to any of them checks **none**. (List grows year to year — read the current PC page.)
|
|
85
|
+
|
|
86
|
+
## Topic fit (foreground these in the framing)
|
|
87
|
+
|
|
88
|
+
Trustworthiness / verification / validation of AI agents; benchmarking & empirical evaluation;
|
|
89
|
+
integration into developer workflows; agent-based coding/testing. A cost-aware, correctness-gated
|
|
90
|
+
_validation_ paper is dead-center — name those keywords in the abstract/intro.
|
|
91
|
+
|
|
92
|
+
## After acceptance — the prestige upgrade
|
|
93
|
+
|
|
94
|
+
AgenticDev is a workshop (lightest authorship tier, but it counts). Extend the accepted paper (≥30% new
|
|
95
|
+
material) into a higher-prestige indexed venue as a **second** publication: **MSR 2027** (deadline
|
|
96
|
+
~Oct 23, 2026) or **NeurIPS 2027 Evaluations & Datasets** (~May 2027). AgenticDev explicitly invites
|
|
97
|
+
journal extensions. Don't dual-submit the same paper — extend it.
|
|
98
|
+
|
|
99
|
+
## Provenance
|
|
100
|
+
|
|
101
|
+
"Measuring the Wrong Number" submitted here 2026-07-13 (#20, ready-for-review), 4pp short paper, OSF
|
|
102
|
+
anonymized artifact linked in Availability, PC-panel estimate ~85–90% accept.
|
|
103
|
+
|
|
104
|
+
## Camera-ready (2026 edition)
|
|
105
|
+
|
|
106
|
+
**The ACM mechanics are generic and live one level up: `../publishers/acm.md`** (eRights first,
|
|
107
|
+
the preamble, the copyright block, CCS, source files). Here — only what's specific to AgenticDev:
|
|
108
|
+
|
|
109
|
+
- **Camera-ready deadline**: **28 Aug 2026, 2 PM AoE** (≈ 7 AM on August 29 at UTC+5).
|
|
110
|
+
- **DOI**: `10.1145/3843282.3843715` · **ACM ISBN**: `979-8-4007-2985-0/26/10`.
|
|
111
|
+
- **Copyright block**: `AgenticDev '26, October 12–16, 2026, Munich, Germany`.
|
|
112
|
+
- **No longer double-blind.** The submission used `[sigconf,review,anonymous]`; both options come
|
|
113
|
+
off for the final.
|
|
114
|
+
- **Same page limit**: body ≤5 pp + up to 2 pp for references only. A sixth page taken up by the
|
|
115
|
+
bibliography still counts within the limit.
|
|
116
|
+
- **Title changes are allowed** — the portal explicitly asks for it "exactly as it should appear
|
|
117
|
+
in the ACM DL." But decide before eRights (see the publisher card).
|
|
118
|
+
|
|
119
|
+
## Attendance / registration
|
|
120
|
+
|
|
121
|
+
The CFP is silent on remote participation, and **that does not mean "you don't have to show
|
|
122
|
+
up"**: ACM has no blanket no-show policy, IEEE does have one and allows a "qualified proxy" plus
|
|
123
|
+
exceptions for circumstances outside the author's control. Which one applies to the ASE workshop
|
|
124
|
+
**cannot be derived from public sources** — only by writing to the chairs.
|
|
125
|
+
|
|
126
|
+
- Workshop-day registration (non-member): **€350** through 08-31, €410 through 09-20, €460
|
|
127
|
+
on-site. This is a **publication gate**, not a travel expense.
|
|
128
|
+
- If entry requires a visa, the timeline for it is real → ask the chairs right after acceptance,
|
|
129
|
+
don't delay.
|
|
130
|
+
|
|
131
|
+
## 🤖 Machine-readable format profile
|
|
132
|
+
|
|
133
|
+
Read by ESLint rules over `<paper>/_build/paper.facts.json` (the facts are captured by
|
|
134
|
+
`extract-pdf-facts.mjs`). **The numbers live here, not in code** — this venue has its own, the
|
|
135
|
+
next one will have different ones. Source: the Conference Publishing author instructions
|
|
136
|
+
(2026-08-25) and ACM's requirements.
|
|
137
|
+
|
|
138
|
+
**The format profile is in [`agenticdev.yaml`](agenticdev.yaml)** next to this file. Data lives
|
|
139
|
+
there, prose lives here.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
% agenticdev.tex — venue numbers for the guards IN THE PREAMBLE. LaTeX doesn't read YAML, so the
|
|
2
|
+
% values are duplicated from venues/agenticdev.jsonc (the source of truth — read by the
|
|
3
|
+
% `pdf/profile` rule, see eslint-rules/pdf-facts.mjs:128). in = inches.
|
|
4
|
+
%
|
|
5
|
+
% 🔴 THIS USED TO SAY `venues/agenticdev.yaml`, AND NO SUCH FILE EXISTS (fixed 2026-09-12). The
|
|
6
|
+
% link went stale during the YAML → JSONC move on 08-26 and survived it, because a comment isn't
|
|
7
|
+
% checked by anything: the "source of truth" named a file that doesn't exist, while the real one
|
|
8
|
+
% sat right next to it.
|
|
9
|
+
% ⚠️ And the duplicate is kept in sync BY HAND. Checked 09-12: 7.087 / 9.252 / 2 / 9 / 5 / 2 match
|
|
10
|
+
% the .jsonc — as of today. There is no mechanism guaranteeing this; a candidate is generating this
|
|
11
|
+
% file from the .jsonc with one build step, which would make the drift unrepresentable (see
|
|
12
|
+
% idei/paper-pipeline-extraction/10-latex-carriers-2026-09-12.md).
|
|
13
|
+
% ⚠️ w/h are CEILINGS ("text width must not exceed 18 cm"), not targets: acmart sets them smaller.
|
|
14
|
+
\def\venuetextblockw{7.087}
|
|
15
|
+
\def\venuetextblockh{9.252}
|
|
16
|
+
\def\venuecolumns{2}
|
|
17
|
+
\def\venuebodypt{9}
|
|
18
|
+
\def\venuebodypagesmax{5}
|
|
19
|
+
\def\venuerefpagesmax{2}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
// AISec @ ACM CCS format profile. Data for the `pdf/*` rules over `_build/paper.facts.json`.
|
|
2
|
+
// Prose about the venue and tracks is in `aisec.md` nearby.
|
|
3
|
+
//
|
|
4
|
+
// PAGE LIMITS — verbatim from https://aisec.cc/ (verified 2026-08-26, not from memory):
|
|
5
|
+
// «Submitted papers must be at most 10 pages long in double-column ACM format---excluding
|
|
6
|
+
// bibliography and well-marked appendices, for which up to two additional pages can be used
|
|
7
|
+
// (hence, the paper's overall length must be of 12 pages at most).»
|
|
8
|
+
// Our card used to say "up to ~10pp" — an approximate number that cannot be put into a gate: it
|
|
9
|
+
// would either let an overage through or redden on a correct paper.
|
|
10
|
+
//
|
|
11
|
+
// ⚠️ A venue caveat worth remembering: "if ... you get a warning stating that 'Too many
|
|
12
|
+
// pages: the limit is 12 pages, found 13', this is OK -- as long as the 13th page contains ONLY
|
|
13
|
+
// the 'Generative AI paragraph'". Our gate does NOT know about this exception and will redden on
|
|
14
|
+
// a 13th page. That's deliberate: the case is rare, and automation that knows "sometimes it's
|
|
15
|
+
// fine" is worse than a plain rejection a human clears by eye.
|
|
16
|
+
//
|
|
17
|
+
// GEOMETRY AND FONTS are inherited from `acmart sigconf` — the same class as agenticdev, and
|
|
18
|
+
// measured the same way (banal + pdffonts, 08-26). AISec points to the "main ACM CCS'26 formatting
|
|
19
|
+
// instructions" and does not publish its own numbers.
|
|
20
|
+
{
|
|
21
|
+
"template": "acmart",
|
|
22
|
+
|
|
23
|
+
// TeX Live packages the acmart template needs ON TOP OF tex-base.jsonc, each with the files that
|
|
24
|
+
// prove it is present (checked with kpsewhich after every install). Read by `paperlint toolchain` and
|
|
25
|
+
// `paperlint build`; the shape is venue-profile.schema.json.
|
|
26
|
+
// libertine · inconsolata (zi4) · newtx — acmart.cls checks ALL THREE and, if ANY is missing,
|
|
27
|
+
// silently falls back to Computer Modern: the PDF compiles, looks normal, is set in the wrong
|
|
28
|
+
// font, and the other metric gives another pagination. A submitted paper went out that way.
|
|
29
|
+
// kastrup (binhex.tex) — pulled in by newtx. Missing it is a HARD stop, so adding the fonts
|
|
30
|
+
// without it breaks a build that worked.
|
|
31
|
+
// fancyhdr — required by acmart itself; present on most images by accident, absent on a
|
|
32
|
+
// minimal one ("File `fancyhdr.sty' not found", measured on TinyTeX, issue #37).
|
|
33
|
+
// the rest — pulled in by acmart ITSELF, not by the paper, so reading \usepackage never finds
|
|
34
|
+
// them. Found 2026-09-01 by the loop build → missing file → tlmgr search --file → install.
|
|
35
|
+
"tex": {
|
|
36
|
+
"packages": {
|
|
37
|
+
"acmart": ["acmart.cls"],
|
|
38
|
+
"amscls": ["amsart.cls"],
|
|
39
|
+
"libertine": ["libertine.sty"],
|
|
40
|
+
"inconsolata": ["zi4.sty"],
|
|
41
|
+
"newtx": ["newtxmath.sty"],
|
|
42
|
+
"kastrup": ["binhex.tex"],
|
|
43
|
+
"fancyhdr": ["fancyhdr.sty"],
|
|
44
|
+
"totpages": ["totpages.sty"],
|
|
45
|
+
"environ": ["environ.sty"],
|
|
46
|
+
"preprint": ["balance.sty"],
|
|
47
|
+
// acmart's `pbalance` option (the vendor's first fix for an unbalanced last page, which the
|
|
48
|
+
// optional rule `pdf/last-page-balance` recommends) loads pbalance, which needs filehook and
|
|
49
|
+
// zref. Measured 2026-09-25 on an acmart sigconf camera-ready: without them the option stops
|
|
50
|
+
// the build; with them the last page went from 639.6 / 224.1 to 424.4 / 439.2 pt, same page count.
|
|
51
|
+
"pbalance": ["pbalance.sty"],
|
|
52
|
+
"filehook": ["filehook.sty"],
|
|
53
|
+
"zref": ["zref-abspage.sty"],
|
|
54
|
+
"xstring": ["xstring.sty"],
|
|
55
|
+
"everyshi": ["everyshi.sty"],
|
|
56
|
+
"hyperxmp": ["hyperxmp.sty"],
|
|
57
|
+
"ncctools": ["manyfoot.sty"],
|
|
58
|
+
"cmap": ["cmap.sty"],
|
|
59
|
+
"float": ["float.sty"],
|
|
60
|
+
"comment": ["comment.sty"],
|
|
61
|
+
"upquote": ["upquote.sty"],
|
|
62
|
+
"doclicense": ["doclicense.sty"],
|
|
63
|
+
"textcase": ["textcase.sty"],
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
|
|
67
|
+
"page_size": "letter",
|
|
68
|
+
"page_w_in": 8.5,
|
|
69
|
+
"page_h_in": 11.0,
|
|
70
|
+
|
|
71
|
+
"textblock_w_in": 7.087,
|
|
72
|
+
"textblock_h_in": 9.252,
|
|
73
|
+
// Last-page balance is NOT a profile field. It is the optional lint rule pdf/last-page-balance,
|
|
74
|
+
// which a consumer turns on for the papers whose publisher asks (Conference Publishing bounced
|
|
75
|
+
// an accepted paper for it on 08-29: "Please correct the last page balancing") — see
|
|
76
|
+
// docs/optional-rules.md.
|
|
77
|
+
|
|
78
|
+
"columns": 2,
|
|
79
|
+
|
|
80
|
+
"body_pt": 9,
|
|
81
|
+
// banal measures the rendered text's mode, not the declared size (measured: 9.30 at a
|
|
82
|
+
// declared 9).
|
|
83
|
+
"body_pt_tol": 0.5,
|
|
84
|
+
|
|
85
|
+
"ref_pt_min": 7,
|
|
86
|
+
"ref_pt_max": 9,
|
|
87
|
+
|
|
88
|
+
"fonts_text": "LinLibertine",
|
|
89
|
+
"fonts_title": "LinBiolinum",
|
|
90
|
+
|
|
91
|
+
// Four tracks (original research · position/open-problem · SoK · benchmark) — the limits are
|
|
92
|
+
// the SAME for all of them, the venue doesn't split them. The keys are kept separate so a
|
|
93
|
+
// paper's `venue.json` can name its own track: not for the numbers, but so it's visible which
|
|
94
|
+
// track it was submitted under.
|
|
95
|
+
"kinds": {
|
|
96
|
+
"research": { "body_pages_max": 10, "ref_pages_max": 2 },
|
|
97
|
+
"benchmark": { "body_pages_max": 10, "ref_pages_max": 2 },
|
|
98
|
+
"position": { "body_pages_max": 10, "ref_pages_max": 2 },
|
|
99
|
+
"sok": { "body_pages_max": 10, "ref_pages_max": 2 },
|
|
100
|
+
},
|
|
101
|
+
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "AISec @ ACM CCS — venue card (data)"
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# AISec @ ACM CCS venue card
|
|
6
|
+
|
|
7
|
+
> **This is a venue DATA file, not a skill.** Follow the `submit-paper` skill for the end-to-end
|
|
8
|
+
> mechanics; the facts below are the venue-specific data. (Formerly the `submit-paper-aisec` skill;
|
|
9
|
+
> demoted to a reference doc so venue data doesn't proliferate the skill namespace.) **Re-verify the
|
|
10
|
+
> CFP each year** (`https://aisec.cc/`) — deadline, page limit, and tracks shift year to year.
|
|
11
|
+
|
|
12
|
+
## The bar (read this first)
|
|
13
|
+
|
|
14
|
+
AISec is **not** a first-edition welcoming workshop. It is the long-running AI-security workshop of
|
|
15
|
+
**ACM CCS — a top-4 security conference** — so calibrate to a _harder_ bar than a fresh workshop:
|
|
16
|
+
mature threat modeling, honest evaluation, and airtight ethics are table stakes, not bonuses. A
|
|
17
|
+
security PC rejects on soundness and ethics grounds that a SE workshop would wave through.
|
|
18
|
+
|
|
19
|
+
## The facts (2026 edition)
|
|
20
|
+
|
|
21
|
+
- **Venue**: ACM Workshop on Artificial Intelligence and Security (**AISec**), co-located with **ACM
|
|
22
|
+
CCS** (Computer and Communications Security).
|
|
23
|
+
- **Deadline**: **24 July 2026** (verify the AoE cutoff, and convert it into your own zone, on the CFP each cycle).
|
|
24
|
+
- **Types / tracks**: **full research papers**; **benchmark papers** (new evaluation frameworks /
|
|
25
|
+
datasets **with artifact sharing** — a first-class track, not an afterthought); **position / SoK**
|
|
26
|
+
(systematization-of-knowledge) papers. Pick the track and pitch to _its_ bar.
|
|
27
|
+
- **Format**: ACM double-column (`sigconf`), up to **~10pp**. Build:
|
|
28
|
+
`pdflatex; bibtex; pdflatex; pdflatex`; add `\microtypesetup{expansion=false}` (the #1 acmart crash).
|
|
29
|
+
- **Blind model**: **double-blind** — `\documentclass[sigconf,review,anonymous]{acmart}`, author
|
|
30
|
+
`Anonymous Author(s)`. See `submit-paper` §0/§4 for de-anon hygiene.
|
|
31
|
+
- **Archival**: accepted papers → **CCS workshop proceedings in the ACM Digital Library** (DOI). Real
|
|
32
|
+
indexed-authorship evidence, at a top-tier-security-adjacent venue.
|
|
33
|
+
- **⚠️ No supplementary-material upload field** on the form. → **Host the artifact externally,
|
|
34
|
+
anonymized** (OSF private project + anonymized view-only link) and `\url{}` it in Availability. See
|
|
35
|
+
`submit-paper` §2 and `paper-pipeline/references/anonymization.md`.
|
|
36
|
+
|
|
37
|
+
## Security-venue specifics that DECIDE acceptance (this is the whole game here)
|
|
38
|
+
|
|
39
|
+
1. **Threat-model soundness.** Name the **attacker** explicitly and their **capabilities** (what they
|
|
40
|
+
observe, what they control, their goal, their budget). **Separate accidental failure from an
|
|
41
|
+
adaptive adversary** — "the model gets it wrong sometimes" and "a motivated attacker steers it" are
|
|
42
|
+
different papers; conflating them is the classic security-PC reject. Put the threat model up front,
|
|
43
|
+
not in a footnote.
|
|
44
|
+
2. **Ethics / responsible disclosure — CRITICAL, a hard reject-vector.**
|
|
45
|
+
- **Anonymize studied third parties too**, not just yourself. Do **not** punch down on named
|
|
46
|
+
maintainers/projects — aggregate the stats and use anonymized IDs (e.g. `G01…G46`) for the
|
|
47
|
+
entities you studied.
|
|
48
|
+
- **Disclose findings to affected parties BEFORE any de-anonymized release.** The paper must state
|
|
49
|
+
the disclosure timeline and that a **release gate** blocks publishing de-anonymized data until
|
|
50
|
+
disclosure completes.
|
|
51
|
+
- No supplementary slot → the anonymized artifact on **OSF** must itself be leak-clean (the released
|
|
52
|
+
files, not just the PDF). A named-entity leak in the _artifact_ is invisible to a paper-only read
|
|
53
|
+
and is the single highest reject-vector — see Provenance.
|
|
54
|
+
3. **Dual-use.** If you publish an **evasion / attack technique, publish its fix in the same paper** —
|
|
55
|
+
net-defensive framing. A security PC will reject a pure attack recipe with no mitigation as
|
|
56
|
+
irresponsible; the same result framed as "here is the weakness AND how to close it" is a
|
|
57
|
+
contribution.
|
|
58
|
+
4. **GenAI-use disclosure.** ACM/CCS require disclosing how generative AI was used in producing the
|
|
59
|
+
work (writing, code, experiments). Add the disclosure statement; don't omit it.
|
|
60
|
+
|
|
61
|
+
## Track fit (foreground these in the framing)
|
|
62
|
+
|
|
63
|
+
Adversarial ML, ML for security / security for ML, LLM/agent safety and security, evaluation &
|
|
64
|
+
benchmarking of AI-security defenses, poisoning/evasion/extraction, and **rigorous measurement of
|
|
65
|
+
whether a claimed safety mechanism actually holds**. A benchmark/measurement paper that ships a
|
|
66
|
+
reusable eval framework + an anonymized artifact is dead-center for the **benchmark track** — name
|
|
67
|
+
those keywords in the abstract/intro and cite the track by name.
|
|
68
|
+
|
|
69
|
+
## After acceptance — the prestige upgrade
|
|
70
|
+
|
|
71
|
+
AISec@CCS is a workshop, but co-located with a top-4 venue it is the strongest workshop tier a
|
|
72
|
+
dossier can hold. Extend the accepted paper (≥30% new material) into a higher-prestige indexed venue as
|
|
73
|
+
a **second** publication — e.g. a full security conference or a journal. Don't dual-submit the same
|
|
74
|
+
paper; extend it. Plan the **camera-ready de-anonymization + release gate** at acceptance (see
|
|
75
|
+
`camera-ready`).
|
|
76
|
+
|
|
77
|
+
## Provenance
|
|
78
|
+
|
|
79
|
+
"Safety Theater in Agentic Coding" hardened for this venue (PC-panel estimate **~87–88%** accept). Its
|
|
80
|
+
accept **hinged on closing an ethics reject-vector**: the released artifact had named **46 maintainers**
|
|
81
|
+
— a paper-only review missed it; the `pc-panel-review` artifact-runner + ethics lens caught it. Fixed
|
|
82
|
+
by **anonymized provenance (`G01–G46`)** plus a **release gate** blocking de-anonymized release until
|
|
83
|
+
disclosure completes. Lesson baked into this card: at a security venue the two things that most move
|
|
84
|
+
the decision — an ethics/disclosure contradiction and an anonymization leak — live in the **artifact**,
|
|
85
|
+
so verify the shipped files, not just the PDF.
|
|
86
|
+
|
|
87
|
+
## Compose with
|
|
88
|
+
|
|
89
|
+
- `submit-paper` (mechanics: HotCRP form, OSF hosting, "ready for review", PDF-only, profile, dossier notes).
|
|
90
|
+
- `camera-ready` (de-anonymization + the release gate after acceptance).
|
|
91
|
+
- `pc-panel-review` — run it LAST as the gate, and specifically field its **ethics lens** and
|
|
92
|
+
**artifact-runner lens** (stress-test the release gate: plant a leak, confirm it's caught).
|
|
93
|
+
- Canonical shared detail: `paper-pipeline/references/artifact-checklist.md` (artifact build) and
|
|
94
|
+
`paper-pipeline/references/anonymization.md` (de-anon deny-list + verify).
|
|
95
|
+
|
|
96
|
+
## Camera-ready
|
|
97
|
+
|
|
98
|
+
AISec is also **ACM** (a CCS workshop), so the final's mechanics are generic and live in
|
|
99
|
+
**`../publishers/acm.md`**: eRights is filled in FIRST and requires the final title; the preamble
|
|
100
|
+
is converted out of submission mode (`printacmref=false` / `setcopyright{none}` /
|
|
101
|
+
`pagestyle{plain}` / the `review` option — all of it removed); Source files are mandatory
|
|
102
|
+
alongside the PDF; CCS codes come from the 2012 CCS Browser.
|
|
103
|
+
|
|
104
|
+
What's AISec's own — its own DOI/ISBN, its own venue line in the copyright block, and its own
|
|
105
|
+
dates: fill those in here once they arrive (the card gets filled in from fact, not from memory).
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
% paper-guards.tex — guards that turn a paper defect into a BUILD FAILURE.
|
|
2
|
+
%
|
|
3
|
+
% Included from the paper's preamble: \input{paper-guards}
|
|
4
|
+
% Found via TEXINPUTS, which check-render.sh sets (the `references/venues/` directory).
|
|
5
|
+
%
|
|
6
|
+
% WHY A SEPARATE FILE, NOT A COPY IN EVERY PAPER. The first edition of the guard (08-26) lived
|
|
7
|
+
% inline in `agenticdev-2026/paper.tex`, and a measurement that same evening showed the cost: of
|
|
8
|
+
% three papers in LaTeX, the guard existed in exactly ONE. So grepping the log in
|
|
9
|
+
% `check-render.sh` was not redundant with it — for the other two it was the only check at all. A
|
|
10
|
+
% per-paper copy degrades exactly the way any convention that only gets written down degrades.
|
|
11
|
+
%
|
|
12
|
+
% 🔴 BOTH HALVES ARE PROVEN BY MEASUREMENT, AND THE ORDER IS EXACTLY THIS (the `papers/CLAUDE.md`
|
|
13
|
+
% rule): first, "silent on the correct case." On a clean `agenticdev-2026/paper.tex`: 0 errors, PDF
|
|
14
|
+
% 621,325 bytes. With a planted `\ref{ghost-xyz}`: `! Package paper Error: undefined references`.
|
|
15
|
+
% With a planted `\cite{ghost-xyz}`: `! Package paper Error: undefined citations (natbib)`.
|
|
16
|
+
%
|
|
17
|
+
% 🔴 GATED ON \finalpass, AND THIS IS LOAD-BEARING. On the first pass `.aux` is empty, so ALL
|
|
18
|
+
% references are UNDEFINED by construction. Measured 08-26 with the unconditional form: pass 1
|
|
19
|
+
% fails ⇒ `.aux` never gets written ⇒ pass 2 fails on the same thing ⇒ the cycle NEVER CONVERGES
|
|
20
|
+
% and no PDF appears at all. The final pass gets `\def\finalpass{}` on the command line (see
|
|
21
|
+
% `check-render.sh`), ordinary passes stay silent.
|
|
22
|
+
%
|
|
23
|
+
% 🔴 TWO FLAGS, NOT ONE, AND THIS IS ALSO A MEASUREMENT. The first version only looked at LaTeX
|
|
24
|
+
% core's `\@refundefined`, and a planted `\cite{ghost}` sailed right through: `acmart` loads
|
|
25
|
+
% NATBIB, which prints ITS OWN warning and never touches the core flag. natbib's flag is
|
|
26
|
+
% `\NAT@undefined` (`\newcommand\NAT@citeundefined{\gdef\NAT@undefined{...}}`, natbib.sty:1095).
|
|
27
|
+
% Caught by planting the defect, not by reading the code: the guard reported "clean" on a paper
|
|
28
|
+
% whose log contained `Package natbib Warning: Citation 'ghost' on page 6 undefined`.
|
|
29
|
+
%
|
|
30
|
+
% ⚠️ The file deliberately contains nothing besides the reference guards. Geometry and page-limit
|
|
31
|
+
% checks are venue-specific and live in each venue's own `<venue>.tex`.
|
|
32
|
+
\makeatletter
|
|
33
|
+
\AtEndDocument{%
|
|
34
|
+
\ifdefined\finalpass
|
|
35
|
+
\ifx\@refundefined\relax\else
|
|
36
|
+
\PackageError{paper}{undefined references - see the log}{}\fi
|
|
37
|
+
\@ifundefined{NAT@undefined}{}{%
|
|
38
|
+
\PackageError{paper}{undefined citations (natbib) - see the log}{}}%
|
|
39
|
+
\fi
|
|
40
|
+
}
|
|
41
|
+
\makeatother
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
// REALM @ EMNLP 2026 format profile — ACL family, NOT ACM. Prose is in `realm.md` nearby,
|
|
2
|
+
// the family's shared rules are in `paper-pipeline/references/acl-venue-rules.md`.
|
|
3
|
+
//
|
|
4
|
+
// 🔴 THE GEOMETRY NUMBERS ARE MEASURED, NOT COPIED. banal run against our own build
|
|
5
|
+
// (`repro/build-submission.sh` → `build/acl_latex.pdf`, 2026-08-26):
|
|
6
|
+
// A4 8.26 x 11.69 in (595 x 842 pt) · 2 columns · body size 11.3 · leading 13.6 ·
|
|
7
|
+
// reference size 10.3 · margins [72, 67, 66, 68] pt · 0 Type 3 fonts
|
|
8
|
+
// acmart (letter 8.5x11, size 9, Libertine) shares NOTHING with this — copying the numbers from
|
|
9
|
+
// `agenticdev.jsonc` would give a gate that reddens on a correct paper.
|
|
10
|
+
{
|
|
11
|
+
"template": "acl",
|
|
12
|
+
|
|
13
|
+
// TeX Live packages the ACL template needs ON TOP OF tex-base.jsonc (the shape is
|
|
14
|
+
// venue-profile.schema.json). acl.sty itself travels with the paper; these are what it loads.
|
|
15
|
+
// times · helvetic · courier · symbol · zapfding — without them "Font ptmr8t not loadable" and
|
|
16
|
+
// no PDF at all. The proof is a font metric file, because that is what failed.
|
|
17
|
+
// `urw-base35` once stood in this list and was INVENTED: tlmgr answers "package urw-base35 not
|
|
18
|
+
// present in repository". The five names above are enough.
|
|
19
|
+
"tex": {
|
|
20
|
+
"packages": {
|
|
21
|
+
"lineno": ["lineno.sty"],
|
|
22
|
+
"psnfss": ["times.sty"],
|
|
23
|
+
"times": ["ptmr8t.tfm"],
|
|
24
|
+
"helvetic": ["phvr8t.tfm"],
|
|
25
|
+
"courier": ["pcrr8t.tfm"],
|
|
26
|
+
"symbol": ["psyr.tfm"],
|
|
27
|
+
"zapfding": ["uzdr.tfm"],
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
|
|
31
|
+
"page_size": "a4",
|
|
32
|
+
"page_w_in": 8.27,
|
|
33
|
+
"page_h_in": 11.69,
|
|
34
|
+
|
|
35
|
+
"columns": 2,
|
|
36
|
+
|
|
37
|
+
// ACL's stated body size is 11pt; banal measures the render's mode and gives 11.3.
|
|
38
|
+
"body_pt": 11,
|
|
39
|
+
"body_pt_tol": 0.5,
|
|
40
|
+
|
|
41
|
+
// ⚠️ The range is derived from a SINGLE measurement (10.3), not from ACL's spec — I could not
|
|
42
|
+
// find ACL's own numbers for the reference size. So it's set wide: for an `error`-level rule, a
|
|
43
|
+
// false positive is worse than a miss. Narrow it once a primary source turns up.
|
|
44
|
+
"ref_pt_min": 9,
|
|
45
|
+
"ref_pt_max": 11,
|
|
46
|
+
|
|
47
|
+
// The Times clone from the ACL template. Headings are NOT gated: the build also contains
|
|
48
|
+
// NimbusSanL-Bold, but a `pdffonts` measurement can't establish exactly what the heading is set
|
|
49
|
+
// in — it only says a typeface IS present in the file, not where it's applied.
|
|
50
|
+
"fonts_text": "NimbusRomNo9L",
|
|
51
|
+
|
|
52
|
+
// 🔴 PAGE LIMITS ARE NOT GATED HERE, AND THAT IS A MEASUREMENT, NOT LAZINESS.
|
|
53
|
+
//
|
|
54
|
+
// banal classifies pages by content and counts Limitations and Ethics as part of the BODY.
|
|
55
|
+
// ACL excludes them from the limit. Measured 08-26 on our own paper: banal said "body 13," the
|
|
56
|
+
// build's own counter said "body pages: 9," and both are right — they're just counting
|
|
57
|
+
// different things (the body ends at Conclusion on p.9; pp.10-13 are Limitations/Ethics; the
|
|
58
|
+
// bibliography starts at 14).
|
|
59
|
+
//
|
|
60
|
+
// A gate on banal's number would give 13 against a limit of 8 and would redden on a paper that
|
|
61
|
+
// is within the limit. For an `error`-level rule that is the worst outcome. The limit stays
|
|
62
|
+
// owned by the counter inside `build-submission.sh`: it reads the markdown source and therefore
|
|
63
|
+
// KNOWS where the body ends, which the PDF does not.
|
|
64
|
+
//
|
|
65
|
+
// The numbers below are DATA for that counter and for humans, not an input to the rule. Source:
|
|
66
|
+
// `realm.md`, verified by directly fetching the 2026-08-02/03 CFP.
|
|
67
|
+
"page_limits_not_gated": {
|
|
68
|
+
"_": "8 at submission, 9 at camera-ready (+1 page). Both numbers are CURRENTLY hardcoded in build-submission.sh — 8 in the header, 9 in the run — which reads like a mismatch even though these are different STAGES. The script should pull them from here instead.",
|
|
69
|
+
"long_submission": 8,
|
|
70
|
+
"long_camera_ready": 9,
|
|
71
|
+
"short_submission": 4,
|
|
72
|
+
"short_camera_ready": 5,
|
|
73
|
+
"refs_and_appendices": "unlimited",
|
|
74
|
+
"limitations_and_ethics": "not counted (ACL rule)",
|
|
75
|
+
},
|
|
76
|
+
|
|
77
|
+
"kinds": {
|
|
78
|
+
"long": {},
|
|
79
|
+
"short": {},
|
|
80
|
+
},
|
|
81
|
+
}
|