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.
Files changed (236) hide show
  1. package/.github/workflows/ci.yml +16 -23
  2. package/CLAUDE.md +55 -11
  3. package/CONTRIBUTING.md +30 -7
  4. package/README.md +11 -8
  5. package/dist/adapters/banal/invocation.d.ts +1 -1
  6. package/dist/adapters/latex/document-class.d.ts +23 -0
  7. package/dist/adapters/latex/document-class.d.ts.map +1 -0
  8. package/dist/adapters/latex/document-class.js +110 -0
  9. package/dist/adapters/latex/document-class.js.map +1 -0
  10. package/dist/adapters/latex/hidden.d.ts +16 -0
  11. package/dist/adapters/latex/hidden.d.ts.map +1 -0
  12. package/dist/adapters/latex/hidden.js +49 -0
  13. package/dist/adapters/latex/hidden.js.map +1 -0
  14. package/dist/adapters/latex/includes.d.ts +12 -0
  15. package/dist/adapters/latex/includes.d.ts.map +1 -0
  16. package/dist/adapters/latex/includes.js +42 -0
  17. package/dist/adapters/latex/includes.js.map +1 -0
  18. package/dist/adapters/latex/index.d.ts +33 -0
  19. package/dist/adapters/latex/index.d.ts.map +1 -0
  20. package/dist/adapters/latex/index.js +25 -0
  21. package/dist/adapters/latex/index.js.map +1 -0
  22. package/dist/adapters/latex/nodes.d.ts +58 -0
  23. package/dist/adapters/latex/nodes.d.ts.map +1 -0
  24. package/dist/adapters/latex/nodes.js +97 -0
  25. package/dist/adapters/latex/nodes.js.map +1 -0
  26. package/dist/adapters/latex/outline.d.ts +10 -0
  27. package/dist/adapters/latex/outline.d.ts.map +1 -0
  28. package/dist/adapters/latex/outline.js +39 -0
  29. package/dist/adapters/latex/outline.js.map +1 -0
  30. package/dist/adapters/latex/parse.d.ts +42 -0
  31. package/dist/adapters/latex/parse.d.ts.map +1 -0
  32. package/dist/adapters/latex/parse.js +95 -0
  33. package/dist/adapters/latex/parse.js.map +1 -0
  34. package/dist/adapters/latex/prose.d.ts +8 -0
  35. package/dist/adapters/latex/prose.d.ts.map +1 -0
  36. package/dist/adapters/latex/prose.js +353 -0
  37. package/dist/adapters/latex/prose.js.map +1 -0
  38. package/dist/adapters/latex/rendered.d.ts +10 -0
  39. package/dist/adapters/latex/rendered.d.ts.map +1 -0
  40. package/dist/adapters/latex/rendered.js +39 -0
  41. package/dist/adapters/latex/rendered.js.map +1 -0
  42. package/dist/adapters/pdfjs/fill.d.ts.map +1 -1
  43. package/dist/adapters/pdfjs/fill.js +12 -12
  44. package/dist/adapters/pdfjs/fill.js.map +1 -1
  45. package/dist/build.js +4 -4
  46. package/dist/build.js.map +1 -1
  47. package/dist/claim-provenance.d.ts +34 -0
  48. package/dist/claim-provenance.d.ts.map +1 -0
  49. package/dist/claim-provenance.js +146 -0
  50. package/dist/claim-provenance.js.map +1 -0
  51. package/dist/cli.d.ts.map +1 -1
  52. package/dist/cli.js +49 -5
  53. package/dist/cli.js.map +1 -1
  54. package/dist/domain/paper-source.d.ts +58 -0
  55. package/dist/domain/paper-source.d.ts.map +1 -0
  56. package/dist/domain/paper-source.js +109 -0
  57. package/dist/domain/paper-source.js.map +1 -0
  58. package/dist/domain/sentences.d.ts +26 -0
  59. package/dist/domain/sentences.d.ts.map +1 -0
  60. package/dist/domain/sentences.js +48 -0
  61. package/dist/domain/sentences.js.map +1 -0
  62. package/dist/domain/tex-document.d.ts +119 -0
  63. package/dist/domain/tex-document.d.ts.map +1 -0
  64. package/dist/domain/tex-document.js +43 -0
  65. package/dist/domain/tex-document.js.map +1 -0
  66. package/dist/eslint-rules/paper-typography.d.ts +7 -0
  67. package/dist/eslint-rules/paper-typography.d.ts.map +1 -1
  68. package/dist/eslint-rules/paper-typography.js +53 -1
  69. package/dist/eslint-rules/paper-typography.js.map +1 -1
  70. package/dist/facts-file.d.ts.map +1 -1
  71. package/dist/facts-file.js +2 -2
  72. package/dist/facts-file.js.map +1 -1
  73. package/dist/new-paper.d.ts +5 -0
  74. package/dist/new-paper.d.ts.map +1 -1
  75. package/dist/new-paper.js +3 -0
  76. package/dist/new-paper.js.map +1 -1
  77. package/dist/package-dirs.d.ts +5 -0
  78. package/dist/package-dirs.d.ts.map +1 -0
  79. package/dist/package-dirs.js +14 -0
  80. package/dist/package-dirs.js.map +1 -0
  81. package/dist/ports/latex.d.ts +35 -0
  82. package/dist/ports/latex.d.ts.map +1 -0
  83. package/dist/ports/latex.js +2 -0
  84. package/dist/ports/latex.js.map +1 -0
  85. package/dist/presets.d.ts +15 -2
  86. package/dist/presets.d.ts.map +1 -1
  87. package/dist/presets.js +19 -6
  88. package/dist/presets.js.map +1 -1
  89. package/dist/register.d.ts +40 -0
  90. package/dist/register.d.ts.map +1 -0
  91. package/dist/register.js +134 -0
  92. package/dist/register.js.map +1 -0
  93. package/dist/tex-paper.d.ts +19 -0
  94. package/dist/tex-paper.d.ts.map +1 -0
  95. package/dist/tex-paper.js +105 -0
  96. package/dist/tex-paper.js.map +1 -0
  97. package/dist/tex-requirements.d.ts +11 -0
  98. package/dist/tex-requirements.d.ts.map +1 -1
  99. package/dist/tex-requirements.js +14 -8
  100. package/dist/tex-requirements.js.map +1 -1
  101. package/dist/tex-venue-rules.d.ts +88 -0
  102. package/dist/tex-venue-rules.d.ts.map +1 -0
  103. package/dist/tex-venue-rules.js +268 -0
  104. package/dist/tex-venue-rules.js.map +1 -0
  105. package/dist/venue-rules.d.ts +1 -1
  106. package/dist/venue-rules.d.ts.map +1 -1
  107. package/docs/configuration.md +3 -2
  108. package/docs/e2e.md +69 -40
  109. package/docs/install.md +1 -1
  110. package/docs/prior-art/README.md +1 -1
  111. package/docs/prior-art/package-location.md +5 -5
  112. package/docs/prior-art/repro/README.md +1 -1
  113. package/docs/prior-art/test-tooling.md +21 -10
  114. package/docs/rules/tex/claim-provenance.md +83 -0
  115. package/docs/rules/tex/missing-input.md +58 -0
  116. package/docs/rules/tex/register.md +77 -0
  117. package/docs/rules/tex/required-section.md +75 -0
  118. package/docs/rules/tex/template.md +74 -0
  119. package/docs/rules/tex/venue-leftover.md +73 -0
  120. package/docs/rules.md +73 -48
  121. package/docs/testing.md +17 -4
  122. package/docs/texlive-install-decision.md +1 -1
  123. package/docs/toolchain.md +2 -2
  124. package/eslint-rules/paper-typography.test.mjs +48 -1
  125. package/eslint-rules/paper-typography.ts +72 -1
  126. package/eslint.config.mjs +156 -15
  127. package/fixtures/build-e2e/acmart/expect.json +26 -0
  128. package/fixtures/build-e2e/aidc/PIPELINE-STATUS.md +3 -0
  129. package/fixtures/build-e2e/aidc/expect.json +14 -0
  130. package/fixtures/build-e2e/aidc/paper.tex +46 -0
  131. package/fixtures/build-e2e/aidc/paperlint.json +1 -0
  132. package/fixtures/build-e2e/broken/expect.json +11 -0
  133. package/fixtures/build-e2e/cite/expect.json +27 -0
  134. package/fixtures/build-e2e/empty/expect.json +12 -0
  135. package/fixtures/build-e2e/fallback/expect.json +53 -0
  136. package/fixtures/build-e2e/guards/expect.json +6 -0
  137. package/fixtures/build-e2e/no-source/expect.json +10 -0
  138. package/fixtures/build-e2e/unbalanced/expect.json +60 -0
  139. package/fixtures/pdf-facts/README.md +1 -1
  140. package/fixtures/real-markdown-paper/baseline.ts +8 -7
  141. package/fixtures/render-paper/build-clean.sh +3 -5
  142. package/package.json +14 -2
  143. package/{skills/submit-paper/references/venues → presets}/acm-sigconf.jsonc +4 -1
  144. package/{skills/submit-paper/references/venues → presets}/agenticdev.jsonc +4 -0
  145. package/presets/aidc.jsonc +73 -0
  146. package/{skills/submit-paper/references/venues → presets}/aisec.jsonc +4 -0
  147. package/presets/ieee-conference.jsonc +66 -0
  148. package/{skills/submit-paper/references/venues → presets}/realm.jsonc +8 -1
  149. package/{skills/submit-paper/references/venues → presets/tex}/paper-guards.tex +1 -1
  150. package/{skills/submit-paper/references/venues → presets}/venue-profile.schema.json +30 -2
  151. package/scripts/check.harness.ts +64 -10
  152. package/scripts/check.test.ts +60 -13
  153. package/scripts/check.ts +83 -30
  154. package/scripts/test.test.ts +1 -1
  155. package/scripts/test.ts +1 -1
  156. package/skills/cold-read-diff/SKILL.md +31 -10
  157. package/skills/cold-read-diff/SKILL.md.spec.ts +30 -9
  158. package/skills/draft-paper/SKILL.md +2 -2
  159. package/skills/draft-paper/SKILL.md.spec.ts +1 -1
  160. package/skills/grade-paper-writing/SKILL.md +109 -44
  161. package/skills/grade-paper-writing/SKILL.md.spec.ts +108 -43
  162. package/skills/harden-paper/SKILL.md +35 -36
  163. package/skills/harden-paper/SKILL.md.spec.ts +34 -35
  164. package/skills/paper-adversarial-review/SKILL.md +2 -2
  165. package/skills/paper-adversarial-review/SKILL.md.spec.ts +1 -1
  166. package/skills/paper-pipeline/PIPELINE-MAP.md +2 -2
  167. package/skills/paper-pipeline/SKILL.md +4 -4
  168. package/skills/paper-pipeline/SKILL.md.spec.ts +3 -3
  169. package/skills/paper-pipeline/grade-paper-writing-ablation.eval.mjs +6 -6
  170. package/skills/paper-pipeline/references/writing-craft.md +53 -18
  171. package/skills/paper-pipeline/scripts/consumer.d.mts +0 -2
  172. package/skills/paper-pipeline/scripts/consumer.mjs +1 -15
  173. package/skills/pc-panel-review/SKILL.md +36 -11
  174. package/skills/pc-panel-review/SKILL.md.spec.ts +35 -10
  175. package/skills/render-paper/SKILL.md +2 -2
  176. package/skills/render-paper/SKILL.md.spec.ts +1 -1
  177. package/skills/render-paper/check-render.sh +16 -63
  178. package/skills/render-paper/render-paper.harness.mjs +17 -59
  179. package/src/adapters/banal/index.test.ts +1 -1
  180. package/src/adapters/banal/invocation.ts +1 -1
  181. package/src/adapters/banal/output.test.ts +1 -1
  182. package/src/adapters/banal/run.test.ts +1 -1
  183. package/src/adapters/banal/xml.test.ts +1 -1
  184. package/src/adapters/latex/document-class.ts +155 -0
  185. package/src/adapters/latex/hidden.ts +70 -0
  186. package/src/adapters/latex/includes.ts +66 -0
  187. package/src/adapters/latex/index.test.ts +535 -0
  188. package/src/adapters/latex/index.ts +65 -0
  189. package/src/adapters/latex/nodes.ts +150 -0
  190. package/src/adapters/latex/outline.ts +64 -0
  191. package/src/adapters/latex/parse.ts +137 -0
  192. package/src/adapters/latex/prose.ts +484 -0
  193. package/src/adapters/latex/rendered.ts +59 -0
  194. package/src/adapters/pdfjs/fill.test.ts +1 -1
  195. package/src/adapters/pdfjs/fill.ts +18 -10
  196. package/src/build.harness.mjs +5 -7
  197. package/src/build.ts +4 -4
  198. package/src/claim-provenance.test.ts +352 -0
  199. package/src/claim-provenance.ts +217 -0
  200. package/src/cli.harness.mjs +1 -1
  201. package/src/cli.test.ts +2 -8
  202. package/src/cli.ts +53 -8
  203. package/src/domain/paper-source.test.ts +156 -0
  204. package/src/domain/paper-source.ts +233 -0
  205. package/src/domain/sentences.ts +67 -0
  206. package/src/domain/tex-document.test.ts +80 -0
  207. package/src/domain/tex-document.ts +143 -0
  208. package/src/engine.harness.mjs +1 -1
  209. package/src/facts-file.test.ts +4 -7
  210. package/src/facts-file.ts +2 -2
  211. package/src/latex-loop.harness.ts +1 -1
  212. package/src/new-paper.test.ts +28 -3
  213. package/src/new-paper.ts +8 -0
  214. package/src/package-dirs.ts +17 -0
  215. package/src/paper-settings-commands.test.ts +6 -1
  216. package/src/ports/latex.ts +42 -0
  217. package/src/presets.test.ts +65 -4
  218. package/src/presets.ts +38 -15
  219. package/src/register.test.ts +165 -0
  220. package/src/register.ts +177 -0
  221. package/src/rule-cases.test.ts +524 -0
  222. package/src/rule-docs.test.ts +159 -0
  223. package/src/tex-paper.test.ts +131 -0
  224. package/src/tex-paper.ts +152 -0
  225. package/src/tex-requirements.harness.ts +13 -23
  226. package/src/tex-requirements.ts +35 -8
  227. package/src/tex-venue-rules.test.ts +741 -0
  228. package/src/tex-venue-rules.ts +461 -0
  229. package/src/toolchain.harness.mjs +1 -1
  230. package/src/venue-rules.test.ts +96 -4
  231. package/src/venue-rules.ts +1 -1
  232. package/templates/paper/paper.tex +2 -1
  233. package/skills/harden-paper/fixtures/uncited-assertions-sample.md +0 -43
  234. package/skills/harden-paper/fixtures/uncited-assertions-sample.tex +0 -77
  235. /package/{skills/submit-paper/references/venues → presets/tex}/agenticdev.tex +0 -0
  236. /package/{skills/submit-paper/references/venues → presets}/tex-base.jsonc +0 -0
