paperlint 3.2.0 โ 4.1.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/workflows/ci.yml +16 -23
- package/CLAUDE.md +33 -13
- package/CONTRIBUTING.md +23 -7
- package/README.md +11 -8
- package/dist/adapters/banal/failure.d.ts +1 -7
- package/dist/adapters/banal/failure.d.ts.map +1 -1
- package/dist/adapters/banal/failure.js +5 -7
- package/dist/adapters/banal/failure.js.map +1 -1
- package/dist/adapters/banal/index.d.ts.map +1 -1
- package/dist/adapters/banal/index.js +8 -11
- package/dist/adapters/banal/index.js.map +1 -1
- package/dist/adapters/banal/install.d.ts.map +1 -1
- package/dist/adapters/banal/install.js +4 -3
- package/dist/adapters/banal/install.js.map +1 -1
- package/dist/adapters/banal/invocation.d.ts +10 -5
- package/dist/adapters/banal/invocation.d.ts.map +1 -1
- package/dist/adapters/banal/invocation.js +13 -1
- package/dist/adapters/banal/invocation.js.map +1 -1
- package/dist/adapters/banal/locate.d.ts +12 -9
- package/dist/adapters/banal/locate.d.ts.map +1 -1
- package/dist/adapters/banal/locate.js +19 -12
- package/dist/adapters/banal/locate.js.map +1 -1
- package/dist/adapters/banal/run.d.ts +10 -1
- package/dist/adapters/banal/run.d.ts.map +1 -1
- package/dist/adapters/banal/run.js +8 -4
- package/dist/adapters/banal/run.js.map +1 -1
- package/dist/adapters/banal/settings.d.ts +1 -1
- package/dist/adapters/banal/settings.d.ts.map +1 -1
- package/dist/adapters/banal/settings.js +2 -1
- package/dist/adapters/banal/settings.js.map +1 -1
- package/dist/adapters/latex/document-class.d.ts +22 -0
- package/dist/adapters/latex/document-class.d.ts.map +1 -0
- package/dist/adapters/latex/document-class.js +102 -0
- package/dist/adapters/latex/document-class.js.map +1 -0
- package/dist/adapters/latex/hidden.d.ts +16 -0
- package/dist/adapters/latex/hidden.d.ts.map +1 -0
- package/dist/adapters/latex/hidden.js +49 -0
- package/dist/adapters/latex/hidden.js.map +1 -0
- package/dist/adapters/latex/index.d.ts +29 -0
- package/dist/adapters/latex/index.d.ts.map +1 -0
- package/dist/adapters/latex/index.js +18 -0
- package/dist/adapters/latex/index.js.map +1 -0
- package/dist/adapters/latex/nodes.d.ts +54 -0
- package/dist/adapters/latex/nodes.d.ts.map +1 -0
- package/dist/adapters/latex/nodes.js +93 -0
- package/dist/adapters/latex/nodes.js.map +1 -0
- package/dist/adapters/latex/outline.d.ts +10 -0
- package/dist/adapters/latex/outline.d.ts.map +1 -0
- package/dist/adapters/latex/outline.js +39 -0
- package/dist/adapters/latex/outline.js.map +1 -0
- package/dist/adapters/latex/parse.d.ts +42 -0
- package/dist/adapters/latex/parse.d.ts.map +1 -0
- package/dist/adapters/latex/parse.js +94 -0
- package/dist/adapters/latex/parse.js.map +1 -0
- package/dist/adapters/latex/rendered.d.ts +10 -0
- package/dist/adapters/latex/rendered.d.ts.map +1 -0
- package/dist/adapters/latex/rendered.js +39 -0
- package/dist/adapters/latex/rendered.js.map +1 -0
- package/dist/adapters/memory/index.d.ts.map +1 -1
- package/dist/adapters/memory/index.js +8 -2
- package/dist/adapters/memory/index.js.map +1 -1
- package/dist/adapters/node/process.io.d.ts +6 -3
- package/dist/adapters/node/process.io.d.ts.map +1 -1
- package/dist/adapters/node/process.io.js.map +1 -1
- package/dist/adapters/node/workspace.io.d.ts.map +1 -1
- package/dist/adapters/node/workspace.io.js +4 -2
- package/dist/adapters/node/workspace.io.js.map +1 -1
- package/dist/adapters/pdfjs/fill.d.ts.map +1 -1
- package/dist/adapters/pdfjs/fill.js +12 -12
- package/dist/adapters/pdfjs/fill.js.map +1 -1
- package/dist/adapters/references/index.d.ts.map +1 -1
- package/dist/adapters/references/index.js +4 -2
- package/dist/adapters/references/index.js.map +1 -1
- package/dist/build-engine.d.ts +1 -1
- package/dist/build-engine.d.ts.map +1 -1
- package/dist/build-engine.js +8 -1
- package/dist/build-engine.js.map +1 -1
- package/dist/build.d.ts +2 -3
- package/dist/build.d.ts.map +1 -1
- package/dist/build.js +9 -10
- package/dist/build.js.map +1 -1
- package/dist/caller-path.d.ts +3 -0
- package/dist/caller-path.d.ts.map +1 -0
- package/dist/caller-path.js +13 -0
- package/dist/caller-path.js.map +1 -0
- package/dist/cli.d.ts +10 -17
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +91 -17
- package/dist/cli.js.map +1 -1
- package/dist/doctor.d.ts +12 -3
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +2 -1
- package/dist/doctor.js.map +1 -1
- package/dist/domain/paths.d.ts +8 -2
- package/dist/domain/paths.d.ts.map +1 -1
- package/dist/domain/paths.js +12 -1
- package/dist/domain/paths.js.map +1 -1
- package/dist/domain/ready.d.ts +24 -0
- package/dist/domain/ready.d.ts.map +1 -0
- package/dist/domain/ready.js +11 -0
- package/dist/domain/ready.js.map +1 -0
- package/dist/domain/record.d.ts +8 -0
- package/dist/domain/record.d.ts.map +1 -0
- package/dist/domain/record.js +8 -0
- package/dist/domain/record.js.map +1 -0
- package/dist/domain/sha256.d.ts.map +1 -1
- package/dist/domain/sha256.js +4 -2
- package/dist/domain/sha256.js.map +1 -1
- package/dist/domain/tex-document.d.ts +84 -0
- package/dist/domain/tex-document.d.ts.map +1 -0
- package/dist/domain/tex-document.js +43 -0
- package/dist/domain/tex-document.js.map +1 -0
- package/dist/engine.d.ts +23 -22
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js.map +1 -1
- package/dist/eslint-rules/bib-reachable-entry.d.ts +1 -1
- package/dist/eslint-rules/bib-reachable-entry.js.map +1 -1
- package/dist/eslint-rules/install-path-literals.d.ts +2 -2
- package/dist/eslint-rules/install-path-literals.js.map +1 -1
- package/dist/eslint-rules/paper-research-question.d.ts +1 -1
- package/dist/eslint-rules/paper-research-question.js.map +1 -1
- package/dist/eslint-rules/paper-stages.d.ts +2 -2
- package/dist/eslint-rules/paper-stages.js.map +1 -1
- package/dist/eslint-rules/paper-typography.d.ts +6 -6
- package/dist/eslint-rules/paper-typography.js.map +1 -1
- package/dist/eslint-rules/pdf-last-page-balance.d.ts +1 -1
- package/dist/eslint-rules/pdf-last-page-balance.js.map +1 -1
- package/dist/eslint-rules/review-frontmatter.d.ts +2 -2
- package/dist/eslint-rules/review-frontmatter.js.map +1 -1
- package/dist/eslint-rules/sibling-frontmatter.d.ts +1 -1
- package/dist/eslint-rules/sibling-frontmatter.d.ts.map +1 -1
- package/dist/eslint-rules/temp-root-realpath.d.ts +1 -1
- package/dist/eslint-rules/temp-root-realpath.js.map +1 -1
- package/dist/eslint-rules/tex-build.d.ts +2 -2
- package/dist/eslint-rules/tex-build.js.map +1 -1
- package/dist/facts-file.d.ts.map +1 -1
- package/dist/facts-file.js +31 -28
- package/dist/facts-file.js.map +1 -1
- package/dist/hooks-settings.d.ts.map +1 -1
- package/dist/hooks-settings.js +17 -2
- package/dist/hooks-settings.js.map +1 -1
- package/dist/init.d.ts +3 -4
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +18 -8
- package/dist/init.js.map +1 -1
- package/dist/lib/paper-config.d.ts.map +1 -1
- package/dist/lib/paper-config.js +1 -5
- package/dist/lib/paper-config.js.map +1 -1
- package/dist/new-paper.d.ts +5 -0
- package/dist/new-paper.d.ts.map +1 -1
- package/dist/new-paper.js +8 -1
- package/dist/new-paper.js.map +1 -1
- package/dist/package-dirs.d.ts +5 -0
- package/dist/package-dirs.d.ts.map +1 -0
- package/dist/package-dirs.js +14 -0
- package/dist/package-dirs.js.map +1 -0
- package/dist/paper-files.d.ts +4 -4
- package/dist/paper-files.d.ts.map +1 -1
- package/dist/paper-files.js +6 -6
- package/dist/paper-files.js.map +1 -1
- package/dist/paper-settings.js +3 -3
- package/dist/paper-settings.js.map +1 -1
- package/dist/pdf-facts.d.ts +51 -1
- package/dist/pdf-facts.d.ts.map +1 -1
- package/dist/pdf-facts.js +23 -15
- package/dist/pdf-facts.js.map +1 -1
- package/dist/pdf-geometry.d.ts.map +1 -1
- package/dist/pdf-geometry.js +2 -3
- package/dist/pdf-geometry.js.map +1 -1
- package/dist/ports/latex.d.ts +24 -0
- package/dist/ports/latex.d.ts.map +1 -0
- package/dist/ports/latex.js +2 -0
- package/dist/ports/latex.js.map +1 -0
- package/dist/ports/tool-installer.d.ts +2 -14
- package/dist/ports/tool-installer.d.ts.map +1 -1
- package/dist/presets.d.ts +15 -2
- package/dist/presets.d.ts.map +1 -1
- package/dist/presets.js +35 -10
- package/dist/presets.js.map +1 -1
- package/dist/references.d.ts.map +1 -1
- package/dist/references.js +4 -4
- package/dist/references.js.map +1 -1
- package/dist/rules-config.d.ts +26 -1
- package/dist/rules-config.d.ts.map +1 -1
- package/dist/rules-config.js +9 -9
- package/dist/rules-config.js.map +1 -1
- package/dist/tex-requirements.d.ts +15 -0
- package/dist/tex-requirements.d.ts.map +1 -1
- package/dist/tex-requirements.js +28 -10
- package/dist/tex-requirements.js.map +1 -1
- package/dist/tex-venue-rules.d.ts +83 -0
- package/dist/tex-venue-rules.d.ts.map +1 -0
- package/dist/tex-venue-rules.js +254 -0
- package/dist/tex-venue-rules.js.map +1 -0
- package/dist/types.d.ts +5 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/venue-rules.d.ts +1 -1
- package/dist/venue-rules.d.ts.map +1 -1
- package/dist/venue-rules.js +20 -7
- package/dist/venue-rules.js.map +1 -1
- package/docs/configuration.md +5 -4
- package/docs/e2e.md +69 -40
- package/docs/install.md +1 -1
- package/docs/prior-art/README.md +1 -1
- package/docs/prior-art/package-location.md +5 -5
- package/docs/prior-art/repro/README.md +1 -1
- package/docs/prior-art/test-tooling.md +21 -10
- package/docs/rules/tex/required-section.md +73 -0
- package/docs/rules/tex/template.md +62 -0
- package/docs/rules/tex/venue-leftover.md +71 -0
- package/docs/rules.md +70 -48
- package/docs/testing.md +17 -4
- package/docs/texlive-install-decision.md +1 -1
- package/docs/toolchain.md +2 -2
- package/eslint-rules/bib-reachable-entry.ts +1 -1
- package/eslint-rules/install-path-literals.ts +2 -2
- package/eslint-rules/paper-research-question.ts +1 -1
- package/eslint-rules/paper-stages.ts +2 -2
- package/eslint-rules/paper-typography.ts +2 -2
- package/eslint-rules/pdf-last-page-balance.ts +1 -1
- package/eslint-rules/review-frontmatter.ts +1 -1
- package/eslint-rules/temp-root-realpath.ts +1 -1
- package/eslint-rules/tex-build.ts +2 -2
- package/eslint.config.mjs +162 -15
- package/fixtures/build-e2e/acmart/expect.json +26 -0
- package/fixtures/build-e2e/aidc/PIPELINE-STATUS.md +3 -0
- package/fixtures/build-e2e/aidc/expect.json +14 -0
- package/fixtures/build-e2e/aidc/paper.tex +46 -0
- package/fixtures/build-e2e/aidc/paperlint.json +1 -0
- package/fixtures/build-e2e/broken/expect.json +11 -0
- package/fixtures/build-e2e/cite/expect.json +27 -0
- package/fixtures/build-e2e/empty/expect.json +12 -0
- package/fixtures/build-e2e/fallback/expect.json +53 -0
- package/fixtures/build-e2e/guards/expect.json +6 -0
- package/fixtures/build-e2e/no-source/expect.json +10 -0
- package/fixtures/build-e2e/unbalanced/expect.json +60 -0
- package/fixtures/install-path-literals/clean.fixture.mjs +1 -1
- package/fixtures/install-path-literals/clean.md +2 -2
- package/fixtures/install-path-literals/defect.fixture.mjs +1 -1
- package/fixtures/install-path-literals/defect.md +2 -2
- package/fixtures/pdf-facts/README.md +1 -1
- package/fixtures/real-markdown-paper/baseline.ts +1 -1
- package/fixtures/render-paper/build-clean.sh +3 -5
- package/hooks/paper-status-gates.sh +9 -19
- package/lib/paper-config.harness.mjs +1 -1
- package/lib/paper-config.ts +1 -5
- package/lib/skill-checks.mjs +24 -381
- package/lib/skill-checks.test.mjs +63 -115
- package/lib/skill-corpus.mjs +10 -251
- package/lib/skill-corpus.test.mjs +2 -13
- package/lib/skill-trigger-cases.mjs +1 -1
- package/package.json +13 -2
- package/{skills/submit-paper/references/venues โ presets}/acm-sigconf.jsonc +4 -1
- package/{skills/submit-paper/references/venues โ presets}/agenticdev.jsonc +4 -0
- package/presets/aidc.jsonc +73 -0
- package/{skills/submit-paper/references/venues โ presets}/aisec.jsonc +4 -0
- package/presets/ieee-conference.jsonc +66 -0
- package/{skills/submit-paper/references/venues โ presets}/realm.jsonc +8 -1
- package/{skills/submit-paper/references/venues โ presets/tex}/paper-guards.tex +1 -1
- package/{skills/submit-paper/references/venues โ presets}/venue-profile.schema.json +30 -2
- package/scripts/check.harness.ts +64 -10
- package/scripts/check.test.ts +60 -13
- package/scripts/check.ts +83 -30
- package/scripts/coverage-config.test.ts +0 -1
- package/scripts/harness-api.frozen.json +0 -1
- package/scripts/test.test.ts +1 -1
- package/scripts/test.ts +1 -1
- package/skills/analyze-sibling-paper/SKILL.md +1 -39
- package/skills/analyze-sibling-paper/SKILL.md.spec.ts +0 -38
- package/skills/argument-arc/SKILL.md +2 -36
- package/skills/argument-arc/SKILL.md.spec.ts +1 -43
- package/skills/build-benchmark/SKILL.md +1 -41
- package/skills/build-benchmark/SKILL.md.spec.ts +0 -40
- package/skills/camera-ready/SKILL.md +1 -34
- package/skills/camera-ready/SKILL.md.spec.ts +0 -33
- package/skills/cold-read-diff/SKILL.md +1 -35
- package/skills/cold-read-diff/SKILL.md.spec.ts +0 -34
- package/skills/draft-paper/SKILL.md +2 -41
- package/skills/draft-paper/SKILL.md.spec.ts +1 -50
- package/skills/extend-paper/SKILL.md +2 -33
- package/skills/extend-paper/SKILL.md.spec.ts +1 -42
- package/skills/find-venue/SKILL.md +2 -38
- package/skills/find-venue/SKILL.md.spec.ts +1 -47
- package/skills/grade-paper-writing/SKILL.md +3 -38
- package/skills/grade-paper-writing/SKILL.md.spec.ts +2 -47
- package/skills/grade-paper-writing/prose-lint.mjs +2 -3
- package/skills/grade-paper-writing/prose-lint.test.ts +1 -1
- package/skills/harden-paper/SKILL.md +1 -39
- package/skills/harden-paper/SKILL.md.spec.ts +0 -38
- package/skills/map-prior-work/SKILL.md +1 -35
- package/skills/map-prior-work/SKILL.md.spec.ts +0 -34
- package/skills/osf-artifact-upload/osf-artifact-upload.harness.ts +3 -4
- package/skills/paper-adversarial-review/SKILL.md +2 -35
- package/skills/paper-adversarial-review/SKILL.md.spec.ts +1 -43
- package/skills/paper-pipeline/PIPELINE-MAP.md +2 -2
- package/skills/paper-pipeline/SKILL.md +3 -29
- package/skills/paper-pipeline/SKILL.md.spec.ts +2 -28
- package/skills/paper-pipeline/grade-paper-writing-ablation.eval.mjs +1 -1
- package/skills/paper-pipeline/paper-pipeline.harness.mjs +25 -40
- package/skills/paper-pipeline/references/acceptance-gate.md +1 -6
- package/skills/paper-pipeline/references/pipeline-status-template.md +8 -35
- package/skills/paper-pipeline/scripts/README.md +30 -225
- package/skills/paper-pipeline/scripts/artifact-coverage.harness.mjs +4 -8
- package/skills/paper-pipeline/scripts/consumer.d.mts +0 -2
- package/skills/paper-pipeline/scripts/consumer.harness.mjs +6 -104
- package/skills/paper-pipeline/scripts/consumer.mjs +24 -119
- package/skills/paper-pipeline/scripts/generated-code.harness.mjs +2 -3
- package/skills/paper-pipeline/scripts/population-map.harness.mjs +3 -3
- package/skills/paper-status/SKILL.md +2 -42
- package/skills/paper-status/SKILL.md.spec.ts +1 -41
- package/skills/pc-panel-review/SKILL.md +2 -46
- package/skills/pc-panel-review/SKILL.md.spec.ts +1 -45
- package/skills/plan-paper-timeline/SKILL.md +2 -36
- package/skills/plan-paper-timeline/SKILL.md.spec.ts +0 -36
- package/skills/render-paper/SKILL.md +2 -38
- package/skills/render-paper/SKILL.md.spec.ts +1 -37
- package/skills/render-paper/check-render.sh +16 -63
- package/skills/render-paper/render-paper.harness.mjs +17 -59
- package/skills/research-ideate/SKILL.md +2 -39
- package/skills/research-ideate/SKILL.md.spec.ts +1 -47
- package/skills/study-accepted-papers/SKILL.md +1 -34
- package/skills/study-accepted-papers/SKILL.md.spec.ts +0 -33
- package/skills/submit-paper/SKILL.md +1 -33
- package/skills/submit-paper/SKILL.md.spec.ts +0 -32
- package/skills/sweep-design-space/SKILL.md +1 -38
- package/skills/sweep-design-space/SKILL.md.spec.ts +0 -37
- package/skills/tighten-paper/SKILL.md +2 -39
- package/skills/tighten-paper/SKILL.md.spec.ts +1 -47
- package/skills/tighten-paper/structure.mjs +4 -11
- package/skills/verify-citations/SKILL.md +2 -38
- package/skills/verify-citations/SKILL.md.spec.ts +1 -37
- package/src/adapters/banal/failure.ts +9 -10
- package/src/adapters/banal/index.test.ts +3 -3
- package/src/adapters/banal/index.ts +8 -10
- package/src/adapters/banal/install.ts +9 -4
- package/src/adapters/banal/invocation.test.ts +20 -8
- package/src/adapters/banal/invocation.ts +24 -9
- package/src/adapters/banal/locate.test.ts +2 -2
- package/src/adapters/banal/locate.ts +27 -21
- package/src/adapters/banal/output.test.ts +1 -1
- package/src/adapters/banal/run.test.ts +3 -3
- package/src/adapters/banal/run.ts +16 -10
- package/src/adapters/banal/settings.ts +2 -2
- package/src/adapters/banal/xml.test.ts +1 -1
- package/src/adapters/curl/download.test.ts +4 -4
- package/src/adapters/latex/document-class.ts +147 -0
- package/src/adapters/latex/hidden.ts +70 -0
- package/src/adapters/latex/index.test.ts +361 -0
- package/src/adapters/latex/index.ts +55 -0
- package/src/adapters/latex/nodes.ts +141 -0
- package/src/adapters/latex/outline.ts +64 -0
- package/src/adapters/latex/parse.ts +136 -0
- package/src/adapters/latex/rendered.ts +59 -0
- package/src/adapters/memory/index.ts +4 -3
- package/src/adapters/node/files.test.ts +5 -3
- package/src/adapters/node/process.io.ts +9 -2
- package/src/adapters/node/process.test.ts +4 -4
- package/src/adapters/node/workspace.io.ts +9 -4
- package/src/adapters/pdfjs/fill.test.ts +1 -1
- package/src/adapters/pdfjs/fill.ts +18 -10
- package/src/adapters/references/index.ts +7 -2
- package/src/build-engine.test.ts +11 -6
- package/src/build-engine.ts +10 -5
- package/src/build.harness.mjs +5 -7
- package/src/build.test.ts +10 -11
- package/src/build.ts +12 -13
- package/src/caller-path.ts +13 -0
- package/src/cli.harness.mjs +1 -3
- package/src/cli.test.ts +21 -16
- package/src/cli.ts +115 -33
- package/src/doctor.test.ts +1 -1
- package/src/doctor.ts +14 -5
- package/src/domain/paths.test.ts +15 -0
- package/src/domain/paths.ts +20 -1
- package/src/domain/ready.ts +31 -0
- package/src/domain/record.test.ts +20 -0
- package/src/domain/record.ts +12 -0
- package/src/domain/sha256.ts +5 -3
- package/src/domain/tex-document.test.ts +80 -0
- package/src/domain/tex-document.ts +110 -0
- package/src/engine.harness.mjs +1 -1
- package/src/engine.ts +30 -2
- package/src/facts-file.test.ts +4 -7
- package/src/facts-file.ts +45 -30
- package/src/hooks-settings.harness.ts +17 -0
- package/src/hooks-settings.ts +28 -4
- package/src/init.test.ts +25 -5
- package/src/init.ts +26 -12
- package/src/latex-loop.harness.ts +1 -1
- package/src/new-paper.harness.mjs +7 -23
- package/src/new-paper.test.ts +28 -3
- package/src/new-paper.ts +15 -3
- package/src/package-dirs.ts +17 -0
- package/src/paper-files.test.ts +22 -19
- package/src/paper-files.ts +16 -27
- package/src/paper-settings-commands.test.ts +6 -1
- package/src/paper-settings.test.ts +2 -2
- package/src/paper-settings.ts +5 -5
- package/src/pdf-facts.test.ts +16 -5
- package/src/pdf-facts.ts +79 -22
- package/src/pdf-geometry.ts +5 -3
- package/src/ports/latex.ts +29 -0
- package/src/ports/tool-installer.ts +2 -17
- package/src/presets.test.ts +65 -4
- package/src/presets.ts +65 -28
- package/src/references.test.ts +25 -19
- package/src/references.ts +4 -5
- package/src/rule-cases.test.ts +474 -0
- package/src/rule-docs.test.ts +159 -0
- package/src/rules-config.ts +40 -11
- package/src/tex-requirements.harness.ts +13 -23
- package/src/tex-requirements.test.ts +21 -0
- package/src/tex-requirements.ts +64 -14
- package/src/tex-venue-rules.test.ts +659 -0
- package/src/tex-venue-rules.ts +429 -0
- package/src/toolchain.harness.mjs +1 -1
- package/src/toolchain.test.ts +9 -5
- package/src/toolchain.ts +2 -2
- package/src/types.ts +5 -3
- package/src/venue-rules.test.ts +104 -8
- package/src/venue-rules.ts +22 -12
- package/templates/paper/paper.tex +2 -1
- package/skills/paper-pipeline/scripts/announce.mjs +0 -67
- package/skills/paper-pipeline/scripts/announce.test.mjs +0 -102
- package/skills/paper-pipeline/scripts/fixtures/clean/PIPELINE-STATUS.md +0 -51
- package/skills/paper-pipeline/scripts/fixtures/dirty/PIPELINE-STATUS.md +0 -52
- package/skills/paper-pipeline/scripts/fixtures/dirty/paper.md +0 -6
- package/skills/paper-pipeline/scripts/fixtures/scorecard.ts +0 -100
- package/skills/paper-pipeline/scripts/ledger.cli.test.mjs +0 -302
- package/skills/paper-pipeline/scripts/ledger.mjs +0 -623
- package/skills/paper-pipeline/scripts/ledger.test.mjs +0 -254
- package/skills/paper-pipeline/scripts/pipeline-check.cli.test.mjs +0 -474
- package/skills/paper-pipeline/scripts/pipeline-check.harness.mjs +0 -328
- package/skills/paper-pipeline/scripts/pipeline-check.mjs +0 -750
- package/skills/paper-pipeline/scripts/pipeline-edges.mjs +0 -169
- package/skills/paper-pipeline/scripts/pipeline-edges.test.mjs +0 -73
- package/skills/paper-pipeline/scripts/run-mechanical.mjs +0 -648
- package/skills/paper-pipeline/scripts/run-mechanical.test.mjs +0 -468
- package/skills/paper-pipeline/scripts/status.mjs +0 -295
- package/skills/paper-pipeline/scripts/status.test.mjs +0 -232
- /package/{skills/submit-paper/references/venues โ presets/tex}/agenticdev.tex +0 -0
- /package/{skills/submit-paper/references/venues โ presets}/tex-base.jsonc +0 -0
package/scripts/check.ts
CHANGED
|
@@ -34,9 +34,11 @@
|
|
|
34
34
|
* (no TeX, no network), and the tail names every skip. "I ran check" then means one thing.
|
|
35
35
|
*/
|
|
36
36
|
import { spawnSync } from "node:child_process";
|
|
37
|
-
import { existsSync } from "node:fs";
|
|
37
|
+
import { existsSync, readFileSync, rmSync } from "node:fs";
|
|
38
|
+
import { tmpdir } from "node:os";
|
|
38
39
|
import { delimiter, dirname, join } from "node:path";
|
|
39
40
|
import { fileURLToPath } from "node:url";
|
|
41
|
+
import { z } from "zod";
|
|
40
42
|
import { isMain } from "../skills/paper-pipeline/scripts/consumer.mjs";
|
|
41
43
|
|
|
42
44
|
const ROOT = dirname(dirname(fileURLToPath(import.meta.url)));
|
|
@@ -72,11 +74,17 @@ type GateCommand =
|
|
|
72
74
|
readonly script: string;
|
|
73
75
|
readonly run?: undefined;
|
|
74
76
|
readonly inCi?: RunInCi;
|
|
77
|
+
/**
|
|
78
|
+
* The script is a vitest run, so its JSON report says how many tests were SKIPPED: a run
|
|
79
|
+
* whose exit is 0 and whose report counts a skip is a skip, not a pass.
|
|
80
|
+
*/
|
|
81
|
+
readonly vitest?: true;
|
|
75
82
|
}
|
|
76
83
|
| {
|
|
77
84
|
readonly run: readonly [string, ...string[]];
|
|
78
85
|
readonly script?: undefined;
|
|
79
86
|
readonly inCi?: undefined;
|
|
87
|
+
readonly vitest?: undefined;
|
|
80
88
|
};
|
|
81
89
|
|
|
82
90
|
/**
|
|
@@ -160,22 +168,14 @@ export const GATES: readonly Gate[] = [
|
|
|
160
168
|
{
|
|
161
169
|
name: "install e2e โ pack, install under npm and pnpm, run the binary",
|
|
162
170
|
job: "gates",
|
|
163
|
-
|
|
171
|
+
script: "test:e2e:install",
|
|
172
|
+
vitest: true,
|
|
164
173
|
},
|
|
165
174
|
{
|
|
166
|
-
name: "
|
|
175
|
+
name: "TeX e2e โ real TeX Live: paperlint toolchain, a real pdflatex build of every fixture, the real banal",
|
|
167
176
|
job: "build-e2e",
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
{
|
|
171
|
-
name: "banal e2e โ the real banal on pdf.js-written XML gives banal-on-pdftohtml's numbers",
|
|
172
|
-
job: "build-e2e",
|
|
173
|
-
run: ["node", "test/e2e/banal.ts"],
|
|
174
|
-
},
|
|
175
|
-
{
|
|
176
|
-
name: "toolchain e2e โ real TeX Live into $PAPERLINT_TEXLIVE_DIR, then a build with only it on PATH",
|
|
177
|
-
job: "build-e2e",
|
|
178
|
-
run: ["node", "test/e2e/toolchain.ts"],
|
|
177
|
+
script: "test:e2e:tex",
|
|
178
|
+
vitest: true,
|
|
179
179
|
},
|
|
180
180
|
];
|
|
181
181
|
|
|
@@ -205,18 +205,41 @@ export const NOT_COVERED: Readonly<Record<string, string>> = {
|
|
|
205
205
|
};
|
|
206
206
|
|
|
207
207
|
/**
|
|
208
|
-
*
|
|
209
|
-
* absent and --strict is off. Anything else nonzero is a failure.
|
|
208
|
+
* vitest's JSON report, as far as the verdict reads it: skipped (`pending`) and `todo` tests.
|
|
210
209
|
*
|
|
211
|
-
* ๐ด A SKIP IS A THIRD OUTCOME. Until the Codex review on #45 the e2e
|
|
212
|
-
* this loop counted that as a pass
|
|
213
|
-
*
|
|
210
|
+
* ๐ด A SKIP IS A THIRD OUTCOME. Until the Codex review on #45 the e2e runs exited 0 on a skip and
|
|
211
|
+
* this loop counted that as a pass: a machine without pnpm or TeX printed "all gates passed" for
|
|
212
|
+
* runs that never happened. The count comes from the runner's own report, not from an exit code
|
|
213
|
+
* the tests would have to agree on.
|
|
214
214
|
*/
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
215
|
+
const VitestReport = z.looseObject({
|
|
216
|
+
numPendingTests: z.number().int().nonnegative(),
|
|
217
|
+
numTodoTests: z.number().int().nonnegative(),
|
|
218
|
+
});
|
|
219
|
+
|
|
220
|
+
/** How many tests a vitest JSON report says were not run, or null when it is not one. */
|
|
221
|
+
export function skippedIn(report: string | null): number | null {
|
|
222
|
+
if (report === null) return null;
|
|
223
|
+
try {
|
|
224
|
+
const r = VitestReport.safeParse(JSON.parse(report));
|
|
225
|
+
return r.success ? r.data.numPendingTests + r.data.numTodoTests : null;
|
|
226
|
+
} catch {
|
|
227
|
+
return null;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* A gate's outcome from its exit status and, for a vitest gate, the skip count its report gave
|
|
233
|
+
* (`null`: the report is missing or unreadable, which cannot be read as a pass).
|
|
234
|
+
*/
|
|
235
|
+
export function outcome(
|
|
236
|
+
status: number | null,
|
|
237
|
+
vitest?: { readonly skipped: number | null },
|
|
238
|
+
): Outcome {
|
|
239
|
+
if (status !== 0) return "fail";
|
|
240
|
+
if (vitest === undefined) return "pass";
|
|
241
|
+
if (vitest.skipped === null) return "fail";
|
|
242
|
+
return vitest.skipped > 0 ? "skip" : "pass";
|
|
220
243
|
}
|
|
221
244
|
|
|
222
245
|
/** The gates that did not pass, each as the line the verdict prints, split by outcome. */
|
|
@@ -225,11 +248,29 @@ interface NotPassed {
|
|
|
225
248
|
skipped: string[];
|
|
226
249
|
}
|
|
227
250
|
|
|
251
|
+
/** A report file's text, read once and removed; null when the run wrote none. */
|
|
252
|
+
export type ReadReport = (file: string) => string | null;
|
|
253
|
+
const readReport: ReadReport = (file) => {
|
|
254
|
+
if (!existsSync(file)) return null;
|
|
255
|
+
const text = readFileSync(file, "utf8");
|
|
256
|
+
rmSync(file, { force: true });
|
|
257
|
+
return text;
|
|
258
|
+
};
|
|
259
|
+
|
|
260
|
+
/** The arguments that make a vitest gate write its JSON report to `file`, beside the usual output. */
|
|
261
|
+
export const reportArgs = (file: string): string[] => [
|
|
262
|
+
"--",
|
|
263
|
+
"--reporter=default",
|
|
264
|
+
"--reporter=json",
|
|
265
|
+
`--outputFile.json=${file}`,
|
|
266
|
+
];
|
|
267
|
+
|
|
228
268
|
/** Run each gate in order; `write` announces it before it starts. */
|
|
229
269
|
function runEach(
|
|
230
270
|
gates: readonly Gate[],
|
|
231
271
|
spawn: Spawn,
|
|
232
272
|
write: (text: string) => unknown,
|
|
273
|
+
reportOf: ReadReport,
|
|
233
274
|
): NotPassed {
|
|
234
275
|
const BIN_FIRST_PATH = [join(ROOT, "node_modules", ".bin"), process.env.PATH]
|
|
235
276
|
.filter(Boolean)
|
|
@@ -237,10 +278,14 @@ function runEach(
|
|
|
237
278
|
const failed: string[] = [];
|
|
238
279
|
const skipped: string[] = [];
|
|
239
280
|
|
|
240
|
-
for (const g of gates) {
|
|
281
|
+
for (const [i, g] of gates.entries()) {
|
|
241
282
|
write(`โโ ${g.name}\n`);
|
|
242
283
|
const [cmd, ...args] = commandOf(g);
|
|
243
|
-
const
|
|
284
|
+
const file = join(
|
|
285
|
+
tmpdir(),
|
|
286
|
+
`paperlint-check-${String(process.pid)}-${String(i)}.json`,
|
|
287
|
+
);
|
|
288
|
+
const r = spawn(cmd, g.vitest ? [...args, ...reportArgs(file)] : args, {
|
|
244
289
|
cwd: ROOT,
|
|
245
290
|
stdio: "inherit",
|
|
246
291
|
encoding: "utf8",
|
|
@@ -249,12 +294,18 @@ function runEach(
|
|
|
249
294
|
// ๐ด The exit code is read from the command itself, never from a pipe. `cmd | tail && โฆ`
|
|
250
295
|
// reports the FILTER's status, which is almost always zero โ that is how a red harness
|
|
251
296
|
// shipped on 2026-09-16.
|
|
252
|
-
const
|
|
297
|
+
const skips = g.vitest ? { skipped: skippedIn(reportOf(file)) } : undefined;
|
|
298
|
+
const o = outcome(r.status, skips);
|
|
253
299
|
if (o === "pass") continue;
|
|
254
300
|
const shown = commandOf(g).join(" ");
|
|
255
301
|
if (o === "skip")
|
|
256
|
-
skipped.push(
|
|
257
|
-
|
|
302
|
+
skipped.push(
|
|
303
|
+
`${g.name} (${shown} โ ${String(skips?.skipped)} test(s) skipped)`,
|
|
304
|
+
);
|
|
305
|
+
else
|
|
306
|
+
failed.push(
|
|
307
|
+
`${g.name} (${shown} โ ${r.status === 0 ? "exit 0, but no vitest JSON report to read skips from" : String(r.status)})`,
|
|
308
|
+
);
|
|
258
309
|
}
|
|
259
310
|
return { failed, skipped };
|
|
260
311
|
}
|
|
@@ -299,14 +350,16 @@ export function runGates({
|
|
|
299
350
|
log = console.log,
|
|
300
351
|
err = console.error,
|
|
301
352
|
write = (s: string) => process.stdout.write(s),
|
|
353
|
+
reportOf = readReport,
|
|
302
354
|
}: {
|
|
303
355
|
gates?: readonly Gate[];
|
|
304
356
|
spawn?: Spawn;
|
|
305
357
|
log?: (line: string) => void;
|
|
306
358
|
err?: (line: string) => void;
|
|
307
359
|
write?: (text: string) => unknown;
|
|
360
|
+
reportOf?: ReadReport;
|
|
308
361
|
} = {}): number {
|
|
309
|
-
const notPassed = runEach(gates, spawn, write);
|
|
362
|
+
const notPassed = runEach(gates, spawn, write, reportOf);
|
|
310
363
|
report(gates, notPassed, { log, err });
|
|
311
364
|
return notPassed.failed.length ? 1 : 0;
|
|
312
365
|
}
|
|
@@ -35,7 +35,6 @@
|
|
|
35
35
|
"skills/paper-pipeline/scripts/consumer.harness.mjs",
|
|
36
36
|
"skills/paper-pipeline/scripts/extract-ref-facts.harness.mjs",
|
|
37
37
|
"skills/paper-pipeline/scripts/generated-code.harness.mjs",
|
|
38
|
-
"skills/paper-pipeline/scripts/pipeline-check.harness.mjs",
|
|
39
38
|
"skills/paper-pipeline/scripts/population-map.harness.mjs",
|
|
40
39
|
"skills/paper-pipeline/scripts/provenance.harness.mjs",
|
|
41
40
|
"skills/paper-pipeline/scripts/round-diff.harness.ts",
|
package/scripts/test.test.ts
CHANGED
|
@@ -24,7 +24,7 @@ test("a failing vitest does not skip the harnesses, and is named as the failure"
|
|
|
24
24
|
1,
|
|
25
25
|
);
|
|
26
26
|
assert.deepEqual(calls, [
|
|
27
|
-
["vitest", "run"],
|
|
27
|
+
["vitest", "run", "--project", "unit"],
|
|
28
28
|
["vigiles", "test", "--min=1", "--no-skip"],
|
|
29
29
|
]);
|
|
30
30
|
assert.deepEqual(said, [
|
package/scripts/test.ts
CHANGED
|
@@ -46,7 +46,7 @@ export function withSources(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv {
|
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
export const SUITES: readonly Suite[] = [
|
|
49
|
-
{ name: "vitest", command: ["vitest", "run"] },
|
|
49
|
+
{ name: "vitest", command: ["vitest", "run", "--project", "unit"] },
|
|
50
50
|
{ name: "harnesses", command: ["vigiles", "test", "--min=1"] },
|
|
51
51
|
];
|
|
52
52
|
|
|
@@ -5,24 +5,10 @@ context: fork
|
|
|
5
5
|
allowed-tools: [WebSearch, WebFetch, Read, Write, Grep, Glob, Bash, Agent]
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
<!-- vigiles:sha256:
|
|
8
|
+
<!-- vigiles:sha256:238796152df07749 compiled from skills/analyze-sibling-paper/SKILL.md.spec.ts -->
|
|
9
9
|
|
|
10
10
|
# analyze-sibling-paper โ settle "isn't this just X?" before a reviewer does
|
|
11
11
|
|
|
12
|
-
## Run me
|
|
13
|
-
|
|
14
|
-
๐ด FIRST, before any other step:
|
|
15
|
-
|
|
16
|
-
```
|
|
17
|
-
node .claude/skills/paper-pipeline/scripts/announce.mjs analyze-sibling-paper <paper-dir>
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
An advisory pass cannot be observed failing โ silence is both its error state and its normal
|
|
21
|
-
state โ so starting is an event, and events get written down.
|
|
22
|
-
|
|
23
|
-
The `<paper-dir>` argument is **your** paper, not the sibling โ the row belongs to the paper being
|
|
24
|
-
defended. The sibling is named by `<report-path>` when the verdict is recorded.
|
|
25
|
-
|
|
26
12
|
When a paper close to yours surfaces, the wrong move is to cite it from its abstract and move on โ that
|
|
27
13
|
leaves a scoop risk you can't see and a reviewer can. This skill reads the *actual* competitor, judges
|
|
28
14
|
whether your contribution genuinely differs, and produces a saved analysis with concrete action points
|
|
@@ -114,30 +100,6 @@ and the action points (with the exact clause text to add/replace). Per the save-
|
|
|
114
100
|
analysis that lives only in a chat is lost the moment the session ends โ and it's exactly what you'll need
|
|
115
101
|
again at rebuttal. **A close sibling with no file in `<paper-dir>/siblings/` is an unfinished analysis.**
|
|
116
102
|
|
|
117
|
-
## Record the verdict
|
|
118
|
-
|
|
119
|
-
๐ด LAST step, once the deliverable exists:
|
|
120
|
-
|
|
121
|
-
```
|
|
122
|
-
node .claude/skills/paper-pipeline/scripts/ledger.mjs record analyze-sibling-paper <paper-dir> FINDING <count> <report-path>
|
|
123
|
-
node .claude/skills/paper-pipeline/scripts/ledger.mjs record analyze-sibling-paper <paper-dir> ABSTAINED <reason> "<one line>"
|
|
124
|
-
```
|
|
125
|
-
|
|
126
|
-
**FINDING** โ `<count>` is the number of action points the card produced (positioning clauses plus
|
|
127
|
-
*MUST CITE* entries), `<report-path>` is the saved card, which names the sibling. Add `--blocking`
|
|
128
|
-
for a genuine scoop, which the skill already treats as an escalation rather than a clause.
|
|
129
|
-
**ABSTAINED** โ `no-witness`: the sibling was read in full and the delta needs no text to change.
|
|
130
|
-
`blocked`: the sibling's full text could not be obtained, so only its abstract was seen โ which is
|
|
131
|
-
explicitly not an analysis and must never be recorded as one.
|
|
132
|
-
|
|
133
|
-
๐ด **There is no PASS.** "The delta is real" read identically whether the sibling had been read
|
|
134
|
-
whole or skimmed, and this skill's own first rule is that an abstract-only delta is not a verdict.
|
|
135
|
-
`no-witness` and `blocked` now say which happened.
|
|
136
|
-
|
|
137
|
-
One row per sibling analysed, filed under its own `--check=<sibling-slug>`; several finding rows
|
|
138
|
-
against one paper is the normal shape here, not a check that keeps failing. Before 2026-08-10 they
|
|
139
|
-
would have overwritten one another.
|
|
140
|
-
|
|
141
103
|
## Rules
|
|
142
104
|
- **Read the paper, not the abstract.** An abstract-only "delta" is not a verdict โ and the card must
|
|
143
105
|
say so: `read: abstract` in its frontmatter, and which parts in its `**Read:**` line.
|
|
@@ -24,20 +24,6 @@ export default experimental_skill({
|
|
|
24
24
|
body: `
|
|
25
25
|
# analyze-sibling-paper โ settle "isn't this just X?" before a reviewer does
|
|
26
26
|
|
|
27
|
-
## Run me
|
|
28
|
-
|
|
29
|
-
๐ด FIRST, before any other step:
|
|
30
|
-
|
|
31
|
-
\`\`\`
|
|
32
|
-
node .claude/skills/paper-pipeline/scripts/announce.mjs analyze-sibling-paper <paper-dir>
|
|
33
|
-
\`\`\`
|
|
34
|
-
|
|
35
|
-
An advisory pass cannot be observed failing โ silence is both its error state and its normal
|
|
36
|
-
state โ so starting is an event, and events get written down.
|
|
37
|
-
|
|
38
|
-
The \`<paper-dir>\` argument is **your** paper, not the sibling โ the row belongs to the paper being
|
|
39
|
-
defended. The sibling is named by \`<report-path>\` when the verdict is recorded.
|
|
40
|
-
|
|
41
27
|
When a paper close to yours surfaces, the wrong move is to cite it from its abstract and move on โ that
|
|
42
28
|
leaves a scoop risk you can't see and a reviewer can. This skill reads the *actual* competitor, judges
|
|
43
29
|
whether your contribution genuinely differs, and produces a saved analysis with concrete action points
|
|
@@ -129,30 +115,6 @@ and the action points (with the exact clause text to add/replace). Per the save-
|
|
|
129
115
|
analysis that lives only in a chat is lost the moment the session ends โ and it's exactly what you'll need
|
|
130
116
|
again at rebuttal. **A close sibling with no file in \`<paper-dir>/siblings/\` is an unfinished analysis.**
|
|
131
117
|
|
|
132
|
-
## Record the verdict
|
|
133
|
-
|
|
134
|
-
๐ด LAST step, once the deliverable exists:
|
|
135
|
-
|
|
136
|
-
\`\`\`
|
|
137
|
-
node .claude/skills/paper-pipeline/scripts/ledger.mjs record analyze-sibling-paper <paper-dir> FINDING <count> <report-path>
|
|
138
|
-
node .claude/skills/paper-pipeline/scripts/ledger.mjs record analyze-sibling-paper <paper-dir> ABSTAINED <reason> "<one line>"
|
|
139
|
-
\`\`\`
|
|
140
|
-
|
|
141
|
-
**FINDING** โ \`<count>\` is the number of action points the card produced (positioning clauses plus
|
|
142
|
-
*MUST CITE* entries), \`<report-path>\` is the saved card, which names the sibling. Add \`--blocking\`
|
|
143
|
-
for a genuine scoop, which the skill already treats as an escalation rather than a clause.
|
|
144
|
-
**ABSTAINED** โ \`no-witness\`: the sibling was read in full and the delta needs no text to change.
|
|
145
|
-
\`blocked\`: the sibling's full text could not be obtained, so only its abstract was seen โ which is
|
|
146
|
-
explicitly not an analysis and must never be recorded as one.
|
|
147
|
-
|
|
148
|
-
๐ด **There is no PASS.** "The delta is real" read identically whether the sibling had been read
|
|
149
|
-
whole or skimmed, and this skill's own first rule is that an abstract-only delta is not a verdict.
|
|
150
|
-
\`no-witness\` and \`blocked\` now say which happened.
|
|
151
|
-
|
|
152
|
-
One row per sibling analysed, filed under its own \`--check=<sibling-slug>\`; several finding rows
|
|
153
|
-
against one paper is the normal shape here, not a check that keeps failing. Before 2026-08-10 they
|
|
154
|
-
would have overwritten one another.
|
|
155
|
-
|
|
156
118
|
## Rules
|
|
157
119
|
- **Read the paper, not the abstract.** An abstract-only "delta" is not a verdict โ and the card must
|
|
158
120
|
say so: \`read: abstract\` in its frontmatter, and which parts in its \`**Read:**\` line.
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: argument-arc
|
|
3
3
|
description: Build or repair the paper's argument architecture โ the one-sentence-per-section outline, the bottom-up inevitability pass, and the name/number budget. Run it when the reader says the paper throws ideas at them, when a structural objection repeats, or before any large rewrite. Not a prose or length skill.
|
|
4
|
-
allowed-tools: [Read, Write, Grep, Glob, Agent
|
|
4
|
+
allowed-tools: [Read, Write, Grep, Glob, Agent]
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
<!-- vigiles:sha256:
|
|
7
|
+
<!-- vigiles:sha256:66be3161e5bde916 compiled from skills/argument-arc/SKILL.md.spec.ts -->
|
|
8
8
|
|
|
9
9
|
# argument-arc โ does the paper carry the reader to one conclusion
|
|
10
10
|
|
|
@@ -14,17 +14,6 @@ allowed-tools: [Read, Write, Grep, Glob, Agent, Bash(node .claude/skills/paper-p
|
|
|
14
14
|
> whether the argument exists. Run it *before* them โ cutting words inside a broken arc is how a
|
|
15
15
|
> session burns a day and ships the same paper.
|
|
16
16
|
|
|
17
|
-
## Run me
|
|
18
|
-
|
|
19
|
-
๐ด FIRST, before any other step:
|
|
20
|
-
|
|
21
|
-
```
|
|
22
|
-
node .claude/skills/paper-pipeline/scripts/announce.mjs argument-arc <paper-dir>
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
An advisory pass cannot be observed failing โ silence is both its error state and its normal
|
|
26
|
-
state โ so starting is an event, and events get written down.
|
|
27
|
-
|
|
28
17
|
The failure it exists to catch has a signature: every paragraph is defensible, every number is real,
|
|
29
18
|
and the reader still finishes the section unable to say what it was for. That is not a prose problem
|
|
30
19
|
and no amount of rewriting sentences fixes it.
|
|
@@ -48,7 +37,6 @@ came out โ which is how a run gets thrown away. That is not hypothetical: it w
|
|
|
48
37
|
data is collected costs the data. Costs a paragraph; saves a study.**
|
|
49
38
|
|
|
50
39
|
`build-benchmark` reads this paragraph before designing, and refuses to proceed if `frame` is empty.
|
|
51
|
-
`pipeline-check.mjs` reports a study that ran with no stated claim.
|
|
52
40
|
|
|
53
41
|
*Added 2026-08-03 alongside the replacement of the numbered stage list โ this skill previously existed
|
|
54
42
|
only as a repair, which meant nobody stated the claim while stating it was still cheap.*
|
|
@@ -125,28 +113,6 @@ most needs help. This skill does:
|
|
|
125
113
|
the calendar against it is a category error.
|
|
126
114
|
- **Rebuild produces a new outline through steps 1โ4 above, and it too gets shown before editing.**
|
|
127
115
|
|
|
128
|
-
## Record the verdict
|
|
129
|
-
|
|
130
|
-
๐ด LAST step, once the deliverable exists:
|
|
131
|
-
|
|
132
|
-
```
|
|
133
|
-
node .claude/skills/paper-pipeline/scripts/ledger.mjs record argument-arc <paper-dir> FINDING <count> <report-path>
|
|
134
|
-
node .claude/skills/paper-pipeline/scripts/ledger.mjs record argument-arc <paper-dir> ABSTAINED <reason> "<one line>"
|
|
135
|
-
```
|
|
136
|
-
|
|
137
|
-
๐ด **There is no PASS.** "The arc carries the reader" is not a value this pass can write down; it is
|
|
138
|
-
what a reader may conclude from the absence of findings, and the concluding is theirs.
|
|
139
|
-
|
|
140
|
-
**FINDING** โ the arc is broken; `<count>` is the number of sections the new outline moves, merges
|
|
141
|
-
or deletes, and `<report-path>` is that outline. Add `--blocking` when there is no conclusion
|
|
142
|
-
sentence to build an arc from: that refusal is a finding about the draft, not an aborted run, and
|
|
143
|
-
`<report-path>` is the one-line statement of what is missing.
|
|
144
|
-
**ABSTAINED** โ `no-witness`: the outline was read end to end and nothing moved. `blocked`: there
|
|
145
|
-
was no outline to read at all.
|
|
146
|
-
|
|
147
|
-
An `ABSTAINED no-witness` on a draft the author has twice called a pile is a missed finding, and
|
|
148
|
-
`status.mjs` will start asking about a check that has only ever abstained.
|
|
149
|
-
|
|
150
116
|
## Rules
|
|
151
117
|
|
|
152
118
|
- **The arc is judged on the outline, never on the draft.** If you find yourself rereading paragraphs
|
|
@@ -10,15 +10,7 @@ export default experimental_skill({
|
|
|
10
10
|
name: "argument-arc",
|
|
11
11
|
description:
|
|
12
12
|
"Build or repair the paper's argument architecture โ the one-sentence-per-section outline, the bottom-up inevitability pass, and the name/number budget. Run it when the reader says the paper throws ideas at them, when a structural objection repeats, or before any large rewrite. Not a prose or length skill.",
|
|
13
|
-
tools: [
|
|
14
|
-
"Read",
|
|
15
|
-
"Write",
|
|
16
|
-
"Grep",
|
|
17
|
-
"Glob",
|
|
18
|
-
"Agent",
|
|
19
|
-
"Bash(node .claude/skills/paper-pipeline/scripts/announce.mjs:*)",
|
|
20
|
-
"Bash(node .claude/skills/paper-pipeline/scripts/ledger.mjs:*)",
|
|
21
|
-
],
|
|
13
|
+
tools: ["Read", "Write", "Grep", "Glob", "Agent"],
|
|
22
14
|
body: `
|
|
23
15
|
# argument-arc โ does the paper carry the reader to one conclusion
|
|
24
16
|
|
|
@@ -28,17 +20,6 @@ export default experimental_skill({
|
|
|
28
20
|
> whether the argument exists. Run it *before* them โ cutting words inside a broken arc is how a
|
|
29
21
|
> session burns a day and ships the same paper.
|
|
30
22
|
|
|
31
|
-
## Run me
|
|
32
|
-
|
|
33
|
-
๐ด FIRST, before any other step:
|
|
34
|
-
|
|
35
|
-
\`\`\`
|
|
36
|
-
node .claude/skills/paper-pipeline/scripts/announce.mjs argument-arc <paper-dir>
|
|
37
|
-
\`\`\`
|
|
38
|
-
|
|
39
|
-
An advisory pass cannot be observed failing โ silence is both its error state and its normal
|
|
40
|
-
state โ so starting is an event, and events get written down.
|
|
41
|
-
|
|
42
23
|
The failure it exists to catch has a signature: every paragraph is defensible, every number is real,
|
|
43
24
|
and the reader still finishes the section unable to say what it was for. That is not a prose problem
|
|
44
25
|
and no amount of rewriting sentences fixes it.
|
|
@@ -62,7 +43,6 @@ came out โ which is how a run gets thrown away. That is not hypothetical: it w
|
|
|
62
43
|
data is collected costs the data. Costs a paragraph; saves a study.**
|
|
63
44
|
|
|
64
45
|
\`build-benchmark\` reads this paragraph before designing, and refuses to proceed if \`frame\` is empty.
|
|
65
|
-
\`pipeline-check.mjs\` reports a study that ran with no stated claim.
|
|
66
46
|
|
|
67
47
|
*Added 2026-08-03 alongside the replacement of the numbered stage list โ this skill previously existed
|
|
68
48
|
only as a repair, which meant nobody stated the claim while stating it was still cheap.*
|
|
@@ -139,28 +119,6 @@ most needs help. This skill does:
|
|
|
139
119
|
the calendar against it is a category error.
|
|
140
120
|
- **Rebuild produces a new outline through steps 1โ4 above, and it too gets shown before editing.**
|
|
141
121
|
|
|
142
|
-
## Record the verdict
|
|
143
|
-
|
|
144
|
-
๐ด LAST step, once the deliverable exists:
|
|
145
|
-
|
|
146
|
-
\`\`\`
|
|
147
|
-
node .claude/skills/paper-pipeline/scripts/ledger.mjs record argument-arc <paper-dir> FINDING <count> <report-path>
|
|
148
|
-
node .claude/skills/paper-pipeline/scripts/ledger.mjs record argument-arc <paper-dir> ABSTAINED <reason> "<one line>"
|
|
149
|
-
\`\`\`
|
|
150
|
-
|
|
151
|
-
๐ด **There is no PASS.** "The arc carries the reader" is not a value this pass can write down; it is
|
|
152
|
-
what a reader may conclude from the absence of findings, and the concluding is theirs.
|
|
153
|
-
|
|
154
|
-
**FINDING** โ the arc is broken; \`<count>\` is the number of sections the new outline moves, merges
|
|
155
|
-
or deletes, and \`<report-path>\` is that outline. Add \`--blocking\` when there is no conclusion
|
|
156
|
-
sentence to build an arc from: that refusal is a finding about the draft, not an aborted run, and
|
|
157
|
-
\`<report-path>\` is the one-line statement of what is missing.
|
|
158
|
-
**ABSTAINED** โ \`no-witness\`: the outline was read end to end and nothing moved. \`blocked\`: there
|
|
159
|
-
was no outline to read at all.
|
|
160
|
-
|
|
161
|
-
An \`ABSTAINED no-witness\` on a draft the author has twice called a pile is a missed finding, and
|
|
162
|
-
\`status.mjs\` will start asking about a check that has only ever abstained.
|
|
163
|
-
|
|
164
122
|
## Rules
|
|
165
123
|
|
|
166
124
|
- **The arc is judged on the outline, never on the draft.** If you find yourself rereading paragraphs
|
|
@@ -5,21 +5,10 @@ context: fork
|
|
|
5
5
|
allowed-tools: [Read, Write, Edit, Grep, Glob, Bash, Agent]
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
<!-- vigiles:sha256:
|
|
8
|
+
<!-- vigiles:sha256:0b91129ca6a6b2a3 compiled from skills/build-benchmark/SKILL.md.spec.ts -->
|
|
9
9
|
|
|
10
10
|
# build-benchmark โ the study + the artifact reviewers can run
|
|
11
11
|
|
|
12
|
-
## Run me
|
|
13
|
-
|
|
14
|
-
๐ด FIRST, before any other step:
|
|
15
|
-
|
|
16
|
-
```
|
|
17
|
-
node .claude/skills/paper-pipeline/scripts/announce.mjs build-benchmark <paper-dir>
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
An advisory pass cannot be observed failing โ silence is both its error state and its normal
|
|
21
|
-
state โ so starting is an event, and events get written down.
|
|
22
|
-
|
|
23
12
|
A measurement paper is only as strong as the artifact a reviewer can `cd` into and re-run. This skill
|
|
24
13
|
covers both halves: the study design that makes the finding true, and the self-checking artifact that
|
|
25
14
|
makes it *verifiable*. The contribution is the **method**, not the one tool you happened to test โ build
|
|
@@ -163,35 +152,6 @@ real-code-through-real-contract execution reveals it.
|
|
|
163
152
|
Before submitting, verify the artifact you built with the reviewer-side reproduction protocol:
|
|
164
153
|
**`references/adversarial-cold-repro.md`** (cold re-run, three-way reconcile, robustness attacks).
|
|
165
154
|
|
|
166
|
-
## Record the verdict
|
|
167
|
-
|
|
168
|
-
๐ด LAST step, once the deliverable exists:
|
|
169
|
-
|
|
170
|
-
```
|
|
171
|
-
node .claude/skills/paper-pipeline/scripts/ledger.mjs record build-benchmark <paper-dir> FINDING <count> <report-path>
|
|
172
|
-
node .claude/skills/paper-pipeline/scripts/ledger.mjs record build-benchmark <paper-dir> ABSTAINED <reason> "<one line>"
|
|
173
|
-
```
|
|
174
|
-
|
|
175
|
-
๐ด **There is no PASS.** An artifact that recomputes every headline number and exits 0 has produced
|
|
176
|
-
no finding; it has not certified the study. Record the absence, do not name it a success.
|
|
177
|
-
|
|
178
|
-
**FINDING** โ `<count>` numbers did not reproduce, or reproduce only with caveats; `<report-path>`
|
|
179
|
-
is the artifact output. Add `--blocking` for the ยง0 refusal: `frame` is empty, so the study was not
|
|
180
|
-
designed.
|
|
181
|
-
**ABSTAINED** โ `no-witness`: the artifact ran and every number reproduced. `input-missing`: the
|
|
182
|
-
raw data is not in the repo. `crashed`: the harness itself died.
|
|
183
|
-
|
|
184
|
-
๐ด That ยง0 refusal is a **finding, not an aborted run** โ it is a fact about the work, so it is a
|
|
185
|
-
FINDING and not an abstention. Record it and stop. A study that was never designed leaves exactly
|
|
186
|
-
the same silence as one that is still running, and the difference costs a week to rediscover.
|
|
187
|
-
|
|
188
|
-
๐ด **THREE MECHANICAL CHECKS FILE UNDER THIS SKILL** and each has its own ledger row:
|
|
189
|
-
`build-benchmark/check-provenance`, `build-benchmark/arm-permutation`,
|
|
190
|
-
`build-benchmark/delivered-pdf` (see `.claude/skills/paper-pipeline/scripts/run-mechanical.mjs`). Until 2026-08-10 the
|
|
191
|
-
ledger keyed on the SKILL, so a clean run of one erased a finding of another from every derived
|
|
192
|
-
view โ which is why two of the three sat unwired. This block records the JUDGEMENT pass, under the
|
|
193
|
-
bare key `build-benchmark`; never file a mechanical result here.
|
|
194
|
-
|
|
195
155
|
## Compose with
|
|
196
156
|
- **argument-arc (frame mode)** โ ๐ด **hard input.** Owns row `frame`, the stated claim. No `frame`, no study.
|
|
197
157
|
- **research-ideate** (upstream) โ supplies the contribution and the pitfall to invert; this skill turns
|
|
@@ -15,17 +15,6 @@ export default experimental_skill({
|
|
|
15
15
|
body: `
|
|
16
16
|
# build-benchmark โ the study + the artifact reviewers can run
|
|
17
17
|
|
|
18
|
-
## Run me
|
|
19
|
-
|
|
20
|
-
๐ด FIRST, before any other step:
|
|
21
|
-
|
|
22
|
-
\`\`\`
|
|
23
|
-
node .claude/skills/paper-pipeline/scripts/announce.mjs build-benchmark <paper-dir>
|
|
24
|
-
\`\`\`
|
|
25
|
-
|
|
26
|
-
An advisory pass cannot be observed failing โ silence is both its error state and its normal
|
|
27
|
-
state โ so starting is an event, and events get written down.
|
|
28
|
-
|
|
29
18
|
A measurement paper is only as strong as the artifact a reviewer can \`cd\` into and re-run. This skill
|
|
30
19
|
covers both halves: the study design that makes the finding true, and the self-checking artifact that
|
|
31
20
|
makes it *verifiable*. The contribution is the **method**, not the one tool you happened to test โ build
|
|
@@ -169,35 +158,6 @@ real-code-through-real-contract execution reveals it.
|
|
|
169
158
|
Before submitting, verify the artifact you built with the reviewer-side reproduction protocol:
|
|
170
159
|
**\`references/adversarial-cold-repro.md\`** (cold re-run, three-way reconcile, robustness attacks).
|
|
171
160
|
|
|
172
|
-
## Record the verdict
|
|
173
|
-
|
|
174
|
-
๐ด LAST step, once the deliverable exists:
|
|
175
|
-
|
|
176
|
-
\`\`\`
|
|
177
|
-
node .claude/skills/paper-pipeline/scripts/ledger.mjs record build-benchmark <paper-dir> FINDING <count> <report-path>
|
|
178
|
-
node .claude/skills/paper-pipeline/scripts/ledger.mjs record build-benchmark <paper-dir> ABSTAINED <reason> "<one line>"
|
|
179
|
-
\`\`\`
|
|
180
|
-
|
|
181
|
-
๐ด **There is no PASS.** An artifact that recomputes every headline number and exits 0 has produced
|
|
182
|
-
no finding; it has not certified the study. Record the absence, do not name it a success.
|
|
183
|
-
|
|
184
|
-
**FINDING** โ \`<count>\` numbers did not reproduce, or reproduce only with caveats; \`<report-path>\`
|
|
185
|
-
is the artifact output. Add \`--blocking\` for the ยง0 refusal: \`frame\` is empty, so the study was not
|
|
186
|
-
designed.
|
|
187
|
-
**ABSTAINED** โ \`no-witness\`: the artifact ran and every number reproduced. \`input-missing\`: the
|
|
188
|
-
raw data is not in the repo. \`crashed\`: the harness itself died.
|
|
189
|
-
|
|
190
|
-
๐ด That ยง0 refusal is a **finding, not an aborted run** โ it is a fact about the work, so it is a
|
|
191
|
-
FINDING and not an abstention. Record it and stop. A study that was never designed leaves exactly
|
|
192
|
-
the same silence as one that is still running, and the difference costs a week to rediscover.
|
|
193
|
-
|
|
194
|
-
๐ด **THREE MECHANICAL CHECKS FILE UNDER THIS SKILL** and each has its own ledger row:
|
|
195
|
-
\`build-benchmark/check-provenance\`, \`build-benchmark/arm-permutation\`,
|
|
196
|
-
\`build-benchmark/delivered-pdf\` (see \`.claude/skills/paper-pipeline/scripts/run-mechanical.mjs\`). Until 2026-08-10 the
|
|
197
|
-
ledger keyed on the SKILL, so a clean run of one erased a finding of another from every derived
|
|
198
|
-
view โ which is why two of the three sat unwired. This block records the JUDGEMENT pass, under the
|
|
199
|
-
bare key \`build-benchmark\`; never file a mechanical result here.
|
|
200
|
-
|
|
201
161
|
## Compose with
|
|
202
162
|
- **argument-arc (frame mode)** โ ๐ด **hard input.** Owns row \`frame\`, the stated claim. No \`frame\`, no study.
|
|
203
163
|
- **research-ideate** (upstream) โ supplies the contribution and the pitfall to invert; this skill turns
|
|
@@ -4,21 +4,10 @@ description: On acceptance, turn the anonymized-for-review paper into the de-ano
|
|
|
4
4
|
allowed-tools: [Read, Write, Edit, Grep, Glob, Bash, WebSearch, WebFetch]
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
<!-- vigiles:sha256:
|
|
7
|
+
<!-- vigiles:sha256:5c85ef4004c31956 compiled from skills/camera-ready/SKILL.md.spec.ts -->
|
|
8
8
|
|
|
9
9
|
# camera-ready โ de-anonymize an accepted paper into the final proceedings version
|
|
10
10
|
|
|
11
|
-
## Run me
|
|
12
|
-
|
|
13
|
-
๐ด FIRST, before any other step:
|
|
14
|
-
|
|
15
|
-
```
|
|
16
|
-
node .claude/skills/paper-pipeline/scripts/announce.mjs camera-ready <paper-dir>
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
An advisory pass cannot be observed failing โ silence is both its error state and its normal
|
|
20
|
-
state โ so starting is an event, and events get written down.
|
|
21
|
-
|
|
22
11
|
The reviewed PDF was anonymized on purpose. Acceptance flips that: the camera-ready carries your
|
|
23
12
|
real name, your real repo, and an archival DOI โ and it's the version that gets indexed, so it's the
|
|
24
13
|
actual authorship evidence. This skill is the reverse of the anonymization you did at
|
|
@@ -113,28 +102,6 @@ If tight, ACM allows references to spill into the reference-only extra pages.
|
|
|
113
102
|
- Record the paper's DOI, the artifact DOI, and the ORCID in the paper's HANDOFF โ those three IDs are
|
|
114
103
|
the authorship evidence and the anchor the extension (`extend-paper`) builds on.
|
|
115
104
|
|
|
116
|
-
## 6. Record the verdict
|
|
117
|
-
|
|
118
|
-
๐ด LAST step, once the deliverable exists:
|
|
119
|
-
|
|
120
|
-
```
|
|
121
|
-
node .claude/skills/paper-pipeline/scripts/ledger.mjs record camera-ready <paper-dir> FINDING <count> <report-path>
|
|
122
|
-
node .claude/skills/paper-pipeline/scripts/ledger.mjs record camera-ready <paper-dir> ABSTAINED <reason> "<one line>"
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
**FINDING** โ `<count>` residual items still open; `<report-path>` names them. Add `--blocking` for
|
|
126
|
-
anything that must not be pushed past: anonymization residue, a dead artifact link, or โ on a
|
|
127
|
-
security paper โ disclosure not yet complete.
|
|
128
|
-
**ABSTAINED** โ `no-witness`: shipped, de-anonymized, DOI live, page limit re-checked, with the DOI
|
|
129
|
-
in the note. `blocked`: the acceptance notice has not arrived, so there is nothing to make ready.
|
|
130
|
-
|
|
131
|
-
๐ด That blocking finding is the only one in this pipeline whose consequence is **irreversible**. The
|
|
132
|
-
public de-anonymized repo is Google-findable the moment it is pushed, so record it before, not after.
|
|
133
|
-
|
|
134
|
-
๐ด **There is no PASS**, and on this skill that is not a formality: a stored "shipped" would have
|
|
135
|
-
been the one row in the pipeline that could be true of a repo nobody had looked at. The DOI in the
|
|
136
|
-
note is the witness. Without it there is nothing to check the row against.
|
|
137
|
-
|
|
138
105
|
## Compose with
|
|
139
106
|
- **submit-paper** (upstream โ this reverses what it anonymized).
|
|
140
107
|
- **paper-pipeline/references/anonymization.md** โ the canonical list of anonymization moves; undo each.
|