paperlint 6.3.0 → 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 (144) hide show
  1. package/CONTRIBUTING.md +4 -2
  2. package/README.md +2 -2
  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 +17 -3
  26. package/dist/cli.js.map +1 -1
  27. package/dist/domain/heading-case.d.ts +100 -0
  28. package/dist/domain/heading-case.d.ts.map +1 -0
  29. package/dist/domain/heading-case.js +365 -0
  30. package/dist/domain/heading-case.js.map +1 -0
  31. package/dist/domain/tex-document.d.ts +32 -0
  32. package/dist/domain/tex-document.d.ts.map +1 -1
  33. package/dist/domain/tex-document.js +11 -0
  34. package/dist/domain/tex-document.js.map +1 -1
  35. package/dist/eslint-rules/latex-language.d.ts.map +1 -1
  36. package/dist/eslint-rules/latex-language.js +16 -3
  37. package/dist/eslint-rules/latex-language.js.map +1 -1
  38. package/dist/facts-file.d.ts +3 -3
  39. package/dist/facts-file.d.ts.map +1 -1
  40. package/dist/facts-file.js +3 -3
  41. package/dist/facts-file.js.map +1 -1
  42. package/dist/folder-venue-rule.js +6 -6
  43. package/dist/folder-venue-rule.js.map +1 -1
  44. package/dist/heading-case.d.ts +48 -0
  45. package/dist/heading-case.d.ts.map +1 -0
  46. package/dist/heading-case.js +191 -0
  47. package/dist/heading-case.js.map +1 -0
  48. package/dist/ports/latex.d.ts +7 -1
  49. package/dist/ports/latex.d.ts.map +1 -1
  50. package/dist/preset-card-rule.d.ts +100 -0
  51. package/dist/preset-card-rule.d.ts.map +1 -0
  52. package/dist/preset-card-rule.js +221 -0
  53. package/dist/preset-card-rule.js.map +1 -0
  54. package/dist/presets.d.ts +19 -2
  55. package/dist/presets.d.ts.map +1 -1
  56. package/dist/presets.js +97 -62
  57. package/dist/presets.js.map +1 -1
  58. package/dist/tex-requirements.d.ts +33 -3
  59. package/dist/tex-requirements.d.ts.map +1 -1
  60. package/dist/tex-requirements.js +27 -2
  61. package/dist/tex-requirements.js.map +1 -1
  62. package/dist/tex-venue-rules.d.ts +1 -1
  63. package/dist/tex-venue-rules.d.ts.map +1 -1
  64. package/dist/tex-venue-rules.js.map +1 -1
  65. package/docs/configuration.md +13 -1
  66. package/docs/optional-rules.md +4 -3
  67. package/docs/rules/format/page-limit.md +1 -1
  68. package/docs/rules/paper/folder-venue-leftover.md +1 -1
  69. package/docs/rules/talk/profile.md +1 -1
  70. package/docs/rules/tex/heading-case.md +424 -0
  71. package/docs/rules.md +62 -53
  72. package/eslint-rules/latex-language.test.mjs +12 -0
  73. package/eslint-rules/latex-language.ts +17 -4
  74. package/eslint-rules/paper-typography.test.mjs +12 -0
  75. package/eslint.config.mjs +59 -1
  76. package/fixtures/build-e2e/acmart/paper.tex +1 -1
  77. package/fixtures/build-e2e/fallback/expect.json +3 -3
  78. package/lib/skill-checks.mjs +31 -0
  79. package/package.json +7 -1
  80. package/presets/acm-sigconf.jsonc +5 -0
  81. package/presets/acm-sigconf.md +43 -0
  82. package/presets/agenticdev.jsonc +27 -6
  83. package/presets/agenticdev.md +151 -0
  84. package/presets/aidc.jsonc +6 -0
  85. package/presets/aidc.md +75 -0
  86. package/presets/aisec.jsonc +5 -1
  87. package/presets/aisec.md +117 -0
  88. package/presets/ieee-conference.jsonc +5 -0
  89. package/presets/ieee-conference.md +38 -0
  90. package/presets/realm.jsonc +7 -2
  91. package/presets/realm.md +166 -0
  92. package/presets/tex/agenticdev.tex +1 -1
  93. package/presets/tex-base.jsonc +6 -0
  94. package/presets/tex-base.md +30 -0
  95. package/presets/venue-profile.schema.json +40 -1
  96. package/skills/find-venue/SKILL.md +6 -5
  97. package/skills/find-venue/SKILL.md.spec.ts +5 -4
  98. package/skills/paper-pipeline/SKILL.md +5 -6
  99. package/skills/paper-pipeline/SKILL.md.spec.ts +4 -5
  100. package/skills/paper-pipeline/references/acl-venue-rules.md +1 -1
  101. package/skills/study-accepted-papers/SKILL.md +3 -3
  102. package/skills/study-accepted-papers/SKILL.md.spec.ts +2 -2
  103. package/skills/submit-paper/SKILL.md +26 -22
  104. package/skills/submit-paper/SKILL.md.spec.ts +25 -21
  105. package/skills/submit-paper/references/publishers/acm.md +1 -1
  106. package/src/adapters/latex/conditionals.ts +130 -0
  107. package/src/adapters/latex/headings.ts +163 -0
  108. package/src/adapters/latex/index.test.ts +65 -0
  109. package/src/adapters/latex/index.ts +3 -0
  110. package/src/adapters/latex/parse.ts +3 -2
  111. package/src/build.ts +2 -2
  112. package/src/cli.test.ts +50 -7
  113. package/src/cli.ts +21 -4
  114. package/src/domain/heading-case.test.ts +660 -0
  115. package/src/domain/heading-case.ts +538 -0
  116. package/src/domain/tex-document.ts +36 -0
  117. package/src/domain/venue-name.test.ts +13 -7
  118. package/src/facts-file.test.ts +4 -4
  119. package/src/facts-file.ts +6 -6
  120. package/src/folder-venue-rule.test.ts +10 -10
  121. package/src/folder-venue-rule.ts +6 -6
  122. package/src/heading-case.test.ts +500 -0
  123. package/src/heading-case.ts +275 -0
  124. package/src/init.test.ts +1 -1
  125. package/src/new-paper.test.ts +10 -6
  126. package/src/paper-settings-commands.test.ts +25 -10
  127. package/src/ports/latex.ts +7 -0
  128. package/src/preset-card-rule.test.ts +266 -0
  129. package/src/preset-card-rule.ts +384 -0
  130. package/src/presets.test.ts +193 -40
  131. package/src/presets.ts +139 -70
  132. package/src/rule-cases.test.ts +136 -50
  133. package/src/submission.test.ts +2 -1
  134. package/src/talk-rules.test.ts +6 -3
  135. package/src/tex-requirements.harness.ts +25 -11
  136. package/src/tex-requirements.test.ts +127 -1
  137. package/src/tex-requirements.ts +70 -8
  138. package/src/tex-venue-rules.test.ts +35 -21
  139. package/src/tex-venue-rules.ts +2 -1
  140. package/src/venue-rules.test.ts +7 -6
  141. package/templates/paper/paper.tex +1 -1
  142. package/skills/submit-paper/references/venues/agenticdev.md +0 -171
  143. package/skills/submit-paper/references/venues/aisec.md +0 -105
  144. package/skills/submit-paper/references/venues/realm.md +0 -155