@@ -1,10 +1,10 @@
1
1
  ---
2
2
  name: grade-paper-writing
3
- description: Use when asking "does this paper read well?" / "is the writing any good?" / "it reads like a wall of text and jargon" / "grade the writing" on a draft. Grades WRITING CRAFT only — nine dimensions 1–5 (Title, Abstract, Intro architecture, Structure, Prose clarity, Jargon discipline, Landing-the-point, Figure economy, Honesty-without-hedge-stacking) against how the best-written papers read (Peyton Jones, McEnerney, Gopen & Swan; exemplars Trusting Trust, Carlini, Greshake), naming the offending sentence and the fix for each. Runs the PERSONA cold-read stall pass (a committed non-academic persona subagent, per-section) whose stall inventory — not the rubric number — is the readability gate other skills consume (pc-panel-review, paper-adversarial-review, harden-paper). Defaults to a blind multi-grader panel; after fixes, mandates the claims-preservation diff (row `claims`). 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). Compose with harden-paper (which calls it), draft-paper (generative counterpart), render-paper.
3
+ description: Use when asking "does this paper read well?" / "is the writing any good?" / "it reads like a wall of text and jargon" / "grade the writing" on a draft. 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. 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). Defaults to a blind multi-grader panel; after fixes, mandates the claims-preservation diff (row `claims`). 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). Compose with harden-paper (which calls it), draft-paper (generative counterpart), render-paper.
4
4
  allowed-tools: [Read, Write, Edit, Grep, Glob, Agent, Skill]
