paperlint 6.3.0 → 7.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (185) hide show
  1. package/CONTRIBUTING.md +4 -2
  2. package/README.md +20 -13
  3. package/dist/adapters/latex/conditionals.d.ts +21 -0
  4. package/dist/adapters/latex/conditionals.d.ts.map +1 -0
  5. package/dist/adapters/latex/conditionals.js +75 -0
  6. package/dist/adapters/latex/conditionals.js.map +1 -0
  7. package/dist/adapters/latex/headings.d.ts +10 -0
  8. package/dist/adapters/latex/headings.d.ts.map +1 -0
  9. package/dist/adapters/latex/headings.js +129 -0
  10. package/dist/adapters/latex/headings.js.map +1 -0
  11. package/dist/adapters/latex/index.d.ts +1 -0
  12. package/dist/adapters/latex/index.d.ts.map +1 -1
  13. package/dist/adapters/latex/index.js +3 -0
  14. package/dist/adapters/latex/index.js.map +1 -1
  15. package/dist/adapters/latex/parse.d.ts +1 -1
  16. package/dist/adapters/latex/parse.d.ts.map +1 -1
  17. package/dist/adapters/latex/parse.js +3 -2
  18. package/dist/adapters/latex/parse.js.map +1 -1
  19. package/dist/build.d.ts +1 -1
  20. package/dist/build.d.ts.map +1 -1
  21. package/dist/build.js +1 -1
  22. package/dist/build.js.map +1 -1
  23. package/dist/cli.d.ts +1 -1
  24. package/dist/cli.d.ts.map +1 -1
  25. package/dist/cli.js +19 -5
  26. package/dist/cli.js.map +1 -1
  27. package/dist/domain/body-pages.d.ts +29 -0
  28. package/dist/domain/body-pages.d.ts.map +1 -1
  29. package/dist/domain/body-pages.js +25 -0
  30. package/dist/domain/body-pages.js.map +1 -1
  31. package/dist/domain/heading-case.d.ts +100 -0
  32. package/dist/domain/heading-case.d.ts.map +1 -0
  33. package/dist/domain/heading-case.js +365 -0
  34. package/dist/domain/heading-case.js.map +1 -0
  35. package/dist/domain/tex-document.d.ts +32 -0
  36. package/dist/domain/tex-document.d.ts.map +1 -1
  37. package/dist/domain/tex-document.js +11 -0
  38. package/dist/domain/tex-document.js.map +1 -1
  39. package/dist/eslint-rules/latex-language.d.ts.map +1 -1
  40. package/dist/eslint-rules/latex-language.js +16 -3
  41. package/dist/eslint-rules/latex-language.js.map +1 -1
  42. package/dist/facts-file.d.ts +3 -3
  43. package/dist/facts-file.d.ts.map +1 -1
  44. package/dist/facts-file.js +3 -3
  45. package/dist/facts-file.js.map +1 -1
  46. package/dist/folder-venue-rule.js +6 -6
  47. package/dist/folder-venue-rule.js.map +1 -1
  48. package/dist/heading-case.d.ts +48 -0
  49. package/dist/heading-case.d.ts.map +1 -0
  50. package/dist/heading-case.js +191 -0
  51. package/dist/heading-case.js.map +1 -0
  52. package/dist/paper-includes.d.ts +3 -0
  53. package/dist/paper-includes.d.ts.map +1 -1
  54. package/dist/paper-includes.js +17 -2
  55. package/dist/paper-includes.js.map +1 -1
  56. package/dist/ports/latex.d.ts +7 -1
  57. package/dist/ports/latex.d.ts.map +1 -1
  58. package/dist/preset-card-rule.d.ts +100 -0
  59. package/dist/preset-card-rule.d.ts.map +1 -0
  60. package/dist/preset-card-rule.js +221 -0
  61. package/dist/preset-card-rule.js.map +1 -0
  62. package/dist/presets.d.ts +29 -5
  63. package/dist/presets.d.ts.map +1 -1
  64. package/dist/presets.js +104 -68
  65. package/dist/presets.js.map +1 -1
  66. package/dist/submission.d.ts +8 -0
  67. package/dist/submission.d.ts.map +1 -1
  68. package/dist/submission.js +19 -7
  69. package/dist/submission.js.map +1 -1
  70. package/dist/tex-requirements.d.ts +42 -3
  71. package/dist/tex-requirements.d.ts.map +1 -1
  72. package/dist/tex-requirements.js +34 -5
  73. package/dist/tex-requirements.js.map +1 -1
  74. package/dist/tex-venue-rules.d.ts +6 -3
  75. package/dist/tex-venue-rules.d.ts.map +1 -1
  76. package/dist/tex-venue-rules.js +29 -10
  77. package/dist/tex-venue-rules.js.map +1 -1
  78. package/dist/venue-rules.d.ts +2 -1
  79. package/dist/venue-rules.d.ts.map +1 -1
  80. package/dist/venue-rules.js +55 -7
  81. package/dist/venue-rules.js.map +1 -1
  82. package/docs/configuration.md +13 -1
  83. package/docs/e2e.md +14 -12
  84. package/docs/optional-rules.md +4 -3
  85. package/docs/rules/format/page-limit.md +19 -2
  86. package/docs/rules/paper/folder-venue-leftover.md +1 -1
  87. package/docs/rules/talk/profile.md +1 -1
  88. package/docs/rules/tex/heading-case.md +424 -0
  89. package/docs/rules/tex/template.md +25 -5
  90. package/docs/rules/tex/venue-leftover.md +13 -0
  91. package/docs/rules.md +74 -57
  92. package/docs/submission.md +5 -1
  93. package/eslint-rules/latex-language.test.mjs +12 -0
  94. package/eslint-rules/latex-language.ts +17 -4
  95. package/eslint-rules/paper-typography.test.mjs +12 -0
  96. package/eslint.config.mjs +59 -1
  97. package/fixtures/build-e2e/acmart/paper.tex +1 -1
  98. package/fixtures/build-e2e/fallback/expect.json +3 -3
  99. package/fixtures/build-e2e/msr/PIPELINE-STATUS.md +3 -0
  100. package/fixtures/build-e2e/msr/expect.json +18 -0
  101. package/fixtures/build-e2e/msr/paper.tex +49 -0
  102. package/fixtures/build-e2e/msr/paperlint.json +1 -0
  103. package/fixtures/build-e2e/msr-appendix-after/PIPELINE-STATUS.md +3 -0
  104. package/fixtures/build-e2e/msr-appendix-after/expect.json +20 -0
  105. package/fixtures/build-e2e/msr-appendix-after/paper.tex +48 -0
  106. package/fixtures/build-e2e/msr-appendix-after/paperlint.json +1 -0
  107. package/lib/skill-checks.mjs +31 -0
  108. package/package.json +7 -1
  109. package/presets/acm-sigconf.jsonc +5 -0
  110. package/presets/acm-sigconf.md +43 -0
  111. package/presets/agenticdev.jsonc +27 -6
  112. package/presets/agenticdev.md +151 -0
  113. package/presets/aidc.jsonc +6 -0
  114. package/presets/aidc.md +75 -0
  115. package/presets/aisec.jsonc +5 -1
  116. package/presets/aisec.md +117 -0
  117. package/presets/ieee-conference.jsonc +5 -0
  118. package/presets/ieee-conference.md +38 -0
  119. package/presets/msr.jsonc +71 -0
  120. package/presets/msr.md +94 -0
  121. package/presets/realm.jsonc +7 -2
  122. package/presets/realm.md +166 -0
  123. package/presets/tex/agenticdev.tex +1 -1
  124. package/presets/tex-base.jsonc +6 -0
  125. package/presets/tex-base.md +30 -0
  126. package/presets/venue-profile.schema.json +65 -1
  127. package/skills/camera-ready/SKILL.md +8 -1
  128. package/skills/camera-ready/SKILL.md.spec.ts +7 -0
  129. package/skills/find-venue/SKILL.md +6 -5
  130. package/skills/find-venue/SKILL.md.spec.ts +5 -4
  131. package/skills/paper-pipeline/SKILL.md +5 -6
  132. package/skills/paper-pipeline/SKILL.md.spec.ts +4 -5
  133. package/skills/paper-pipeline/references/acl-venue-rules.md +1 -1
  134. package/skills/study-accepted-papers/SKILL.md +3 -3
  135. package/skills/study-accepted-papers/SKILL.md.spec.ts +2 -2
  136. package/skills/submission-portal/SKILL.md +2 -2
  137. package/skills/submission-portal/SKILL.md.spec.ts +1 -1
  138. package/skills/submit-paper/SKILL.md +34 -22
  139. package/skills/submit-paper/SKILL.md.spec.ts +33 -21
  140. package/skills/submit-paper/references/publishers/acm.md +1 -1
  141. package/src/adapters/latex/conditionals.ts +130 -0
  142. package/src/adapters/latex/headings.ts +163 -0
  143. package/src/adapters/latex/index.test.ts +65 -0
  144. package/src/adapters/latex/index.ts +3 -0
  145. package/src/adapters/latex/parse.ts +3 -2
  146. package/src/build.ts +2 -2
  147. package/src/cli.test.ts +50 -7
  148. package/src/cli.ts +28 -6
  149. package/src/domain/body-pages.test.ts +144 -0
  150. package/src/domain/body-pages.ts +61 -1
  151. package/src/domain/heading-case.test.ts +660 -0
  152. package/src/domain/heading-case.ts +538 -0
  153. package/src/domain/tex-document.ts +36 -0
  154. package/src/domain/venue-name.test.ts +13 -7
  155. package/src/facts-file.test.ts +4 -4
  156. package/src/facts-file.ts +6 -6
  157. package/src/folder-venue-rule.test.ts +10 -10
  158. package/src/folder-venue-rule.ts +6 -6
  159. package/src/heading-case.test.ts +500 -0
  160. package/src/heading-case.ts +275 -0
  161. package/src/init.test.ts +1 -1
  162. package/src/new-paper.test.ts +37 -6
  163. package/src/paper-includes.test.ts +26 -0
  164. package/src/paper-includes.ts +20 -2
  165. package/src/paper-settings-commands.test.ts +26 -11
  166. package/src/ports/latex.ts +7 -0
  167. package/src/preset-card-rule.test.ts +267 -0
  168. package/src/preset-card-rule.ts +384 -0
  169. package/src/presets.test.ts +259 -41
  170. package/src/presets.ts +161 -75
  171. package/src/rule-cases.test.ts +136 -50
  172. package/src/submission.test.ts +44 -4
  173. package/src/submission.ts +28 -7
  174. package/src/talk-rules.test.ts +6 -3
  175. package/src/tex-requirements.harness.ts +25 -11
  176. package/src/tex-requirements.test.ts +127 -1
  177. package/src/tex-requirements.ts +91 -12
  178. package/src/tex-venue-rules.test.ts +196 -21
  179. package/src/tex-venue-rules.ts +47 -16
  180. package/src/venue-rules.test.ts +180 -8
  181. package/src/venue-rules.ts +71 -10
  182. package/templates/paper/paper.tex +1 -1
  183. package/skills/submit-paper/references/venues/agenticdev.md +0 -171
  184. package/skills/submit-paper/references/venues/aisec.md +0 -105
  185. package/skills/submit-paper/references/venues/realm.md +0 -155
