paperlint 12.0.0 → 12.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.
package/CONTRIBUTING.md CHANGED
@@ -179,7 +179,8 @@ change to `.c8rc.json`'s exclude list that was not made there on purpose.
179
179
  ## Adding a venue
180
180
 
181
181
  A venue is a **preset**, a JSONC file in `presets/`, validated by
182
- `venue-profile.schema.json` beside it. Adding one is three files and no code:
182
+ `venue-profile.schema.json` beside it. Adding one is three files and no code (the maintainer skill
183
+ `.claude/skills/add-venue/` walks an agent through it, from the call for papers):
183
184
 
184
185
  1. **The preset, thin.** `presets/<name>.jsonc` extends the template family it is built on
185
186
  (`"extends": "paperlint:acm-sigconf"` for an ACM venue) and adds only what the call for papers
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "paperlint",
3
- "version": "12.0.0",
3
+ "version": "12.1.0",
4
4
  "description": "A linter for scientific papers written in LaTeX: catches mistakes before you submit to a conference or journal.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -0,0 +1,75 @@
1
+ // AGENT'27 (the Second International Workshop on Agentic Engineering, an ICSE 2027 workshop) — a
2
+ // VENUE preset over the IEEE conference family. Everything the IEEEtran template decides (page
3
+ // size, columns, fonts, body size, TeX packages) comes from ieee-conference.jsonc; this file adds
4
+ // what AGENT's call for papers sets. Its card, in prose: `agent.md` beside this file.
5
+ //
6
+ // Verbatim from https://conf.researchr.org/home/icse-2027/agent-2027 (fetched 2026-10-26):
7
+ // «Full papers (research or experience): up to 8 pages, including references.»
8
+ // «Short papers (position, emerging research, tool, benchmark, or experience): up to 5 pages,
9
+ // including references.»
10
+ // «All submissions must be original, written in English, and formatted according to the IEEE
11
+ // conference proceedings template. Submissions will be reviewed single-anonymously. Accepted
12
+ // workshop papers will be published by IEEE. It is not possible to pay for extra pages.»
13
+ // «Workshop paper submission deadline: November 13, 2026 / Notification of acceptance: December
14
+ // 11, 2026 / Camera-ready deadline: January 29, 2027 / All dates are Anywhere on Earth (AoE).»
15
+ {
16
+ "type": "venue",
17
+ "name": "AGENT 2027",
18
+ // The call quoted above.
19
+ "url": "https://conf.researchr.org/home/icse-2027/agent-2027",
20
+ "extends": "paperlint:ieee-conference",
21
+
22
+ // «AGENT» alone is an ordinary word: as a name it would flag every paper folder called
23
+ // `agent-…` (paper/folder-venue-leftover compares folder names by words, and `mentions` reaches
24
+ // only the text rules). So the venue is «AGENT 2027» and «AGENT'27» (the call's own spelling,
25
+ // with either apostrophe). ICSE is left out: papers cite ICSE papers by name.
26
+ "aliases": ["AGENT'27", "AGENT\u201927"],
27
+
28
+ // No `template` and no `blind`, on purpose. The call names «the IEEE conference proceedings
29
+ // template» and no class line, so the family's `[conference]` stands (the ICSE workshops page
30
+ // gives `[10pt,conference]{IEEEtran}` for workshop PROPOSALS only). The review is
31
+ // single-anonymous (above), so `blind` — which turns on anonymity/identity — stays unset; the
32
+ // portal agrees: its status data carries no `"blind":true` (read 2026-10-26).
33
+
34
+ // «Submission link» on the call's page: HotCRP.
35
+ "portal": { "kind": "hotcrp", "url": "https://icse2027-agent.hotcrp.com" },
36
+
37
+ // The portal's reading: `"sub":1794657599` on https://icse2027-agent.hotcrp.com/deadlines, shown
38
+ // as «Saturday Nov 14, 2026, 6:59:59 AM EST» = 2026-11-14T11:59:59Z = the end of 13 Nov AoE. The
39
+ // scheduled refresh rewrites it. The call's two other dates are not on the portal; they are the
40
+ // call's, in UTC at the end of the AoE day.
41
+ "deadlines": [
42
+ {
43
+ "what": "submission",
44
+ "at": "2026-11-14T11:59:59Z",
45
+ "source": "portal",
46
+ "url": "https://icse2027-agent.hotcrp.com/deadlines",
47
+ "read": "2026-10-26",
48
+ },
49
+ {
50
+ "what": "notification",
51
+ "at": "2026-12-12T11:59:59Z",
52
+ "source": "call",
53
+ "url": "https://conf.researchr.org/home/icse-2027/agent-2027",
54
+ "read": "2026-10-26",
55
+ },
56
+ {
57
+ "what": "camera-ready",
58
+ "at": "2027-01-30T11:59:59Z",
59
+ "source": "call",
60
+ "url": "https://conf.researchr.org/home/icse-2027/agent-2027",
61
+ "read": "2026-10-26",
62
+ },
63
+ ],
64
+
65
+ "format": {
66
+ // 🔴 THE LIMITS INCLUDE THE REFERENCES («up to 8 pages, including references»), and no key
67
+ // gates a total. `body_pages_max` is banal's body count, which is never more than the total, so
68
+ // a paper over it is over the limit; a paper whose references sit alone on a page after a full
69
+ // body passes this gate and is still over. The card says so.
70
+ "kinds": {
71
+ "full": { "body_pages_max": 8 },
72
+ "short": { "body_pages_max": 5 },
73
+ },
74
+ },
75
+ }
@@ -0,0 +1,70 @@
1
+ ---
2
+ title: "AGENT @ ICSE — venue card"
3
+ ---
4
+
5
+ # AGENT @ ICSE
6
+
7
+ The card of the venue preset `paperlint:agent` ([`agent.jsonc`](agent.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
+ **Re-verify the call for papers every year**
12
+ ([conf.researchr.org/home/icse-2027/agent-2027](https://conf.researchr.org/home/icse-2027/agent-2027)).
13
+ Sources read 2026-10-26: that page, the portal's
14
+ [deadlines page](https://icse2027-agent.hotcrp.com/deadlines), and the
15
+ [ICSE 2027 workshops page](https://conf.researchr.org/track/icse-2027/icse-2027-workshops).
16
+
17
+ ## The venue (2027 edition)
18
+
19
+ - **Venue**: The Second International Workshop on Agentic Engineering, an ICSE 2027 workshop,
20
+ Mon 26 April 2027, Dublin.
21
+ - **Portal**: HotCRP, `https://icse2027-agent.hotcrp.com/` (the page's «Submission link»).
22
+ - **Format**: «formatted according to the IEEE conference proceedings template». No class line is
23
+ given for papers, so the preset keeps the family's `\documentclass[conference]{IEEEtran}`.
24
+ - **Review**: «Submissions will be reviewed single-anonymously.» The authors' names stay on the
25
+ paper; the portal's status data carries no `"blind":true`, which agrees.
26
+ - **Publisher**: «Accepted workshop papers will be published by IEEE.» The page does not say
27
+ «archival» or offer a non-archival choice.
28
+ - **Deadlines (AoE)**: submission 13 Nov 2026, notification 11 Dec 2026, camera-ready 29 Jan 2027.
29
+ The portal reads `"sub":1794657599`, 2026-11-14T11:59:59Z, the end of 13 Nov AoE: the two agree.
30
+
31
+ ## Paper kinds and limits
32
+
33
+ | kind | pages | what it is (the call's words) |
34
+ | ------- | ----: | ------------------------------------------------------------------------------------------------------------------ |
35
+ | `full` | 8 | «Full papers (research or experience): up to 8 pages, including references.» |
36
+ | `short` | 5 | «Short papers (position, emerging research, tool, benchmark, or experience): up to 5 pages, including references.» |
37
+
38
+ 🔴 **The limit is a total, references included**, and «It is not possible to pay for extra pages.»
39
+ `format/page-limit` can only compare banal's body count with the number, so a paper whose body
40
+ fills the pages and whose references stand alone on one more page passes the rule and is over the
41
+ limit. Count the PDF's pages yourself before submitting.
42
+
43
+ ## What else the preset encodes
44
+
45
+ - **The IEEE template**, through `extends: paperlint:ieee-conference` ([`ieee-conference.md`](ieee-conference.md)).
46
+ - **The venue's name** is `AGENT 2027`, with the aliases `AGENT'27` and `AGENT’27` (what
47
+ `tex/venue-leftover` looks for in another venue's paper). «AGENT» alone is an ordinary word, and
48
+ as a name it would flag every paper folder called `agent-…` (`paper/folder-venue-leftover`).
49
+ - **Portal and deadlines** (`portal`, `deadlines`): the submission reading is the portal's and is
50
+ refreshed by paperlint's scheduled workflow; notification and camera-ready are the call's.
51
+
52
+ ## Not verified
53
+
54
+ - **Remote presentation**: neither the workshop page, the ICSE workshops page nor the ICSE 2027
55
+ site's «Attending» menu states a policy. Ask the chairs before relying on one.
56
+ - **AI / LLM usage policy and required sections**: none stated on the workshop page.
57
+ - **The proceedings' class line**: see Format above; the page links the IEEE templates page only.
58
+
59
+ ## What the preset resolves to
60
+
61
+ <!-- paperlint:preset-rules -->
62
+ <!-- prettier-ignore-start -->
63
+ <!-- Generated from agent.jsonc by `npx eslint --fix` (rule preset/card-rules). Edit the preset, not this section. -->
64
+
65
+ **`paperlint:agent`** — venue preset for AGENT 2027 · call for papers: <https://conf.researchr.org/home/icse-2027/agent-2027> · extends `paperlint:ieee-conference`
66
+
67
+ No preset of this chain sets a rule: under it, every rule keeps paperlint's default.
68
+
69
+ <!-- prettier-ignore-end -->
70
+ <!-- /paperlint:preset-rules -->
@@ -0,0 +1,72 @@
1
+ // AGENTVERIFY 2027 (the International Workshop on Infrastructure for Trustworthy Software Agents, an
2
+ // ICSE 2027 workshop) — a VENUE preset over the IEEE conference family. Everything the IEEEtran
3
+ // template decides comes from ieee-conference.jsonc; this file adds what AGENTVERIFY's call sets.
4
+ // Its card, in prose: `agentverify.md` beside this file.
5
+ //
6
+ // Verbatim from https://agentverify2027.github.io/cfp.html (fetched 2026-10-26):
7
+ // «Full Papers: Maximum of 8 pages, including references.»
8
+ // «Short & Demonstration Papers: Maximum of 4 pages, including references.»
9
+ // «Extended Abstracts: Maximum of 2 pages, including references.»
10
+ // «Papers will be submitted via HotCRP and reviewed double-blind. Submissions should follow the
11
+ // IEEE format in line with ICSE 2027 and present an original contribution.»
12
+ // «Papers are due November 13th, 2026 (AoE).»
13
+ // and from https://agentverify2027.github.io/ (same day): «Paper submission deadline November 13,
14
+ // 2026 / Final notification December 11, 2026 / Camera-ready deadline January 29, 2027 / All
15
+ // deadlines are Anywhere on Earth (AoE).»
16
+ {
17
+ "type": "venue",
18
+ "name": "AGENTVERIFY",
19
+ // The call quoted above.
20
+ "url": "https://agentverify2027.github.io/cfp.html",
21
+ "extends": "paperlint:ieee-conference",
22
+
23
+ // «reviewed double-blind» (the call above), and `"blind":true` in the portal's status data
24
+ // (https://icse2027-agentverify.hotcrp.com/deadlines, read 2026-10-26). anonymity/identity then
25
+ // requires the paper's `identity`.
26
+ "blind": true,
27
+
28
+ // «Submit Your Paper →» on the workshop's site: HotCRP.
29
+ "portal": {
30
+ "kind": "hotcrp",
31
+ "url": "https://icse2027-agentverify.hotcrp.com",
32
+ },
33
+
34
+ // The portal's reading: `"sub":1794657599` = 2026-11-14T11:59:59Z = the end of 13 Nov AoE. It
35
+ // agrees with the call and with the ICSE workshops page; the organizers' email of 2026-10-23
36
+ // (agentverify.md) says the same and that there is no separate abstract deadline, so there is no
37
+ // `registration`. Notification and camera-ready are the site's, at the end of the AoE day.
38
+ "deadlines": [
39
+ {
40
+ "what": "submission",
41
+ "at": "2026-11-14T11:59:59Z",
42
+ "source": "portal",
43
+ "url": "https://icse2027-agentverify.hotcrp.com/deadlines",
44
+ "read": "2026-10-26",
45
+ },
46
+ {
47
+ "what": "notification",
48
+ "at": "2026-12-12T11:59:59Z",
49
+ "source": "call",
50
+ "url": "https://agentverify2027.github.io/",
51
+ "read": "2026-10-26",
52
+ },
53
+ {
54
+ "what": "camera-ready",
55
+ "at": "2027-01-30T11:59:59Z",
56
+ "source": "call",
57
+ "url": "https://agentverify2027.github.io/",
58
+ "read": "2026-10-26",
59
+ },
60
+ ],
61
+
62
+ "format": {
63
+ // 🔴 THE LIMITS INCLUDE THE REFERENCES, and no key gates a total: `body_pages_max` is banal's
64
+ // body count, never more than the total, so a paper over it is over the limit; references alone
65
+ // on a page after a full body pass this gate and are still over (agentverify.md).
66
+ "kinds": {
67
+ "full": { "body_pages_max": 8 },
68
+ "short": { "body_pages_max": 4 },
69
+ "abstract": { "body_pages_max": 2 },
70
+ },
71
+ },
72
+ }
@@ -0,0 +1,85 @@
1
+ ---
2
+ title: "AGENTVERIFY @ ICSE — venue card"
3
+ ---
4
+
5
+ # AGENTVERIFY @ ICSE
6
+
7
+ The card of the venue preset `paperlint:agentverify` ([`agentverify.jsonc`](agentverify.jsonc)):
8
+ what the venue asks for, in prose. The numbers a machine checks live in the preset; the section at
9
+ the end is generated from it. The `submit-paper` skill reads this card for the venue's specifics.
10
+
11
+ **Re-verify the call for papers every year**
12
+ ([agentverify2027.github.io/cfp.html](https://agentverify2027.github.io/cfp.html)). Sources read
13
+ 2026-10-26: that page, [the home page](https://agentverify2027.github.io/), the portal's
14
+ [deadlines page](https://icse2027-agentverify.hotcrp.com/deadlines), and the
15
+ [ICSE 2027 workshops page](https://conf.researchr.org/track/icse-2027/icse-2027-workshops). The
16
+ researchr page `conf.researchr.org/home/agentverify-2027` only redirects to the workshop's site.
17
+
18
+ ## The venue (2027 edition)
19
+
20
+ - **Venue**: Workshop on Infrastructure for Trustworthy Software Agents, an ICSE 2027 workshop,
21
+ Sun 25 April 2027, Dublin.
22
+ - **Portal**: HotCRP, `https://icse2027-agentverify.hotcrp.com/` («Submit Your Paper →»).
23
+ - **Format and review**: «Papers will be submitted via HotCRP and reviewed double-blind.
24
+ Submissions should follow the IEEE format in line with ICSE 2027 and present an original
25
+ contribution.» The portal's status data carries `"blind":true`. No class line is given, so the
26
+ preset keeps the family's `\documentclass[conference]{IEEEtran}`.
27
+ - **Publisher**: «Accepted papers will appear in the ICSE 2027 workshop proceedings by default.»
28
+ The ICSE workshops page: «The workshop papers will be published by the IEEE.» The CFP does not
29
+ say what a non-default route would be, or whether it is archival.
30
+ - **Presenting**: «At least one author of each accepted paper must register and present.»
31
+ - **Deadlines (AoE)**: submission 13 Nov 2026, reviews due 5 Dec, final notification 11 Dec 2026,
32
+ camera-ready 29 Jan 2027.
33
+
34
+ ## 🔴 The submission deadline moved
35
+
36
+ The organizers' email of 2026-10-23 (as received by an author; the email itself is not public):
37
+
38
+ > The submission deadline for AGENTVERIFY 2027 has been updated to November 13, 2026. We do not
39
+ > have a separate abstract submission deadline.
40
+
41
+ Source: **organizers' email, 2026-10-23**. On 2026-10-26 every public source agreed with it: the
42
+ CFP, the home page («Papers are due November 13th, 2026 (AoE)»), the ICSE workshops page («Workshop
43
+ Papers Submission Deadline for all Workshops: 13 November 2026») and the portal (`"sub":1794657599`,
44
+ 2026-11-14T11:59:59Z). None of the pages read showed 6 November. If a cached copy of any of them
45
+ does, the email and the live pages win.
46
+
47
+ ## Paper kinds and limits
48
+
49
+ | kind | pages | the call's words |
50
+ | ---------- | ----: | --------------------------------------------------------------------------------------------------------------------------------------- |
51
+ | `full` | 8 | «Full Papers: Maximum of 8 pages, including references.» |
52
+ | `short` | 4 | «Short & Demonstration Papers: Maximum of 4 pages, including references.» |
53
+ | `abstract` | 2 | «Extended Abstracts: Maximum of 2 pages, including references.» They «are free of APC charges and will be included in the proceedings.» |
54
+
55
+ 🔴 **Every limit is a total, references included.** `format/page-limit` can only compare banal's
56
+ body count with the number, so references standing alone on a page after a full body pass the rule
57
+ and are over the limit. Count the PDF's pages yourself before submitting.
58
+
59
+ ## What else the preset encodes
60
+
61
+ - **The IEEE template**, through `extends: paperlint:ieee-conference` ([`ieee-conference.md`](ieee-conference.md)).
62
+ - **Double-blind review** (`blind`), so `anonymity/identity` checks the PDF against the paper's
63
+ declared `identity`.
64
+ - **Portal and deadlines**: the submission reading is the portal's, refreshed by paperlint's
65
+ scheduled workflow; notification and camera-ready are the site's. No `registration`: there is no
66
+ abstract deadline.
67
+
68
+ ## Not verified
69
+
70
+ - **Remote presentation**: not stated (only «must register and present»).
71
+ - **Archival / non-archival choice**: «by default» suggests an alternative; none is described.
72
+ - **AI / LLM usage policy and required sections**: none stated.
73
+
74
+ ## What the preset resolves to
75
+
76
+ <!-- paperlint:preset-rules -->
77
+ <!-- prettier-ignore-start -->
78
+ <!-- Generated from agentverify.jsonc by `npx eslint --fix` (rule preset/card-rules). Edit the preset, not this section. -->
79
+
80
+ **`paperlint:agentverify`** — venue preset for AGENTVERIFY · call for papers: <https://agentverify2027.github.io/cfp.html> · extends `paperlint:ieee-conference`
81
+
82
+ No preset of this chain sets a rule: under it, every rule keeps paperlint's default.
83
+
84
+ <!-- prettier-ignore-end -->
85
+ <!-- /paperlint:preset-rules -->
@@ -30,7 +30,7 @@ versions. `compsoc` changes the text block and the headings, and nothing the `pd
30
30
  <!-- prettier-ignore-start -->
31
31
  <!-- Generated from ieee-conference.jsonc by `npx eslint --fix` (rule preset/card-rules). Edit the preset, not this section. -->
32
32
 
33
- **`paperlint:ieee-conference`** — template family, no venue of its own · extended by `paperlint:aidc`, `paperlint:msr`
33
+ **`paperlint:ieee-conference`** — template family, no venue of its own · extended by `paperlint:agent`, `paperlint:agentverify`, `paperlint:aidc`, `paperlint:msr`, `paperlint:nlbse`
34
34
 
35
35
  No preset of this chain sets a rule: under it, every rule keeps paperlint's default.
36
36
 
@@ -0,0 +1,76 @@
1
+ // NLBSE 2027 (the 6th Natural Language-based Software Engineering Workshop, an ICSE 2027 workshop)
2
+ // — a VENUE preset over the IEEE conference family. Everything the IEEEtran template decides comes
3
+ // from ieee-conference.jsonc; this file adds what NLBSE's call sets. Its card, in prose:
4
+ // `nlbse.md` beside this file.
5
+ //
6
+ // Verbatim from https://conf.researchr.org/home/icse-2027/nlbse-2027 (fetched 2026-10-26):
7
+ // «Full papers (maximum of 8 pages, including references).» · «Education tools and materials
8
+ // (maximum of 8 pages, including references).» · «Replication Studies and Negative results
9
+ // (maximum of 8 pages, including references).» · «Short and demonstration papers (maximum of 4
10
+ // pages, including references).» · «Position papers (maximum of 2 pages, including
11
+ // references).» · «Tool Competition entries (maximum of 4 pages, including references).»
12
+ // «All submissions must conform to the ICSE’27 formatting and submission instructions. All
13
+ // submissions must be anonymized, in PDF format and should be performed electronically through
14
+ // HotCRP: https://icse2027-nlbse.hotcrp.com/.»
15
+ // Dates: «Fri 13 Nov 2026 (updated) Paper submission / Fri 27 Nov 2026 (new) Tool
16
+ // competition/Research challenge paper submission / Fri 11 Dec 2026 Author notification / Fri
17
+ // 29 Jan 2027 Camera ready», «All dates are Anywhere on Earth (AoE).»
18
+ {
19
+ "type": "venue",
20
+ "name": "NLBSE",
21
+ // The call quoted above.
22
+ "url": "https://conf.researchr.org/home/icse-2027/nlbse-2027",
23
+ "extends": "paperlint:ieee-conference",
24
+
25
+ // «All submissions must be anonymized» (the call above), and `"blind":true` in the portal's
26
+ // status data (https://icse2027-nlbse.hotcrp.com/deadlines, read 2026-10-26). The call never
27
+ // says «double-blind»; anonymity/identity then requires the paper's `identity`.
28
+ "blind": true,
29
+
30
+ // «should be performed electronically through HotCRP» (the call above).
31
+ "portal": { "kind": "hotcrp", "url": "https://icse2027-nlbse.hotcrp.com" },
32
+
33
+ // 🔴 THE PORTAL HOLDS NO DEADLINE YET: on 2026-10-26 its status data read `"sub":{"open":false}`
34
+ // with no date, while the call lists 13 Nov. So these are the call's readings, in UTC at the end
35
+ // of the AoE day; the refresh adds the portal's the day it publishes one (the earlier binds).
36
+ // The competition papers' 27 Nov is in the card only: one reading per kind and source.
37
+ "deadlines": [
38
+ {
39
+ "what": "submission",
40
+ "at": "2026-11-14T11:59:59Z",
41
+ "source": "call",
42
+ "url": "https://conf.researchr.org/home/icse-2027/nlbse-2027",
43
+ "read": "2026-10-26",
44
+ },
45
+ {
46
+ "what": "notification",
47
+ "at": "2026-12-12T11:59:59Z",
48
+ "source": "call",
49
+ "url": "https://conf.researchr.org/home/icse-2027/nlbse-2027",
50
+ "read": "2026-10-26",
51
+ },
52
+ {
53
+ "what": "camera-ready",
54
+ "at": "2027-01-30T11:59:59Z",
55
+ "source": "call",
56
+ "url": "https://conf.researchr.org/home/icse-2027/nlbse-2027",
57
+ "read": "2026-10-26",
58
+ },
59
+ ],
60
+
61
+ "format": {
62
+ // 🔴 EVERY LIMIT INCLUDES THE REFERENCES, and no key gates a total: `body_pages_max` is banal's
63
+ // body count, never more than the total, so a paper over it is over the limit; references alone
64
+ // on a page after a full body pass this gate and are still over (nlbse.md). The competition
65
+ // papers' «2-4 pages» (Multitask Code Classification) does not say whether references count, so
66
+ // only the call's «Tool Competition entries» line is a kind; the research challenge has no limit.
67
+ "kinds": {
68
+ "full": { "body_pages_max": 8 },
69
+ "education": { "body_pages_max": 8 },
70
+ "replication": { "body_pages_max": 8 },
71
+ "short": { "body_pages_max": 4 },
72
+ "position": { "body_pages_max": 2 },
73
+ "tool-competition": { "body_pages_max": 4 },
74
+ },
75
+ },
76
+ }
@@ -0,0 +1,85 @@
1
+ ---
2
+ title: "NLBSE @ ICSE — venue card"
3
+ ---
4
+
5
+ # NLBSE @ ICSE
6
+
7
+ The card of the venue preset `paperlint:nlbse` ([`nlbse.jsonc`](nlbse.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
+ **Re-verify the call for papers every year**
12
+ ([conf.researchr.org/home/icse-2027/nlbse-2027](https://conf.researchr.org/home/icse-2027/nlbse-2027)).
13
+ Sources read 2026-10-26: that page, the portal's
14
+ [deadlines page](https://icse2027-nlbse.hotcrp.com/deadlines), and the
15
+ [ICSE 2027 workshops page](https://conf.researchr.org/track/icse-2027/icse-2027-workshops).
16
+
17
+ ## The venue (2027 edition)
18
+
19
+ - **Venue**: The 6th Natural Language-based Software Engineering Workshop, an ICSE 2027 workshop,
20
+ Sun 25 April 2027, Dublin. «NLBSE 2027 is sponsored by ACM SIGSOFT and IEEE-CS TCSE.»
21
+ - **Portal**: HotCRP, `https://icse2027-nlbse.hotcrp.com/`.
22
+ - **Format**: «All submissions must conform to the ICSE’27 formatting and submission instructions.»
23
+ No template or class line is named on the page; the ICSE 2027 workshops page says «The workshop
24
+ papers will be published by the IEEE.» and links the IEEE templates only for workshop proposals.
25
+ The preset keeps the family's `\documentclass[conference]{IEEEtran}`, an inference, not a quote.
26
+ - **Review**: «All submissions must be anonymized, in PDF format». The call never says single- or
27
+ double-blind; the portal's status data carries `"blind":true`, which the preset follows.
28
+ - **Publisher**: the call says only «The accepted submissions will be published in the workshop
29
+ proceedings.» (tool competitions) and «Accepted papers will appear in the NLBSE ’27 proceedings.»
30
+ (research challenge, skill classification). IEEE comes from the ICSE page above. No archival /
31
+ non-archival choice is mentioned.
32
+ - **Deadlines (AoE)**: paper submission 13 Nov 2026 (marked «updated»), tool competition and
33
+ research challenge papers **27 Nov 2026** (marked «new»), notification 11 Dec 2026, camera-ready
34
+ 29 Jan 2027. Only the 13 Nov line is in the preset.
35
+ - 🔴 **Disagreement**: the call lists 13 Nov, but the portal's status data on 2026-10-26 reads
36
+ `"sub":{"open":false}` with no date, i.e. it was closed and showed none. The preset therefore
37
+ carries the call's reading until the portal publishes one.
38
+
39
+ ## Paper kinds and limits
40
+
41
+ Every limit says «including references».
42
+
43
+ | kind | pages | the call's words |
44
+ | ------------------ | ----: | -------------------------------------------------------------------------------------- |
45
+ | `full` | 8 | «Full papers (maximum of 8 pages, including references).» |
46
+ | `education` | 8 | «Education tools and materials (maximum of 8 pages, including references).» |
47
+ | `replication` | 8 | «Replication Studies and Negative results (maximum of 8 pages, including references).» |
48
+ | `short` | 4 | «Short and demonstration papers (maximum of 4 pages, including references).» |
49
+ | `position` | 2 | «Position papers (maximum of 2 pages, including references).» |
50
+ | `tool-competition` | 4 | «Tool Competition entries (maximum of 4 pages, including references).» |
51
+
52
+ Two competition papers have no kind. Multitask Code Classification: «you must write a paper (2-4
53
+ pages)», references not mentioned. The research challenge states no limit.
54
+
55
+ 🔴 **The limits are totals.** `format/page-limit` can only compare banal's body count with the
56
+ number, so references standing alone on a page after a full body pass the rule and are over the
57
+ limit. Count the PDF's pages yourself before submitting.
58
+
59
+ ## What else the preset encodes
60
+
61
+ - **The IEEE template**, through `extends: paperlint:ieee-conference` ([`ieee-conference.md`](ieee-conference.md)).
62
+ - **Anonymous review** (`blind`), so `anonymity/identity` checks the PDF against the paper's
63
+ declared `identity`.
64
+ - **Portal and deadlines**: all three readings are the call's for now (see Disagreement above).
65
+
66
+ ## Not verified
67
+
68
+ - **Remote presentation**: not stated on the page.
69
+ - **AI / LLM usage policy**: not stated. Required content exists only for the competition papers
70
+ (model, pre-processing, tuning, validation results, code link; the challenge: research problem,
71
+ role of natural language, dataset version, methods, findings, reproducibility link).
72
+ - **The template's class line** and **whether a non-archival route exists**: not stated.
73
+
74
+ ## What the preset resolves to
75
+
76
+ <!-- paperlint:preset-rules -->
77
+ <!-- prettier-ignore-start -->
78
+ <!-- Generated from nlbse.jsonc by `npx eslint --fix` (rule preset/card-rules). Edit the preset, not this section. -->
79
+
80
+ **`paperlint:nlbse`** — venue preset for NLBSE · call for papers: <https://conf.researchr.org/home/icse-2027/nlbse-2027> · extends `paperlint:ieee-conference`
81
+
82
+ No preset of this chain sets a rule: under it, every rule keeps paperlint's default.
83
+
84
+ <!-- prettier-ignore-end -->
85
+ <!-- /paperlint:preset-rules -->
@@ -403,6 +403,9 @@ test("the exclude list is exactly the justified set", () => {
403
403
  // skill and CLAUDE.md sources vigiles compiles; a glob's `**` skips a dot directory
404
404
  "**/*.spec.ts",
405
405
  ".github/*.spec.ts",
406
+ // the same two kinds in a maintainer skill, which does not ship (`.claude/skills/<name>/`)
407
+ ".claude/skills/*/*.spec.ts",
408
+ ".claude/skills/*/*.eval.*",
406
409
  // type declarations
407
410
  "**/*.d.ts",
408
411
  "**/*.d.mts",
package/skills/CLAUDE.md CHANGED
@@ -1,4 +1,4 @@
1
- <!-- vigiles:sha256:e0aa2cec8926b04f compiled from skills/CLAUDE.md.spec.ts -->
1
+ <!-- vigiles:sha256:b9427668f4875ea5 compiled from skills/CLAUDE.md.spec.ts -->
2
2
 
3
3
  # CLAUDE.md
4
4
 
@@ -12,7 +12,7 @@ package's location come from `skills/paper-pipeline/scripts/consumer.mjs`; the l
12
12
 
13
13
  ### Skills Ship In Skills
14
14
 
15
- **Guidance only** — Skills ship in `skills/`, never `.claude/skills/`. `paperlint init` symlinks each one into the consumer's `.claude/skills/<name>`; the link's directory name is the skill's name. `skills/` is the npm layout: of 855 packages scanned, 336 shipped `skills/` against 15 `.claude/skills/`. Rejected: leaving the skills for Claude Code to find inside `node_modules` (`docs/install.md`); a symlink loads at startup, deterministically.
15
+ **Guidance only** — Skills ship in `skills/`, never `.claude/skills/`. `paperlint init` symlinks each one into the consumer's `.claude/skills/<name>`; the link's directory name is the skill's name. `skills/` is the npm layout: of 855 packages scanned, 336 shipped `skills/` against 15 `.claude/skills/`. Rejected: leaving the skills for Claude Code to find inside `node_modules` (`docs/install.md`); a symlink loads at startup, deterministically. A skill for working on paperlint itself (it edits this repository's presets, tests or source) does not ship: it lives in `.claude/skills/<name>/` as a real directory, outside `files`, and no shipped skill or user doc names it (`add-venue`).
16
16
 
17
17
  ### A Criterion That Judges Prose
18
18
 
@@ -9,7 +9,7 @@ ${file("src/link-skills.ts")}; install-specific paths are flagged by ${file("esl
9
9
  },
10
10
  rules: {
11
11
  "skills-ship-in-skills": guidance(
12
- "Skills ship in `skills/`, never `.claude/skills/`. `paperlint init` symlinks each one into the consumer's `.claude/skills/<name>`; the link's directory name is the skill's name. `skills/` is the npm layout: of 855 packages scanned, 336 shipped `skills/` against 15 `.claude/skills/`. Rejected: leaving the skills for Claude Code to find inside `node_modules` (`docs/install.md`); a symlink loads at startup, deterministically.",
12
+ "Skills ship in `skills/`, never `.claude/skills/`. `paperlint init` symlinks each one into the consumer's `.claude/skills/<name>`; the link's directory name is the skill's name. `skills/` is the npm layout: of 855 packages scanned, 336 shipped `skills/` against 15 `.claude/skills/`. Rejected: leaving the skills for Claude Code to find inside `node_modules` (`docs/install.md`); a symlink loads at startup, deterministically. A skill for working on paperlint itself (it edits this repository's presets, tests or source) does not ship: it lives in `.claude/skills/<name>/` as a real directory, outside `files`, and no shipped skill or user doc names it (`add-venue`).",
13
13
  ),
14
14
  "a-criterion-that-judges-prose": guidance(
15
15
  'It follows the five principles in `eslint-rules/CLAUDE.md` ("A rule that judges prose"). A skill does not grep prose for what a rule can count.',
@@ -302,7 +302,7 @@ describe("paperlint lint — the paper over its preset, and the project's own pr
302
302
  const r = await lint(root);
303
303
  expect(r.code).toBe(1);
304
304
  expect(r.out).toMatch(
305
- /acm-sigconf, agenticdev, aidc, aisec, ieee-conference, msr, realm/,
305
+ /acm-sigconf, agent, agenticdev, agentverify, aidc, aisec, ieee-conference, msr, nlbse, realm/,
306
306
  );
307
307
  });
308
308
  });
@@ -87,11 +87,14 @@ describe("the shipped cards", () => {
87
87
  // Guards: a glob that matched nothing lints nothing and reports clean.
88
88
  expect(results.map((r) => r.filePath.slice(P.length + 1)).sort()).toEqual([
89
89
  "acm-sigconf.md",
90
+ "agent.md",
90
91
  "agenticdev.md",
92
+ "agentverify.md",
91
93
  "aidc.md",
92
94
  "aisec.md",
93
95
  "ieee-conference.md",
94
96
  "msr.md",
97
+ "nlbse.md",
95
98
  "realm.md",
96
99
  "tex-base.md",
97
100
  ]);
@@ -174,6 +174,53 @@ const FAMILIES = PARSED.filter((p) =>
174
174
  PARSED.some((q) => q.preset.extends === `${SHIPPED_PREFIX}${p.name}`),
175
175
  );
176
176
 
177
+ // What each shipped preset declares itself to be; a new preset adds its row here.
178
+ const DECLARED = {
179
+ "acm-sigconf.jsonc": { type: "family" },
180
+ "agenticdev.jsonc": {
181
+ type: "venue",
182
+ name: "AgenticDev",
183
+ url: "https://conf.researchr.org/home/ase-2026/agenticdev-2026",
184
+ },
185
+ "agent.jsonc": {
186
+ type: "venue",
187
+ name: "AGENT 2027",
188
+ url: "https://conf.researchr.org/home/icse-2027/agent-2027",
189
+ },
190
+ "agentverify.jsonc": {
191
+ type: "venue",
192
+ name: "AGENTVERIFY",
193
+ url: "https://agentverify2027.github.io/cfp.html",
194
+ },
195
+ "aidc.jsonc": {
196
+ type: "venue",
197
+ name: "AIDC",
198
+ url: "https://aidcworkshop.github.io/",
199
+ },
200
+ "aisec.jsonc": {
201
+ type: "venue",
202
+ name: "AISec",
203
+ url: "https://aisec.cc/",
204
+ },
205
+ "ieee-conference.jsonc": { type: "family" },
206
+ "msr.jsonc": {
207
+ type: "venue",
208
+ name: "MSR",
209
+ url: "https://2027.msrconf.org/track/msr-2027-technical-papers",
210
+ },
211
+ "nlbse.jsonc": {
212
+ type: "venue",
213
+ name: "NLBSE",
214
+ url: "https://conf.researchr.org/home/icse-2027/nlbse-2027",
215
+ },
216
+ "realm.jsonc": {
217
+ type: "venue",
218
+ name: "REALM",
219
+ url: "https://realm-workshop.github.io/call_for_papers",
220
+ },
221
+ "tex-base.jsonc": { type: "base" },
222
+ };
223
+
177
224
  describe("what each shipped preset declares itself to be", () => {
178
225
  it("every shipped preset loads and declares what it is; a venue links its call", () => {
179
226
  const declared = Object.fromEntries(
@@ -185,36 +232,7 @@ describe("what each shipped preset declares itself to be", () => {
185
232
  .identity,
186
233
  ]),
187
234
  );
188
- expect(declared).toEqual({
189
- "acm-sigconf.jsonc": { type: "family" },
190
- "agenticdev.jsonc": {
191
- type: "venue",
192
- name: "AgenticDev",
193
- url: "https://conf.researchr.org/home/ase-2026/agenticdev-2026",
194
- },
195
- "aidc.jsonc": {
196
- type: "venue",
197
- name: "AIDC",
198
- url: "https://aidcworkshop.github.io/",
199
- },
200
- "aisec.jsonc": {
201
- type: "venue",
202
- name: "AISec",
203
- url: "https://aisec.cc/",
204
- },
205
- "ieee-conference.jsonc": { type: "family" },
206
- "msr.jsonc": {
207
- type: "venue",
208
- name: "MSR",
209
- url: "https://2027.msrconf.org/track/msr-2027-technical-papers",
210
- },
211
- "realm.jsonc": {
212
- type: "venue",
213
- name: "REALM",
214
- url: "https://realm-workshop.github.io/call_for_papers",
215
- },
216
- "tex-base.jsonc": { type: "base" },
217
- });
235
+ expect(declared).toEqual(DECLARED);
218
236
  });
219
237
 
220
238
  it("the families another preset extends are exactly the ones that declare `family`", () => {
@@ -457,7 +475,7 @@ describe("what does not resolve, and says why", () => {
457
475
  "a shipped name with a typo",
458
476
  "paperlint:agenticdve",
459
477
  "not-found",
460
- /acm-sigconf, agenticdev, aidc, aisec, ieee-conference, msr, realm/,
478
+ /acm-sigconf, agent, agenticdev, agentverify, aidc, aisec, ieee-conference, msr, nlbse, realm/,
461
479
  ],
462
480
  ["the base TeX set", "paperlint:tex-base", "not-found", /agenticdev/],
463
481
  [
@@ -625,11 +643,14 @@ describe("shippedVenueNames — what each shipped venue is called", () => {
625
643
  // A venue is labelled by its `name`, a family by its file name.
626
644
  expect(names.map((n) => n.label)).toEqual([
627
645
  "acm-sigconf",
646
+ "AGENT 2027",
628
647
  "AgenticDev",
648
+ "AGENTVERIFY",
629
649
  "AIDC",
630
650
  "AISec",
631
651
  "ieee-conference",
632
652
  "MSR",
653
+ "NLBSE",
633
654
  "REALM",
634
655
  ]);
635
656
  expect(names.find((n) => n.label === "AISec")?.aliases).toEqual(
@@ -647,11 +668,14 @@ describe("shippedVenueNames — what each shipped venue is called", () => {
647
668
  shippedVenueNames({ files, venuesDir: VENUES }).map((n) => n.label),
648
669
  ).toEqual([
649
670
  "acm-sigconf",
671
+ "AGENT 2027",
650
672
  "AgenticDev",
673
+ "AGENTVERIFY",
651
674
  "AIDC",
652
675
  "AISec",
653
676
  "ieee-conference",
654
677
  "MSR",
678
+ "NLBSE",
655
679
  ]);
656
680
  });
657
681
  });
@@ -998,9 +998,12 @@ describe("otherVenues", () => {
998
998
  if (!aidc.ok) return;
999
999
  expect(otherVenues(aidc.value, deps).map((o) => o.label)).toEqual([
1000
1000
  "acm-sigconf",
1001
+ "AGENT 2027",
1001
1002
  "AgenticDev",
1003
+ "AGENTVERIFY",
1002
1004
  "AISec",
1003
1005
  "MSR",
1006
+ "NLBSE",
1004
1007
  ]);
1005
1008
  });
1006
1009
  });
@@ -270,13 +270,13 @@ describe("pdf/profile — the declaration must resolve, or nothing is judged", (
270
270
  "an unknown venue (a typo would silently disable every check)",
271
271
  { extends: "paperlint:agentic-dev", kind: "short" },
272
272
  "preset",
273
- /agenticdev, aidc, aisec, ieee-conference, msr, realm/,
273
+ /agent, agenticdev, agentverify, aidc, aisec, ieee-conference, msr, nlbse, realm/,
274
274
  ],
275
275
  [
276
276
  "the base TeX set is not a venue",
277
277
  { extends: "paperlint:tex-base" },
278
278
  "preset",
279
- /agenticdev, aidc, aisec, ieee-conference, msr, realm/,
279
+ /agent, agenticdev, agentverify, aidc, aisec, ieee-conference, msr, nlbse, realm/,
280
280
  ],
281
281
  [
282
282
  "paperlint.json that is not JSON",