5
5
  ---
6
6
 
7
- <!-- vigiles:sha256:c5d998b7471000fc compiled from skills/grade-paper-writing/SKILL.md.spec.ts -->
7
+ <!-- vigiles:sha256:baf1f69df2502086 compiled from skills/grade-paper-writing/SKILL.md.spec.ts -->
8
8
 
9
9
  # grade-paper-writing — grade how the paper READS, then fix it sentence by sentence
10
10
 
@@ -16,7 +16,7 @@ doesn't drive home how crazy the situation is"* — which is a writing problem,
16
16
  which the defect-hunting skills will pass right over.
17
17
 
18
18
  Grounding (do NOT re-derive — read it): `../paper-pipeline/references/writing-craft.md` holds the craft
19
- rules, the exemplar lessons, and the full nine-dimension rubric with 1/5 anchors. This skill applies it.
19
+ rules, the exemplar lessons, and the full ten-dimension rubric with 1/5 anchors. This skill applies it.
20
20
 
21
21
  ## The frame to hold while grading (from the reference)
22
22
  The papers that make a human care share three moves: **(1) open on a problem/assumption the reader already
@@ -25,6 +25,14 @@ repeatable sentence.** Grade the draft against that trio, plus McEnerney's test
25
25
  for the reader, or just record the author's thinking?* — and Gopen/Swan's sentence mechanics (payload in
26
26
  the stress position, subject next to verb, one idea per sentence).
27
27
 