@@ -11,11 +11,21 @@
11
11
  "type": "string",
12
12
  "minLength": 1
13
13
  },
14
+ "type": {
15
+ "description": "What this file is. `venue`: one venue's call for papers, and it must say which venue (`name`) and where its call is (`url`). `family`: a publisher's template (acm-sigconf, ieee-conference) that venue presets extend; it names no venue, so it has neither `name` nor `url`. `base`: the TeX packages every paper gets (tex-base.jsonc); it holds only `tex` and nothing extends it.",
16
+ "type": "string",
17
+ "enum": ["venue", "family", "base"]
18
+ },
14
19
  "name": {
15
- "description": "A display name for messages; the file name otherwise.",
20
+ "description": "A venue's name as its call for papers spells it (`AgenticDev`). Required on a venue, refused on a family. The label of messages, and one of the names `tex/venue-leftover` looks for.",
16
21
  "type": "string",
17
22
  "minLength": 1
18
23
  },
24
+ "url": {
25
+ "description": "A venue's call for papers or author instructions: the page its numbers are quoted from. Required on a venue, refused on a family.",
26
+ "type": "string",
27
+ "pattern": "^https://[^\\s/]+[^\\s]*$"
28
+ },
19
29
  "tex": {
20
30
  "$ref": "#/definitions/tex"
21
31
  },
@@ -24,6 +34,16 @@
24
34
  "type": "string",
25
35
  "minLength": 1
26
36
  },
37
+ "template_forbids": {
38
+ "description": "Class options the venue's call forbids in the \\documentclass line (`[\"compsoc\", \"compsocconf\"]`: MSR's «without including the compsoc or compsocconf options»). `tex/template` reports each one a paper's class line carries. Read with the `template` of the same file, and only with it: a child's `template` replaces both.",
39
+ "type": "array",
40
+ "minItems": 1,
41
+ "uniqueItems": true,
42
+ "items": {
43
+ "type": "string",
44
+ "minLength": 1
45
+ }
46
+ },
27
47
  "blind": {
28
48
  "description": "The venue reviews double-blind: its call says submissions must be anonymized. Read by `anonymity/identity`, which then requires the paper's `identity` and finds none of it in the PDF. Set only where the venue says so, with the quote. A child's value replaces its parent's.",
29
49
  "type": "boolean"
@@ -37,6 +57,11 @@
37
57
  "minLength": 1
38
58
  }
39
59
  },
