paperlint 6.2.3 → 7.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (234) hide show
  1. package/CONTRIBUTING.md +4 -2
  2. package/README.md +10 -3
  3. package/dist/adapters/hotcrp/index.d.ts +7 -0
  4. package/dist/adapters/hotcrp/index.d.ts.map +1 -0
  5. package/dist/adapters/hotcrp/index.js +7 -0
  6. package/dist/adapters/hotcrp/index.js.map +1 -0
  7. package/dist/adapters/hotcrp/portal.io.d.ts +20 -0
  8. package/dist/adapters/hotcrp/portal.io.d.ts.map +1 -0
  9. package/dist/adapters/hotcrp/portal.io.js +90 -0
  10. package/dist/adapters/hotcrp/portal.io.js.map +1 -0
  11. package/dist/adapters/hotcrp/response.d.ts +13 -0
  12. package/dist/adapters/hotcrp/response.d.ts.map +1 -0
  13. package/dist/adapters/hotcrp/response.js +138 -0
  14. package/dist/adapters/hotcrp/response.js.map +1 -0
  15. package/dist/adapters/latex/conditionals.d.ts +21 -0
  16. package/dist/adapters/latex/conditionals.d.ts.map +1 -0
  17. package/dist/adapters/latex/conditionals.js +75 -0
  18. package/dist/adapters/latex/conditionals.js.map +1 -0
  19. package/dist/adapters/latex/headings.d.ts +10 -0
  20. package/dist/adapters/latex/headings.d.ts.map +1 -0
  21. package/dist/adapters/latex/headings.js +129 -0
  22. package/dist/adapters/latex/headings.js.map +1 -0
  23. package/dist/adapters/latex/index.d.ts +1 -0
  24. package/dist/adapters/latex/index.d.ts.map +1 -1
  25. package/dist/adapters/latex/index.js +3 -0
  26. package/dist/adapters/latex/index.js.map +1 -1
  27. package/dist/adapters/latex/parse.d.ts +1 -1
  28. package/dist/adapters/latex/parse.d.ts.map +1 -1
  29. package/dist/adapters/latex/parse.js +3 -2
  30. package/dist/adapters/latex/parse.js.map +1 -1
  31. package/dist/build.d.ts +1 -1
  32. package/dist/build.d.ts.map +1 -1
  33. package/dist/build.js +1 -1
  34. package/dist/build.js.map +1 -1
  35. package/dist/cli.d.ts +4 -2
  36. package/dist/cli.d.ts.map +1 -1
  37. package/dist/cli.js +126 -37
  38. package/dist/cli.js.map +1 -1
  39. package/dist/domain/heading-case.d.ts +100 -0
  40. package/dist/domain/heading-case.d.ts.map +1 -0
  41. package/dist/domain/heading-case.js +365 -0
  42. package/dist/domain/heading-case.js.map +1 -0
  43. package/dist/domain/result.d.ts +4 -0
  44. package/dist/domain/result.d.ts.map +1 -1
  45. package/dist/domain/result.js +2 -0
  46. package/dist/domain/result.js.map +1 -1
  47. package/dist/domain/submission.d.ts +106 -0
  48. package/dist/domain/submission.d.ts.map +1 -0
  49. package/dist/domain/submission.js +39 -0
  50. package/dist/domain/submission.js.map +1 -0
  51. package/dist/domain/tex-document.d.ts +32 -0
  52. package/dist/domain/tex-document.d.ts.map +1 -1
  53. package/dist/domain/tex-document.js +11 -0
  54. package/dist/domain/tex-document.js.map +1 -1
  55. package/dist/domain/venue-name.d.ts +38 -0
  56. package/dist/domain/venue-name.d.ts.map +1 -0
  57. package/dist/domain/venue-name.js +71 -0
  58. package/dist/domain/venue-name.js.map +1 -0
  59. package/dist/eslint-rules/latex-language.d.ts.map +1 -1
  60. package/dist/eslint-rules/latex-language.js +16 -3
  61. package/dist/eslint-rules/latex-language.js.map +1 -1
  62. package/dist/facts-file.d.ts +3 -3
  63. package/dist/facts-file.d.ts.map +1 -1
  64. package/dist/facts-file.js +3 -3
  65. package/dist/facts-file.js.map +1 -1
  66. package/dist/folder-venue-rule.d.ts +51 -0
  67. package/dist/folder-venue-rule.d.ts.map +1 -0
  68. package/dist/folder-venue-rule.js +96 -0
  69. package/dist/folder-venue-rule.js.map +1 -0
  70. package/dist/heading-case.d.ts +48 -0
  71. package/dist/heading-case.d.ts.map +1 -0
  72. package/dist/heading-case.js +191 -0
  73. package/dist/heading-case.js.map +1 -0
  74. package/dist/init.d.ts +6 -0
  75. package/dist/init.d.ts.map +1 -1
  76. package/dist/init.js +3 -3
  77. package/dist/init.js.map +1 -1
  78. package/dist/lib/paper-config.d.ts.map +1 -1
  79. package/dist/lib/paper-config.js +5 -1
  80. package/dist/lib/paper-config.js.map +1 -1
  81. package/dist/new-paper.d.ts +19 -5
  82. package/dist/new-paper.d.ts.map +1 -1
  83. package/dist/new-paper.js +23 -4
  84. package/dist/new-paper.js.map +1 -1
  85. package/dist/paper-settings.d.ts +3 -0
  86. package/dist/paper-settings.d.ts.map +1 -1
  87. package/dist/paper-settings.js +20 -4
  88. package/dist/paper-settings.js.map +1 -1
  89. package/dist/ports/latex.d.ts +7 -1
  90. package/dist/ports/latex.d.ts.map +1 -1
  91. package/dist/ports/submission-portal.d.ts +19 -0
  92. package/dist/ports/submission-portal.d.ts.map +1 -0
  93. package/dist/ports/submission-portal.js +2 -0
  94. package/dist/ports/submission-portal.js.map +1 -0
  95. package/dist/preset-card-rule.d.ts +100 -0
  96. package/dist/preset-card-rule.d.ts.map +1 -0
  97. package/dist/preset-card-rule.js +221 -0
  98. package/dist/preset-card-rule.js.map +1 -0
  99. package/dist/presets.d.ts +43 -2
  100. package/dist/presets.d.ts.map +1 -1
  101. package/dist/presets.js +130 -63
  102. package/dist/presets.js.map +1 -1
  103. package/dist/rules-config.js +1 -1
  104. package/dist/submission.d.ts +61 -0
  105. package/dist/submission.d.ts.map +1 -0
  106. package/dist/submission.js +211 -0
  107. package/dist/submission.js.map +1 -0
  108. package/dist/tex-requirements.d.ts +36 -3
  109. package/dist/tex-requirements.d.ts.map +1 -1
  110. package/dist/tex-requirements.js +30 -2
  111. package/dist/tex-requirements.js.map +1 -1
  112. package/dist/tex-venue-rules.d.ts +7 -8
  113. package/dist/tex-venue-rules.d.ts.map +1 -1
  114. package/dist/tex-venue-rules.js +10 -14
  115. package/dist/tex-venue-rules.js.map +1 -1
  116. package/dist/types.d.ts +13 -0
  117. package/dist/types.d.ts.map +1 -1
  118. package/docs/configuration.md +30 -11
  119. package/docs/optional-rules.md +4 -3
  120. package/docs/rules/format/page-limit.md +1 -1
  121. package/docs/rules/paper/folder-venue-leftover.md +104 -0
  122. package/docs/rules/talk/captions-cover.md +1 -1
  123. package/docs/rules/talk/duration-floor.md +1 -1
  124. package/docs/rules/talk/profile.md +1 -1
  125. package/docs/rules/tex/heading-case.md +424 -0
  126. package/docs/rules.md +64 -53
  127. package/docs/skills.md +5 -4
  128. package/docs/submission.md +64 -0
  129. package/docs/talk.md +1 -1
  130. package/eslint-rules/latex-language.test.mjs +12 -0
  131. package/eslint-rules/latex-language.ts +17 -4
  132. package/eslint-rules/paper-typography.test.mjs +12 -0
  133. package/eslint.config.mjs +59 -1
  134. package/fixtures/build-e2e/acmart/paper.tex +1 -1
  135. package/fixtures/build-e2e/fallback/expect.json +3 -3
  136. package/lib/paper-config.ts +6 -1
  137. package/lib/skill-checks.d.mts +7 -0
  138. package/lib/skill-checks.mjs +31 -0
  139. package/lib/skill-trigger-cases.mjs +11 -0
  140. package/package.json +8 -2
  141. package/presets/acm-sigconf.jsonc +5 -0
  142. package/presets/acm-sigconf.md +43 -0
  143. package/presets/agenticdev.jsonc +27 -6
  144. package/presets/agenticdev.md +151 -0
  145. package/presets/aidc.jsonc +12 -0
  146. package/presets/aidc.md +75 -0
  147. package/presets/aisec.jsonc +5 -1
  148. package/presets/aisec.md +117 -0
  149. package/presets/ieee-conference.jsonc +5 -0
  150. package/presets/ieee-conference.md +38 -0
  151. package/presets/realm.jsonc +7 -2
  152. package/presets/realm.md +166 -0
  153. package/presets/tex/agenticdev.tex +1 -1
  154. package/presets/tex-base.jsonc +6 -0
  155. package/presets/tex-base.md +30 -0
  156. package/presets/venue-profile.schema.json +57 -2
  157. package/skills/find-venue/SKILL.md +6 -5
  158. package/skills/find-venue/SKILL.md.spec.ts +5 -4
  159. package/skills/paper-pipeline/SKILL.md +5 -6
  160. package/skills/paper-pipeline/SKILL.md.spec.ts +4 -5
  161. package/skills/paper-pipeline/paper-pipeline.harness.mjs +4 -0
  162. package/skills/paper-pipeline/references/acl-venue-rules.md +1 -1
  163. package/skills/study-accepted-papers/SKILL.md +3 -3
  164. package/skills/study-accepted-papers/SKILL.md.spec.ts +2 -2
  165. package/skills/submission-portal/SKILL.md +69 -0
  166. package/skills/submission-portal/SKILL.md.spec.ts +71 -0
  167. package/skills/submission-portal/submission-portal.eval.mjs +15 -0
  168. package/skills/submission-portal/submission-portal.test.ts +81 -0
  169. package/skills/submit-paper/SKILL.md +27 -22
  170. package/skills/submit-paper/SKILL.md.spec.ts +26 -21
  171. package/skills/submit-paper/references/publishers/acm.md +1 -1
  172. package/src/adapters/hotcrp/cassette/README.md +24 -0
  173. package/src/adapters/hotcrp/cassette/get-noauth.json +10 -0
  174. package/src/adapters/hotcrp/cassette/get-paper.json +39 -0
  175. package/src/adapters/hotcrp/cassette/post-dot.json +21 -0
  176. package/src/adapters/hotcrp/cassette/post-ok.json +12 -0
  177. package/src/adapters/hotcrp/index.ts +11 -0
  178. package/src/adapters/hotcrp/portal.io.ts +130 -0
  179. package/src/adapters/hotcrp/portal.test.ts +503 -0
  180. package/src/adapters/hotcrp/response.ts +181 -0
  181. package/src/adapters/latex/conditionals.ts +130 -0
  182. package/src/adapters/latex/headings.ts +163 -0
  183. package/src/adapters/latex/index.test.ts +65 -0
  184. package/src/adapters/latex/index.ts +3 -0
  185. package/src/adapters/latex/parse.ts +3 -2
  186. package/src/build.ts +2 -2
  187. package/src/cli.test.ts +155 -3
  188. package/src/cli.ts +161 -25
  189. package/src/domain/heading-case.test.ts +660 -0
  190. package/src/domain/heading-case.ts +538 -0
  191. package/src/domain/result.test.ts +9 -1
  192. package/src/domain/result.ts +5 -0
  193. package/src/domain/submission.test.ts +45 -0
  194. package/src/domain/submission.ts +141 -0
  195. package/src/domain/tex-document.ts +36 -0
  196. package/src/domain/venue-name.test.ts +121 -0
  197. package/src/domain/venue-name.ts +129 -0
  198. package/src/facts-file.test.ts +4 -4
  199. package/src/facts-file.ts +6 -6
  200. package/src/folder-venue-rule.test.ts +182 -0
  201. package/src/folder-venue-rule.ts +141 -0
  202. package/src/heading-case.test.ts +500 -0
  203. package/src/heading-case.ts +275 -0
  204. package/src/init.test.ts +22 -0
  205. package/src/init.ts +9 -2
  206. package/src/new-paper.harness.mjs +11 -9
  207. package/src/new-paper.test.ts +135 -10
  208. package/src/new-paper.ts +38 -7
  209. package/src/paper-settings-commands.test.ts +25 -10
  210. package/src/paper-settings.test.ts +12 -1
  211. package/src/paper-settings.ts +25 -5
  212. package/src/parse-args.test.ts +19 -0
  213. package/src/ports/latex.ts +7 -0
  214. package/src/ports/submission-portal.ts +26 -0
  215. package/src/preset-card-rule.test.ts +266 -0
  216. package/src/preset-card-rule.ts +384 -0
  217. package/src/presets.test.ts +212 -37
  218. package/src/presets.ts +183 -71
  219. package/src/rule-cases.test.ts +147 -42
  220. package/src/rules-config.ts +1 -1
  221. package/src/submission.test.ts +497 -0
  222. package/src/submission.ts +311 -0
  223. package/src/talk-rules.test.ts +6 -3
  224. package/src/tex-requirements.harness.ts +25 -11
  225. package/src/tex-requirements.test.ts +127 -1
  226. package/src/tex-requirements.ts +78 -8
  227. package/src/tex-venue-rules.test.ts +36 -22
  228. package/src/tex-venue-rules.ts +14 -26
  229. package/src/types.ts +13 -0
  230. package/src/venue-rules.test.ts +7 -6
  231. package/templates/paper/paper.tex +1 -1
  232. package/skills/submit-paper/references/venues/agenticdev.md +0 -171
  233. package/skills/submit-paper/references/venues/aisec.md +0 -105
  234. package/skills/submit-paper/references/venues/realm.md +0 -155