28
+ 🔴 **Every push in this rubric has a floor as well as a ceiling.** The craft rules above pull toward
29
+ short, plain, punchy sentences, and each mechanical check below caps something: jargon, length, hedges,
30
+ connectives. A rubric in which every check is a ceiling has one equilibrium — terse assertions with no
31
+ signposting and no stated owner — and reviewers call that a blog post (*"overly literary"*, *"some
32
+ sentences are too informal"*, *"readers are often required to infer the intended relationships between
33
+ claims"*). The floor is the venue's own register: dimension #10 measures the distance to it, and no fix
34
+ this skill proposes may move the text further from it than it already is.
35
+
28
36
  ## Execution model — run the graders as subagents (context forks), by default
29
37
  The blind panel (≥3 graders) and the cold-read stall pass **run in fresh subagents, not inline** — for two
30
38
  reasons: (a) grading dumps the whole paper + long stall inventories into context, which gunks up the main
@@ -77,6 +85,21 @@ they supplied it.
77
85
  Give the passage **as text in the prompt**, not as a file path. A path invites reading the
78
86
  neighbours, and reading the neighbours is how this pass fails silently.
79
87
 
88
+ ### Two readers, and both run
89
+
90
+ The pass runs two committed personas, each in its own subagent. Neither replaces the other: they
91
+ stall on different sentences.
92
+
93
+ | persona | reads | stalls on |
94
+ |---|---|---|
95
+ | **the engineer** — a strong practitioner outside academia (`Sam` in the reference) | every section, one subagent per section | terms, walls, sentences that mean nothing to someone who does not already hold the idea |
96
+ | **the workshop reviewer** — a PC member at the target venue with 40 minutes for the paper, Confidence 3 | the abstract, the introduction and the conclusion, skimmed in that order | a sentence whose result has no owner (the authors? a cited work? a population?), a relation between claims left for the reader to infer, and anything that does not read like a paper at this venue |
97
+
98
+ The engineer cannot report the second column by construction: he does not know what a paper at the
99
+ venue sounds like, and a sentence with no stated owner reads to him as confident, not as ambiguous.
100
+ The reviewer persona's full prompt is in the reference, next to the engineer's. Its findings go into
101
+ the same stall inventory, under their own classes (7 and 8 below).
102
+
80
103
  ### The one question, per sentence
81
104
 
82
105
  > **What does this sentence claim? Restate it in your own words.**
@@ -98,6 +121,8 @@ every 2026-08-05 defect lived.
98
121
  | 4 | 🔴 **means nothing** | every word is known, the sentence parses grammatically, and the reader still cannot say what it claims | *"the state to remove is not the rule but its claim about itself"* · *"constructions nobody built"* |
99
122
  | 5 | 🔴 **sounds clever, carries nothing** | reads smoothly, feels like a payoff, and its content is a restatement or is borrowed from a section the reader has not read | *"nine deletions against four fixes is §5.1's cheap way out, winning again"* |
100
123
  | 6 | 🔴 **vague heading** | a heading naming no concrete object — no linter, no configuration, no agent, no file | *"Three answers, all of them after the fact"* · *"The configuration nobody resolves"* |
124
+ | 7 | 🔴 **whose result?** (reviewer persona) | the reader cannot tell whether a claim is a property of the world, a cited finding, or the authors' own measurement | *"asked twice about the same repositories, it changes its mind on a fifth"* — the paper's own experiment, read as a fact about LLMs |
125
+ | 8 | 🔴 **off-register** (reviewer persona) | a sentence the venue's accepted papers would not contain: an aphorism, a fragment, a colloquial closing line, an unmarked jump between claims | *"Measure the bill, not the syllables."* — quoted back by a reviewer as "too informal" |
101
126
 
102
127
  Class 5 is the one a knowing reader always waves through, because it reads *well*. Ask for it by
103
128
  name — "which sentences sound clever but say less than they appear to?" — or it will not be reported.
@@ -133,11 +158,12 @@ is what happened.
133
158
  2. **Run the cold-read stall pass FIRST — the full specification is below, under "The stall pass".**
134
159
  It was previously a pointer to a reference section that did not exist, which is why the pass drifted
135
160
  into "log where I stumbled" and stopped catching the class it exists for.
136
- 2. **Score all nine dimensions 1–5** using the anchors in the reference, on the **absolute scale** defined
161
+ 2. **Score all ten dimensions 1–5** using the anchors in the reference, on the **absolute scale** defined
137
162
  there (5 = best-in-field, **3 = the default for a solid paper**; most dimensions are 2–3). Weight Prose
138
- (#5), Jargon (#6), Landing (#7) ×2 — that's where "wall of jargon" lives. Report raw /45 + weighted /60.
163
+ (#5), Jargon (#6), Landing (#7) and Register (#10) ×2 — the first three are where "wall of jargon"
164
+ lives, the fourth is where "blog post" lives. Report raw /50 + weighted /70.
139
165
  **Do NOT trust a single grade.** A lone grader — especially one that just wrote or verified the paper —
140
- anchors optimistic; a 52/60-looking number is suspect until confirmed. So **when the score matters, run a
166
+ anchors optimistic; a 60/70-looking number is suspect until confirmed. So **when the score matters, run a
141
167
  blind panel: ≥3 independent graders (fresh subagents, ideally an adversarial model like Fable), each
142
168
  blind to any prior score, to each other, and to the "it improved" framing — given only the current page
143
169
  and the field's best.** Report the **distribution (per-dimension + overall min / median / max)**, not one
@@ -146,6 +172,18 @@ is what happened.
146
172
  3. **For every dimension scoring ≤3, name the specific offending sentence or section** and write the fix —
147
173
  not "tighten the prose" but the rewritten sentence, or "move the point from ¶3 to ¶1", or "gloss
148
174
  `operation-normalized` in plain words at first use." Fixes must be applyable, not vibes.
175
+ 3a. **Grade #10, register distance, against the venue's own papers — not against the exemplars.**
176
+ Take 2–3 papers accepted at the target venue (or, for a first-edition workshop, at its parent
177
+ conference) in the same paper type: fetch them from the proceedings or the program page, or use the
178
+ ones the author supplies. Read the abstract, the introduction and the conclusion of each beside the
179
+ draft's, and record, for both sides: how each result is owned (*we measured* · a citation · a named
180
+ population), how often a point is made by contrast (*not X but Y*, *rather than*, *instead of* —
181
+ the measured difference between this corpus and accepted papers), sentence length and fragments,
182
+ and whether any sentence is an aphorism or a closing punchline. The
183
+ score is the distance: 5 = a reviewer could not tell the draft from the reference papers by register;
184
+ 1 = it reads as a different genre. Quote the reference sentence beside each draft sentence you flag.
185
+ If no accepted paper can be fetched or supplied, write `#10: not graded — no reference papers` and
186
+ say which were tried; a register score from memory is the guess this dimension exists to replace.
149
187
  4. **Find the paper's three-move opportunities:** what held assumption could open it? what is its single
150
188
  most visceral concrete instance (lead with that, not the mean)? what one sentence should the reader
151
189
  quote? If the draft is missing any, that's the highest-leverage fix.
@@ -210,7 +248,7 @@ is what happened.
210
248
  8. **Run the avoid-list grep (mechanical).** Grep the source for the slop / web-slang / filler / hype words
211
249
  in `../paper-pipeline/references/writing-craft.md` → "The avoid-list", and report every hit with its line number and a
212
250
  replacement. These are scrutinize-words, not absolute bans — but each hit is a readability debit against
213
- dimension #6 (Jargon) and the "engaging + human-readable" north star. (This session's miss that motivated
251
+ dimension #6 (Jargon) and the north star — readable by the target reader, in the venue's register. (This session's miss that motivated
214
252
  it: "listicle" survived into a submitted-ready AISec draft.)
215
253
  7. **Wall-of-text sweep (see `writing-craft.md` → "The wall-of-text check").** Flag any paragraph running
216
254
  >~15 source lines / ~150 words or covering >3 sub-points — a visual wall the reader's eye slides off
@@ -224,7 +262,7 @@ is what happened.
224
262
  isn't strong enough" and "nothing here is quotable."
225
263
 
226
264
  ## Output
227
- 1. **Scorecard** — nine dimensions with one-line justification each; raw /45 + weighted /60. When a blind
265
+ 1. **Scorecard** — ten dimensions with one-line justification each; raw /50 + weighted /70. When a blind
228
266
  panel was run (the default when the score matters), report the **distribution** — per-dimension and
229
267
  overall min / median / max across graders — not a single number, and name any dimension they split on.
230
268
  Lead with the two or three dimensions dragging it down, ranked.
@@ -299,19 +337,31 @@ Mechanical leg: `paper-lint`'s plain-language pass flags any sentence carrying t
299
337
  citation groups, or five or more reference numbers in under 45 words. It cannot judge whether the
300
338
  prose is *good*; it reliably catches this one shape, which is the shape that recurs.
301
339
 
302
- **And the words themselves, not only the sentences.** *Adherence* means *following the rules*. The
303
- "Jargon discipline" dimension below does not catch this, because the word looks perfectly at home —
304
- judgment slides right past it. What catches it is a list: `paper-lint` carries ~30 words with a plain
305
- English equivalent (adherence · utilise · demonstrates · constitutes · prior to · necessitates ·
306
- facilitates · methodology · leverage · albeit · comprise · entail · in order to …) and names the
307
- replacement in the nudge. Keep the list narrow — only words where the swap does not change meaning —
308
- and never rewrite a cited work's title to obey it.
309
-
310
- **Other markers of the same register, all cheap to check and all worth a pass:** nominalisation
311
- density (*an honest accounting of what the construction costs* — abstract nouns doing the work verbs
312
- should do), stock connectives (*furthermore*, *thereby*, *it is worth noting*), and statistics chained
313
- through a paragraph instead of sitting in a table. Numbers belong in a table the moment there are more
314
- than about six of them in one paragraph.
340
+ **And the words themselves, not only the sentences.** *Utilise* means *use*. The "Jargon discipline"
341
+ dimension below does not catch this, because the word looks perfectly at home — judgment slides right
342
+ past it. What catches it is a list: `paper-lint` carries ~30 words with a plainer equivalent (utilise ·
343
+ constitutes · prior to · necessitates · facilitates · leverage · albeit · in order to …) and names the
344
+ replacement in the nudge.
345
+
346
+ 🔴 **The swap is two-sided: replace a word only when the plain word stays in academic register.**
347
+ *Utilise → use* and *in order to → to* pass: the replacement is what the venue's own papers write.
348
+ *Adherence → following*, *demonstrates → shows* in a results sentence, *methodology → how we did it*
349
+ do not pass when the reference papers of dimension #10 use the first form — there the plain word is a
350
+ step toward a blog post, and the finding is withdrawn. Keep the list narrow — only words where the swap
351
+ changes neither meaning nor register — and never rewrite a cited work's title to obey it.
352
+
353
+ **Signposting is the register, not a tic, and this skill never removes it on style grounds.** Frame
354
+ markers and relation words — *we show*, *this section*, *first … finally*, *in contrast*, *therefore*,
355
+ *however* — are how academic prose tells the reader what kind of claim comes next and how it relates to
356
+ the last one. Their count does not separate a draft from accepted papers (see "Contrast framing"
357
+ below); removing them does, in the wrong direction. Flag a connective only when it asserts a relation
358
+ the two sentences do not have (a *therefore* that does not follow), or when it is empty filler (*it is
359
+ worth noting that*). Never flag one for being academic.
360
+
361
+ **Other markers worth a pass:** nominalisation density (*an honest accounting of what the construction
362
+ costs* — abstract nouns doing the work verbs should do) and statistics chained through a paragraph
363
+ instead of sitting in a table. Numbers belong in a table the moment there are more than about six of
364
+ them in one paragraph.
315
365
 
316
366
 
317
367
  ## 🔴 The class the rubric could not see, and why it kept coming back (2026-08-04)
@@ -330,25 +380,37 @@ them measures words and sentences. The defect is not in the words.
330
380
 
331
381
  Two separable failures:
332
382
 
333
- ### 1. The text talks about the text (metadiscourse)
334
-
335
- *"Two findings come first, because they bind whatever else you build"* says nothing about rules
336
- files, agents, or repositories. It is the paper **narrating its own structure** — the reader is
337
- handed a table of contents where they expected a fact. This is Hyland's *frame marker*, and in this
338
- corpus it is the single most reliable smell of machine-drafted expository prose: an
339
- instruction-tuned model is rewarded for signposting, so it signposts where a writer would simply
340
- say the thing.
341
-
342
- **Countable.** Per section, count openers and connectives whose subject is the document rather than
343
- the world: *this paper · this section · we now turn · comes first · in what follows · the rest of
344
- this · as discussed above · it is worth noting · importantly*. Measured on this paper: **10 in the
345
- body**, and the abstract's opener was one. Target for an abstract or conclusion: **zero**. Body:
346
- under one per section, and every survivor must earn a reason.
347
-
348
- **Rewrite heuristic:** delete the frame and start at the fact. *"Two findings come first, because
349
- they bind whatever else you build. Asked the same question twice…"* → *"Asked the same question
350
- twice with identical inputs, a frontier model changes its verdict on 21.5% of rows."* Nothing is
351
- lost. The ordering was already visible — it is the order of the sentences.
383
+ ### 1. Contrast framing, and a frame that carries nothing
384
+
385
+ **What separates this corpus from accepted papers is contrast, not signposting — measure that
386
+ first.** Counted with the same counter on five accepted ACSAC 2024/25 ML-security papers against a
387
+ paper of ours: *"not X but Y"* at 35.5 per 10,000 words in ours against at most 4.9 there (and five
388
+ of their six hits were *"not only … but also"*); *"rather than / instead of"* at 19.9 against at most
389
+ 5.4. Every sentence that defines its point by what it is not is a sentence whose point the reader
390
+ must reconstruct. **Rewrite heuristic:** state the thing; move the rejected alternative to its own
391
+ sentence, or drop it if nobody proposed it. Check *instead of · rather than · not … but* first,
392
+ against the same count on the reference papers of dimension #10.
393
+
394
+ **Frame markers do not separate us from accepted papers, and are not a target in either direction.**
395
+ Hyland's *frame markers* (*this paper · this section · we show · first … finally · in what follows*)
396
+ measured 0.76–3.1 per 1,000 words on those five accepted papers (median 1.46); the lowest accepted
397
+ paper measured is 0.76, and ours sat inside that range. So neither "remove signposting" nor "add
398
+ signposting to reach a number" is a fix. A published average from a different counter (Hyland's
399
+ ~5 per 1,000) says nothing about where a venue's floor lies.
400
+
401
+ What IS a defect is a frame that carries nothing. *"Two findings come first, because they bind
402
+ whatever else you build"* says nothing about rules files, agents, or repositories: the frame is
403
+ there, and the claim it announces is not. List the frames whose announced content never arrives
404
+ within the next two sentences; those are the findings. **Rewrite heuristic:** keep the frame and make
405
+ it carry the claim. *"Two findings come first, because they bind whatever else you build. Asked the
406
+ same question twice…"* → *"We first report two properties of the model that constrain any harness
407
+ built on it. Asked the same question twice with identical inputs, it changed its verdict on 21.5% of
408
+ rows (Section 4.5)."* The frame now names what follows, and the sentence after it says whose
409
+ measurement it is.
410
+
411
+ ⚠️ **Vocabulary lists are not a register signal.** *robust*, *significant*, *comprehensive* and the
412
+ rest of the AI-tells vocabulary fire on every one of the five accepted papers. Flag such a word only
413
+ when it is empty in its sentence, never as evidence of a machine or of the wrong register.
352
414
 