60
+ "mentions": {
61
+ "description": "When the venue's `name` and `aliases` count as naming it in a paper's text (`tex/venue-leftover`). Absent: any whole-word use. `with-year`: only with a year beside the name — `MSR 2027`, `MSR'27`, `MSR~2027` — for a name that is also a common acronym (MSR: Microsoft Research, or an acronym a paper defines), where a bare use names something else far more often than the venue. A child's value replaces its parent's.",
62
+ "type": "string",
63
+ "enum": ["with-year"]
64
+ },
40
65
  "portal": {
41
66
  "description": "Where the venue takes submissions, read by `paperlint submission`: the portal's kind (an adapter exists for `hotcrp`) and the site's base URL, the one its pages and `/api/` hang off. A paper says which submission is its own with `submission: { id }` in its paperlint.json. A child's value replaces its parent's.",
42
67
  "type": "object",
@@ -76,6 +101,9 @@
76
101
  "description": "What the venue's call for papers sets. Every key is optional; a child preset's key replaces its parent's, and a child's kind replaces that kind.",
77
102
  "type": "object",
78
103
  "additionalProperties": false,
104
+ "dependencies": {
105
+ "appendix_in_body": ["body_ends_at"]
106
+ },
79
107
  "properties": {
80
108
  "page_size": {
81
109
  "type": "string",
@@ -130,6 +158,10 @@
130
158
  "type": "string",
131
159
  "enum": ["references"]
132
160
  },
161
+ "appendix_in_body": {
162
+ "description": "With `body_ends_at: references`: the venue counts its appendices in the body limit and allows reference pages that hold only references (MSR: «10 pages for the main text, inclusive of all figures, tables, appendices, etc. Two more pages containing only references are permitted.»). `format/page-limit` then counts as body the pages up to the references and, when the appendix starts after them, every page from the appendix (found by hyperref's anchor) to the last; the pages between are the reference pages, judged against `ref_pages_max`. An appendix before the references is body and ends nothing.",
163
+ "type": "boolean"
164
+ },
133
165
  "page_limits_not_gated": {
134
166
  "type": "object"
135
167
  },
@@ -336,6 +368,10 @@
336
368
  }
337
369
  }
338
370
  },
