paperlint 4.0.0 → 4.2.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 +55 -11
- package/CONTRIBUTING.md +30 -7
- package/README.md +11 -8
- package/dist/adapters/banal/invocation.d.ts +1 -1
- package/dist/adapters/latex/document-class.d.ts +23 -0
- package/dist/adapters/latex/document-class.d.ts.map +1 -0
- package/dist/adapters/latex/document-class.js +110 -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/includes.d.ts +12 -0
- package/dist/adapters/latex/includes.d.ts.map +1 -0
- package/dist/adapters/latex/includes.js +42 -0
- package/dist/adapters/latex/includes.js.map +1 -0
- package/dist/adapters/latex/index.d.ts +33 -0
- package/dist/adapters/latex/index.d.ts.map +1 -0
- package/dist/adapters/latex/index.js +25 -0
- package/dist/adapters/latex/index.js.map +1 -0
- package/dist/adapters/latex/nodes.d.ts +58 -0
- package/dist/adapters/latex/nodes.d.ts.map +1 -0
- package/dist/adapters/latex/nodes.js +97 -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 +95 -0
- package/dist/adapters/latex/parse.js.map +1 -0
- package/dist/adapters/latex/prose.d.ts +8 -0
- package/dist/adapters/latex/prose.d.ts.map +1 -0
- package/dist/adapters/latex/prose.js +353 -0
- package/dist/adapters/latex/prose.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/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/build.js +4 -4
- package/dist/build.js.map +1 -1
- package/dist/claim-provenance.d.ts +34 -0
- package/dist/claim-provenance.d.ts.map +1 -0
- package/dist/claim-provenance.js +146 -0
- package/dist/claim-provenance.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +49 -5
- package/dist/cli.js.map +1 -1
- package/dist/domain/paper-source.d.ts +58 -0
- package/dist/domain/paper-source.d.ts.map +1 -0
- package/dist/domain/paper-source.js +109 -0
- package/dist/domain/paper-source.js.map +1 -0
- package/dist/domain/sentences.d.ts +26 -0
- package/dist/domain/sentences.d.ts.map +1 -0
- package/dist/domain/sentences.js +48 -0
- package/dist/domain/sentences.js.map +1 -0
- package/dist/domain/tex-document.d.ts +119 -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/eslint-rules/paper-typography.d.ts +7 -0
- package/dist/eslint-rules/paper-typography.d.ts.map +1 -1
- package/dist/eslint-rules/paper-typography.js +53 -1
- package/dist/eslint-rules/paper-typography.js.map +1 -1
- package/dist/facts-file.d.ts.map +1 -1
- package/dist/facts-file.js +2 -2
- package/dist/facts-file.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 +3 -0
- 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/ports/latex.d.ts +35 -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/presets.d.ts +15 -2
- package/dist/presets.d.ts.map +1 -1
- package/dist/presets.js +19 -6
- package/dist/presets.js.map +1 -1
- package/dist/register.d.ts +40 -0
- package/dist/register.d.ts.map +1 -0
- package/dist/register.js +134 -0
- package/dist/register.js.map +1 -0
- package/dist/tex-paper.d.ts +19 -0
- package/dist/tex-paper.d.ts.map +1 -0
- package/dist/tex-paper.js +105 -0
- package/dist/tex-paper.js.map +1 -0
- package/dist/tex-requirements.d.ts +11 -0
- package/dist/tex-requirements.d.ts.map +1 -1
- package/dist/tex-requirements.js +14 -8
- package/dist/tex-requirements.js.map +1 -1
- package/dist/tex-venue-rules.d.ts +88 -0
- package/dist/tex-venue-rules.d.ts.map +1 -0
- package/dist/tex-venue-rules.js +268 -0
- package/dist/tex-venue-rules.js.map +1 -0
- package/dist/venue-rules.d.ts +1 -1
- package/dist/venue-rules.d.ts.map +1 -1
- package/docs/configuration.md +3 -2
- 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/claim-provenance.md +83 -0
- package/docs/rules/tex/missing-input.md +58 -0
- package/docs/rules/tex/register.md +77 -0
- package/docs/rules/tex/required-section.md +75 -0
- package/docs/rules/tex/template.md +74 -0
- package/docs/rules/tex/venue-leftover.md +73 -0
- package/docs/rules.md +73 -48
- package/docs/testing.md +17 -4
- package/docs/texlive-install-decision.md +1 -1
- package/docs/toolchain.md +2 -2
- package/eslint-rules/paper-typography.test.mjs +48 -1
- package/eslint-rules/paper-typography.ts +72 -1
- package/eslint.config.mjs +156 -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/pdf-facts/README.md +1 -1
- package/fixtures/real-markdown-paper/baseline.ts +8 -7
- package/fixtures/render-paper/build-clean.sh +3 -5
- package/package.json +14 -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/test.test.ts +1 -1
- package/scripts/test.ts +1 -1
- package/skills/cold-read-diff/SKILL.md +31 -10
- package/skills/cold-read-diff/SKILL.md.spec.ts +30 -9
- package/skills/draft-paper/SKILL.md +2 -2
- package/skills/draft-paper/SKILL.md.spec.ts +1 -1
- package/skills/grade-paper-writing/SKILL.md +109 -44
- package/skills/grade-paper-writing/SKILL.md.spec.ts +108 -43
- package/skills/harden-paper/SKILL.md +35 -36
- package/skills/harden-paper/SKILL.md.spec.ts +34 -35
- package/skills/paper-adversarial-review/SKILL.md +2 -2
- package/skills/paper-adversarial-review/SKILL.md.spec.ts +1 -1
- package/skills/paper-pipeline/PIPELINE-MAP.md +2 -2
- package/skills/paper-pipeline/SKILL.md +4 -4
- package/skills/paper-pipeline/SKILL.md.spec.ts +3 -3
- package/skills/paper-pipeline/grade-paper-writing-ablation.eval.mjs +6 -6
- package/skills/paper-pipeline/references/writing-craft.md +53 -18
- package/skills/paper-pipeline/scripts/consumer.d.mts +0 -2
- package/skills/paper-pipeline/scripts/consumer.mjs +1 -15
- package/skills/pc-panel-review/SKILL.md +36 -11
- package/skills/pc-panel-review/SKILL.md.spec.ts +35 -10
- package/skills/render-paper/SKILL.md +2 -2
- package/skills/render-paper/SKILL.md.spec.ts +1 -1
- package/skills/render-paper/check-render.sh +16 -63
- package/skills/render-paper/render-paper.harness.mjs +17 -59
- package/src/adapters/banal/index.test.ts +1 -1
- package/src/adapters/banal/invocation.ts +1 -1
- package/src/adapters/banal/output.test.ts +1 -1
- package/src/adapters/banal/run.test.ts +1 -1
- package/src/adapters/banal/xml.test.ts +1 -1
- package/src/adapters/latex/document-class.ts +155 -0
- package/src/adapters/latex/hidden.ts +70 -0
- package/src/adapters/latex/includes.ts +66 -0
- package/src/adapters/latex/index.test.ts +535 -0
- package/src/adapters/latex/index.ts +65 -0
- package/src/adapters/latex/nodes.ts +150 -0
- package/src/adapters/latex/outline.ts +64 -0
- package/src/adapters/latex/parse.ts +137 -0
- package/src/adapters/latex/prose.ts +484 -0
- package/src/adapters/latex/rendered.ts +59 -0
- package/src/adapters/pdfjs/fill.test.ts +1 -1
- package/src/adapters/pdfjs/fill.ts +18 -10
- package/src/build.harness.mjs +5 -7
- package/src/build.ts +4 -4
- package/src/claim-provenance.test.ts +352 -0
- package/src/claim-provenance.ts +217 -0
- package/src/cli.harness.mjs +1 -1
- package/src/cli.test.ts +2 -8
- package/src/cli.ts +53 -8
- package/src/domain/paper-source.test.ts +156 -0
- package/src/domain/paper-source.ts +233 -0
- package/src/domain/sentences.ts +67 -0
- package/src/domain/tex-document.test.ts +80 -0
- package/src/domain/tex-document.ts +143 -0
- package/src/engine.harness.mjs +1 -1
- package/src/facts-file.test.ts +4 -7
- package/src/facts-file.ts +2 -2
- package/src/latex-loop.harness.ts +1 -1
- package/src/new-paper.test.ts +28 -3
- package/src/new-paper.ts +8 -0
- package/src/package-dirs.ts +17 -0
- package/src/paper-settings-commands.test.ts +6 -1
- package/src/ports/latex.ts +42 -0
- package/src/presets.test.ts +65 -4
- package/src/presets.ts +38 -15
- package/src/register.test.ts +165 -0
- package/src/register.ts +177 -0
- package/src/rule-cases.test.ts +524 -0
- package/src/rule-docs.test.ts +159 -0
- package/src/tex-paper.test.ts +131 -0
- package/src/tex-paper.ts +152 -0
- package/src/tex-requirements.harness.ts +13 -23
- package/src/tex-requirements.ts +35 -8
- package/src/tex-venue-rules.test.ts +741 -0
- package/src/tex-venue-rules.ts +461 -0
- package/src/toolchain.harness.mjs +1 -1
- package/src/venue-rules.test.ts +96 -4
- package/src/venue-rules.ts +1 -1
- package/templates/paper/paper.tex +2 -1
- package/skills/harden-paper/fixtures/uncited-assertions-sample.md +0 -43
- package/skills/harden-paper/fixtures/uncited-assertions-sample.tex +0 -77
- /package/{skills/submit-paper/references/venues → presets/tex}/agenticdev.tex +0 -0
- /package/{skills/submit-paper/references/venues → presets}/tex-base.jsonc +0 -0
|
@@ -4,7 +4,7 @@ description: Use when asking "is this paper actually ready to submit?" / "what's
|
|
|
4
4
|
allowed-tools: [Read, Write, Edit, Grep, Glob, Bash, WebSearch, WebFetch, Agent, Skill]
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
<!-- vigiles:sha256:
|
|
7
|
+
<!-- vigiles:sha256:35f1ec023504e0ce compiled from skills/harden-paper/SKILL.md.spec.ts -->
|
|
8
8
|
|
|
9
9
|
# harden-paper — the multi-axis pre-submit gate
|
|
10
10
|
|
|
@@ -19,7 +19,7 @@ allowed-tools: [Read, Write, Edit, Grep, Glob, Bash, WebSearch, WebFetch, Agent,
|
|
|
19
19
|
number, and omission must survive on the page. Go axis by axis; for each, **find → fix → re-verify**,
|
|
20
20
|
don't just list. Below, each axis says what to run / check and the specific traps that recur.
|
|
21
21
|
|
|
22
|
-
> Axes 1–10 are **soundness** gates (get it accepted / avoid desk-reject). Axis 11 (**citability**) is
|
|
22
|
+
> Axes 1–10 and 12 are **soundness** gates (get it accepted / avoid desk-reject). Axis 11 (**citability**) is
|
|
23
23
|
> the *impact* gate — a correct-but-forgettable paper passes review and gets cited zero times. For a
|
|
24
24
|
> body of work, citability is not optional polish; run it as a gate too.
|
|
25
25
|
|
|
@@ -61,7 +61,8 @@ middle sags" — wasting the polish on possibly-cut sections.
|
|
|
61
61
|
there with no pointer reaching it, the body is overclaiming and "it's in the appendix" is not
|
|
62
62
|
a defence — reviewers are not required to read appendices, and ARR says so in as many words.
|
|
63
63
|
Rule and the sorting test: `paper-pipeline/references/body-vs-appendix.md`.
|
|
64
|
-
Mechanical leg:
|
|
64
|
+
Mechanical leg: `tex/claim-provenance` (axis 7) reports every sentence that states a number and
|
|
65
|
+
does not say whose it is.
|
|
65
66
|
|
|
66
67
|
3. **Novelty vs the nearest neighbor** — the scoop check. Search for the paper that *already did your
|
|
67
68
|
thing* (`verify-citations` covers metadata; here, actively hunt the closest empirical/method twin).
|
|
@@ -114,40 +115,18 @@ middle sags" — wasting the polish on possibly-cut sections.
|
|
|
114
115
|
to an artifact output or a `\cite`; an untraceable number is treated as fabricated** (source or cut).
|
|
115
116
|
*(This session: "37% growth to 18% cut across independent runs" was in neither — only the artifact
|
|
116
117
|
evaluator caught it.)*
|
|
117
|
-
- **`npx
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
Citation forms recognized: **any `\…cite…` macro** (`\cite`/`\citep`/`\citet`/`\footcite`/`\smartcite`/
|
|
126
|
-
`\parencite`/`\textcite`/`\citeauthor`/`\citeyearpar`…), `\footnote`, **numeric cites** `[12]`/`[3,4]`/
|
|
127
|
-
`[1]` (the dominant CS style), a URL, or a markdown `[@key]`/`[^fn]`/`](link)`. This is the exact thing a
|
|
128
|
-
reviewer pounces on ("[citation needed]"). *Complementary to `check-numbers.sh`, not a dup:* that one
|
|
129
|
-
traces **every** number; this one flags **empirical assertions lacking a cite** and stays quiet on the
|
|
130
|
-
paper's own results. **Guards** (so it doesn't false-alarm): years (`2026`), version numbers (`v1.2`,
|
|
131
|
-
`Node 18`), figure/table/section/equation refs — both literal (`Table 2 shows …`) and cross-ref macros
|
|
132
|
-
(`Table~\ref{tab:x} shows …`, `\autoref`/`\Cref`), numbers inside math mode, **tabular/array bodies** and
|
|
133
|
-
**ordered-list markers** (`2.`), **definitions** (`is defined as`/`refers to`/`we define`), and the
|
|
134
|
-
paper's **OWN reported results**. The own-result guard is a **subject-proximity heuristic** (not a
|
|
135
|
-
parser): it exempts a sentence only when first person is the *subject* — it **starts** with
|
|
136
|
-
`we`/`this paper`/`this work`, or has `we <verb>` / `our <contribution-noun>` — so `We find a 6% reduction`
|
|
137
|
-
passes but a bare `Transformers outperform RNNs by 12%` flags, and, deliberately, `US-based detectors
|
|
138
|
-
reject 40%` (country "US", not "us") and `Our reading of the literature shows X outperforms Y` (a claim
|
|
139
|
-
about others) still **flag**. Fix each hit by attaching a cite, reframing honestly as your own result, by
|
|
140
|
-
cutting the claim — or, for a genuinely defensible one, an `eslint-disable-next-line` **with the reason
|
|
141
|
-
on the spot**. Contract fixtures live in `fixtures/uncited-assertions-sample.{tex,md}` (annotated
|
|
142
|
-
MUST/MUST-NOT-flag cases, incl. the numeric-cite / `\footcite` / `\ref`-float / list-marker / own-result
|
|
143
|
-
regressions) and are still the rule's test — `eslint-rules/paper-claims.harness.mjs` runs them.
|
|
144
|
-
*(Severity is `warn` on purpose: both the own-result guard and sentence splitting are **heuristics** —
|
|
145
|
-
a fixed abbreviation set (`vs.`/`e.g.`/`i.e.`/`et al.`/`cf.`) is protected from false breaks, and on the
|
|
146
|
-
four committed papers the rule reports 374 findings. Treat volume as advisory, not a hard gate.)*
|
|
118
|
+
- **`npx paperlint lint`** — the *overclaim* axis (axis 2), compiled, as `tex/claim-provenance`: every
|
|
119
|
+
sentence of the body that states a number and has no owner — no citation or link, no *we*/*our*, no
|
|
120
|
+
`\ref` or "Table 2", no named sample ("n = 134", "48 runs") — is reported, because a reader cannot
|
|
121
|
+
tell a cited finding from the authors' own measurement from a general fact. Fix each hit by saying
|
|
122
|
+
whose the number is in the sentence, or keep it with an `eslint-disable-next-line` **and the reason
|
|
123
|
+
on the spot**. What it cannot judge (whether the owner is the right one) is on its page,
|
|
124
|
+
`docs/rules/tex/claim-provenance.md`. Complementary to `check-numbers.sh`, not a dup: that one traces
|
|
125
|
+
**every** number to the artifact; this one asks each number's sentence for its owner.
|
|
147
126
|
Enumeration is mechanical; the per-line trace/reconcile stays judgment (prose isn't policy — compile the list).
|
|
148
127
|
|
|
149
128
|
8. **Writing craft (audience-appropriate language + how it reads)** — run **`grade-paper-writing`** (the
|
|
150
|
-
|
|
129
|
+
10-dim rubric in `../paper-pipeline/references/writing-craft.md`).
|
|
151
130
|
🔴 **Invoke it BY NAME with the Skill tool — do not describe the need and hope it fires.**
|
|
152
131
|
Selection of this skill is **not reliable, and not reliably bad either**: the same eight prompts,
|
|
153
132
|
the same description and the same 36 competitors measured **21%** in the morning and **50–54%**
|
|
@@ -159,8 +138,9 @@ middle sags" — wasting the polish on possibly-cut sections.
|
|
|
159
138
|
An explicit call does not depend on selection at all. Without it this axis silently does not run,
|
|
160
139
|
and a hardening pass that skipped its readability axis reports the same "done" as one that ran it.
|
|
161
140
|
**Downstream of axis 0** (don't polish a
|
|
162
|
-
section slated to be cut). Two hard rules from the AISec session: (a) run the stall pass as
|
|
163
|
-
|
|
141
|
+
section slated to be cut). Two hard rules from the AISec session: (a) run the stall pass as **both persona
|
|
142
|
+
subagents** — "Sam", a non-expert engineer, per-section for a dense paper, and the workshop reviewer
|
|
143
|
+
skimming abstract, introduction and conclusion for whose result each sentence states — the rubric SCORE under-fires because a
|
|
164
144
|
frontier grader knows every term and never stalls (it scored a wall-heavy paper 44/60); the persona inventory,
|
|
165
145
|
not the number, is the gate. (b) **A wall / spec-sheet / coined-jargon-heading HARD-FAILS this axis — it is not
|
|
166
146
|
a "minor" note.** Strip jargon the *target venue's* reviewers won't know (register-calibration: keep field-native
|
|
@@ -210,6 +190,23 @@ middle sags" — wasting the polish on possibly-cut sections.
|
|
|
210
190
|
accrue to the extended/arXiv version. Log the follow-on (fuller taxonomy, bigger corpus, the
|
|
211
191
|
dropped refs) so the citable artifact exists. Put a preprint where people can find and cite it.
|
|
212
192
|
|
|
193
|
+
12. **Headline results table** — every number in the abstract and in the conclusion appears in ONE
|
|
194
|
+
table in the body, one row per headline result, with these columns: the result as stated, its
|
|
195
|
+
**n** (what was counted, and how many), its **ground-truth source** (the authors' own measurement
|
|
196
|
+
with the section that reports it, a cited work, or a public dataset), any correction applied
|
|
197
|
+
(multiplicity, a recall floor, a rerun), and the one-line reading the paper draws from it.
|
|
198
|
+
- **Find:** list every number in the abstract and the conclusion (`check-numbers.sh` enumerates
|
|
199
|
+
them), then look each one up in the table. A number with no row, a row with no n, or a row with
|
|
200
|
+
no source is a finding — one per number, not one for the axis.
|
|
201
|
+
- **Why it is an axis and not a nicety:** a reviewer who cannot tell *"properties of LLMs,
|
|
202
|
+
statistical observations from repositories, and experimental findings produced by the authors"*
|
|
203
|
+
apart asks for exactly this — *"a compact table summarizing each headline result, sample size,
|
|
204
|
+
ground-truth source, correction, and final interpretation"*. Prose cannot carry five attributes
|
|
205
|
+
per number; the table can, and it gives every headline claim the owner that
|
|
206
|
+
`tex/claim-provenance` asks of each sentence.
|
|
207
|
+
- **Fix:** build the table, point the abstract's and the conclusion's numbers at it, and move a
|
|
208
|
+
number that has no n or no source out of the abstract until it has both.
|
|
209
|
+
|
|
213
210
|
## Mechanical submission gates (do these yourself — don't punt to the author)
|
|
214
211
|
|
|
215
212
|
- **Double-blind hygiene.** Run the mechanical gate — it greps the deny-list across the PDF text +
|
|
@@ -247,6 +244,8 @@ ready"** — the gates are orthogonal axes and do not average out. **Ready ⇔ A
|
|
|
247
244
|
left unresolved;
|
|
248
245
|
- **Nearest-neighbor scoop** — axis 3 answered: the closest sibling found and either distinguished
|
|
249
246
|
or escalated (`analyze-sibling-paper`);
|
|
247
|
+
- **Headline results table** — axis 12: every number in the abstract and the conclusion has a row
|
|
248
|
+
with its n and its ground-truth source;
|
|
250
249
|
- **The mechanical gates** — de-anon hygiene, page/word-fit, format template.
|
|
251
250
|
|
|
252
251
|
> 🔴 **Citations and scoop were MISSING from this list until 2026-08-31, and the omission had
|
|
@@ -36,7 +36,7 @@ export default experimental_skill({
|
|
|
36
36
|
number, and omission must survive on the page. Go axis by axis; for each, **find → fix → re-verify**,
|
|
37
37
|
don't just list. Below, each axis says what to run / check and the specific traps that recur.
|
|
38
38
|
|
|
39
|
-
> Axes 1–10 are **soundness** gates (get it accepted / avoid desk-reject). Axis 11 (**citability**) is
|
|
39
|
+
> Axes 1–10 and 12 are **soundness** gates (get it accepted / avoid desk-reject). Axis 11 (**citability**) is
|
|
40
40
|
> the *impact* gate — a correct-but-forgettable paper passes review and gets cited zero times. For a
|
|
41
41
|
> body of work, citability is not optional polish; run it as a gate too.
|
|
42
42
|
|
|
@@ -78,7 +78,8 @@ middle sags" — wasting the polish on possibly-cut sections.
|
|
|
78
78
|
there with no pointer reaching it, the body is overclaiming and "it's in the appendix" is not
|
|
79
79
|
a defence — reviewers are not required to read appendices, and ARR says so in as many words.
|
|
80
80
|
Rule and the sorting test: \`paper-pipeline/references/body-vs-appendix.md\`.
|
|
81
|
-
Mechanical leg:
|
|
81
|
+
Mechanical leg: \`tex/claim-provenance\` (axis 7) reports every sentence that states a number and
|
|
82
|
+
does not say whose it is.
|
|
82
83
|
|
|
83
84
|
3. **Novelty vs the nearest neighbor** — the scoop check. Search for the paper that *already did your
|
|
84
85
|
thing* (\`verify-citations\` covers metadata; here, actively hunt the closest empirical/method twin).
|
|
@@ -131,40 +132,18 @@ middle sags" — wasting the polish on possibly-cut sections.
|
|
|
131
132
|
to an artifact output or a \`\\cite\`; an untraceable number is treated as fabricated** (source or cut).
|
|
132
133
|
*(This session: "37% growth to 18% cut across independent runs" was in neither — only the artifact
|
|
133
134
|
evaluator caught it.)*
|
|
134
|
-
- **\`npx
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
Citation forms recognized: **any \`\\…cite…\` macro** (\`\\cite\`/\`\\citep\`/\`\\citet\`/\`\\footcite\`/\`\\smartcite\`/
|
|
143
|
-
\`\\parencite\`/\`\\textcite\`/\`\\citeauthor\`/\`\\citeyearpar\`…), \`\\footnote\`, **numeric cites** \`[12]\`/\`[3,4]\`/
|
|
144
|
-
\`[1]\` (the dominant CS style), a URL, or a markdown \`[@key]\`/\`[^fn]\`/\`](link)\`. This is the exact thing a
|
|
145
|
-
reviewer pounces on ("[citation needed]"). *Complementary to \`check-numbers.sh\`, not a dup:* that one
|
|
146
|
-
traces **every** number; this one flags **empirical assertions lacking a cite** and stays quiet on the
|
|
147
|
-
paper's own results. **Guards** (so it doesn't false-alarm): years (\`2026\`), version numbers (\`v1.2\`,
|
|
148
|
-
\`Node 18\`), figure/table/section/equation refs — both literal (\`Table 2 shows …\`) and cross-ref macros
|
|
149
|
-
(\`Table~\\ref{tab:x} shows …\`, \`\\autoref\`/\`\\Cref\`), numbers inside math mode, **tabular/array bodies** and
|
|
150
|
-
**ordered-list markers** (\`2.\`), **definitions** (\`is defined as\`/\`refers to\`/\`we define\`), and the
|
|
151
|
-
paper's **OWN reported results**. The own-result guard is a **subject-proximity heuristic** (not a
|
|
152
|
-
parser): it exempts a sentence only when first person is the *subject* — it **starts** with
|
|
153
|
-
\`we\`/\`this paper\`/\`this work\`, or has \`we <verb>\` / \`our <contribution-noun>\` — so \`We find a 6% reduction\`
|
|
154
|
-
passes but a bare \`Transformers outperform RNNs by 12%\` flags, and, deliberately, \`US-based detectors
|
|
155
|
-
reject 40%\` (country "US", not "us") and \`Our reading of the literature shows X outperforms Y\` (a claim
|
|
156
|
-
about others) still **flag**. Fix each hit by attaching a cite, reframing honestly as your own result, by
|
|
157
|
-
cutting the claim — or, for a genuinely defensible one, an \`eslint-disable-next-line\` **with the reason
|
|
158
|
-
on the spot**. Contract fixtures live in \`fixtures/uncited-assertions-sample.{tex,md}\` (annotated
|
|
159
|
-
MUST/MUST-NOT-flag cases, incl. the numeric-cite / \`\\footcite\` / \`\\ref\`-float / list-marker / own-result
|
|
160
|
-
regressions) and are still the rule's test — \`eslint-rules/paper-claims.harness.mjs\` runs them.
|
|
161
|
-
*(Severity is \`warn\` on purpose: both the own-result guard and sentence splitting are **heuristics** —
|
|
162
|
-
a fixed abbreviation set (\`vs.\`/\`e.g.\`/\`i.e.\`/\`et al.\`/\`cf.\`) is protected from false breaks, and on the
|
|
163
|
-
four committed papers the rule reports 374 findings. Treat volume as advisory, not a hard gate.)*
|
|
135
|
+
- **\`npx paperlint lint\`** — the *overclaim* axis (axis 2), compiled, as \`tex/claim-provenance\`: every
|
|
136
|
+
sentence of the body that states a number and has no owner — no citation or link, no *we*/*our*, no
|
|
137
|
+
\`\\ref\` or "Table 2", no named sample ("n = 134", "48 runs") — is reported, because a reader cannot
|
|
138
|
+
tell a cited finding from the authors' own measurement from a general fact. Fix each hit by saying
|
|
139
|
+
whose the number is in the sentence, or keep it with an \`eslint-disable-next-line\` **and the reason
|
|
140
|
+
on the spot**. What it cannot judge (whether the owner is the right one) is on its page,
|
|
141
|
+
\`docs/rules/tex/claim-provenance.md\`. Complementary to \`check-numbers.sh\`, not a dup: that one traces
|
|
142
|
+
**every** number to the artifact; this one asks each number's sentence for its owner.
|
|
164
143
|
Enumeration is mechanical; the per-line trace/reconcile stays judgment (prose isn't policy — compile the list).
|
|
165
144
|
|
|
166
145
|
8. **Writing craft (audience-appropriate language + how it reads)** — run **\`grade-paper-writing\`** (the
|
|
167
|
-
|
|
146
|
+
10-dim rubric in \`../paper-pipeline/references/writing-craft.md\`).
|
|
168
147
|
🔴 **Invoke it BY NAME with the Skill tool — do not describe the need and hope it fires.**
|
|
169
148
|
Selection of this skill is **not reliable, and not reliably bad either**: the same eight prompts,
|
|
170
149
|
the same description and the same 36 competitors measured **21%** in the morning and **50–54%**
|
|
@@ -176,8 +155,9 @@ middle sags" — wasting the polish on possibly-cut sections.
|
|
|
176
155
|
An explicit call does not depend on selection at all. Without it this axis silently does not run,
|
|
177
156
|
and a hardening pass that skipped its readability axis reports the same "done" as one that ran it.
|
|
178
157
|
**Downstream of axis 0** (don't polish a
|
|
179
|
-
section slated to be cut). Two hard rules from the AISec session: (a) run the stall pass as
|
|
180
|
-
|
|
158
|
+
section slated to be cut). Two hard rules from the AISec session: (a) run the stall pass as **both persona
|
|
159
|
+
subagents** — "Sam", a non-expert engineer, per-section for a dense paper, and the workshop reviewer
|
|
160
|
+
skimming abstract, introduction and conclusion for whose result each sentence states — the rubric SCORE under-fires because a
|
|
181
161
|
frontier grader knows every term and never stalls (it scored a wall-heavy paper 44/60); the persona inventory,
|
|
182
162
|
not the number, is the gate. (b) **A wall / spec-sheet / coined-jargon-heading HARD-FAILS this axis — it is not
|
|
183
163
|
a "minor" note.** Strip jargon the *target venue's* reviewers won't know (register-calibration: keep field-native
|
|
@@ -227,6 +207,23 @@ middle sags" — wasting the polish on possibly-cut sections.
|
|
|
227
207
|
accrue to the extended/arXiv version. Log the follow-on (fuller taxonomy, bigger corpus, the
|
|
228
208
|
dropped refs) so the citable artifact exists. Put a preprint where people can find and cite it.
|
|
229
209
|
|
|
210
|
+
12. **Headline results table** — every number in the abstract and in the conclusion appears in ONE
|
|
211
|
+
table in the body, one row per headline result, with these columns: the result as stated, its
|
|
212
|
+
**n** (what was counted, and how many), its **ground-truth source** (the authors' own measurement
|
|
213
|
+
with the section that reports it, a cited work, or a public dataset), any correction applied
|
|
214
|
+
(multiplicity, a recall floor, a rerun), and the one-line reading the paper draws from it.
|
|
215
|
+
- **Find:** list every number in the abstract and the conclusion (\`check-numbers.sh\` enumerates
|
|
216
|
+
them), then look each one up in the table. A number with no row, a row with no n, or a row with
|
|
217
|
+
no source is a finding — one per number, not one for the axis.
|
|
218
|
+
- **Why it is an axis and not a nicety:** a reviewer who cannot tell *"properties of LLMs,
|
|
219
|
+
statistical observations from repositories, and experimental findings produced by the authors"*
|
|
220
|
+
apart asks for exactly this — *"a compact table summarizing each headline result, sample size,
|
|
221
|
+
ground-truth source, correction, and final interpretation"*. Prose cannot carry five attributes
|
|
222
|
+
per number; the table can, and it gives every headline claim the owner that
|
|
223
|
+
\`tex/claim-provenance\` asks of each sentence.
|
|
224
|
+
- **Fix:** build the table, point the abstract's and the conclusion's numbers at it, and move a
|
|
225
|
+
number that has no n or no source out of the abstract until it has both.
|
|
226
|
+
|
|
230
227
|
## Mechanical submission gates (do these yourself — don't punt to the author)
|
|
231
228
|
|
|
232
229
|
- **Double-blind hygiene.** Run the mechanical gate — it greps the deny-list across the PDF text +
|
|
@@ -264,6 +261,8 @@ ready"** — the gates are orthogonal axes and do not average out. **Ready ⇔ A
|
|
|
264
261
|
left unresolved;
|
|
265
262
|
- **Nearest-neighbor scoop** — axis 3 answered: the closest sibling found and either distinguished
|
|
266
263
|
or escalated (\`analyze-sibling-paper\`);
|
|
264
|
+
- **Headline results table** — axis 12: every number in the abstract and the conclusion has a row
|
|
265
|
+
with its n and its ground-truth source;
|
|
267
266
|
- **The mechanical gates** — de-anon hygiene, page/word-fit, format template.
|
|
268
267
|
|
|
269
268
|
> 🔴 **Citations and scoop were MISSING from this list until 2026-08-31, and the omission had
|
|
@@ -5,7 +5,7 @@ context: fork
|
|
|
5
5
|
allowed-tools: [Read, Write, Grep, Glob, Agent, Skill]
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
<!-- vigiles:sha256:
|
|
8
|
+
<!-- vigiles:sha256:fe41e7c71eb4672d compiled from skills/paper-adversarial-review/SKILL.md.spec.ts -->
|
|
9
9
|
|
|
10
10
|
# paper-adversarial-review — be the reviewer who wants to reject it
|
|
11
11
|
|
|
@@ -88,6 +88,6 @@ venue + paper type (short/full/position/benchmark). Ask for the structured outpu
|
|
|
88
88
|
- If the paper is genuinely strong, say so — don't manufacture problems.
|
|
89
89
|
|
|
90
90
|
## Compose with
|
|
91
|
-
- `grade-paper-writing` — the Readability/prose axis of the scorecard defers to its
|
|
91
|
+
- `grade-paper-writing` — the Readability/prose axis of the scorecard defers to its 10-dim rubric; run it for the sentence-level fixes behind a low readability score.
|
|
92
92
|
- `pc-panel-review` — this atom's scorecard is one reviewer's card; the panel aggregates N of them (same 1–5 scale) into the decision.
|
|
93
93
|
- The venue CFP (fit/format). Prose QA for papers routes to `grade-paper-writing` + `paper-pipeline/references/writing-craft.md` — NOT the site repo's `writing-quality` / `audience-test` skills (those are for blog posts only; the paper suite's persona pass supersedes them here).
|
|
@@ -94,7 +94,7 @@ venue + paper type (short/full/position/benchmark). Ask for the structured outpu
|
|
|
94
94
|
- If the paper is genuinely strong, say so — don't manufacture problems.
|
|
95
95
|
|
|
96
96
|
## Compose with
|
|
97
|
-
- \`grade-paper-writing\` — the Readability/prose axis of the scorecard defers to its
|
|
97
|
+
- \`grade-paper-writing\` — the Readability/prose axis of the scorecard defers to its 10-dim rubric; run it for the sentence-level fixes behind a low readability score.
|
|
98
98
|
- \`pc-panel-review\` — this atom's scorecard is one reviewer's card; the panel aggregates N of them (same 1–5 scale) into the decision.
|
|
99
99
|
- The venue CFP (fit/format). Prose QA for papers routes to \`grade-paper-writing\` + \`paper-pipeline/references/writing-craft.md\` — NOT the site repo's \`writing-quality\` / \`audience-test\` skills (those are for blog posts only; the paper suite's persona pass supersedes them here).`,
|
|
100
100
|
});
|
|
@@ -200,7 +200,7 @@ format.
|
|
|
200
200
|
## 3. Venue constants belong in a card, not in code
|
|
201
201
|
|
|
202
202
|
> **Done (#79, 2.1.0), in a different shape than planned below.** The constants live in **venue
|
|
203
|
-
> presets**, JSONC files in `
|
|
203
|
+
> presets**, JSONC files in the package's `presets/`: `acm-sigconf.jsonc` is the ACM
|
|
204
204
|
> family (the `format` block — page size, columns, fonts, font sizes — plus the `tex` packages),
|
|
205
205
|
> `agenticdev.jsonc` and `aisec.jsonc` extend it and add their `kinds` (page limits) and `rules`,
|
|
206
206
|
> `realm.jsonc` stands alone. A paper picks one in `<paper>/paperlint.json`
|
|
@@ -332,7 +332,7 @@ point. Nothing to check.
|
|
|
332
332
|
| page limit | **4** | `venues/realm.md` 8 · `build-submission.sh` 8 · `PIPELINE-STATUS` "8/8" · the build prints **9** |
|
|
333
333
|
| the TeX package list | **5** | `ensure-toolchain.sh` (executable) · `SKILL.md` · `render-paper.harness.mjs` (pins it ✅) · `build-submission.sh` · `PIPELINE-STATUS` |
|
|
334
334
|
|
|
335
|
-
The canonical source is the venue preset (`
|
|
335
|
+
The canonical source is the venue preset (`presets/<name>.jsonc`, resolved through its `extends`
|
|
336
336
|
chain): its `format` block for the numbers (page size, columns, fonts, font sizes, and `kinds` for
|
|
337
337
|
page limits), its `tex` block (plus `tex-base.jsonc`) for packages — since 2026-09-24;
|
|
338
338
|
`ensure-toolchain.sh` held them until then — and its `rules` block for the checks the venue
|
|
@@ -4,7 +4,7 @@ description: The orchestrator for writing a research paper end-to-end, from idea
|
|
|
4
4
|
allowed-tools: [Read, Write, Edit, Grep, Glob, Bash, WebSearch, WebFetch, Agent, Skill]
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
<!-- vigiles:sha256:
|
|
7
|
+
<!-- vigiles:sha256:805b94a3515406d7 compiled from skills/paper-pipeline/SKILL.md.spec.ts -->
|
|
8
8
|
|
|
9
9
|
# paper-pipeline — the conductor for the whole organism
|
|
10
10
|
|
|
@@ -19,7 +19,7 @@ of that — who is filing what, and when — stays in the author's own private n
|
|
|
19
19
|
- `references/artifact-checklist.md` — the self-checking reproduction artifact.
|
|
20
20
|
- `references/anonymization.md` — the double-blind deny-list + hygiene (and its reverse at camera-ready).
|
|
21
21
|
- `references/writing-craft.md` — how well-written papers read (craft rules + exemplar lessons + the
|
|
22
|
-
gradeable
|
|
22
|
+
gradeable 10-dim writing rubric); cited by `draft-paper`, `grade-paper-writing`, and `harden-paper`.
|
|
23
23
|
- `references/review-ratchet.md` — how to fix a caught overclaim (tighten → cut → Threats → hedge)
|
|
24
24
|
and why every review round must be paid back with a `tighten-paper` pass; cited by
|
|
25
25
|
`paper-adversarial-review`, `pc-panel-review`, `harden-paper`.
|
|
@@ -30,7 +30,7 @@ of that — who is filing what, and when — stays in the author's own private n
|
|
|
30
30
|
space, anonymity, OpenReview mechanics. Fetch once, not per paper. Venue-specific facts stay in
|
|
31
31
|
`submit-paper/references/venues/<venue>.md`. (No prose equivalent yet for ACM or IEEE — write one
|
|
32
32
|
when the next paper goes there. ACM's machine-checked format already exists: the
|
|
33
|
-
`paperlint:acm-sigconf` preset, `
|
|
33
|
+
`paperlint:acm-sigconf` preset, `presets/acm-sigconf.jsonc` in the package.)
|
|
34
34
|
|
|
35
35
|
## The readiness scorecard (which boxes are checked)
|
|
36
36
|
Stages run in subagents and report into chat, which evaporates — so "did everything run?" becomes
|
|
@@ -224,7 +224,7 @@ skill: 🔴 **argument architecture** — does the whole thing carry the reader
|
|
|
224
224
|
nobody's) · **content strength** — does the contribution clear *this venue's* bar (`study-accepted-papers`,
|
|
225
225
|
mines the accepted corpus for Accept→Strong levers; in SETUP, before the prose is set) ·
|
|
226
226
|
**scientific defects** — what a hostile reviewer attacks (`paper-adversarial-review` / `pc-panel-review`)
|
|
227
|
-
· **writing craft** — does it read like a human wrote it (`grade-paper-writing`, the
|
|
227
|
+
· **writing craft** — does it read like a human wrote it (`grade-paper-writing`, the 10-dim rubric in
|
|
228
228
|
`references/writing-craft.md`; called by `harden-paper`). A paper can ace one and fail another — grade all four.
|
|
229
229
|
**The arc axis comes first**, because tightening length and polishing sentences inside a broken arc is
|
|
230
230
|
how a day disappears and the same paper ships.
|
|
@@ -36,7 +36,7 @@ of that — who is filing what, and when — stays in the author's own private n
|
|
|
36
36
|
- \`references/artifact-checklist.md\` — the self-checking reproduction artifact.
|
|
37
37
|
- \`references/anonymization.md\` — the double-blind deny-list + hygiene (and its reverse at camera-ready).
|
|
38
38
|
- \`references/writing-craft.md\` — how well-written papers read (craft rules + exemplar lessons + the
|
|
39
|
-
gradeable
|
|
39
|
+
gradeable 10-dim writing rubric); cited by \`draft-paper\`, \`grade-paper-writing\`, and \`harden-paper\`.
|
|
40
40
|
- \`references/review-ratchet.md\` — how to fix a caught overclaim (tighten → cut → Threats → hedge)
|
|
41
41
|
and why every review round must be paid back with a \`tighten-paper\` pass; cited by
|
|
42
42
|
\`paper-adversarial-review\`, \`pc-panel-review\`, \`harden-paper\`.
|
|
@@ -47,7 +47,7 @@ of that — who is filing what, and when — stays in the author's own private n
|
|
|
47
47
|
space, anonymity, OpenReview mechanics. Fetch once, not per paper. Venue-specific facts stay in
|
|
48
48
|
\`submit-paper/references/venues/<venue>.md\`. (No prose equivalent yet for ACM or IEEE — write one
|
|
49
49
|
when the next paper goes there. ACM's machine-checked format already exists: the
|
|
50
|
-
\`paperlint:acm-sigconf\` preset, \`
|
|
50
|
+
\`paperlint:acm-sigconf\` preset, \`presets/acm-sigconf.jsonc\` in the package.)
|
|
51
51
|
|
|
52
52
|
## The readiness scorecard (which boxes are checked)
|
|
53
53
|
Stages run in subagents and report into chat, which evaporates — so "did everything run?" becomes
|
|
@@ -241,7 +241,7 @@ skill: 🔴 **argument architecture** — does the whole thing carry the reader
|
|
|
241
241
|
nobody's) · **content strength** — does the contribution clear *this venue's* bar (\`study-accepted-papers\`,
|
|
242
242
|
mines the accepted corpus for Accept→Strong levers; in SETUP, before the prose is set) ·
|
|
243
243
|
**scientific defects** — what a hostile reviewer attacks (\`paper-adversarial-review\` / \`pc-panel-review\`)
|
|
244
|
-
· **writing craft** — does it read like a human wrote it (\`grade-paper-writing\`, the
|
|
244
|
+
· **writing craft** — does it read like a human wrote it (\`grade-paper-writing\`, the 10-dim rubric in
|
|
245
245
|
\`references/writing-craft.md\`; called by \`harden-paper\`). A paper can ace one and fail another — grade all four.
|
|
246
246
|
**The arc axis comes first**, because tightening length and polishing sentences inside a broken arc is
|
|
247
247
|
how a day disappears and the same paper ships.
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
*
|
|
57
57
|
* A0 baseline verbatim. The control.
|
|
58
58
|
* A1 short keep sentence 1 ("Use when asking …") and sentence 2 ("Grades WRITING CRAFT
|
|
59
|
-
* only —
|
|
59
|
+
* only — ten dimensions … the fix for each."). Delete everything after.
|
|
60
60
|
* 1174 -> ~530 chars. The blunt arm: does ANY deletion revive it?
|
|
61
61
|
* A2 no-subordination delete ONLY the two clauses announcing that this skill is a SUBROUTINE of
|
|
62
62
|
* other skills: "whose stall inventory … is the readability gate other skills
|
|
@@ -67,7 +67,7 @@
|
|
|
67
67
|
* deferring — declining to call a thing that presents itself as something
|
|
68
68
|
* another skill calls. No other skill in the roster says this about itself.
|
|
69
69
|
* A3 no-negation delete ONLY the sentence carrying the "NOT …" delegation clauses.
|
|
70
|
-
* A4 no-machinery delete ONLY the opaque internals and proper nouns: the
|
|
70
|
+
* A4 no-machinery delete ONLY the opaque internals and proper nouns: the ten-dimension
|
|
71
71
|
* parenthetical, the "(Peyton Jones, McEnerney, Gopen & Swan; exemplars …)"
|
|
72
72
|
* authorities, the PERSONA sentence and the blind-panel/claims-diff sentence.
|
|
73
73
|
* Keeps sentence 1 and the NOT-clauses.
|
|
@@ -76,7 +76,7 @@
|
|
|
76
76
|
* "grade-paper-writing" reads as a niche in-house verb the selector skips.
|
|
77
77
|
* The only arm that changes nothing about the description text.
|
|
78
78
|
* A6 persona-only ADDED AFTER A0-A5 RAN, on request, and it is A1's MIRROR. The skill has two
|
|
79
|
-
* jobs — a
|
|
79
|
+
* jobs — a ten-dimension rubric and a persona cold-read stall pass — and A1
|
|
80
80
|
* as specified keeps the rubric sentence and deletes the persona one, so the
|
|
81
81
|
* six-arm design had a rubric-only description and no persona-only twin. A6 is
|
|
82
82
|
* that twin: the opening sentence (minus the `"grade the writing"` trigger,
|
|
@@ -518,9 +518,9 @@ const D_NEGATION = [
|
|
|
518
518
|
" NOT a content/defect review (paper-adversarial-review / pc-panel-review), NOT a structural cut plan (tighten-paper — run that first on a bloated draft), NOT venue-bar content strength (study-accepted-papers).",
|
|
519
519
|
];
|
|
520
520
|
const D_MACHINERY = [
|
|
521
|
-
" (Title, Abstract, Intro architecture, Structure, Prose clarity, Jargon discipline, Landing-the-point, Figure economy, Honesty-without-hedge-stacking)",
|
|
521
|
+
" (Title, Abstract, Intro architecture, Structure, Prose clarity, Jargon discipline, Landing-the-point, Figure economy, Honesty-without-hedge-stacking, Register distance to the target venue)",
|
|
522
522
|
" (Peyton Jones, McEnerney, Gopen & Swan; exemplars Trusting Trust, Carlini, Greshake)",
|
|
523
|
-
" Runs the
|
|
523
|
+
" Runs the cold-read stall pass with TWO committed personas (a non-academic engineer per section, and a workshop reviewer skimming abstract, introduction and conclusion) whose stall inventory — not the rubric number — is the readability gate other skills consume (pc-panel-review, paper-adversarial-review, harden-paper).",
|
|
524
524
|
" Defaults to a blind multi-grader panel; after fixes, mandates the claims-preservation diff (row `claims`).",
|
|
525
525
|
];
|
|
526
526
|
// NOTE ON "FOUR NOT-CLAUSES": the description carries THREE uppercase "NOT …" delegation clauses
|
|
@@ -546,7 +546,7 @@ const applyCuts = (s, cuts) => {
|
|
|
546
546
|
// its subordination tail removed — see the header for why that tail goes.
|
|
547
547
|
const D_PERSONA_ONLY = [
|
|
548
548
|
' / "grade the writing"',
|
|
549
|
-
" Grades WRITING CRAFT only —
|
|
549
|
+
" Grades WRITING CRAFT only — ten dimensions 1–5 (Title, Abstract, Intro architecture, Structure, Prose clarity, Jargon discipline, Landing-the-point, Figure economy, Honesty-without-hedge-stacking, Register distance to the target venue) against how the best-written papers read (Peyton Jones, McEnerney, Gopen & Swan; exemplars Trusting Trust, Carlini, Greshake) AND against 2–3 accepted papers of the target venue, naming the offending sentence and the fix for each.",
|
|
550
550
|
" whose stall inventory — not the rubric number — is the readability gate other skills consume (pc-panel-review, paper-adversarial-review, harden-paper)",
|
|
551
551
|
" Defaults to a blind multi-grader panel; after fixes, mandates the claims-preservation diff (row `claims`).",
|
|
552
552
|
" NOT a content/defect review (paper-adversarial-review / pc-panel-review), NOT a structural cut plan (tighten-paper — run that first on a bloated draft), NOT venue-bar content strength (study-accepted-papers).",
|
|
@@ -79,10 +79,13 @@ attributed to Kent Beck — treat as widely-cited, not primary-verified.)
|
|
|
79
79
|
- **MapReduce** — "Simplified" in the title = the reader's _benefit_ as the promise; clean topic sentences;
|
|
80
80
|
motivating example before mechanism.
|
|
81
81
|
|
|
82
|
-
## The gradeable rubric —
|
|
82
|
+
## The gradeable rubric — 10 dimensions, score 1–5 (anchors), most-severe first
|
|
83
83
|
|
|
84
|
-
For the "wall of jargon" failure mode, **weight #5 Prose, #6 Jargon, #7 Landing-the-point ×2
|
|
85
|
-
|
|
84
|
+
For the "wall of jargon" failure mode, **weight #5 Prose, #6 Jargon, #7 Landing-the-point ×2**; for the
|
|
85
|
+
"blog post" failure mode, **weight #10 Register ×2** as well. Score each, name the offending
|
|
86
|
+
sentence/section, write the fix. Dimensions #1–#9 push toward plain and memorable; #10 is the floor
|
|
87
|
+
under them — a fix that raises one of them by leaving the venue's register lowers #10, and the
|
|
88
|
+
grade says so.
|
|
86
89
|
|
|
87
90
|
1. **Title — value + memorability.** 1 = generic topic label, forgettable. 5 = states the finding or the
|
|
88
91
|
reader's benefit and is quotable; repeatable after one read.
|
|
@@ -91,7 +94,7 @@ name the offending sentence/section, write the fix.
|
|
|
91
94
|
3. **Intro architecture — problem/why-care/contribution/evidence, fast.** 1 = background/lit-tour, point
|
|
92
95
|
arrives on page 2–3. 5 = SPJ arc in the first half-page + a bulleted, forward-referenced contributions list.
|
|
93
96
|
4. **Structure & signposting (incl. visual density).** 1 = arbitrary order, paragraphs open mid-thought,
|
|
94
|
-
|
|
97
|
+
no signposting between claims (the reader must infer how one claim relates to the next), OR a wall — one giant unbroken paragraph the reader's eye slides off. 5 = each
|
|
95
98
|
section one job, every paragraph's first sentence is its claim, forward refs not a roadmap, AND no wall:
|
|
96
99
|
long related-work / discussion blocks are broken into scannable chunks with bold/italic run-in sub-heads
|
|
97
100
|
(see the wall-of-text check below).
|
|
@@ -115,6 +118,14 @@ validity`, `null`, `coarse`, coined handles) used with no plain-words gloss —
|
|
|
115
118
|
self-contained. 5 = one "money figure" a skim-reader understands alone; self-contained captions; tables show the one comparison that matters.
|
|
116
119
|
9. **Honesty without hedge-stacking.** 1 = overclaims OR drowns in hedges + defensive early related-work
|
|
117
120
|
wall. 5 = explicit "what we do NOT claim," one clean threats-to-validity move, related work at the end as context.
|
|
121
|
+
10. **Register distance to the target venue — graded against 2–3 accepted papers of that venue (or its
|
|
122
|
+
parent conference), never against the exemplars above.** 1 = reads as another genre: aphorisms and
|
|
123
|
+
punchline closings, fragments, colloquial asides, claims with no stated owner, relations between
|
|
124
|
+
claims left for the reader to infer. 5 = a reviewer at the venue could not tell it from the
|
|
125
|
+
reference papers by register: results owned (_we measured_, a citation, a named population),
|
|
126
|
+
relations signposted (_therefore_, _in contrast_, _this section_), sentences complete. Every flag
|
|
127
|
+
quotes the reference sentence it was compared against. No reference papers → not graded, and the
|
|
128
|
+
report says so; this dimension is never scored from memory.
|
|
118
129
|
|
|
119
130
|
## Scoring calibration — how to avoid an inflated grade (read before scoring)
|
|
120
131
|
|
|
@@ -175,6 +186,25 @@ bucket-1 field terms and trips on buckets 2–3. Optionally also run it on a **d
|
|
|
175
186
|
lacks the vocabulary for real (not by role-play) and stalls even more like a human. The persona's inventory feeds
|
|
176
187
|
straight into the fix pass.
|
|
177
188
|
|
|
189
|
+
**Run the second persona too — the workshop reviewer. Both, never one instead of the other.** Sam cannot see two
|
|
190
|
+
defects by construction: he does not know what a paper at this venue sounds like, and a sentence with no stated
|
|
191
|
+
owner reads to him as confident rather than ambiguous. Those are exactly the two a real reviewer wrote down
|
|
192
|
+
("difficult at first to distinguish among properties of LLMs, statistical observations from repositories, and
|
|
193
|
+
experimental findings produced by the authors"; "blogpost"). Spawn a second fresh subagent:
|
|
194
|
+
|
|
195
|
+
> You are a program-committee member at <venue>. You review for it every year, you have eleven papers this
|
|
196
|
+
> round, and you have 40 minutes for this one. Your confidence will be 3: you know the area, not this exact
|
|
197
|
+
> topic. Read the abstract, then the introduction, then the conclusion — nothing else. For EVERY sentence ask:
|
|
198
|
+
> whose result does this state — the authors' own measurement, a cited work, or a general property of the
|
|
199
|
+
> world? If you cannot tell, quote it and write WHOSE?. Where two sentences sit side by side and you have to
|
|
200
|
+
> work out yourself how they relate, quote the pair and write RELATION?. Where a sentence would not appear in
|
|
201
|
+
> a paper at <venue> — an aphorism, a punchline, a fragment, a colloquial turn — quote it and write REGISTER.
|
|
202
|
+
> Then give the overall recommendation you would write after these 40 minutes, and the one sentence of your
|
|
203
|
+
> review a chair would read first. Output the list and the recommendation only.
|
|
204
|
+
|
|
205
|
+
Its WHOSE? / RELATION? / REGISTER lines go into the stall inventory as classes 7 and 8 of `grade-paper-writing`.
|
|
206
|
+
Give it the three sections as text, and no framing: it is a reviewer who has not talked to the authors.
|
|
207
|
+
|
|
178
208
|
**Run the persona PER SECTION for a dense or long (>~6pp) paper — never one whole-paper pass.** A single pass over
|
|
179
209
|
a full paper skims the middle: this session a whole-paper sweep scored 44/60 and missed the walls that per-section
|
|
180
210
|
persona reads (intro, method, results) each caught immediately. Chunk it to 2–3pp / one section per subagent, so
|
|
@@ -233,16 +263,18 @@ of `rm -rf` collapses to one"), a triple-nested-em-dash sentence you parse twice
|
|
|
233
263
|
(the author's rule: don't open on the spec sheet.) When unsure which bucket a term is in, ask: _would a reviewer at THIS
|
|
234
264
|
venue use it, or is it imported from stats/philosophy/our own coinage?_
|
|
235
265
|
|
|
236
|
-
**De-jargon is RE-VOICING the sentence, not swapping the word
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
sections "way too academicy for 0 reason"). The fix
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
instrument, not an injection defense" → "
|
|
244
|
-
|
|
245
|
-
|
|
266
|
+
**De-jargon is RE-VOICING the sentence, not swapping the word — and the new voice is the venue's, not
|
|
267
|
+
a conversation's.** Replacing a coined term with a plainer noun inside a sentence built around nominalizations
|
|
268
|
+
leaves the stall in place (GateBench 2026-07-25: a term-level de-jargon pass cleared the flagged words but the
|
|
269
|
+
author still hit sections "way too academicy for 0 reason"). The fix is the sentence shape: subject–verb–object,
|
|
270
|
+
active voice, the actor named, no nominalizations ("performs an evaluation of" → "checks"). **The fix stops at the
|
|
271
|
+
register of the venue's accepted papers:** no contractions, no fragments, no colloquial asides, and the signposting
|
|
272
|
+
stays (_therefore_, _in contrast_, _we show_). E.g. "We therefore position the guard as a defense against
|
|
273
|
+
trigger~A and a measurement instrument, not an injection defense" → "The guard is therefore a defense against
|
|
274
|
+
accidental triggers and an instrument for measuring them; it is not designed to stop an attacker." — plainer,
|
|
275
|
+
and still a sentence the venue prints. "So the guard is there to catch accidents — it is not built to stop an
|
|
276
|
+
attacker" goes one step too far: it is what a reviewer quotes back as informal. Test each rewrite against a
|
|
277
|
+
sentence from the reference papers of dimension #10, not against how it sounds aloud.
|
|
246
278
|
|
|
247
279
|
**Step 0 — mechanical pre-scan (BEFORE reading, so the pass can't rubber-stamp).** Run the coined-compound
|
|
248
280
|
grep from the avoid-list against the source and add EVERY hit to the stall inventory as a candidate; grep the
|
|
@@ -376,9 +408,11 @@ axis that catches "the conclusion isn't strong enough."
|
|
|
376
408
|
|
|
377
409
|
## The avoid-list — words that read as slop or stall a human (flag every hit)
|
|
378
410
|
|
|
379
|
-
The north star: **a paper should be
|
|
380
|
-
|
|
381
|
-
NOT a researcher get this sentence in 10 seconds? If not, it's too dense.
|
|
411
|
+
The north star: **a paper should be readable by a smart non-specialist AND read as a paper at its venue —
|
|
412
|
+
plain where plainness costs nothing, academic where the register expects it.** Two tests, both apply: would a
|
|
413
|
+
strong engineer who is NOT a researcher get this sentence in 10 seconds? If not, it's too dense. Would it sit
|
|
414
|
+
unremarked in one of the venue's accepted papers (dimension #10)? If not, it's too loose — a replacement that
|
|
415
|
+
passes the first test by failing the second is not a fix. The jargon dimension (#6) and the
|
|
382
416
|
stall pass are the judgment; the list below is the _checkable_ part (prose isn't policy — compile what's
|
|
383
417
|
mechanical). These are **scrutinize-words, not absolute bans** (some are legit in context — "significant" for
|
|
384
418
|
a real stat, "method"); on every hit, ask "does this earn its place, or is it slop / hype / a reader-stall?"
|
|
@@ -435,7 +469,8 @@ number, so the paper does not have to print them all — divide the labor:
|
|
|
435
469
|
|
|
436
470
|
1. **DO lead with the concrete crazy instance, not the aggregate stat** (Carlini's UUID).
|
|
437
471
|
2. **DO manufacture the "wait, what?" pivot** — surface the held assumption, then break it (Greshake).
|
|
438
|
-
3. **DO write the intro as the SPJ arc + a bulleted, forward-referenced contributions list**;
|
|
472
|
+
3. **DO write the intro as the SPJ arc + a bulleted, forward-referenced contributions list**; keep an
|
|
473
|
+
"organized as follows" paragraph only when the venue's accepted papers carry one.
|
|
439
474
|
4. **DON'T imitate Attention-style dense contribution-less prose** unless the audience already cares.
|
|
440
475
|
5. **DON'T stack jargon or hedges** — gloss every term plainly at first use; replace hedge-piles with one
|
|
441
476
|
precise scope sentence; land one repeatable moral (Trusting Trust).
|
|
@@ -32,8 +32,6 @@ export interface SkillsFs {
|
|
|
32
32
|
}
|
|
33
33
|
export declare function installedSkills(dir: string, fs?: SkillsFs): string[];
|
|
34
34
|
|
|
35
|
-
/** The directory of venue TeX files this package ships; `paperlint build` prepends it to TEXINPUTS. */
|
|
36
|
-
export declare function packageVenuesDir(): string;
|
|
37
35
|
export declare const SHIPPED_SKILLS_DIR: string;
|
|
38
36
|
export declare const PACKAGE_NAME: "paperlint";
|
|
39
37
|
export declare const BIN_FILE: "bin/paperlint.mjs";
|
|
@@ -57,7 +57,7 @@ import {
|
|
|
57
57
|
statSync,
|
|
58
58
|
} from "node:fs";
|
|
59
59
|
import { join, resolve, sep } from "node:path";
|
|
60
|
-
import {
|
|
60
|
+
import { pathToFileURL } from "node:url";
|
|
61
61
|
|
|
62
62
|
// Re-exported, not re-declared — see the note in `lib/paper-config.mjs`. This file is not a hook
|
|
63
63
|
// and never needed its own copy.
|
|
@@ -98,20 +98,6 @@ export function consumerRoot({ env = process.env, cwd = process.cwd() } = {}) {
|
|
|
98
98
|
return env.CLAUDE_PROJECT_DIR || cwd;
|
|
99
99
|
}
|
|
100
100
|
|
|
101
|
-
/**
|
|
102
|
-
* The directory of venue TeX files THIS PACKAGE ships — `paper-guards.tex` and each venue's
|
|
103
|
-
* `<venue>.tex` — which a paper's preamble `\input`s and `paperlint build` puts on `TEXINPUTS`.
|
|
104
|
-
*
|
|
105
|
-
* Resolved from this file's own location, never from the caller's cwd: the directory travels
|
|
106
|
-
* with the package, wherever the package is installed (own checkout, `node_modules`, a plugin
|
|
107
|
-
* cache). `import.meta.url` is the realpath, so a symlinked skills directory changes nothing.
|
|
108
|
-
*/
|
|
109
|
-
export function packageVenuesDir() {
|
|
110
|
-
return fileURLToPath(
|
|
111
|
-
new URL("../../submit-paper/references/venues", import.meta.url),
|
|
112
|
-
);
|
|
113
|
-
}
|
|
114
|
-
|
|
115
101
|
/**
|
|
116
102
|
* The package's npm name — the directory it lands in under `node_modules`, and the name Node
|
|
117
103
|
* resolves it by. Every path into the installed package is built from this, never re-spelled;
|