353
415
  ### 2. The qualification eats the claim
354
416
 
@@ -388,9 +450,11 @@ one sentence.
388
450
  They are the only two sections most readers finish, and the abstract is the only one every reviewer
389
451
  reads before forming a view. Grade them **separately and harder**:
390
452
 
391
- - **zero** frame markers, **zero** self-reference to the paper;
453
+ - no frame that announces a claim and then does not make it; *"We show that…"* naming the authors'
454
+ own result is the register of an abstract, not a defect;
392
455
  - first sentence is about the world, never about the document;
393
- - no number arrives without the unit it counts (*"21.5% of rows"* — rows of what?);
456
+ - no number arrives without the unit it counts (*"21.5% of rows"* — rows of what?) or without its
457
+ owner — the authors' measurement, a cited work, or a named population;
394
458
  - the last sentence of each is a **conclusion**, not an announcement of one;
395
459
  - nothing may refer forward to a section the reader has not read.
396
460
 
@@ -400,8 +464,9 @@ one did, and it was the worst section in the paper by measured density both time
400
464
 
401
465
  ### What is NOT mechanizable here
402
466
 
403
- Whether a frame marker is load-bearing (*"we claim nothing there"* genuinely scopes a claim) and
404
- whether a hedge is honest or defensive. Count them, surface them, and leave the verdict to a reader.
467
+ Whether a frame marker carries its claim (*"we claim nothing there"* genuinely scopes one) and
468
+ whether a hedge is honest or defensive. The mechanical leg that does exist: `tex/claim-provenance`
469
+ reports every sentence of the body that holds a number and no owner. Count them, surface them, and leave the verdict to a reader.
405
470
  The counter's job is that nobody can say afterwards they did not know.