@@ -24,7 +24,12 @@
24
24
  // aidc.jsonc). The planted defects fail as they should, measured on the same compsoc paper:
25
25
  // `a4paper` added to the options → page 8.264 x 11.694 in: pdf/geometry
26
26
  // Computer Modern (`\rmdefault{cmr}`) → fonts CMR10, CMBX12, …: pdf/fonts, no NimbusRomNo9L
27
+ //
28
+ // Its card, in prose: `ieee-conference.md` beside this file.
27
29
  {
30
+ // A template family: it names no venue, so no `name` and no `url` (the venues that extend it do).
31
+ "type": "family",
32
+
28
33
  "template": "\\documentclass[conference]{IEEEtran}",
29
34
 
30
35
  // TeX Live packages the IEEEtran template needs ON TOP OF tex-base.jsonc, each with the files that
@@ -0,0 +1,38 @@
1
+ ---
2
+ title: "IEEE IEEEtran conference — template family card"
3
+ ---
4
+
5
+ # IEEE `IEEEtran` conference
6
+
7
+ The card of the template family `paperlint:ieee-conference`
8
+ ([`ieee-conference.jsonc`](ieee-conference.jsonc)). A family is what a publisher's template
9
+ decides, whatever the venue: it names no venue and has no call for papers. A venue preset extends
10
+ it and adds what its own call sets — the class options it names, the page limit of each kind of
11
+ paper, the sections it requires. The template is [IEEEtran on CTAN](https://ctan.org/pkg/ieeetran).
12
+
13
+ ## What the family encodes
14
+
15
+ - **The class**: `\documentclass[conference]{IEEEtran}`. A venue that requires `compsoc` names it
16
+ in its own template and its own text block (as `aidc` does).
17
+ - **The page**: US letter, 8.5 × 11 in; the text block of `[conference]`, 7.14 × 9.30 in; two
18
+ columns.
19
+ - **The fonts**: Times (the URW clone the PDF names NimbusRomNo9L) for text, headings and title;
20
+ body at 10 pt, the bibliography at 8 pt (IEEEtran sets it in `\footnotesize`).
21
+ - **TeX packages** on top of the base set: ieeetran, cite, psnfss and times.
22
+
23
+ The numbers are measured, not copied: IEEE's own template files (`bare_conf.tex`,
24
+ `bare_conf_compsoc.tex`) and a 13-page paper built on each with IEEEtran.cls V1.8b, on two TeX Live
25
+ versions. `compsoc` changes the text block and the headings, and nothing the `pdf/*` rules judge.
26
+
27
+ ## What the family resolves to
28
+
29
+ <!-- paperlint:preset-rules -->
30
+ <!-- prettier-ignore-start -->
31
+ <!-- Generated from ieee-conference.jsonc by `npx eslint --fix` (rule preset/card-rules). Edit the preset, not this section. -->
32
+
33
+ **`paperlint:ieee-conference`** — template family, no venue of its own · extended by `paperlint:aidc`
34
+
35
+ No preset of this chain sets a rule: under it, every rule keeps paperlint's default.
36
+
37
+ <!-- prettier-ignore-end -->
38
+ <!-- /paperlint:preset-rules -->
@@ -1,5 +1,5 @@
1
- // REALM @ EMNLP 2026 format profile — ACL family, NOT ACM. Prose is in `realm.md` nearby,
2
- // the family's shared rules are in `paper-pipeline/references/acl-venue-rules.md`.
1
+ // REALM @ EMNLP 2026 format profile — ACL family, NOT ACM. Prose is in its card, `realm.md`
2
+ // beside this file; the family's shared rules are in `paper-pipeline/references/acl-venue-rules.md`.
3
3
  //
4
4
  // 🔴 THE GEOMETRY NUMBERS ARE MEASURED, NOT COPIED. banal run against our own build
5
5
  // (`repro/build-submission.sh` → `build/acl_latex.pdf`, 2026-08-26):
@@ -8,6 +8,11 @@
8
8
  // acmart (letter 8.5x11, size 9, Libertine) shares NOTHING with this — copying the numbers from
9
9
  // `agenticdev.jsonc` would give a gate that reddens on a correct paper.
10
10
  {
11
+ "type": "venue",
12
+ "name": "REALM",
13
+ // The workshop's call for papers, which the page limits below are quoted from.
14
+ "url": "https://realm-workshop.github.io/call_for_papers",
15
+
11
16
  // ACL's template is not a class: `acl_latex.tex` opens with `\documentclass[11pt]{article}` and
12
17
  // loads `acl.sty` as a package (https://github.com/acl-org/acl-style-files, checked 2026-09-27).
13
18
  // So the class `tex/template` compares against is article, at 11pt.
@@ -0,0 +1,166 @@
1
+ ---
2
+ title: "REALM @ EMNLP — venue card"
3
+ ---
4
+
5
+ # REALM @ EMNLP
6
+
7
+ The card of the venue preset `paperlint:realm` ([`realm.jsonc`](realm.jsonc)): what the venue asks
8
+ for, in prose. The numbers a machine checks live in the preset; the section at the end is generated
9
+ from it. The `submit-paper` skill reads this card for the venue's specifics.
10
+
11
+ **Family: ACL.** What is ACL-wide (the appendix rule, Limitations and Ethics outside the limit,
12
+ anonymity, OpenReview mechanics) lives in `paper-pipeline/references/acl-venue-rules.md`; only
13
+ REALM's own facts are here. ACL's template is not a class — `acl_latex.tex` loads `acl.sty` into
14
+ `\documentclass[11pt]{article}` — so this preset extends no family and carries the template's
15
+ numbers itself.
16
+
17
+ Sources: the call for papers,
18
+ [realm-workshop.github.io/call_for_papers](https://realm-workshop.github.io/call_for_papers)
19
+ (fetched 2026-08-02 and 2026-08-03), and the OpenReview invitation schema.
20
+ 🔴 **Re-verify every cycle** — dates, limits and tracks move between editions.
21
+
22
+ ## The venue (2026 edition, the 2nd)
23
+
24
+ | field | value |
25
+ | -------------------------- | ------------------------------------------------------------------------------------------------------------- |
26
+ | full name | REALM — workshop at EMNLP 2026 |
27
+ | edition | **2nd** (the 1st edition's accepted papers exist — mine them with `study-accepted-papers`) |
28
+ | direct submission deadline | **Wednesday 5 August 2026**, 23:59 **AoE** (= 6 August 11:59 UTC) |
29
+ | ARR commitment deadline | 31 August 2026, same AoE convention |
30
+ | archival | optional at submission; archival → **ACL Anthology proceedings** |
31
+ | blind | **double-blind** — names and affiliations omitted |
32
+ | preprints | allowed at any time, provided the PDF does not link to de-anonymized information |
33
+ | portal | `openreview.net/group?id=EMNLP/2026/Workshop/REALM` |
34
+ | format | **PDF only** |
35
+ | mandatory sections | none beyond ACL's Limitations; _"authors are expected to attest to the ethical considerations in their work"_ |
36
+ | venue mode | hybrid; Thursday 29 October, 9:00–17:30, Room P1 |
37
+
38
+ ## Paper kinds and limits
39
+
40
+ | kind | at submission | at camera-ready | references and appendices |
41
+ | ------- | ------------: | --------------: | ------------------------: |
42
+ | `long` | 8 pages | 9 pages | unlimited |
43
+ | `short` | 4 pages | 5 pages | unlimited |
44
+
45
+ 🔴 **The page limit is not gated by the preset**, and that is a measurement: banal counts
46
+ Limitations and Ethics as body, which ACL excludes from the limit, so a gate on its count reports a
47
+ paper inside the limit. The numbers sit in the preset's `page_limits_not_gated`, as data for a
48
+ counter that knows where the body ends; the two kinds exist so a paper can name its own.
49
+
50
+ ## What else the preset encodes
51
+
52
+ - **The template**: `\documentclass[11pt]{article}` (`tex/template`), A4, two columns, Times at
53
+ 11 pt, references between 9 and 11 pt — measured on a build, not copied from ACL's text.
54
+ - **TeX packages** `acl.sty` needs: lineno, and the Times, Helvetica, Courier, Symbol and Zapf
55
+ Dingbats fonts (without them: "Font ptmr8t not loadable" and no PDF).
56
+ - **Names**: `REALM` and `EMNLP`, what `tex/venue-leftover` looks for in another venue's paper.
57
+
58
+ ## 🔴 The submission form has no supplementary field
59
+
60
+ From `api2.openreview.net/invitations?id=EMNLP/2026/Workshop/REALM/-/Submission`, the form's
61
+ **complete** field list:
62
+
63
+ ```
64
+ title · authors · authorids · keywords · TLDR · abstract · pdf ·
65
+ archival · cross_submission_to · serve_as_reviewer · venue · venueid
66
+ ```
67
+
68
+ There is no Responsible NLP Checklist and no supplementary upload. So:
69
+
70
+ 1. **Host the artifact externally and anonymously**, with the URL inside the PDF — a submission
71
+ blocker, and an artifact reviewer refuses the Available badge without a resolving URL.
72
+ 2. **Do not confuse this route with ARR**, whose portal does have the checklist and separate
73
+ software and data uploads.
74
+ 3. **No checklist means no LLM-disclosure field here**: put the disclosure in Limitations or Ethical
75
+ considerations, both outside the page limit
76
+ (`paper-pipeline/references/acl-venue-rules.md`, §GenAI / LLM disclosure).
77
+
78
+ `keywords` is a form field, so a keyword line does **not** belong in the typeset PDF.
79
+
80
+ ## The submission form, field by field
81
+
82
+ What the live form shows, in order. Help text is quoted.
83
+
84
+ | # | field | required | type | what goes in |
85
+ | --- | ----------------------- | -------- | -------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
86
+ | 1 | **Title** | ✱ | one line | _"Add TeX formulas using $In-line$ or $$Block$$"_ — plain text otherwise. **Must match the PDF's title exactly**; a late title edit in the paper means re-uploading the PDF _and_ retyping this |
87
+ | 2 | **Authors** | ✱ | profile search | pre-filled with the submitting author. _"All authors must have an OpenReview profile prior to submitting"_ — a co-author without an active profile blocks the whole submission |
88
+ | 3 | **Keywords** | ✱ | comma-separated | free text, no controlled vocabulary. 🔴 **Because this is a form field, the keyword line does NOT belong in the typeset PDF** |
89
+ | 4 | **TL;DR** | — | one sentence, 🔴 **hard max 250 characters** | _"a short sentence describing your paper"_. The limit is **not in the help text** — it rejects on submit. Optional, but it is the first thing a bidding reviewer reads: name the mechanism, not the topic. Count the characters before pasting |
90
+ | 5 | **Abstract** | ✱ | markdown + TeX, Write/Preview tabs | paste the paper's abstract. Markdown emphasis renders; `**bold**` survives. Backticks render as code |
91
+ | 6 | **PDF** | ✱ | file upload | _"Upload a PDF file that ends with .pdf"_. No supplementary field anywhere on the form — see above |
92
+ | 7 | **Archival** | ✱ | radio: Archival / Non-archival | Archival → **ACL Anthology**. _"If your paper is a cross-submission (currently under review or already published at another venue), it cannot be archival, per ACL policies."_ Changeable at camera-ready |
93
+ | 8 | **Cross Submission To** | — | one line | leave **empty** unless the paper is genuinely under review elsewhere. Filling it forfeits archival |
94
+ | 9 | **Serve As Reviewer** | ✱ | profile search | _"reciprocal reviewing practice… nominate at least one author to serve as a reviewer using their OpenReview profile ID (e.g. ~First_Last1)"_. **A solo author nominates themself** — the field is required and there is nobody else |
95
+ | 10 | License | ✱ | fixed chip | **CC BY 4.0**, not editable |
96
+ | 11 | Readers | ✱ | fixed chips | `EMNLP 2026 Workshop REALM` + `authorids` |
97
+ | 12 | Signatures | ✱ | fixed chip | the submitting author |
98
+
99
+ Then **Submit** / Cancel.
100
+
101
+ 🔴 **The displayed deadline is not when writes stop.** An OpenReview invitation carries two dates
102
+ and the interface shows only the first:
103
+
104
+ | field | 2026 edition, UTC |
105
+ | -------------------------------------------------------------- | ----------------- |
106
+ | `duedate` — printed everywhere as the deadline | 2026-08-06 11:59 |
107
+ | `expdate` — when the invitation actually stops accepting edits | 2026-08-06 12:29 |
108
+
109
+ A 30-minute window, undocumented in the call and invisible on the form. Read it before the last
110
+ hour:
111
+
112
+ ```
113
+ curl -sS "https://api2.openreview.net/invitations?id=<VENUE-PATH>/-/Submission" \
114
+ | python3 -c "import json,sys,datetime;[print(k, datetime.datetime.utcfromtimestamp(i[k]/1000)) \
115
+ for i in json.load(sys.stdin)['invitations'] for k in ('duedate','expdate') if i.get(k)]"
116
+ ```
117
+
118
+ Do not plan around it — a venue may set `expdate == duedate`. It is room to recover from a defect
119
+ found at the deadline, not a schedule.
120
+
121
+ ## Traps
122
+
123
+ - **The title lives in two places, and they diverge silently.** Change the paper first, rebuild,
124
+ then fill the form — never the other way round.
125
+ - **"Serve As Reviewer" enrols the nominee.** The day after submission the program chairs assign
126
+ papers and set a review deadline (2026: submissions 5 August, reviews due 21 August AoE, sixteen
127
+ days). ACL's AI policy applies to the reviews, verbatim from the chairs' email: _"the use of
128
+ generative AI tools to write an entire review is prohibited. While such tools may be used for
129
+ minor editing (e.g., grammar or clarity), the content and assessment must be the reviewer's
130
+ own."_ The sanction lands on submissions to the next ARR cycle. Price the reviewing window in
131
+ before submitting, and check whether a decision about reviewing was already made before filling
132
+ a required field.
133
+ - **Keywords are a form field, not paper content.** Keep the list in a non-typeset comment in the
134
+ source and paste it here.
135
+ - **The abstract field accepts markdown**, so paste the source abstract. Extracting it from the
136
+ built PDF is a mistake: on a line-numbered build the extractor interleaves the margin numbers and
137
+ drops paragraphs.
138
+ - **The deadline's time zone is stated in a different sentence** of the call than the date. Read
139
+ the whole page, then convert.
140
+ - **OpenReview profile moderation is the critical path.** An author with no institutional email and
141
+ no DBLP record has no expedite route; start the profile weeks ahead.
142
+ - The workshop's hybrid status comes from REALM's own root page, not EMNLP's general one.
143
+
144
+ ## The ARR route is not a free fallback
145
+
146
+ The 31 August "ARR commitment" deadline commits a paper **already reviewed by ACL Rolling Review**.
147
+ A paper never submitted to ARR needs an ARR submission first, on ARR's own cycle.
148
+
149
+ ## Sources
150
+
151
+ - `realm-workshop.github.io/call_for_papers` — the call (fetched 2026-08-02, 2026-08-03)
152
+ - `realm-workshop.github.io/` — the root page, hybrid confirmation
153
+ - `api2.openreview.net/invitations?id=…/-/Submission` — the live form schema
154
+
155
+ ## What the preset resolves to
156
+
157
+ <!-- paperlint:preset-rules -->
158
+ <!-- prettier-ignore-start -->
159
+ <!-- Generated from realm.jsonc by `npx eslint --fix` (rule preset/card-rules). Edit the preset, not this section. -->
160
+
161
+ **`paperlint:realm`** — venue preset for REALM · call for papers: <https://realm-workshop.github.io/call_for_papers>
162
+
163
+ No preset of this chain sets a rule: under it, every rule keeps paperlint's default.
164
+
165
+ <!-- prettier-ignore-end -->
166
+ <!-- /paperlint:preset-rules -->
@@ -1,5 +1,5 @@
1
1
  % agenticdev.tex — venue numbers for the guards IN THE PREAMBLE. LaTeX doesn't read YAML, so the
2
- % values are duplicated from venues/agenticdev.jsonc (the source of truth — read by the
2
+ % values are duplicated from presets/agenticdev.jsonc (the source of truth — read by the
3
3
  % `pdf/profile` rule, see eslint-rules/pdf-facts.mjs:128). in = inches.
4
4
  %
5
5
  % 🔴 THIS USED TO SAY `venues/agenticdev.yaml`, AND NO SUCH FILE EXISTS (fixed 2026-09-12). The
@@ -14,7 +14,13 @@
14
14
  // cm-super — without it pdflatex silently RASTERIZES Computer Modern in some contexts (a Type 3
15
15
  // bitmap font in the PDF; measured 2026-09-01 on an ACL paper: 1 Type 3 font before, 0 after).
16
16
  // ACM and ACL both reject such a PDF, and the build does not complain.
17
+ //
18
+ // Its card, in prose: `tex-base.md` beside this file.
17
19
  {
20
+ // The base set: not a venue and not a template family. No preset extends it — every paper gets it
21
+ // anyway, under whatever it extends — so it holds `tex` and nothing else (the schema says so).
22
+ "type": "base",
23
+
18
24
  "tex": {
19
25
  "packages": {
20
26
  "latex": ["latex.ltx", "article.cls"],
@@ -0,0 +1,30 @@
1
+ ---
2
+ title: "The TeX base set — card"
3
+ ---
4
+
5
+ # The TeX base set
6
+
7
+ The card of [`tex-base.jsonc`](tex-base.jsonc): the TeX Live packages **every** paper gets, and all
8
+ a paper gets when it extends no preset. It is neither a venue nor a template family, and no preset
9
+ extends it — a venue's or a family's `tex.packages` is added on top of it, never instead of it.
10
+ `paperlint toolchain` installs it with every preset's packages; `paperlint build` checks it is
11
+ present before building.
12
+
13
+ What it is for: a plain `article` paper with the usual tools, typeset in Type 1 fonts. Each package
14
+ names the files that prove it is installed — `kpsewhich` must find them after an install, because
15
+ an installer's exit code is not the criterion. `cm-super` is there because without it pdflatex
16
+ silently rasterizes Computer Modern in some contexts, a bitmap font that ACM and ACL both reject.
17
+ `texcount` and `checkcites` are programs the skills run, not files LaTeX loads.
18
+
19
+ ## What the preset resolves to
20
+
21
+ <!-- paperlint:preset-rules -->
22
+ <!-- prettier-ignore-start -->
23
+ <!-- Generated from tex-base.jsonc by `npx eslint --fix` (rule preset/card-rules). Edit the preset, not this section. -->
24
+
25
+ **`tex-base.jsonc`** — the TeX base set: every paper gets it, whatever it extends, and no preset extends it
26
+
27
+ No preset of this chain sets a rule: under it, every rule keeps paperlint's default.
28
+
29
+ <!-- prettier-ignore-end -->
30
+ <!-- /paperlint:preset-rules -->
@@ -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
  },
@@ -29,7 +39,7 @@
29
39
  "type": "boolean"
30
40
  },
31
41
  "aliases": {
32
- "description": "Other names the venue goes by in a paper's text — its acronym, its parent conference (`[\"AISec\", \"ACM CCS\"]`). Read by `tex/venue-leftover`: a paper that extends another venue and says one of these is flagged. Matched as whole words, case-sensitive. Collected along the `extends` chain, with `name`.",
42
+ "description": "Other names the venue goes by in a paper's text — its acronym, its parent conference (`[\"AISec\", \"ACM CCS\"]`). Read by `tex/venue-leftover`: a paper that extends another venue and says one of these is flagged. Matched as whole words, case-sensitive. Also read by `paper/folder-venue-leftover`, against the words of the paper's folder name, case ignored. Collected along the `extends` chain, with `name`.",
33
43
  "type": "array",
34
44
  "uniqueItems": true,
35
45
  "items": {
@@ -37,6 +47,22 @@
37
47
  "minLength": 1
38
48
  }
39
49
  },
50
+ "portal": {
51
+ "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.",
52
+ "type": "object",
53
+ "additionalProperties": false,
54
+ "required": ["kind", "url"],
55
+ "properties": {
56
+ "kind": {
57
+ "type": "string",
58
+ "minLength": 1
59
+ },
60
+ "url": {
61
+ "type": "string",
62
+ "pattern": "^https?://[^\\s/]+[^\\s]*$"
63
+ }
64
+ }
65
+ },
40
66
  "required_sections": {
41
67
  "description": "Sections the venue requires, read by `tex/required-section`. Each is a `\\section` or `\\section*` whose title equals `title` once whitespace is collapsed. `position: \"last\"`: after every section of the body (the ones before the appendix and the bibliography); it may stand after the bibliography. A child preset's list replaces its parent's.",
42
68
  "type": "array",
@@ -320,6 +346,7 @@
320
346
  }
321
347
  }
322
348
  },
349
+ "required": ["type"],
323
350
  "allOf": [
324
351
  {
325
352
  "if": {
@@ -330,6 +357,34 @@
330
357
  "then": {
331
358
  "required": ["tex"]
332
359
  }
360
+ },
361
+ {
362
+ "if": {
363
+ "required": ["type"],
364
+ "properties": { "type": { "const": "venue" } }
365
+ },
366
+ "then": {
367
+ "required": ["name", "url"]
368
+ }
369
+ },
370
+ {
371
+ "if": {
372
+ "required": ["type"],
373
+ "properties": { "type": { "const": "family" } }
374
+ },
375
+ "then": {
376
+ "properties": { "name": false, "url": false }
377
+ }
378
+ },
379
+ {
380
+ "if": {
381
+ "required": ["type"],
382
+ "properties": { "type": { "const": "base" } }
383
+ },
384
+ "then": {
385
+ "required": ["type", "tex"],
386
+ "maxProperties": 2
387
+ }
333
388
  }
334
389
  ],
335
390
  "definitions": {
@@ -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\`. |
@@ -94,6 +94,10 @@ const NOT_IN_MAP = new Map([
94
94
  "osf-artifact-upload",
95
95
  "a helper that uploads an artifact file, not a stage of writing a paper",
96
96
  ],
97
+ [
98
+ "submission-portal",
99
+ "a helper that reads and updates the submission on the portal, reached through `submit-paper`",
100
+ ],
97
101
  ]);
98
102
 
99
103
  for (const name of dirs) {
@@ -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