@@ -1,155 +0,0 @@
1
- # REALM @ EMNLP — venue card
2
-
3
- **Family: ACL.** Everything ACL-wide (appendix rule, Limitations/Ethics not counting, anonymity,
4
- OpenReview mechanics) lives in `paper-pipeline/references/acl-venue-rules.md`. Only REALM-specific
5
- facts are here.
6
-
7
- Verified by direct fetch of `realm-workshop.github.io/call_for_papers` **2026-08-02 and 2026-08-03**
8
- (twice, independently), plus a live pull of the OpenReview invitation schema.
9
- 🔴 **Re-verify every cycle** — dates, limits and tracks move year to year.
10
-
11
- ## The 2026 edition (2nd edition)
12
-
13
- | field | value |
14
- | -------------------------- | ------------------------------------------------------------------------------------------------------------- |
15
- | full name | REALM — workshop at EMNLP 2026 |
16
- | edition | **2nd** (a 1st-edition accepted corpus exists — mine it with `study-accepted-papers`, in SETUP) |
17
- | direct submission deadline | **Wednesday 5 August 2026**, 23:59 **AoE** |
18
- | → in the author's zone | at UTC+5: **6 August 2026, 16:59** (AoE = UTC−12; 5 Aug 23:59 AoE = 6 Aug 11:59 UTC) |
19
- | ARR commitment deadline | 31 August 2026, same AoE convention |
20
- | long paper | **8 pages of content** |
21
- | short paper | 4 pages of content |
22
- | refs + appendices | **unlimited** |
23
- | camera-ready | **+1 page** (9 long / 5 short) |
24
- | archival | optional at submission; archival → **ACL Anthology proceedings** |
25
- | blind | **double-blind** — names and affiliations omitted |
26
- | preprints | explicitly allowed, any time, provided the PDF does not link to de-anonymised info |
27
- | portal | `openreview.net/group?id=EMNLP/2026/Workshop/REALM` |
28
- | format | **PDF only** |
29
- | mandatory sections | none beyond ACL's Limitations; _"authors are expected to attest to the ethical considerations in their work"_ |
30
- | venue mode | hybrid; held Thursday 29 October, 9:00–17:30, Room P1 |
31
-
32
- ## 🔴 The submission form has NO supplementary field
33
-
34
- Pulled live from `api2.openreview.net/invitations?id=EMNLP/2026/Workshop/REALM/-/Submission`. The
35
- form's **complete** field list:
36
-
37
- ```
38
- title · authors · authorids · keywords · TLDR · abstract · pdf ·
39
- archival · cross_submission_to · serve_as_reviewer · venue · venueid
40
- ```
41
-
42
- There is **no Responsible NLP Checklist and no supplementary upload**. Two consequences:
43
-
44
- 1. **The artifact must be hosted externally and anonymously**, with the URL inside the PDF. Budget
45
- time for this — it is a submission blocker, and an artifact reviewer will refuse the Available
46
- badge without a resolving URL.
47
- 2. Do not confuse this route with **ARR**, whose portal _does_ have the checklist and separate
48
- software/data uploads. Different portal, different process. A previous version of this project's
49
- checklist conflated them.
50
- 3. **No checklist field means no LLM-disclosure gate here**, and therefore no required placement for
51
- it — put the disclosure in Limitations or Ethical considerations, both outside the page limit,
52
- and keep it out of the reader's first contact with a measurement. Full rule, with the policy text
53
- and the failure it was written from: `paper-pipeline/references/acl-venue-rules.md`, §GenAI / LLM
54
- disclosure.
55
-
56
- Note `keywords` is a form field, so the keyword line does **not** belong in the typeset PDF.
57
-
58
- ## The submission form, field by field (filled 2026-08-06, ~15 min before deadline)
59
-
60
- Transcribed from the live form while filling it. The API schema above lists field _names_; this is
61
- what the form actually shows, in order, with what each one wants. A field's help text is quoted.
62
-
63
- | # | field | required | type | what goes in |
64
- | --- | ----------------------- | -------- | -------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
65
- | 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 |
66
- | 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 |
67
- | 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** |
68
- | 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 |
69
- | 5 | **Abstract** | ✱ | markdown + TeX, Write/Preview tabs | paste the paper's abstract. Markdown emphasis renders; `**bold**` survives. Backticks render as code |
70
- | 6 | **PDF** | ✱ | file upload | _"Upload a PDF file that ends with .pdf"_. No supplementary field anywhere on the form — see above |
71
- | 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 |
72
- | 8 | **Cross Submission To** | — | one line | leave **empty** unless the paper is genuinely under review elsewhere. Filling it forfeits archival |
73
- | 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 |
74
- | 10 | License | ✱ | fixed chip | **CC BY 4.0**, not editable |
75
- | 11 | Readers | ✱ | fixed chips | `EMNLP 2026 Workshop REALM` + `authorids` |
76
- | 12 | Signatures | ✱ | fixed chip | the submitting author |
77
-
78
- Then **Submit** / Cancel. An Edit History block below repeats Readers + Signatures — informational.
79
-
80
- 🔴 **The displayed deadline is NOT when writes stop.** An OpenReview invitation carries two dates
81
- and the interface shows only the first:
82
-
83
- | field | 2026 edition, UTC | at UTC+5 |
84
- | -------------------------------------------------------------- | ----------------- | --------- |
85
- | `duedate` — printed everywhere as the deadline | 2026-08-06 11:59 | **16:59** |
86
- | `expdate` — when the invitation actually stops accepting edits | 2026-08-06 12:29 | **17:29** |
87
-
88
- A **30-minute grace window**, undocumented in the CFP and invisible on the form. Read it before the
89
- last hour, not after — it is the difference between shipping a fix and abandoning it:
90
-
91
- ```
92
- curl -sS "https://api2.openreview.net/invitations?id=<VENUE-PATH>/-/Submission" \
93
- | python3 -c "import json,sys,datetime;[print(k, datetime.datetime.utcfromtimestamp(i[k]/1000)) \
94
- for i in json.load(sys.stdin)['invitations'] for k in ('duedate','expdate') if i.get(k)]"
95
- ```
96
-
97
- Do **not** plan around it — a venue may set `expdate == duedate`, and 30 minutes is not a schedule.
98
- Treat it as recovery room for a defect found at the buzzer. Re-read it every cycle.
99
-
100
- **Traps hit for real:**
101
-
102
- - 🔴 **The title lives in two places and they silently diverge.** A title change at T−14 min meant a
103
- fresh PDF _and_ a retyped Title field. Change the paper first, rebuild, then fill the form — never
104
- the other way round.
105
- - 🔴 **"Serve As Reviewer" surprises solo authors, and it is not a formality — it enrols you.** It reads
106
- as though it wants a colleague. It is required, and the answer for a one-author paper is your own
107
- profile ID. **The day after submitting, the program chairs assign papers and set a review deadline**
108
- (2026: submissions 5 Aug, reviews due 21 Aug AoE — sixteen days). Consequences to price in BEFORE
109
- submitting, not after:
110
- - **ACL's AI policy applies to the reviews.** Verbatim from the chairs' email: _"the use of
111
- generative AI tools to write an entire review is prohibited. While such tools may be used for
112
- minor editing (e.g., grammar or clarity), the content and assessment must be the reviewer's own."_
113
- Every review hour is personal. The sanction for violating it lands on submissions to the next ARR
114
- cycle — the same ecosystem the paper is in.
115
- - **The workshop's PC roster is not published**, so the only durable proof of the service is a
116
- Web of Science verified-review record: forward the chairs' thank-you email to
117
- `reviews@webofscience.com`. Set that profile up BEFORE reviewing, not after.
118
- - It is nonetheless a real judging credential, distinct from authorship. One submission closes two
119
- criteria — but the reviewing window is not negotiable and may collide with other commitments.
120
-
121
- 🔴 **Hit for real on `compile-rules-2026`.** This project had _decided on 2026-07-26 not to serve as
122
- a REALM reviewer_, with three written reasons (no public roster, the window collides with an ASPLOS
123
- artifact round, the AI policy makes it all personal hours). Eleven days later the required form field
124
- enrolled him anyway, because the field was filled in from a submission checklist that did not know
125
- about the decision. **A required form field can silently reverse a recorded decision.** Before
126
- filling any required field, check whether the project has already decided that question.
127
-
128
- - **Keywords are a form field, not paper content** — so anything in the PDF's keyword line is
129
- duplicated dead weight. Keep the list in a non-typeset comment in the source and paste it here.
130
- - **The abstract field accepts markdown**, so the source abstract can be pasted nearly verbatim.
131
- Extracting it from the _built PDF_ instead is a mistake: a text extractor on the line-numbered
132
- build interleaves the margin numbers and silently drops paragraphs.
133
-
134
- ## The ARR route is not a free fallback
135
-
136
- The 31 August "ARR commitment" deadline commits a paper **that has already been reviewed by ACL
137
- Rolling Review**. It is not a second chance for a paper that was never submitted to ARR — that needs
138
- an ARR submission first, on ARR's own cycle. Do not plan around it without checking the ARR calendar.
139
-
140
- ## Gotchas hit for real
141
-
142
- - **Deadline confusion.** The CFP prints "August 5th" and states the AoE rule in a _different_
143
- sentence on the same page. A pass on 2026-07-31 concluded "AoE not stated, assume noon 5 Aug" and
144
- was wrong by 29 hours. Read the whole page, then convert.
145
- - **OpenReview profile moderation is the critical path**, not the writing. An independent author with
146
- no institutional email and no DBLP record has no expedite route. Start the profile weeks ahead.
147
- - The workshop's hybrid status is confirmed by REALM's **own** root page — do not carry it over from
148
- EMNLP's general page.
149
-
150
- ## Sources
151
-
152
- - `realm-workshop.github.io/call_for_papers` — CFP (fetched 2026-08-02, 2026-08-03)
153
- - `realm-workshop.github.io/` — root, hybrid confirmation
154
- - `api2.openreview.net/invitations?id=…/-/Submission` — the live form schema
155
- - Per-paper compliance state: `<paper-dir>/SUBMIT-CHECKLIST.md`