406
471
 
407
472
  ## Compose with
@@ -9,7 +9,7 @@ import { experimental_skill } from "vigiles/spec";
9
9
  export default experimental_skill({
10
10
  name: "grade-paper-writing",
11
11
  description:
12
- 'Use when asking "does this paper read well?" / "is the writing any good?" / "it reads like a wall of text and jargon" / "grade the writing" on a draft. Grades WRITING CRAFT only — nine dimensions 1–5 (Title, Abstract, Intro architecture, Structure, Prose clarity, Jargon discipline, Landing-the-point, Figure economy, Honesty-without-hedge-stacking) against how the best-written papers read (Peyton Jones, McEnerney, Gopen & Swan; exemplars Trusting Trust, Carlini, Greshake), naming the offending sentence and the fix for each. Runs the PERSONA cold-read stall pass (a committed non-academic persona subagent, per-section) whose stall inventory — not the rubric number — is the readability gate other skills consume (pc-panel-review, paper-adversarial-review, harden-paper). Defaults to a blind multi-grader panel; after fixes, mandates the claims-preservation diff (row `claims`). 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). Compose with harden-paper (which calls it), draft-paper (generative counterpart), render-paper.',
12
+ 'Use when asking "does this paper read well?" / "is the writing any good?" / "it reads like a wall of text and jargon" / "grade the writing" on a draft. 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. 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). Defaults to a blind multi-grader panel; after fixes, mandates the claims-preservation diff (row `claims`). 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). Compose with harden-paper (which calls it), draft-paper (generative counterpart), render-paper.',
13
13
  tools: ["Read", "Write", "Edit", "Grep", "Glob", "Agent", "Skill"],
14
14
  body: `
15
15
  # grade-paper-writing — grade how the paper READS, then fix it sentence by sentence
@@ -22,7 +22,7 @@ doesn't drive home how crazy the situation is"* — which is a writing problem,
22
22
  which the defect-hunting skills will pass right over.
23
23
 
24
24
  Grounding (do NOT re-derive — read it): \`../paper-pipeline/references/writing-craft.md\` holds the craft
25
- rules, the exemplar lessons, and the full nine-dimension rubric with 1/5 anchors. This skill applies it.
25
+ rules, the exemplar lessons, and the full ten-dimension rubric with 1/5 anchors. This skill applies it.
26
26
 
27
27
  ## The frame to hold while grading (from the reference)
28
28
  The papers that make a human care share three moves: **(1) open on a problem/assumption the reader already
@@ -31,6 +31,14 @@ repeatable sentence.** Grade the draft against that trio, plus McEnerney's test
31
31
  for the reader, or just record the author's thinking?* — and Gopen/Swan's sentence mechanics (payload in
32
32
  the stress position, subject next to verb, one idea per sentence).
33
33
 
34
+ 🔴 **Every push in this rubric has a floor as well as a ceiling.** The craft rules above pull toward
35
+ short, plain, punchy sentences, and each mechanical check below caps something: jargon, length, hedges,
36
+ connectives. A rubric in which every check is a ceiling has one equilibrium — terse assertions with no
37
+ signposting and no stated owner — and reviewers call that a blog post (*"overly literary"*, *"some
38
+ sentences are too informal"*, *"readers are often required to infer the intended relationships between
39
+ claims"*). The floor is the venue's own register: dimension #10 measures the distance to it, and no fix
40
+ this skill proposes may move the text further from it than it already is.
41
+
34
42
  ## Execution model — run the graders as subagents (context forks), by default
35
43
  The blind panel (≥3 graders) and the cold-read stall pass **run in fresh subagents, not inline** — for two
36
44
  reasons: (a) grading dumps the whole paper + long stall inventories into context, which gunks up the main
@@ -83,6 +91,21 @@ they supplied it.
83
91
  Give the passage **as text in the prompt**, not as a file path. A path invites reading the
84
92
  neighbours, and reading the neighbours is how this pass fails silently.
85
93
 
94
+ ### Two readers, and both run
95
+
96
+ The pass runs two committed personas, each in its own subagent. Neither replaces the other: they
97
+ stall on different sentences.
98
+
99
+ | persona | reads | stalls on |
100
+ |---|---|---|
101
+ | **the engineer** — a strong practitioner outside academia (\`Sam\` in the reference) | every section, one subagent per section | terms, walls, sentences that mean nothing to someone who does not already hold the idea |
102
+ | **the workshop reviewer** — a PC member at the target venue with 40 minutes for the paper, Confidence 3 | the abstract, the introduction and the conclusion, skimmed in that order | a sentence whose result has no owner (the authors? a cited work? a population?), a relation between claims left for the reader to infer, and anything that does not read like a paper at this venue |
103
+
104
+ The engineer cannot report the second column by construction: he does not know what a paper at the
105
+ venue sounds like, and a sentence with no stated owner reads to him as confident, not as ambiguous.
106
+ The reviewer persona's full prompt is in the reference, next to the engineer's. Its findings go into
107
+ the same stall inventory, under their own classes (7 and 8 below).
108
+
86
109
  ### The one question, per sentence
87
110
 
88
111
  > **What does this sentence claim? Restate it in your own words.**
@@ -104,6 +127,8 @@ every 2026-08-05 defect lived.
104
127
  | 4 | 🔴 **means nothing** | every word is known, the sentence parses grammatically, and the reader still cannot say what it claims | *"the state to remove is not the rule but its claim about itself"* · *"constructions nobody built"* |
105
128
  | 5 | 🔴 **sounds clever, carries nothing** | reads smoothly, feels like a payoff, and its content is a restatement or is borrowed from a section the reader has not read | *"nine deletions against four fixes is §5.1's cheap way out, winning again"* |
106
129
  | 6 | 🔴 **vague heading** | a heading naming no concrete object — no linter, no configuration, no agent, no file | *"Three answers, all of them after the fact"* · *"The configuration nobody resolves"* |
130
+ | 7 | 🔴 **whose result?** (reviewer persona) | the reader cannot tell whether a claim is a property of the world, a cited finding, or the authors' own measurement | *"asked twice about the same repositories, it changes its mind on a fifth"* — the paper's own experiment, read as a fact about LLMs |
131
+ | 8 | 🔴 **off-register** (reviewer persona) | a sentence the venue's accepted papers would not contain: an aphorism, a fragment, a colloquial closing line, an unmarked jump between claims | *"Measure the bill, not the syllables."* — quoted back by a reviewer as "too informal" |
107
132
 
108
133
  Class 5 is the one a knowing reader always waves through, because it reads *well*. Ask for it by
109
134
  name — "which sentences sound clever but say less than they appear to?" — or it will not be reported.
@@ -139,11 +164,12 @@ is what happened.
139
164
  2. **Run the cold-read stall pass FIRST — the full specification is below, under "The stall pass".**
140
165
  It was previously a pointer to a reference section that did not exist, which is why the pass drifted
141
166
  into "log where I stumbled" and stopped catching the class it exists for.
142
- 2. **Score all nine dimensions 1–5** using the anchors in the reference, on the **absolute scale** defined
167
+ 2. **Score all ten dimensions 1–5** using the anchors in the reference, on the **absolute scale** defined
143
168
  there (5 = best-in-field, **3 = the default for a solid paper**; most dimensions are 2–3). Weight Prose
144
- (#5), Jargon (#6), Landing (#7) ×2 — that's where "wall of jargon" lives. Report raw /45 + weighted /60.
169
+ (#5), Jargon (#6), Landing (#7) and Register (#10) ×2 — the first three are where "wall of jargon"
170
+ lives, the fourth is where "blog post" lives. Report raw /50 + weighted /70.
145
171
  **Do NOT trust a single grade.** A lone grader — especially one that just wrote or verified the paper —
146
- anchors optimistic; a 52/60-looking number is suspect until confirmed. So **when the score matters, run a
172
+ anchors optimistic; a 60/70-looking number is suspect until confirmed. So **when the score matters, run a
147
173
  blind panel: ≥3 independent graders (fresh subagents, ideally an adversarial model like Fable), each
148
174
  blind to any prior score, to each other, and to the "it improved" framing — given only the current page
149
175
  and the field's best.** Report the **distribution (per-dimension + overall min / median / max)**, not one
@@ -152,6 +178,18 @@ is what happened.
152
178
  3. **For every dimension scoring ≤3, name the specific offending sentence or section** and write the fix —
153
179
  not "tighten the prose" but the rewritten sentence, or "move the point from ¶3 to ¶1", or "gloss
154
180
  \`operation-normalized\` in plain words at first use." Fixes must be applyable, not vibes.
181
+ 3a. **Grade #10, register distance, against the venue's own papers — not against the exemplars.**
182
+ Take 2–3 papers accepted at the target venue (or, for a first-edition workshop, at its parent
183
+ conference) in the same paper type: fetch them from the proceedings or the program page, or use the
184
+ ones the author supplies. Read the abstract, the introduction and the conclusion of each beside the
185
+ draft's, and record, for both sides: how each result is owned (*we measured* · a citation · a named
186
+ population), how often a point is made by contrast (*not X but Y*, *rather than*, *instead of* —
187
+ the measured difference between this corpus and accepted papers), sentence length and fragments,
188
+ and whether any sentence is an aphorism or a closing punchline. The
189
+ score is the distance: 5 = a reviewer could not tell the draft from the reference papers by register;
190
+ 1 = it reads as a different genre. Quote the reference sentence beside each draft sentence you flag.
191
+ If no accepted paper can be fetched or supplied, write \`#10: not graded — no reference papers\` and
192
+ say which were tried; a register score from memory is the guess this dimension exists to replace.
155
193
  4. **Find the paper's three-move opportunities:** what held assumption could open it? what is its single
156
194
  most visceral concrete instance (lead with that, not the mean)? what one sentence should the reader
157
195
  quote? If the draft is missing any, that's the highest-leverage fix.
@@ -216,7 +254,7 @@ is what happened.
216
254
  8. **Run the avoid-list grep (mechanical).** Grep the source for the slop / web-slang / filler / hype words
217
255
  in \`../paper-pipeline/references/writing-craft.md\` → "The avoid-list", and report every hit with its line number and a
218
256
  replacement. These are scrutinize-words, not absolute bans — but each hit is a readability debit against
219
- dimension #6 (Jargon) and the "engaging + human-readable" north star. (This session's miss that motivated
257
+ dimension #6 (Jargon) and the north star — readable by the target reader, in the venue's register. (This session's miss that motivated
220
258
  it: "listicle" survived into a submitted-ready AISec draft.)
221
259
  7. **Wall-of-text sweep (see \`writing-craft.md\` → "The wall-of-text check").** Flag any paragraph running
222
260
  >~15 source lines / ~150 words or covering >3 sub-points — a visual wall the reader's eye slides off
@@ -230,7 +268,7 @@ is what happened.
230
268
  isn't strong enough" and "nothing here is quotable."
231
269
 
232
270
  ## Output
233
- 1. **Scorecard** — nine dimensions with one-line justification each; raw /45 + weighted /60. When a blind
271
+ 1. **Scorecard** — ten dimensions with one-line justification each; raw /50 + weighted /70. When a blind
234
272
  panel was run (the default when the score matters), report the **distribution** — per-dimension and
235
273
  overall min / median / max across graders — not a single number, and name any dimension they split on.
236
274
  Lead with the two or three dimensions dragging it down, ranked.
@@ -305,19 +343,31 @@ Mechanical leg: \`paper-lint\`'s plain-language pass flags any sentence carrying
305
343
  citation groups, or five or more reference numbers in under 45 words. It cannot judge whether the
306
344
  prose is *good*; it reliably catches this one shape, which is the shape that recurs.
307
345
 
308
- **And the words themselves, not only the sentences.** *Adherence* means *following the rules*. The
309
- "Jargon discipline" dimension below does not catch this, because the word looks perfectly at home —
310
- judgment slides right past it. What catches it is a list: \`paper-lint\` carries ~30 words with a plain
311
- English equivalent (adherence · utilise · demonstrates · constitutes · prior to · necessitates ·
312
- facilitates · methodology · leverage · albeit · comprise · entail · in order to …) and names the
313
- replacement in the nudge. Keep the list narrow — only words where the swap does not change meaning —
314
- and never rewrite a cited work's title to obey it.
315
-
316
- **Other markers of the same register, all cheap to check and all worth a pass:** nominalisation
317
- density (*an honest accounting of what the construction costs* — abstract nouns doing the work verbs
318
- should do), stock connectives (*furthermore*, *thereby*, *it is worth noting*), and statistics chained
319
- through a paragraph instead of sitting in a table. Numbers belong in a table the moment there are more
320
- than about six of them in one paragraph.
346
+ **And the words themselves, not only the sentences.** *Utilise* means *use*. The "Jargon discipline"
347
+ dimension below does not catch this, because the word looks perfectly at home — judgment slides right
348
+ past it. What catches it is a list: \`paper-lint\` carries ~30 words with a plainer equivalent (utilise ·
349
+ constitutes · prior to · necessitates · facilitates · leverage · albeit · in order to …) and names the
350
+ replacement in the nudge.
351
+
352
+ 🔴 **The swap is two-sided: replace a word only when the plain word stays in academic register.**
353
+ *Utilise → use* and *in order to → to* pass: the replacement is what the venue's own papers write.
354
+ *Adherence → following*, *demonstrates → shows* in a results sentence, *methodology → how we did it*
355
+ do not pass when the reference papers of dimension #10 use the first form — there the plain word is a
356
+ step toward a blog post, and the finding is withdrawn. Keep the list narrow — only words where the swap
357
+ changes neither meaning nor register — and never rewrite a cited work's title to obey it.
358
+
359
+ **Signposting is the register, not a tic, and this skill never removes it on style grounds.** Frame
360
+ markers and relation words — *we show*, *this section*, *first … finally*, *in contrast*, *therefore*,
361
+ *however* — are how academic prose tells the reader what kind of claim comes next and how it relates to
362
+ the last one. Their count does not separate a draft from accepted papers (see "Contrast framing"
363
+ below); removing them does, in the wrong direction. Flag a connective only when it asserts a relation
364
+ the two sentences do not have (a *therefore* that does not follow), or when it is empty filler (*it is
365
+ worth noting that*). Never flag one for being academic.
366
+
367
+ **Other markers worth a pass:** nominalisation density (*an honest accounting of what the construction
368
+ costs* — abstract nouns doing the work verbs should do) and statistics chained through a paragraph
369
+ instead of sitting in a table. Numbers belong in a table the moment there are more than about six of
370
+ them in one paragraph.
321
371
 
322
372
 
323
373
  ## 🔴 The class the rubric could not see, and why it kept coming back (2026-08-04)
@@ -336,25 +386,37 @@ them measures words and sentences. The defect is not in the words.
336
386
 
337
387
  Two separable failures:
338
388
 
339
- ### 1. The text talks about the text (metadiscourse)
340
-
341
- *"Two findings come first, because they bind whatever else you build"* says nothing about rules
342
- files, agents, or repositories. It is the paper **narrating its own structure** — the reader is
343
- handed a table of contents where they expected a fact. This is Hyland's *frame marker*, and in this
344
- corpus it is the single most reliable smell of machine-drafted expository prose: an
345
- instruction-tuned model is rewarded for signposting, so it signposts where a writer would simply
346
- say the thing.
347
-
348
- **Countable.** Per section, count openers and connectives whose subject is the document rather than
349
- the world: *this paper · this section · we now turn · comes first · in what follows · the rest of
350
- this · as discussed above · it is worth noting · importantly*. Measured on this paper: **10 in the
351
- body**, and the abstract's opener was one. Target for an abstract or conclusion: **zero**. Body:
352
- under one per section, and every survivor must earn a reason.
353
-
354
- **Rewrite heuristic:** delete the frame and start at the fact. *"Two findings come first, because
355
- they bind whatever else you build. Asked the same question twice…"* → *"Asked the same question
356
- twice with identical inputs, a frontier model changes its verdict on 21.5% of rows."* Nothing is
357
- lost. The ordering was already visible — it is the order of the sentences.
389
+ ### 1. Contrast framing, and a frame that carries nothing
390
+
391
+ **What separates this corpus from accepted papers is contrast, not signposting — measure that
392
+ first.** Counted with the same counter on five accepted ACSAC 2024/25 ML-security papers against a
393
+ paper of ours: *"not X but Y"* at 35.5 per 10,000 words in ours against at most 4.9 there (and five
394
+ of their six hits were *"not only … but also"*); *"rather than / instead of"* at 19.9 against at most
395
+ 5.4. Every sentence that defines its point by what it is not is a sentence whose point the reader
396
+ must reconstruct. **Rewrite heuristic:** state the thing; move the rejected alternative to its own
397
+ sentence, or drop it if nobody proposed it. Check *instead of · rather than · not … but* first,
398
+ against the same count on the reference papers of dimension #10.
399
+
400
+ **Frame markers do not separate us from accepted papers, and are not a target in either direction.**
401
+ Hyland's *frame markers* (*this paper · this section · we show · first … finally · in what follows*)
402
+ measured 0.76–3.1 per 1,000 words on those five accepted papers (median 1.46); the lowest accepted
403
+ paper measured is 0.76, and ours sat inside that range. So neither "remove signposting" nor "add
404
+ signposting to reach a number" is a fix. A published average from a different counter (Hyland's
405
+ ~5 per 1,000) says nothing about where a venue's floor lies.
406
+
407
+ What IS a defect is a frame that carries nothing. *"Two findings come first, because they bind
408
+ whatever else you build"* says nothing about rules files, agents, or repositories: the frame is
409
+ there, and the claim it announces is not. List the frames whose announced content never arrives
410
+ within the next two sentences; those are the findings. **Rewrite heuristic:** keep the frame and make
411
+ it carry the claim. *"Two findings come first, because they bind whatever else you build. Asked the
412
+ same question twice…"* → *"We first report two properties of the model that constrain any harness
413
+ built on it. Asked the same question twice with identical inputs, it changed its verdict on 21.5% of
414
+ rows (Section 4.5)."* The frame now names what follows, and the sentence after it says whose
415
+ measurement it is.
416
+
417
+ ⚠️ **Vocabulary lists are not a register signal.** *robust*, *significant*, *comprehensive* and the
418
+ rest of the AI-tells vocabulary fire on every one of the five accepted papers. Flag such a word only
419
+ when it is empty in its sentence, never as evidence of a machine or of the wrong register.
358
420
 
359
421
  ### 2. The qualification eats the claim
360
422
 
@@ -394,9 +456,11 @@ one sentence.
394
456
  They are the only two sections most readers finish, and the abstract is the only one every reviewer
395
457
  reads before forming a view. Grade them **separately and harder**:
396
458
 
397
- - **zero** frame markers, **zero** self-reference to the paper;
459
+ - no frame that announces a claim and then does not make it; *"We show that…"* naming the authors'
460
+ own result is the register of an abstract, not a defect;
398
461
  - first sentence is about the world, never about the document;
399
- - no number arrives without the unit it counts (*"21.5% of rows"* — rows of what?);
462
+ - no number arrives without the unit it counts (*"21.5% of rows"* — rows of what?) or without its
463
+ owner — the authors' measurement, a cited work, or a named population;
400
464
  - the last sentence of each is a **conclusion**, not an announcement of one;
401
465
  - nothing may refer forward to a section the reader has not read.
402
466
 
@@ -406,8 +470,9 @@ one did, and it was the worst section in the paper by measured density both time
406
470
 
407
471
  ### What is NOT mechanizable here
408
472
 
409
- Whether a frame marker is load-bearing (*"we claim nothing there"* genuinely scopes a claim) and
410
- whether a hedge is honest or defensive. Count them, surface them, and leave the verdict to a reader.
473
+ Whether a frame marker carries its claim (*"we claim nothing there"* genuinely scopes one) and
474
+ whether a hedge is honest or defensive. The mechanical leg that does exist: \`tex/claim-provenance\`
475
+ reports every sentence of the body that holds a number and no owner. Count them, surface them, and leave the verdict to a reader.
411
476
  The counter's job is that nobody can say afterwards they did not know.
412
477
 
413
478
  ## Compose with