371
+ "required": ["type"],
372
+ "dependencies": {
373
+ "template_forbids": ["template"]
374
+ },
339
375
  "allOf": [
340
376
  {
341
377
  "if": {
@@ -346,6 +382,34 @@
346
382
  "then": {
347
383
  "required": ["tex"]
348
384
  }
385
+ },
386
+ {
387
+ "if": {
388
+ "required": ["type"],
389
+ "properties": { "type": { "const": "venue" } }
390
+ },
391
+ "then": {
392
+ "required": ["name", "url"]
393
+ }
394
+ },
395
+ {
396
+ "if": {
397
+ "required": ["type"],
398
+ "properties": { "type": { "const": "family" } }
399
+ },
400
+ "then": {
401
+ "properties": { "name": false, "url": false }
402
+ }
403
+ },
404
+ {
405
+ "if": {
406
+ "required": ["type"],
407
+ "properties": { "type": { "const": "base" } }
408
+ },
409
+ "then": {
410
+ "required": ["type", "tex"],
411
+ "maxProperties": 2
412
+ }
349
413
  }
350
414
  ],
351
415
  "definitions": {
@@ -4,7 +4,7 @@ description: On acceptance, turn the anonymized-for-review paper into the de-ano
4
4
  allowed-tools: [Read, Write, Edit, Grep, Glob, Bash, WebSearch, WebFetch]
5
5
  ---
6
6
 
7
- <!-- vigiles:sha256:5c85ef4004c31956 compiled from skills/camera-ready/SKILL.md.spec.ts -->
7
+ <!-- vigiles:sha256:1c9ad89e55c3e89a compiled from skills/camera-ready/SKILL.md.spec.ts -->
8
8
 
9
9
  # camera-ready — de-anonymize an accepted paper into the final proceedings version
10
10
 
@@ -94,6 +94,13 @@ and going over is a hard reject at the proceedings stage. Recompile
94
94
  If tight, ACM allows references to spill into the reference-only extra pages.
95
95
 
96
96
  ## 5. Ship
97
+ - **Before the final PDF goes up, hand the last check to the author, in plain words.** Tell them that
98
+ paperlint passing is not the venue or the publisher accepting the format, and ask them to open the
99
+ exact PDF they are about to upload and check it against the venue's call for papers and its
100
+ camera-ready instructions themselves — the page count and what counts toward the limit (the
101
+ camera-ready's extra page, if any), the template and its class options, the author block and
102
+ acknowledgements now de-anonymized, and that every figure, table and reference renders. Upload once
103
+ they say they have looked.
97
104
  - Rebuild the final PDF, upload to the camera-ready system (often the same HotCRP, or an ACM eRights /
98
105
  TAPS pipeline — follow the copyright email).
99
106
  - Complete the **ACM/IEEE eRights** copyright form → paste the returned copyright block + DOI into the
@@ -109,6 +109,13 @@ and going over is a hard reject at the proceedings stage. Recompile
109
109
  If tight, ACM allows references to spill into the reference-only extra pages.
110
110
 
111
111
  ## 5. Ship
112
+ - **Before the final PDF goes up, hand the last check to the author, in plain words.** Tell them that
113
+ paperlint passing is not the venue or the publisher accepting the format, and ask them to open the
114
+ exact PDF they are about to upload and check it against the venue's call for papers and its
115
+ camera-ready instructions themselves — the page count and what counts toward the limit (the
116
+ camera-ready's extra page, if any), the template and its class options, the author block and
117
+ acknowledgements now de-anonymized, and that every figure, table and reference renders. Upload once
118
+ they say they have looked.
112
119
  - Rebuild the final PDF, upload to the camera-ready system (often the same HotCRP, or an ACM eRights /
113
120
  TAPS pipeline — follow the copyright email).
114
121
  - Complete the **ACM/IEEE eRights** copyright form → paste the returned copyright block + DOI into the
@@ -1,10 +1,10 @@
1
1
  ---
2
2
  name: find-venue
3
- description: "Discover and rank real venues for a given paper, scored by authorship credit not just prestige. Fetch candidate CFPs (WebSearch/WebFetch), capture deadline / page limit / paper-type fit / indexing (ACM DL / IEEE Xplore / archival vs non-archival) / double-blind / remote-attendance / selectivity, then rank by credit-weight (peer-reviewed + indexed + parent-venue prestige) × topic fit × accept-probability × deadline feasibility × remote-friendliness. Emit a comparison table and a keep/switch recommendation. Encodes: workshop newness does NOT hurt authorship; non-archival workshops rank LOW; the prestige move is to EXTEND the accepted paper later, not hold out. Compose with research-ideate (upstream), plan-paper-timeline, the submit-paper venue data cards (submit-paper/references/venues/<venue>.md), and extend-paper."
3
+ description: "Discover and rank real venues for a given paper, scored by authorship credit not just prestige. Fetch candidate CFPs (WebSearch/WebFetch), capture deadline / page limit / paper-type fit / indexing (ACM DL / IEEE Xplore / archival vs non-archival) / double-blind / remote-attendance / selectivity, then rank by credit-weight (peer-reviewed + indexed + parent-venue prestige) × topic fit × accept-probability × deadline feasibility × remote-friendliness. Emit a comparison table and a keep/switch recommendation. Encodes: workshop newness does NOT hurt authorship; non-archival workshops rank LOW; the prestige move is to EXTEND the accepted paper later, not hold out. Compose with research-ideate (upstream), plan-paper-timeline, the venue cards (presets/<venue>.md in the paperlint package), and extend-paper."
4
4
  allowed-tools: [Read, Write, Grep, Glob, WebSearch, WebFetch, Agent]
5
5
  ---
6
6
 
7
- <!-- vigiles:sha256:bfda3e840d81d95d compiled from skills/find-venue/SKILL.md.spec.ts -->
7
+ <!-- vigiles:sha256:8b332cbc072b46ee compiled from skills/find-venue/SKILL.md.spec.ts -->
8
8
 
9
9
  # find-venue — rank real venues by what earns the credit, then keep or switch
10
10
 
@@ -81,9 +81,10 @@ rank = credit-weight × topic-fit × accept-probability × deadline-feasibility
81
81
  `{ "extends": "paperlint:<venue>", "kind": "<kind>" }` — a shipped preset, else a family
82
82
  (`paperlint:acm-sigconf`) or the project's own `./venues/<name>.jsonc`; the `pdf/*` rules then
83
83
  check the built PDF against its page limit and format.
84
- - `submit-paper` venue data cards (`submit-paper/references/venues/<venue>.md`, e.g. `agenticdev.md`,
85
- `aisec.md`) — the winner gets a venue-specific data card with its HotCRP quirks; save a new one per
86
- venue as plain data, not a new skill.
84
+ - the venue cards, `presets/<venue>.md` in the paperlint package beside each venue preset (e.g.
85
+ `agenticdev.md`, `aisec.md`) — the winner gets a card with its HotCRP quirks beside its preset;
86
+ for a venue with no shipped preset, the project's own `./venues/<name>.md` beside its
87
+ `./venues/<name>.jsonc`. Plain data, not a new skill.
87
88
  - `extend-paper` — the prestige-upgrade target this skill names but defers.
88
89
 
89
90
  ## Provenance
@@ -9,7 +9,7 @@ import { experimental_skill } from "vigiles/spec";
9
9
  export default experimental_skill({
10
10
  name: "find-venue",
11
11
  description:
12
- "Discover and rank real venues for a given paper, scored by authorship credit not just prestige. Fetch candidate CFPs (WebSearch/WebFetch), capture deadline / page limit / paper-type fit / indexing (ACM DL / IEEE Xplore / archival vs non-archival) / double-blind / remote-attendance / selectivity, then rank by credit-weight (peer-reviewed + indexed + parent-venue prestige) × topic fit × accept-probability × deadline feasibility × remote-friendliness. Emit a comparison table and a keep/switch recommendation. Encodes: workshop newness does NOT hurt authorship; non-archival workshops rank LOW; the prestige move is to EXTEND the accepted paper later, not hold out. Compose with research-ideate (upstream), plan-paper-timeline, the submit-paper venue data cards (submit-paper/references/venues/<venue>.md), and extend-paper.",
12
+ "Discover and rank real venues for a given paper, scored by authorship credit not just prestige. Fetch candidate CFPs (WebSearch/WebFetch), capture deadline / page limit / paper-type fit / indexing (ACM DL / IEEE Xplore / archival vs non-archival) / double-blind / remote-attendance / selectivity, then rank by credit-weight (peer-reviewed + indexed + parent-venue prestige) × topic fit × accept-probability × deadline feasibility × remote-friendliness. Emit a comparison table and a keep/switch recommendation. Encodes: workshop newness does NOT hurt authorship; non-archival workshops rank LOW; the prestige move is to EXTEND the accepted paper later, not hold out. Compose with research-ideate (upstream), plan-paper-timeline, the venue cards (presets/<venue>.md in the paperlint package), and extend-paper.",
13
13
  tools: ["Read", "Write", "Grep", "Glob", "WebSearch", "WebFetch", "Agent"],
14
14
  body: `
15
15
  # find-venue — rank real venues by what earns the credit, then keep or switch
@@ -87,9 +87,10 @@ rank = credit-weight × topic-fit × accept-probability × deadline-feasibility
87
87
  \`{ "extends": "paperlint:<venue>", "kind": "<kind>" }\` — a shipped preset, else a family
88
88
  (\`paperlint:acm-sigconf\`) or the project's own \`./venues/<name>.jsonc\`; the \`pdf/*\` rules then
89
89
  check the built PDF against its page limit and format.
90
- - \`submit-paper\` venue data cards (\`submit-paper/references/venues/<venue>.md\`, e.g. \`agenticdev.md\`,
91
- \`aisec.md\`) — the winner gets a venue-specific data card with its HotCRP quirks; save a new one per
92
- venue as plain data, not a new skill.
90
+ - the venue cards, \`presets/<venue>.md\` in the paperlint package beside each venue preset (e.g.
91
+ \`agenticdev.md\`, \`aisec.md\`) — the winner gets a card with its HotCRP quirks beside its preset;
92
+ for a venue with no shipped preset, the project's own \`./venues/<name>.md\` beside its
93
+ \`./venues/<name>.jsonc\`. Plain data, not a new skill.
93
94
  - \`extend-paper\` — the prestige-upgrade target this skill names but defers.
94
95
 
95
96
  ## Provenance
@@ -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:805b94a3515406d7 compiled from skills/paper-pipeline/SKILL.md.spec.ts -->
7
+ <!-- vigiles:sha256:a8a20289badf1fa8 compiled from skills/paper-pipeline/SKILL.md.spec.ts -->
8
8
 
9
9
  # paper-pipeline — the conductor for the whole organism
10
10
 
@@ -27,10 +27,9 @@ of that — who is filing what, and when — stays in the author's own private n
27
27
  grades, open findings, submit-ready verdict). Copied into `<paper-dir>/PIPELINE-STATUS.md`.
28
28
  - `references/acl-venue-rules.md` — what holds at **every** ACL-family venue and workshop: the
29
29
  page-limit map, the appendix rule and the trap inside it, Limitations/Ethics as free-but-restricted
30
- space, anonymity, OpenReview mechanics. Fetch once, not per paper. Venue-specific facts stay in
31
- `submit-paper/references/venues/<venue>.md`. (No prose equivalent yet for ACM or IEEE — write one
32
- when the next paper goes there. ACM's machine-checked format already exists: the
33
- `paperlint:acm-sigconf` preset, `presets/acm-sigconf.jsonc` in the package.)
30
+ space, anonymity, OpenReview mechanics. Fetch once, not per paper. Venue-specific facts stay in the
31
+ venue's card, `presets/<venue>.md` in the package. The ACM and IEEE templates have family cards
32
+ beside their presets, `presets/acm-sigconf.md` and `presets/ieee-conference.md`.
34
33
 
35
34
  ## The readiness scorecard (which boxes are checked)
36
35
  Stages run in subagents and report into chat, which evaporates — so "did everything run?" becomes
@@ -151,7 +150,7 @@ Ordered, because each really does gate the next. Two pairs run in parallel; that
151
150
  | **Validate the idea** | **`research-ideate`** | Is it a reusable method (survives review) in your lane, and does it feed the credit criteria? Go/no-go + the MVP finding. |
152
151
  | **Map the competition** ‖ | **`map-prior-work`** | 🔴 **Who already did this?** Multi-angle sweep; date each hit against your submission (5 months = prior, not concurrent); triage by which layer of your claim it threatens; deep-read the dangerous ones. Output: **what you can still claim** + a related-work skeleton. *Added 2026-07-27 after a five-month-older paper surfaced at T−10 days on a finished draft.* |
153
152
  | **Pick the venue** ‖ | **`find-venue`** | Rank by credit-weight (peer-reviewed + indexed) × fit × accept-odds × deadline × remote. |
154
- | **Learn the venue's bar** | **`study-accepted-papers`** | 🔴 **What does an ACCEPTED paper look like HERE?** Measure the venue's whole accepted volume, deep-read 8–12 of your contribution type, and extract what made them strong: evidence scale, figures, artifact release, how the abstract is built. File the venue card (`submit-paper/references/venues/<venue>.md`) and confirm family rules (`references/acl-venue-rules.md`). *Promoted to its own step 2026-08-03: on `compile-rules-2026` every judgement of the paper's quality — rubric, persona, simulated panel, accept probability — came from instruments this pipeline itself generated, with no external grounding, and the author had to say so at T−3 days. A closed loop optimises against its own model of a reviewer.* |
153
+ | **Learn the venue's bar** | **`study-accepted-papers`** | 🔴 **What does an ACCEPTED paper look like HERE?** Measure the venue's whole accepted volume, deep-read 8–12 of your contribution type, and extract what made them strong: evidence scale, figures, artifact release, how the abstract is built. File the venue card (`presets/<venue>.md` in the package, or the project's own beside its preset) and confirm family rules (`references/acl-venue-rules.md`). *Promoted to its own step 2026-08-03: on `compile-rules-2026` every judgement of the paper's quality — rubric, persona, simulated panel, accept probability — came from instruments this pipeline itself generated, with no external grounding, and the author had to say so at T−3 days. A closed loop optimises against its own model of a reviewer.* |
155
154
  | 🔴 **Can you physically submit?** | **`plan-paper-timeline`** | **The step that owns the question no stage used to own.** Create the portal account NOW; drive the profile to **ACTIVE**, not "pending moderation"; confirm the form's fields and the artifact-hosting requirement. OpenReview moderation runs **up to two weeks**, and an author with no institutional email has no expedite route. Scorecard row `access`. *Added 2026-08-03, when this was the sole critical-path item on a finished paper at T−4 days: the science was done and there was nowhere to put it.* |
156
155
  | **Schedule it** | **`plan-paper-timeline`** | Deadlines → calendar with buffers, in the author's own zone (AoE − 12h ≠ your clock). Space papers apart. |
157
156
  | 🔴 **State the claim** | **`argument-arc`** (frame mode) | **One paragraph: what will this paper claim, and what would have to be true?** Before any run. The frame decides which results matter, and reframing after the data is collected is how experiments get thrown away — observed on `compile-rules-2026`, and the reason `argument-arc` has a rebuild mode at all. Costs a paragraph; saves a study. Scorecard row `frame`. |
@@ -44,10 +44,9 @@ of that — who is filing what, and when — stays in the author's own private n
44
44
  grades, open findings, submit-ready verdict). Copied into \`<paper-dir>/PIPELINE-STATUS.md\`.
45
45
  - \`references/acl-venue-rules.md\` — what holds at **every** ACL-family venue and workshop: the
46
46
  page-limit map, the appendix rule and the trap inside it, Limitations/Ethics as free-but-restricted
47
- space, anonymity, OpenReview mechanics. Fetch once, not per paper. Venue-specific facts stay in
48
- \`submit-paper/references/venues/<venue>.md\`. (No prose equivalent yet for ACM or IEEE — write one
49
- when the next paper goes there. ACM's machine-checked format already exists: the
50
- \`paperlint:acm-sigconf\` preset, \`presets/acm-sigconf.jsonc\` in the package.)
47
+ space, anonymity, OpenReview mechanics. Fetch once, not per paper. Venue-specific facts stay in the
48
+ venue's card, \`presets/<venue>.md\` in the package. The ACM and IEEE templates have family cards
49
+ beside their presets, \`presets/acm-sigconf.md\` and \`presets/ieee-conference.md\`.
51
50
 
52
51
  ## The readiness scorecard (which boxes are checked)
53
52
  Stages run in subagents and report into chat, which evaporates — so "did everything run?" becomes
@@ -168,7 +167,7 @@ Ordered, because each really does gate the next. Two pairs run in parallel; that
168
167
  | **Validate the idea** | **\`research-ideate\`** | Is it a reusable method (survives review) in your lane, and does it feed the credit criteria? Go/no-go + the MVP finding. |
169
168
  | **Map the competition** ‖ | **\`map-prior-work\`** | 🔴 **Who already did this?** Multi-angle sweep; date each hit against your submission (5 months = prior, not concurrent); triage by which layer of your claim it threatens; deep-read the dangerous ones. Output: **what you can still claim** + a related-work skeleton. *Added 2026-07-27 after a five-month-older paper surfaced at T−10 days on a finished draft.* |
170
169
  | **Pick the venue** ‖ | **\`find-venue\`** | Rank by credit-weight (peer-reviewed + indexed) × fit × accept-odds × deadline × remote. |
171
- | **Learn the venue's bar** | **\`study-accepted-papers\`** | 🔴 **What does an ACCEPTED paper look like HERE?** Measure the venue's whole accepted volume, deep-read 8–12 of your contribution type, and extract what made them strong: evidence scale, figures, artifact release, how the abstract is built. File the venue card (\`submit-paper/references/venues/<venue>.md\`) and confirm family rules (\`references/acl-venue-rules.md\`). *Promoted to its own step 2026-08-03: on \`compile-rules-2026\` every judgement of the paper's quality — rubric, persona, simulated panel, accept probability — came from instruments this pipeline itself generated, with no external grounding, and the author had to say so at T−3 days. A closed loop optimises against its own model of a reviewer.* |
170
+ | **Learn the venue's bar** | **\`study-accepted-papers\`** | 🔴 **What does an ACCEPTED paper look like HERE?** Measure the venue's whole accepted volume, deep-read 8–12 of your contribution type, and extract what made them strong: evidence scale, figures, artifact release, how the abstract is built. File the venue card (\`presets/<venue>.md\` in the package, or the project's own beside its preset) and confirm family rules (\`references/acl-venue-rules.md\`). *Promoted to its own step 2026-08-03: on \`compile-rules-2026\` every judgement of the paper's quality — rubric, persona, simulated panel, accept probability — came from instruments this pipeline itself generated, with no external grounding, and the author had to say so at T−3 days. A closed loop optimises against its own model of a reviewer.* |
172
171
  | 🔴 **Can you physically submit?** | **\`plan-paper-timeline\`** | **The step that owns the question no stage used to own.** Create the portal account NOW; drive the profile to **ACTIVE**, not "pending moderation"; confirm the form's fields and the artifact-hosting requirement. OpenReview moderation runs **up to two weeks**, and an author with no institutional email has no expedite route. Scorecard row \`access\`. *Added 2026-08-03, when this was the sole critical-path item on a finished paper at T−4 days: the science was done and there was nowhere to put it.* |
173
172
  | **Schedule it** | **\`plan-paper-timeline\`** | Deadlines → calendar with buffers, in the author's own zone (AoE − 12h ≠ your clock). Space papers apart. |
174
173
  | 🔴 **State the claim** | **\`argument-arc\`** (frame mode) | **One paragraph: what will this paper claim, and what would have to be true?** Before any run. The frame decides which results matter, and reframing after the data is collected is how experiments get thrown away — observed on \`compile-rules-2026\`, and the reason \`argument-arc\` has a rebuild mode at all. Costs a paragraph; saves a study. Scorecard row \`frame\`. |
@@ -139,4 +139,4 @@ year.
139
139
 
140
140
  Page counts per track · archival vs non-archival · ARR commitment route and its deadline · the
141
141
  submission portal URL and its form fields · anonymity period · attendance requirements · the review
142
- criteria. All of that lives in `submit-paper/references/venues/<venue>.md`.
142
+ criteria. All of that lives in the venue's card, `presets/<venue>.md` in the paperlint package.
@@ -5,7 +5,7 @@ context: fork
5
5
  allowed-tools: [Read, Write, Edit, Grep, Glob, Bash, WebSearch, WebFetch, Agent]
6
6
  ---
7
7
 
8
- <!-- vigiles:sha256:e199b342e4e98338 compiled from skills/study-accepted-papers/SKILL.md.spec.ts -->
8
+ <!-- vigiles:sha256:b68bde442319a605 compiled from skills/study-accepted-papers/SKILL.md.spec.ts -->
9
9
 
10
10
  # study-accepted-papers — learn the venue's bar from its own accepted corpus, then lever your draft up
11
11
 
@@ -24,7 +24,7 @@ It answers a different question than the neighboring skills:
24
24
 
25
25
  Grounding: the authorship criterion — why a *strong* accept at an indexed venue is
26
26
  worth more to the dossier than a borderline one — reviewer enthusiasm shows up in the acceptance and in
27
- letters), and the venue data card `../submit-paper/references/venues/<venue>.md` if one exists.
27
+ letters), and the venue's card `presets/<venue>.md` in the paperlint package if one exists.
28
28
 
29
29
  ## Step 1 — pin the venue's stated bar (fetch, don't guess)
30
30
 
@@ -162,7 +162,7 @@ short enough that it survives being loaded into every session.
162
162
  - `pc-panel-review` / `paper-adversarial-review` — run those to red-team the draft; run this to learn the bar the red-team should hold it to. Complementary, not redundant.
163
163
  - `verify-citations` — consumes the Step-4 citation gaps.
164
164
  - `extend-paper` — the natural home for every EXPENSIVE lever this skill surfaces.
165
- - `submit-paper` venue data card (`submit-paper/references/venues/<venue>.md`) — save durable venue-bar findings there as data, not as a new skill per venue.
165
+ - the venue card (`presets/<venue>.md` in the paperlint package, or the project's own `./venues/<name>.md` beside its preset) — save durable venue-bar findings there as data, not as a new skill per venue.
166
166
  - the paper's `<paper>/paperlint.json` (`{ "extends": "paperlint:<venue>", "kind": "<kind>" }`) — which venue preset the `pdf/*` rules check the built PDF against; a venue with no shipped preset extends a family (`paperlint:acm-sigconf`) or the project's own `./venues/<name>.jsonc`. Findings about the venue's page limit or format belong in that preset, with their source quote.
167
167
 
168
168
  ## Provenance
@@ -40,7 +40,7 @@ It answers a different question than the neighboring skills:
40
40
 
41
41
  Grounding: the authorship criterion — why a *strong* accept at an indexed venue is
42
42
  worth more to the dossier than a borderline one — reviewer enthusiasm shows up in the acceptance and in
43
- letters), and the venue data card \`../submit-paper/references/venues/<venue>.md\` if one exists.
43
+ letters), and the venue's card \`presets/<venue>.md\` in the paperlint package if one exists.
44
44
 
45
45
  ## Step 1 — pin the venue's stated bar (fetch, don't guess)
46
46
 
@@ -178,7 +178,7 @@ short enough that it survives being loaded into every session.
178
178
  - \`pc-panel-review\` / \`paper-adversarial-review\` — run those to red-team the draft; run this to learn the bar the red-team should hold it to. Complementary, not redundant.
179
179
  - \`verify-citations\` — consumes the Step-4 citation gaps.
180
180
  - \`extend-paper\` — the natural home for every EXPENSIVE lever this skill surfaces.
181
- - \`submit-paper\` venue data card (\`submit-paper/references/venues/<venue>.md\`) — save durable venue-bar findings there as data, not as a new skill per venue.
181
+ - the venue card (\`presets/<venue>.md\` in the paperlint package, or the project's own \`./venues/<name>.md\` beside its preset) — save durable venue-bar findings there as data, not as a new skill per venue.
182
182
  - the paper's \`<paper>/paperlint.json\` (\`{ "extends": "paperlint:<venue>", "kind": "<kind>" }\`) — which venue preset the \`pdf/*\` rules check the built PDF against; a venue with no shipped preset extends a family (\`paperlint:acm-sigconf\`) or the project's own \`./venues/<name>.jsonc\`. Findings about the venue's page limit or format belong in that preset, with their source quote.
183
183
 
184
184
  ## Provenance
@@ -4,7 +4,7 @@ description: "Read or change a paper's submission on the venue's HotCRP portal v
4
4
  allowed-tools: [Read, Grep, Glob, Bash]
5
5
  ---
6
6
 
7
- <!-- vigiles:sha256:deb3d74f5c3f93a8 compiled from skills/submission-portal/SKILL.md.spec.ts -->
7
+ <!-- vigiles:sha256:4b3a8c0b51ebe206 compiled from skills/submission-portal/SKILL.md.spec.ts -->
8
8
 
9
9
  # submission-portal — read and update the submission on the portal, then prove it landed
10
10
 
@@ -14,7 +14,7 @@ supported; for any other portal the command says so and the upload is done by ha
14
14
  ## What must be in place
15
15
 
16
16
  - **The venue preset declares the portal**: `"portal": { "kind": "hotcrp", "url": "<the site>" }`
17
- (`paperlint:aidc` has it). For your own venue preset, add it there.
17
+ (`paperlint:aidc` and `paperlint:msr` have it). For your own venue preset, add it there.
18
18
  - **The paper's `paperlint.json` names its submission**: `"submission": { "id": <number> }` — the
19
19
  number HotCRP shows for the paper.
20
20
  - **A token in `HOTCRP_TOKEN`**, created by the author on the HotCRP site under Account settings →
@@ -15,7 +15,7 @@ supported; for any other portal the command says so and the upload is done by ha
15
15
  ## What must be in place
16
16
 
17
17
  - **The venue preset declares the portal**: \`"portal": { "kind": "hotcrp", "url": "<the site>" }\`
18
- (\`paperlint:aidc\` has it). For your own venue preset, add it there.
18
+ (\`paperlint:aidc\` and \`paperlint:msr\` have it). For your own venue preset, add it there.
19
19
  - **The paper's \`paperlint.json\` names its submission**: \`"submission": { "id": <number> }\` — the
20
20
  number HotCRP shows for the paper.
21
21
  - **A token in \`HOTCRP_TOKEN\`**, created by the author on the HotCRP site under Account settings →
@@ -1,10 +1,10 @@
1
1
  ---
2
2
  name: submit-paper
3
- description: End-to-end playbook for submitting a peer-reviewed paper to a double-blind venue (HotCRP workshops/conferences) — from a hardened draft to "ready for review." Covers building and anonymously hosting a reproduction artifact, HotCRP profile + form mechanics, double-blind hygiene, and the authorship/credential angles for an independent researcher. Use when the paper is drafted and reviewed and it's time to actually submit. Compose with pc-panel-review / paper-adversarial-review (harden first), and with the venue data card (references/venues/<venue>.md) for venue specifics.
3
+ description: End-to-end playbook for submitting a peer-reviewed paper to a double-blind venue (HotCRP workshops/conferences) — from a hardened draft to "ready for review." Covers building and anonymously hosting a reproduction artifact, HotCRP profile + form mechanics, double-blind hygiene, and the authorship/credential angles for an independent researcher. Use when the paper is drafted and reviewed and it's time to actually submit. Compose with pc-panel-review / paper-adversarial-review (harden first), and with the venue card (presets/<venue>.md in the paperlint package) for venue specifics.
4
4
  allowed-tools: [Read, Write, Edit, Grep, Glob, Bash, WebSearch, WebFetch, Skill]
5
5
  ---
6
6
 
7
- <!-- vigiles:sha256:767a4757d1df67d3 compiled from skills/submit-paper/SKILL.md.spec.ts -->
7
+ <!-- vigiles:sha256:81d5777962c2864a compiled from skills/submit-paper/SKILL.md.spec.ts -->
8
8
 
9
9
  # submit-paper — get a reviewed paper from "done" to "ready for review"
10
10
 
@@ -12,26 +12,31 @@ Assumes the paper is already hardened (run `pc-panel-review` — incl. its venue
12
12
  `paper-adversarial-review` first). This skill is the submission mechanics — the part that bit us with
13
13
  avoidable friction the first time. Distilled from the AgenticDev 2026 submission.
14
14
 
15
- ## Venue specifics — a DATA card, not a skill
15
+ ## Venue specifics — a CARD beside the venue's preset, not a skill
16
16
  The venue-specific facts (deadline, page limits, tracks, PC-member conflict list, blind model, format
17
- quirks, whether a supplementary-upload field exists, the extension target) live as **plain reference
18
- data files** under `references/venues/<venue>.md`:
19
- - `references/venues/agenticdev.md` — AgenticDev @ ASE (workshop; ACM DL/IEEE Xplore).
20
- - `references/venues/aisec.md` — AISec @ ACM CCS (security workshop; ACM DL; harder bar).
21
-
22
- **The pattern (follow it for every new venue):** when you fetch a venue's exact submission instructions,
23
- save them as a new **data file** `references/venues/<venue>.md` (short `title:` frontmatter only — NOT a
24
- skill with `name:`/`description:`). This preserves the "save the exact venue instructions" rule while
25
- keeping the skill namespace from proliferating one card per venue. The *mechanics* stay here; the venue
26
- file is only the facts.
27
-
28
- **The card is prose; the machine-checked format is a PRESET beside it.** A paper declares its venue
17
+ quirks, whether a supplementary-upload field exists) live in the venue's **card**, `presets/<venue>.md`
18
+ in the paperlint package, beside the preset `presets/<venue>.jsonc` that the lint rules check a
19
+ paper against:
20
+ - `presets/agenticdev.md` — AgenticDev @ ASE (workshop; ASE workshop proceedings).
21
+ - `presets/aisec.md` — AISec @ ACM CCS (security workshop; ACM DL; harder bar).
22
+ - `presets/aidc.md` — AIDC @ IEEE ACSAC (workshop; IEEE template, LLM Usage Statement).
23
+ - `presets/msr.md` — MSR Technical Papers (conference; IEEE template from 2027, appendices count in the page limit).
24
+ - `presets/realm.md` — REALM @ EMNLP (ACL family, OpenReview).
25
+
26
+ **The card is prose; the machine-checked format is the PRESET beside it.** A paper declares its venue
29
27
  in `<paper>/paperlint.json`: `{ "extends": "paperlint:<venue>", "kind": "<kind>" }`, and the
30
28
  `pdf/*` lint rules judge the built PDF against that preset (page limit per kind, fonts, page size,
31
- columns, font sizes). A venue with no shipped preset extends a family — `paperlint:acm-sigconf`
32
- for an ACM venue — or a preset of the project's own, `./venues/<name>.jsonc` (paperlint's
33
- `docs/rules.md`, "Writing your own venue preset"). Put the page limits you fetched from the CFP in
34
- the preset's `format.kinds`, each with its quote.
29
+ columns, font sizes). The card's last section — what the preset is, its call for papers, the rules it
30
+ sets and where each comes from — is generated from the preset, so read the numbers there, not from
31
+ memory.
32
+
33
+ **The pattern (follow it for every new venue):** when you fetch a venue's exact submission
34
+ instructions, write the numbers into a preset with their quotes and the rest into a card beside it.
35
+ A venue with no shipped preset extends a family — `paperlint:acm-sigconf` for an ACM venue — in a
36
+ preset of the project's own, `./venues/<name>.jsonc`, with its card `./venues/<name>.md` next to
37
+ it (paperlint's `docs/rules.md`, "Writing your own venue preset"). A venue preset declares
38
+ `"type": "venue"`, the venue's `name` and the `url` of its call for papers. The *mechanics*
39
+ stay here; the card is only the facts.
35
40
 
36
41
  ## Publisher specifics — one level ABOVE the venue
37
42
  Camera-ready mechanics belong to the **publisher**, not the venue: ACM eRights, the submit-vs-final
@@ -106,6 +111,13 @@ Many workshop HotCRPs have **no supplementary-upload field** — check first; if
106
111
  An independent researcher with no ties usually checks **none** — that's honest.
107
112
 
108
113
  ## 5. Submit
114
+ - **Before the PDF goes up — and before every Replace — hand the last check to the author, in plain
115
+ words.** Tell them that paperlint passing is not the venue accepting the format: the preset is
116
+ transcribed from a call that can change, and any check can miss something. Ask them to open the
117
+ exact PDF they are about to upload and check it against the venue's call for papers themselves —
118
+ the page count and what counts toward the limit (appendices, references), the template and its
119
+ class options, anonymity, and that every figure, table and reference renders. Upload once they say
120
+ they have looked. (`paperlint submission update` prints the same request before it sends.)
109
121
  - **Save and submit**, then **mark it "ready for review."** A saved draft alone is NOT evaluated — this
110
122
  is the step people miss.
111
123
  - You can edit until the deadline: use **Replace** on the Submission field to swap the PDF for a late
@@ -148,9 +160,9 @@ convention with no reader.
148
160
  ## Compose with
149
161
  - Harden first: `pc-panel-review` (incl. its venue-fit mode), `paper-adversarial-review`, `render-paper`.
150
162
  - Publisher mechanics (camera-ready): `references/publishers/<publisher>.md`.
151
- - Venue specifics: the matching data card `references/venues/<venue>.md` (e.g.
152
- `references/venues/agenticdev.md`) for deadlines, page limits, PC-member conflict lists, whether
153
- supplementary upload exists, and the extension target.
163
+ - Venue specifics: the venue's card `presets/<venue>.md` in the paperlint package (e.g.
164
+ `presets/agenticdev.md`) for deadlines, page limits, PC-member conflict lists, and whether a
165
+ supplementary upload exists.
154
166
 
155
167
  ## Provenance
156
168
  Written from the AgenticDev 2026 @ ASE submission (2026-07-13): PC-panel-reviewed, self-checking
@@ -9,7 +9,7 @@ import { experimental_skill } from "vigiles/spec";
9
9
  export default experimental_skill({
10
10
  name: "submit-paper",
11
11
  description:
12
- 'End-to-end playbook for submitting a peer-reviewed paper to a double-blind venue (HotCRP workshops/conferences) — from a hardened draft to "ready for review." Covers building and anonymously hosting a reproduction artifact, HotCRP profile + form mechanics, double-blind hygiene, and the authorship/credential angles for an independent researcher. Use when the paper is drafted and reviewed and it\'s time to actually submit. Compose with pc-panel-review / paper-adversarial-review (harden first), and with the venue data card (references/venues/<venue>.md) for venue specifics.',
12
+ 'End-to-end playbook for submitting a peer-reviewed paper to a double-blind venue (HotCRP workshops/conferences) — from a hardened draft to "ready for review." Covers building and anonymously hosting a reproduction artifact, HotCRP profile + form mechanics, double-blind hygiene, and the authorship/credential angles for an independent researcher. Use when the paper is drafted and reviewed and it\'s time to actually submit. Compose with pc-panel-review / paper-adversarial-review (harden first), and with the venue card (presets/<venue>.md in the paperlint package) for venue specifics.',
13
13
  tools: [
14
14
  "Read",
15
15
  "Write",
@@ -28,26 +28,31 @@ Assumes the paper is already hardened (run \`pc-panel-review\` — incl. its ven
28
28
  \`paper-adversarial-review\` first). This skill is the submission mechanics — the part that bit us with
29
29
  avoidable friction the first time. Distilled from the AgenticDev 2026 submission.
30
30
 
31
- ## Venue specifics — a DATA card, not a skill
31
+ ## Venue specifics — a CARD beside the venue's preset, not a skill
32
32
  The venue-specific facts (deadline, page limits, tracks, PC-member conflict list, blind model, format
33
- quirks, whether a supplementary-upload field exists, the extension target) live as **plain reference
34
- data files** under \`references/venues/<venue>.md\`:
35
- - \`references/venues/agenticdev.md\` — AgenticDev @ ASE (workshop; ACM DL/IEEE Xplore).
36
- - \`references/venues/aisec.md\` — AISec @ ACM CCS (security workshop; ACM DL; harder bar).
37
-
38
- **The pattern (follow it for every new venue):** when you fetch a venue's exact submission instructions,
39
- save them as a new **data file** \`references/venues/<venue>.md\` (short \`title:\` frontmatter only — NOT a
40
- skill with \`name:\`/\`description:\`). This preserves the "save the exact venue instructions" rule while
41
- keeping the skill namespace from proliferating one card per venue. The *mechanics* stay here; the venue
42
- file is only the facts.
43
-
44
- **The card is prose; the machine-checked format is a PRESET beside it.** A paper declares its venue
33
+ quirks, whether a supplementary-upload field exists) live in the venue's **card**, \`presets/<venue>.md\`
34
+ in the paperlint package, beside the preset \`presets/<venue>.jsonc\` that the lint rules check a
35
+ paper against:
36
+ - \`presets/agenticdev.md\` — AgenticDev @ ASE (workshop; ASE workshop proceedings).
37
+ - \`presets/aisec.md\` — AISec @ ACM CCS (security workshop; ACM DL; harder bar).
38
+ - \`presets/aidc.md\` — AIDC @ IEEE ACSAC (workshop; IEEE template, LLM Usage Statement).
39
+ - \`presets/msr.md\` — MSR Technical Papers (conference; IEEE template from 2027, appendices count in the page limit).
40
+ - \`presets/realm.md\` — REALM @ EMNLP (ACL family, OpenReview).
41
+
42
+ **The card is prose; the machine-checked format is the PRESET beside it.** A paper declares its venue
45
43
  in \`<paper>/paperlint.json\`: \`{ "extends": "paperlint:<venue>", "kind": "<kind>" }\`, and the
46
44
  \`pdf/*\` lint rules judge the built PDF against that preset (page limit per kind, fonts, page size,
47
- columns, font sizes). A venue with no shipped preset extends a family — \`paperlint:acm-sigconf\`
48
- for an ACM venue — or a preset of the project's own, \`./venues/<name>.jsonc\` (paperlint's
49
- \`docs/rules.md\`, "Writing your own venue preset"). Put the page limits you fetched from the CFP in
50
- the preset's \`format.kinds\`, each with its quote.
45
+ columns, font sizes). The card's last section — what the preset is, its call for papers, the rules it
46
+ sets and where each comes from — is generated from the preset, so read the numbers there, not from
47
+ memory.
48
+
49
+ **The pattern (follow it for every new venue):** when you fetch a venue's exact submission
50
+ instructions, write the numbers into a preset with their quotes and the rest into a card beside it.
51
+ A venue with no shipped preset extends a family — \`paperlint:acm-sigconf\` for an ACM venue — in a
52
+ preset of the project's own, \`./venues/<name>.jsonc\`, with its card \`./venues/<name>.md\` next to
53
+ it (paperlint's \`docs/rules.md\`, "Writing your own venue preset"). A venue preset declares
54
+ \`"type": "venue"\`, the venue's \`name\` and the \`url\` of its call for papers. The *mechanics*
55
+ stay here; the card is only the facts.
51
56
 
52
57
  ## Publisher specifics — one level ABOVE the venue
53
58
  Camera-ready mechanics belong to the **publisher**, not the venue: ACM eRights, the submit-vs-final
@@ -122,6 +127,13 @@ Many workshop HotCRPs have **no supplementary-upload field** — check first; if
122
127
  An independent researcher with no ties usually checks **none** — that's honest.
123
128
 
124
129
  ## 5. Submit
130
+ - **Before the PDF goes up — and before every Replace — hand the last check to the author, in plain
131
+ words.** Tell them that paperlint passing is not the venue accepting the format: the preset is
132
+ transcribed from a call that can change, and any check can miss something. Ask them to open the
133
+ exact PDF they are about to upload and check it against the venue's call for papers themselves —
134
+ the page count and what counts toward the limit (appendices, references), the template and its
135
+ class options, anonymity, and that every figure, table and reference renders. Upload once they say
136
+ they have looked. (\`paperlint submission update\` prints the same request before it sends.)
125
137
  - **Save and submit**, then **mark it "ready for review."** A saved draft alone is NOT evaluated — this
126
138
  is the step people miss.
127
139
  - You can edit until the deadline: use **Replace** on the Submission field to swap the PDF for a late
@@ -164,9 +176,9 @@ convention with no reader.
164
176
  ## Compose with
165
177
  - Harden first: \`pc-panel-review\` (incl. its venue-fit mode), \`paper-adversarial-review\`, \`render-paper\`.
166
178
  - Publisher mechanics (camera-ready): \`references/publishers/<publisher>.md\`.
167
- - Venue specifics: the matching data card \`references/venues/<venue>.md\` (e.g.
168
- \`references/venues/agenticdev.md\`) for deadlines, page limits, PC-member conflict lists, whether
169
- supplementary upload exists, and the extension target.
179
+ - Venue specifics: the venue's card \`presets/<venue>.md\` in the paperlint package (e.g.
180
+ \`presets/agenticdev.md\`) for deadlines, page limits, PC-member conflict lists, and whether a
181
+ supplementary upload exists.
170
182
 
171
183
  ## Provenance
172
184
  Written from the AgenticDev 2026 @ ASE submission (2026-07-13): PC-panel-reviewed, self-checking
@@ -8,7 +8,7 @@ tags: [publisher, acm, camera-ready, erights, ccs]
8
8
  # ACM: what camera-ready requires
9
9
 
10
10
  > This is the **publisher** level, not the venue level. Identical for AgenticDev@ASE, AISec@CCS,
11
- > and any other ACM conference. The venue card (`../venues/<venue>.md`) holds only what's its own:
11
+ > and any other ACM conference. The venue card (`presets/<venue>.md` in the paperlint package) holds only what's its own:
12
12
  > dates, page limit, its own DOI/ISBN, blind model.
13
13
  >
14
14
  > Captured 2026-08-24 from the live AgenticDev #20 HotCRP form — field by field, not from memory.