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
@@ -141,6 +141,8 @@ export const SETTINGS_KEYS: Readonly<Record<string, string>> = Object.freeze({
141
141
  identity:
142
142
  "what identifies the authors — names, handles, emails, affiliations, own project names; a blind venue's PDF must not say any of them — anonymity/identity. The root's list and a paper's are joined",
143
143
  talk: 'how this paper is presented: { "mode": "remote-video", "dir"?, "files"?, "one_slide"? } — the talk/ rules. A paper\'s own; refused in the root file',
144
+ submission:
145
+ "which submission on the venue's portal is this paper's: { \"id\": <number> } — paperlint submission, with the preset's \"portal\". A paper's own; refused in the root file",
144
146
  scripts: "how skill prose names the scripts — consumer.mjs",
145
147
  timezone: "the zone deadline anchors are written in — consumer.mjs",
146
148
  contactEmail: "the polite-pool address for citation lookups — consumer.mjs",
@@ -150,7 +152,10 @@ export const SETTINGS_KEYS: Readonly<Record<string, string>> = Object.freeze({
150
152
  });
151
153
 
152
154
  /** The keys that only mean something for one paper: refused in the root `paperlint.json`. */
153
- export const PAPER_ONLY_KEYS: readonly string[] = Object.freeze(["talk"]);
155
+ export const PAPER_ONLY_KEYS: readonly string[] = Object.freeze([
156
+ "talk",
157
+ "submission",
158
+ ]);
154
159
 
155
160
  /** The keys that only mean something for the whole project: refused in a paper's `paperlint.json`. */
156
161
  export const ROOT_ONLY_KEYS: readonly string[] = Object.freeze([
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Types for `skill-checks.mjs`, for the TypeScript tests that call it. Only what they call is
3
+ * declared; the module stays JavaScript.
4
+ */
5
+
6
+ /** The shared per-skill checks for `skills/<name>/SKILL.md`; rejects naming every failure. */
7
+ export function checkSkill(name: string): Promise<void>;
@@ -22,6 +22,7 @@ import assert from "node:assert/strict";
22
22
  import { existsSync, readFileSync } from "node:fs";
23
23
  import { join } from "node:path";
24
24
  import { recordCheck } from "vigiles";
25
+ import { presetsDir } from "#src/package-dirs";
25
26
 
26
27
  import { SKILLS_DIR, ROOT, load, commands, permits } from "./skill-corpus.mjs";
27
28
 
@@ -35,6 +36,16 @@ import {
35
36
 
36
37
  const PIPELINE = pipelineScripts(scriptsRoot({ env: {}, cwd: ROOT }));
37
38
 
39
+ /** How a skill names a file of the package's presets directory. */
40
+ const PRESETS_PREFIX = "presets/";
41
+
42
+ /** The preset files a skill's text names in code spans (`presets/agenticdev.md`), placeholders left out. */
43
+ export const presetRefs = (src) => [
44
+ ...new Set(
45
+ [...src.matchAll(/`(presets\/[A-Za-z0-9._-]+)`/g)].map((m) => m[1]),
46
+ ),
47
+ ];
48
+
38
49
  /**
39
50
  * Assert everything single-skill about `name`. Throws with EVERY finding, not the first.
40
51
  * Returns the number of skills checked (1) so a caller can report what it actually did.
@@ -145,6 +156,26 @@ export async function checkSkill(name) {
145
156
  }
146
157
  }
147
158
 
159
+ // ═══════════════════════════════════════════════════════════════════════════════════════════════
160
+ // 9. EVERY PRESET FILE the skill names exists in the package. Skills name a venue's card and preset
161
+ // as `presets/<name>.md` / `presets/<name>.jsonc` "in the package" — a path inside the package, the
162
+ // same in every install channel — and the cards once lived under a skill's `references/`, so a
163
+ // name that outlived a move would send the model to a file that is not there. Resolved against
164
+ // the package's presets directory (`#src/package-dirs`, the one module that knows where it is).
165
+ // Placeholders (`presets/<venue>.md`) are not names of a file and are left out.
166
+ // ═══════════════════════════════════════════════════════════════════════════════════════════════
167
+ for (const s of skills) {
168
+ for (const ref of presetRefs(s.src)) {
169
+ const abs = join(presetsDir(), ref.slice(PRESETS_PREFIX.length));
170
+ soft(() =>
171
+ assert.ok(
172
+ existsSync(abs),
173
+ `${s.name}: names \`${ref}\` in the package, and there is no such file (looked at ${abs}).`,
174
+ ),
175
+ );
176
+ }
177
+ }
178
+
148
179
  if (deferred.length) {
149
180
  const e = new Error(
150
181
  `${deferred.length} assertion(s) failed for skill "${name}":\n\n` +
@@ -304,6 +304,17 @@ const PACKAGE_CASES = [
304
304
  ],
305
305
  collides: ["submit-paper"],
306
306
  },
307
+ {
308
+ skill: "submission-portal",
309
+ why: "READ or CHANGE the submission on the HotCRP portal over its API, and prove the portal holds the latest build",
310
+ prompts: [
311
+ "replace the PDF on hotcrp with the new build",
312
+ "проверь, что статья на hotcrp правда в статусе Submitted",
313
+ "залей новый абстракт и пдф в hotcrp, дедлайн через час",
314
+ "какую версию pdf увидят рецензенты — ту, что я собрал сейчас?",
315
+ ],
316
+ collides: ["submit-paper", "osf-artifact-upload"],
317
+ },
307
318
  {
308
319
  skill: "paper-pipeline",
309
320
  why: "DRIVE the whole lifecycle — the conductor, when the ask is the whole arc not one step",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "paperlint",
3
- "version": "6.2.3",
3
+ "version": "7.0.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",
@@ -33,7 +33,7 @@
33
33
  "ts-essentials": "^10.2.1",
34
34
  "typescript": "^6.0.3",
35
35
  "unpdf": "^1.8.1",
36
- "vigiles": "^31.0.1",
36
+ "vigiles": "^32.1.0",
37
37
  "zod": "^4.6.5"
38
38
  },
39
39
  "devDependencies": {
@@ -49,6 +49,7 @@
49
49
  "eslint-plugin-boundaries": "^7.2.0",
50
50
  "eslint-plugin-functional": "^10.0.1",
51
51
  "eslint-plugin-n": "^18.3.0",
52
+ "eslint-plugin-project-structure": "^3.14.5",
52
53
  "eslint-plugin-sonarjs": "^4.2.1",
53
54
  "prettier": "^3.8.1",
54
55
  "semantic-release": "25.0.9",
@@ -132,6 +133,11 @@
132
133
  "types": "./dist/lib/*.d.ts",
133
134
  "default": "./dist/lib/*.js"
134
135
  },
136
+ "#src/*": {
137
+ "paperlint-source": "./src/*.ts",
138
+ "types": "./dist/*.d.ts",
139
+ "default": "./dist/*.js"
140
+ },
135
141
  "#eslint-rules/*": {
136
142
  "paperlint-source": "./eslint-rules/*.ts",
137
143
  "types": "./dist/eslint-rules/*.d.ts",
@@ -6,7 +6,12 @@
6
6
  // the Conference Publishing author instructions for ACM (2026-08-25), which state ACM's own
7
7
  // requirements. A paper may extend this family directly for an ACM venue nobody has profiled:
8
8
  // page size, columns and fonts are checked; with no kinds, the page limit is not.
9
+ //
10
+ // Its card, in prose: `acm-sigconf.md` beside this file.
9
11
  {
12
+ // A template family: it names no venue, so no `name` and no `url` (the venues that extend it do).
13
+ "type": "family",
14
+
10
15
  // `tex/template` requires a paper's class to be acmart WITH `sigconf`: acmart's default format is
11
16
  // `manuscript`, a single-column layout no sigconf venue takes. Other options (review, anonymous,
12
17
  // screen, nonacm) are the paper's to add.
@@ -0,0 +1,43 @@
1
+ ---
2
+ title: "ACM acmart sigconf — template family card"
3
+ ---
4
+
5
+ # ACM `acmart` sigconf
6
+
7
+ The card of the template family `paperlint:acm-sigconf` ([`acm-sigconf.jsonc`](acm-sigconf.jsonc)).
8
+ A family is what a publisher's template decides, whatever the venue: it names no venue and has no
9
+ call for papers. A venue preset extends it and adds what its own call sets — the page limit of each
10
+ kind of paper, and the rules its producer implies. The template is
11
+ [acmart on CTAN](https://ctan.org/pkg/acmart).
12
+
13
+ A paper for an ACM venue that has no preset may extend the family directly: page size, columns and
14
+ fonts are then checked, and the page limit is not (a family has no kinds).
15
+
16
+ ## What the family encodes
17
+
18
+ - **The class**: `\documentclass[sigconf]{acmart}` — `sigconf` is required, since acmart's default
19
+ format is a single-column manuscript no sigconf venue takes. `review`, `anonymous`, `screen` and
20
+ `nonacm` are the paper's to add.
21
+ - **The page**: US letter, 8.5 × 11 in; a text block of at most 18 × 23.5 cm (7.087 × 9.252 in);
22
+ two columns.
23
+ - **The fonts**: Libertine for the text, Biolinum for the title; body text at 9 pt, references from
24
+ 7 to 9 pt (banal measures 0.3 pt high on every template, hence the 0.5 pt tolerance).
25
+ - **TeX packages** on top of the base set: acmart and everything it loads itself — libertine,
26
+ inconsolata and newtx (if any one is missing, acmart silently falls back to Computer Modern), the
27
+ rest found by building and installing what was missing.
28
+
29
+ The numbers were measured on acmart sigconf builds (banal and pdf.js, 2026-08-26) and quoted from
30
+ the Conference Publishing author instructions for ACM (2026-08-25).
31
+
32
+ ## What the family resolves to
33
+
34
+ <!-- paperlint:preset-rules -->
35
+ <!-- prettier-ignore-start -->
36
+ <!-- Generated from acm-sigconf.jsonc by `npx eslint --fix` (rule preset/card-rules). Edit the preset, not this section. -->
37
+
38
+ **`paperlint:acm-sigconf`** — template family, no venue of its own · extended by `paperlint:agenticdev`, `paperlint:aisec`
39
+
40
+ No preset of this chain sets a rule: under it, every rule keeps paperlint's default.
41
+
42
+ <!-- prettier-ignore-end -->
43
+ <!-- /paperlint:preset-rules -->
@@ -1,9 +1,14 @@
1
1
  // AgenticDev (an ASE workshop) — a VENUE preset over the ACM sigconf family. Prose about the venue
2
- // is in agenticdev.md nearby. Everything the ACM template decides (page size, columns, fonts, font
2
+ // is in its card, agenticdev.md beside this file (every preset has one: `npm run lint` fails
3
+ // without it, and the card's rules section is generated from this file). Everything the ACM template decides (page size, columns, fonts, font
3
4
  // sizes, TeX packages) comes from acm-sigconf.jsonc; this file adds what AgenticDev's call for
4
5
  // papers sets.
5
6
  // Source for the numbers: the Conference Publishing author instructions 2026-08-25.
6
7
  {
8
+ "type": "venue",
9
+ "name": "AgenticDev",
10
+ // The workshop's call for papers on the ASE 2026 site.
11
+ "url": "https://conf.researchr.org/home/ase-2026/agenticdev-2026",
7
12
  "extends": "paperlint:acm-sigconf",
8
13
 
9
14
  // What the venue is called in a paper's text (tex/venue-leftover). Its parent conference, ASE,
@@ -63,12 +68,28 @@
63
68
 
64
69
  // The proceedings are produced by Conference Publishing Consulting — agenticdev.md takes its
65
70
  // numbers from their author instructions — which require "balanced columns on the last page, if
66
- // the page is not filled" and sent an accepted camera-ready back for it on 2026-08-29, the day
67
- // after AgenticDev's camera-ready deadline ("Please correct the last page balancing"). So every
68
- // AgenticDev paper gets the optional rule; a paper can still turn it off in its own
69
- // paperlint.json. 120 pt is the rule's default, measured: the balanced build ended 2.7 pt apart,
70
- // the returned one 321.4 pt apart (docs/optional-rules.md).
71
+ // the page is not filled", checked before the proceedings are produced: "problem papers are sent
72
+ // back to the authors". So every AgenticDev paper gets the optional rule; a paper can still turn
73
+ // it off in its own paperlint.json. 120 pt is the rule's default, measured: a balanced build ended
74
+ // 2.7 pt apart, an unbalanced one 321.4 pt apart (docs/optional-rules.md).
75
+ //
76
+ // The same vendor asks for headline style in the title and in every heading. Its help page
77
+ // (https://www.conference-publishing.com/Help.php) defines it: «Headline-Style Capitalization
78
+ // (according to the Chicago Manual of Style, Sections 8.157, 8.158, and 8.159)», with the word
79
+ // lists the rule's chicago-headline style judges by. Its instructions for an event
80
+ // (https://www.conference-publishing.com/Instructions.php?Event=ITICSE18) set both scopes:
81
+ // «The title should use headline-style capitalization (e.g., 'The Best POPL Paper of All Time')»
82
+ // and «All levels of headings use headline-style capitalization.» Its checklist names it, and
83
+ // papers that miss it are returned to their authors. The rule lives here and not in acm-sigconf: ACM's own
84
+ // pages and the other vendors that produce ACM proceedings were not read, and an error on a
85
+ // requirement nobody has seen would block correct papers. A venue whose author kit names the
86
+ // same authority adds the same line; one that names another (APA, IEEE, Springer) waits for that
87
+ // style (docs/rules/tex/heading-case.md, «Adding a style»).
71
88
  "rules": {
72
89
  "pdf/last-page-balance": ["error", { "tolerancePt": 120 }],
90
+ "tex/heading-case": [
91
+ "error",
92
+ { "title": "chicago-headline", "headings": "chicago-headline" },
93
+ ],
73
94
  },
74
95
  }
@@ -0,0 +1,151 @@
1
+ ---
2
+ title: "AgenticDev @ ASE — venue card"
3
+ ---
4
+
5
+ # AgenticDev @ ASE
6
+
7
+ The card of the venue preset `paperlint:agenticdev` ([`agenticdev.jsonc`](agenticdev.jsonc)): what
8
+ the venue asks for, in prose. The numbers a machine checks live in the preset; the section at the
9
+ 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
+ ([conf.researchr.org/home/ase-2026/agenticdev-2026](https://conf.researchr.org/home/ase-2026/agenticdev-2026)):
13
+ dates, limits and tracks change between editions.
14
+
15
+ ## The venue (2026 edition)
16
+
17
+ - **Venue**: Workshop on Agentic AI for Next-Generation Software Development, co-located with
18
+ **ASE** (Automated Software Engineering), Munich, October 2026.
19
+ - **Portal**: HotCRP, `https://agenticdev2026.hotcrp.com/paper/new`.
20
+ - **Deadline**: July 15, 2026, AoE. Notification August 21, camera-ready August 28.
21
+ - **Format**: ACM `\documentclass[sigconf,review,anonymous]{acmart}` → **double-blind**. Build with
22
+ `pdflatex; bibtex; pdflatex; pdflatex`; add `\microtypesetup{expansion=false}` (the most common
23
+ acmart crash).
24
+ - **No supplementary-material field** on the HotCRP form (Title, Submission, Abstract, Authors, ACM
25
+ corresponding, Contacts, PC conflicts). Host the artifact externally (an anonymized view-only
26
+ link) and `\url{}` it in the paper's Availability section; see `submit-paper` §2.
27
+ - **Archival**: accepted papers go into the **ASE workshop proceedings**, with a DOI; selected
28
+ papers are invited to a journal special issue. ASE's publisher **alternates by year** — ASEW '24
29
+ ACM (`10.1145/3691621.*`), ASE 2025 Workshops IEEE (`csdl/proceedings/asew/2025`), the main track
30
+ likewise ('22 ACM, '23 IEEE, '24 ACM, '25 IEEE). There is no dual ACM DL / IEEE Xplore
31
+ publication; the `10.5555` prefix in the ACM DL is a Guide catalog entry, not an ACM
32
+ publication. Confirm the year's publisher with the chairs before paying an article processing
33
+ charge.
34
+
35
+ ## Paper kinds and limits
36
+
37
+ The preset's `format.kinds`; a paper names its own in its `paperlint.json` (`kind`).
38
+
39
+ | kind | body pages | extra pages of references | what it is |
40
+ | ------- | ---------: | ------------------------: | --------------------- |
41
+ | `full` | 10 | 2 | mature work |
42
+ | `short` | 5 | 2 | WIP, vision, position |
43
+ | `demo` | 5 | 2 | demo or tool |
44
+
45
+ At camera-ready the limits stay the same: a sixth page taken by the bibliography of a short paper
46
+ still counts within them.
47
+
48
+ ## What else the preset encodes
49
+
50
+ - **The ACM template**, through `extends: paperlint:acm-sigconf`: letter paper, two columns,
51
+ Libertine at 9 pt, acmart's TeX packages ([`acm-sigconf.md`](acm-sigconf.md)).
52
+ - **Balanced columns on the last page** (`pdf/last-page-balance`, 120 pt tolerance). The proceedings
53
+ are produced by Conference Publishing Consulting, whose author instructions require "balanced
54
+ columns on the last page, if the page is not filled"; problem papers are sent back.
55
+ - **Headline-style capitalization** in the title and every heading (`tex/heading-case`, the
56
+ `chicago-headline` style). The same producer's instructions: «The title should use headline-style
57
+ capitalization» and «All levels of headings use headline-style capitalization», defined on its
58
+ help page as Chicago Manual of Style §§8.157–8.159.
59
+ - **Names**: `AgenticDev` is what `tex/venue-leftover` looks for in another venue's paper; ASE is
60
+ left out on purpose — a three-letter acronym too many sentences use for other things.
61
+ - **The talk** (`talk`): remote presentation by video only, with the numbers below.
62
+
63
+ ## Naming the venue correctly
64
+
65
+ AgenticDev is a workshop of ASE 2026, listed on ASE's own co-located events page; it is **not** the
66
+ ASE main track, which has its own program, committee and selectivity.
67
+
68
+ | write | do not write |
69
+ | ----------------------------------------------------- | ------------------------------------ |
70
+ | "accepted at AgenticDev 2026, a workshop of ASE 2026" | "accepted at ASE 2026" |
71
+ | "workshop paper, ASE 2026 workshop proceedings" | "published at a CORE A\* conference" |
72
+ | "ASE is CORE A\*; AgenticDev is one of its workshops" | "this paper is CORE A\*" |
73
+
74
+ ## Registration
75
+
76
+ Registration of at least one author is a condition of appearing in the proceedings, not only of
77
+ attending. 2026: article processing charge $350 (ACM is fully open access since 2026-01-01), and
78
+ workshop-day registration (non-member) €350 until 08-31, €410 until 09-20, €460 on site.
79
+
80
+ ## PC members (the "PC conflicts" field) — 2026
81
+
82
+ Andrea Rosani (Free U Bozen/Bolzano) · Giuseppe Di Fatta (Free U Bozen/Bolzano) · Jean Marie Mottu
83
+ (Nantes U) · Paolo Papotti (Eurecom) · Simos Gerasimou (Cyprus U of Technology). The list changes
84
+ every year — read the current PC page.
85
+
86
+ ## Topic fit
87
+
88
+ Trustworthiness, verification and validation of AI agents; benchmarking and empirical evaluation;
89
+ integration into developer workflows; agent-based coding and testing.
90
+
91
+ ## Camera-ready (2026 edition)
92
+
93
+ The ACM mechanics are the same for every ACM venue and live one level up, in the `submit-paper`
94
+ skill's `references/publishers/acm.md` (eRights first, the preamble, the copyright block, CCS
95
+ concepts, source files). AgenticDev's own:
96
+
97
+ - **Deadline**: August 28, 2026, 2 PM AoE.
98
+ - **ACM ISBN**: `979-8-4007-2985-0/26/10`.
99
+ - **Copyright block**: `AgenticDev '26, October 12–16, 2026, Munich, Germany`.
100
+ - **No longer double-blind**: the `review` and `anonymous` class options come off for the final.
101
+ - **Title changes are allowed** — the portal asks for the title "exactly as it should appear in the
102
+ ACM DL". Decide before eRights.
103
+
104
+ ## The talk (2026 edition)
105
+
106
+ **The deadline and the upload channel come from the parent conference's not-in-person page, not
107
+ from this card** — look it up again for each edition.
108
+
109
+ Remote presentation is allowed, but there is no live slot: the workshop adopts ASE 2026's
110
+ [Not-in-Person Presentations](https://conf.researchr.org/track/ase-2026/ase-2026-not-in-person-presentations)
111
+ policy:
112
+
113
+ > ASE 2026 does not provide presentation slots for papers that are not presented in-person by one
114
+ > of the authors.
115
+
116
+ The author sends instead:
117
+
118
+ | artifact | what the page says | deadline (2026) |
119
+ | --------- | --------------------------------------------------------------------------------------------------------------------------------- | ----------------- |
120
+ | video | "made available via a dedicated page on the conference website (recommendation: 10 min duration, mp4 file format, HD resolution)" | 2026-10-08 |
121
+ | one-slide | "shown during one of the conference sessions"; no size or format stated | same as the video |
122
+ | poster | optional for the workshop; ASE prints it | 2026-09-21 |
123
+
124
+ **Where to upload**: "find the submission link on the submission page for your paper (see
125
+ author-kit e-mail from Conference Publishing Consulting)" — the same personal page as the
126
+ camera-ready, block "Optional Archive/Appendix/Video/Picture Submissions … Submit Material to ACM".
127
+ "All submitted material will be published in the ACM DL if the publishing-rights agreement gives
128
+ permission for this", so tick permission for auxiliary material in eRights.
129
+
130
+ **The slot**: per the chairs' email to all authors (2026-09-29), a short paper gets 10 minutes in
131
+ total, approximately 6–7 for the presentation and 3–4 for questions. The full-paper slot was not
132
+ stated, so the preset gives `talk` numbers for `short` only. No source requires a live answer to
133
+ questions; put a contact address on the video's last slide and on the one-slide.
134
+
135
+ The `talk/*` rules check the finished files against these numbers: `docs/talk.md`.
136
+
137
+ ## What the preset resolves to
138
+
139
+ <!-- paperlint:preset-rules -->
140
+ <!-- prettier-ignore-start -->
141
+ <!-- Generated from agenticdev.jsonc by `npx eslint --fix` (rule preset/card-rules). Edit the preset, not this section. -->
142
+
143
+ **`paperlint:agenticdev`** — venue preset for AgenticDev · call for papers: <https://conf.researchr.org/home/ase-2026/agenticdev-2026> · extends `paperlint:acm-sigconf`
144
+
145
+ | rule | severity | options | set in |
146
+ | --- | --- | --- | --- |
147
+ | [`pdf/last-page-balance`](../docs/rules.md) | error | `{"tolerancePt":120}` | this preset |
148
+ | [`tex/heading-case`](../docs/rules/tex/heading-case.md) | error | `{"title":"chicago-headline","headings":"chicago-headline"}` | this preset |
149
+
150
+ <!-- prettier-ignore-end -->
151
+ <!-- /paperlint:preset-rules -->
@@ -19,13 +19,25 @@
19
19
  // what refuses the upload.
20
20
  //
21
21
  // THE REVIEW IS DOUBLE-BLIND: `"blind":true` in the same portal data, and the call above.
22
+ //
23
+ // Its card, in prose: `aidc.md` beside this file.
22
24
  {
25
+ "type": "venue",
26
+ "name": "AIDC",
27
+ // The call quoted above.
28
+ "url": "https://aidcworkshop.github.io/",
23
29
  "extends": "paperlint:ieee-conference",
24
30
 
25
31
  // «Submissions must be properly anonymized for double-blind review.» (the call above), and
26
32
  // `"blind":true` in the portal's data. anonymity/identity then requires the paper's `identity`.
27
33
  "blind": true,
28
34
 
35
+ // Where submissions go: the HotCRP site named in the deadline note above. `paperlint submission`
36
+ // reads and updates a paper's submission there through HotCRP's API (`/api/paper`). Recorded
37
+ // 2026-10-03: `/api/whoami` on this site answers 401 "Missing credentials" without a token —
38
+ // the HotCRP API, there.
39
+ "portal": { "kind": "hotcrp", "url": "https://aidc.submit.acsac.org" },
40
+
29
41
  // What the venue is called in a paper's text (tex/venue-leftover): the workshop, and the
30
42
  // conference it is held at.
31
43
  "aliases": ["AIDC", "ACSAC"],
@@ -0,0 +1,75 @@
1
+ ---
2
+ title: "AIDC @ IEEE ACSAC — venue card"
3
+ ---
4
+
5
+ # AIDC @ IEEE ACSAC
6
+
7
+ The card of the venue preset `paperlint:aidc` ([`aidc.jsonc`](aidc.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** ([aidcworkshop.github.io](https://aidcworkshop.github.io/)).
12
+
13
+ ## The venue (2026 edition, the first)
14
+
15
+ - **Venue**: Workshop on Agentic AI in Offensive and Defensive Cyber Operations, held at
16
+ **IEEE ACSAC 2026** (Annual Computer Security Applications Conference).
17
+ - **Format**, verbatim from the call: «All submitted papers must be prepared in US Letter size, not
18
+ A4, using the double-column IEEE conference format. This requirement will be strictly enforced.»
19
+ and «LaTeX submissions must use the IEEEtran.cls version 1.8b template with the
20
+ \documentclass[conference,compsoc]{IEEEtran} document class option.»
21
+ - **Double-blind**: «Submissions must be properly anonymized for double-blind review.», and
22
+ `"blind":true` in the portal's data.
23
+ - **Portal**: HotCRP at `https://aidc.submit.acsac.org`.
24
+ - 🔴 **The deadline people get wrong**: the HotCRP portal closes 2026-10-02 11:59:59 UTC
25
+ (`"sub":1790942399` on `https://aidc.submit.acsac.org/deadlines`), while the workshop page says
26
+ «October 2, 2026 (Anywhere-on-Earth, AoE)» — a day later. The portal is what refuses the upload.
27
+
28
+ ## Paper kinds and limits
29
+
30
+ | kind | body pages | what it is |
31
+ | --------- | ---------: | ------------------------------------------------------------------------------------------------------------- |
32
+ | `regular` | 12 | «Regular technical papers: Up to 12 pages excluding references and appendices.» |
33
+ | `short` | 6 | «Short position papers or work-in-progress (WIP) papers: Up to 6 pages, excluding references and appendices.» |
34
+
35
+ References, appendices and the LLM Usage Statement are unlimited. 🔴 **The body is counted up to
36
+ where the references start** (`format.body_ends_at: "references"`), not by banal's count: banal
37
+ calls any page with non-bibliography text body, so an LLM Usage Statement or an appendix placed
38
+ before the references would push a paper whose body ends at the foot of page 12 to «body 13».
39
+ See `docs/rules/format/page-limit.md`.
40
+
41
+ ## What else the preset encodes
42
+
43
+ - **The IEEE template**, through `extends: paperlint:ieee-conference` — letter paper, two columns,
44
+ Times at 10 pt, IEEEtran's TeX packages ([`ieee-conference.md`](ieee-conference.md)) — with the
45
+ `compsoc` option required in the class line (`tex/template`) and compsoc's text block,
46
+ 7.00 × 9.02 in.
47
+ - **The LLM Usage Statement** (`required_sections`). The call: «Authors must follow the ACSAC AI
48
+ Usage Policy for all workshop submissions.» The policy (`https://www.acsac.org/2026/submissions/ai/`):
49
+ «If LLMs are used, authors must include a separate, clearly marked section titled "LLM Usage
50
+ Statement" at the end of the paper. This section does not count towards the page limit.» and
51
+ «Failure to comply with these requirements is grounds for desk rejection without further
52
+ review.» `tex/required-section` cannot know whether LLMs were used, so it requires the section
53
+ always — an author who used none says so in it. A bold paragraph is not a section with this
54
+ title and does not count.
55
+ - **Double-blind review** (`blind`), so `anonymity/identity` checks the PDF against the paper's
56
+ declared `identity`.
57
+ - **Where submissions go** (`portal`): `paperlint submission` reads and updates a paper's
58
+ submission through HotCRP's API on that site.
59
+ - **Names**: `AIDC` and `ACSAC`, what `tex/venue-leftover` looks for in another venue's paper.
60
+ - **The register of the body** (`register`): the workshop's first edition has no accepted papers,
61
+ so the bands of `tex/contrast-frames`, `tex/claim-emphasis` and `tex/relation-markers` are set by
62
+ five accepted ACSAC papers on the same template, in `fixtures/accepted-papers/`.
63
+
64
+ ## What the preset resolves to
65
+
66
+ <!-- paperlint:preset-rules -->
67
+ <!-- prettier-ignore-start -->
68
+ <!-- Generated from aidc.jsonc by `npx eslint --fix` (rule preset/card-rules). Edit the preset, not this section. -->
69
+
70
+ **`paperlint:aidc`** — venue preset for AIDC · call for papers: <https://aidcworkshop.github.io/> · extends `paperlint:ieee-conference`
71
+
72
+ No preset of this chain sets a rule: under it, every rule keeps paperlint's default.
73
+
74
+ <!-- prettier-ignore-end -->
75
+ <!-- /paperlint:preset-rules -->
@@ -1,6 +1,6 @@
1
1
  // AISec @ ACM CCS — a VENUE preset over the ACM sigconf family. Data for the `pdf/*` rules over
2
2
  // `_build/paper.facts.json`.
3
- // Prose about the venue and tracks is in `aisec.md` nearby.
3
+ // Prose about the venue and tracks is in its card, `aisec.md` beside this file.
4
4
  //
5
5
  // PAGE LIMITS — verbatim from https://aisec.cc/ (verified 2026-08-26, not from memory):
6
6
  // «Submitted papers must be at most 10 pages long in double-column ACM format---excluding
@@ -23,6 +23,10 @@
23
23
  // but that is the main conference). Turn pdf/last-page-balance on in the paper's paperlint.json if
24
24
  // the camera-ready instructions ask for it.
25
25
  {
26
+ "type": "venue",
27
+ "name": "AISec",
28
+ // The call quoted above.
29
+ "url": "https://aisec.cc/",
26
30
  "extends": "paperlint:acm-sigconf",
27
31
 
28
32
  // What the venue is called in a paper's text (tex/venue-leftover): the workshop, and the
@@ -0,0 +1,117 @@
1
+ ---
2
+ title: "AISec @ ACM CCS — venue card"
3
+ ---
4
+
5
+ # AISec @ ACM CCS
6
+
7
+ The card of the venue preset `paperlint:aisec` ([`aisec.jsonc`](aisec.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** ([aisec.cc](https://aisec.cc/)) — deadline, page limit
12
+ and tracks shift between editions.
13
+
14
+ ## The bar
15
+
16
+ AISec is the long-running AI-security workshop of **ACM CCS**, a top security conference — not a
17
+ first-edition workshop. Mature threat modelling, honest evaluation and sound ethics are expected,
18
+ not rewarded: a security committee rejects on soundness and ethics grounds that a software
19
+ engineering workshop would wave through.
20
+
21
+ ## The venue (2026 edition)
22
+
23
+ - **Venue**: ACM Workshop on Artificial Intelligence and Security (**AISec**), co-located with
24
+ **ACM CCS** (Computer and Communications Security).
25
+ - **Deadline**: 24 July 2026 (check the AoE cutoff on the call each cycle).
26
+ - **Tracks**: full research papers; **benchmark papers** (new evaluation frameworks or datasets
27
+ **with artifact sharing** — a track of its own); position and SoK (systematization of knowledge)
28
+ papers. Pitch to the bar of the chosen track.
29
+ - **Format**: ACM double-column (`sigconf`). Build with `pdflatex; bibtex; pdflatex; pdflatex`; add
30
+ `\microtypesetup{expansion=false}` (the most common acmart crash).
31
+ - **Blind model**: **double-blind** — `\documentclass[sigconf,review,anonymous]{acmart}`, author
32
+ `Anonymous Author(s)`. See `submit-paper` §0/§4.
33
+ - **Archival**: accepted papers go into the CCS workshop proceedings in the ACM Digital Library,
34
+ with a DOI.
35
+ - **No supplementary-material field** on the form: host the artifact externally, anonymized (a
36
+ view-only link), and `\url{}` it in the Availability section. See `submit-paper` §2 and
37
+ `paper-pipeline/references/anonymization.md`.
38
+
39
+ ## Paper kinds and limits
40
+
41
+ Verbatim from the call: «Submitted papers must be at most 10 pages long in double-column ACM
42
+ format---excluding bibliography and well-marked appendices, for which up to two additional pages
43
+ can be used (hence, the paper's overall length must be of 12 pages at most).»
44
+
45
+ The limits are the same for every track; the preset keeps one kind per track so a paper's
46
+ `paperlint.json` says which track it was submitted under.
47
+
48
+ | kind | body pages | pages of bibliography and appendices |
49
+ | ----------- | ---------: | -----------------------------------: |
50
+ | `research` | 10 | 2 |
51
+ | `benchmark` | 10 | 2 |
52
+ | `position` | 10 | 2 |
53
+ | `sok` | 10 | 2 |
54
+
55
+ ⚠️ The venue tolerates a 13th page that holds **only** the generative-AI paragraph («Too many pages:
56
+ the limit is 12 pages, found 13» is then acceptable). `format/page-limit` does not know this
57
+ exception and reports the 13th page; a person clears that case by eye.
58
+
59
+ ## What else the preset encodes
60
+
61
+ - **The ACM template**, through `extends: paperlint:acm-sigconf` — AISec points to the main ACM
62
+ CCS formatting instructions and publishes no numbers of its own ([`acm-sigconf.md`](acm-sigconf.md)).
63
+ - **Names**: `AISec` and `ACM CCS`, what `tex/venue-leftover` looks for in another venue's paper.
64
+ - **No rules of its own**: nothing says who produces the AISec proceedings or whether they require
65
+ a balanced last page. A paper turns `pdf/last-page-balance` on in its own `paperlint.json` if the
66
+ camera-ready instructions ask for it.
67
+
68
+ ## What decides acceptance at a security venue
69
+
70
+ 1. **Threat-model soundness.** Name the attacker and their capabilities (what they observe and
71
+ control, their goal, their budget), and separate accidental failure from an adaptive adversary
72
+ — conflating the two is the classic reject. The threat model goes up front.
73
+ 2. **Ethics and responsible disclosure — a hard reject vector.**
74
+ - Anonymize studied third parties too: aggregate statistics and use anonymized IDs for the
75
+ entities studied, rather than naming maintainers or projects.
76
+ - Disclose findings to affected parties **before** any de-anonymized release; the paper states
77
+ the disclosure timeline and the release gate that holds de-anonymized data back until then.
78
+ - The anonymized artifact must itself be leak-free — the released files, not just the PDF. A
79
+ named entity in the artifact is invisible to a paper-only read.
80
+ 3. **Dual use.** A paper that publishes an evasion or attack technique publishes its fix with it.
81
+ 4. **Generative-AI disclosure.** ACM and CCS require stating how generative AI was used in the
82
+ work (writing, code, experiments).
83
+
84
+ ## Track fit
85
+
86
+ Adversarial ML, ML for security and security for ML, LLM and agent safety and security, evaluation
87
+ and benchmarking of AI-security defenses, poisoning, evasion and extraction, and rigorous
88
+ measurement of whether a claimed safety mechanism holds. A measurement paper that ships a reusable
89
+ evaluation framework and an anonymized artifact fits the benchmark track; name the track in the
90
+ abstract.
91
+
92
+ ## Compose with
93
+
94
+ - `submit-paper` — the mechanics: HotCRP form, anonymous artifact hosting, "ready for review".
95
+ - `camera-ready` — de-anonymization and the release gate after acceptance.
96
+ - `pc-panel-review` — its ethics lens and artifact-runner lens (plant a leak, confirm it is caught).
97
+ - `paper-pipeline/references/artifact-checklist.md` and `paper-pipeline/references/anonymization.md`.
98
+
99
+ ## Camera-ready
100
+
101
+ AISec is an ACM venue, so the final's mechanics are the ACM ones in the `submit-paper` skill's
102
+ `references/publishers/acm.md`: eRights first (it needs the final title), the preamble out of
103
+ submission mode, source files beside the PDF, CCS concepts from the 2012 CCS browser. AISec's own
104
+ DOI, ISBN, copyright line and dates are added here when the venue publishes them.
105
+
106
+ ## What the preset resolves to
107
+
108
+ <!-- paperlint:preset-rules -->
109
+ <!-- prettier-ignore-start -->
110
+ <!-- Generated from aisec.jsonc by `npx eslint --fix` (rule preset/card-rules). Edit the preset, not this section. -->
111
+
112
+ **`paperlint:aisec`** — venue preset for AISec · call for papers: <https://aisec.cc/> · extends `paperlint:acm-sigconf`
113
+
114
+ No preset of this chain sets a rule: under it, every rule keeps paperlint's default.
115
+
116
+ <!-- prettier-ignore-end -->
117
+ <!-- /paperlint:preset-rules -->