paperlint 2.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 (762) hide show
  1. package/.github/dependabot.yml +72 -0
  2. package/.github/workflows/ci.yml +297 -0
  3. package/.github/workflows/dependabot-automerge.yml +70 -0
  4. package/.github/workflows/pr-title.yml +59 -0
  5. package/.github/workflows/release.yml +54 -0
  6. package/CLAUDE.md +598 -0
  7. package/CONTRIBUTING.md +159 -0
  8. package/LICENSE +21 -0
  9. package/README.md +240 -0
  10. package/action.harness.mjs +287 -0
  11. package/action.mutations.mjs +162 -0
  12. package/action.yml +138 -0
  13. package/bin/rpp.mjs +43 -0
  14. package/dist/action-ref.d.ts +12 -0
  15. package/dist/action-ref.d.ts.map +1 -0
  16. package/dist/action-ref.js +16 -0
  17. package/dist/action-ref.js.map +1 -0
  18. package/dist/adapters/banal/failure.d.ts +73 -0
  19. package/dist/adapters/banal/failure.d.ts.map +1 -0
  20. package/dist/adapters/banal/failure.js +58 -0
  21. package/dist/adapters/banal/failure.js.map +1 -0
  22. package/dist/adapters/banal/index.d.ts +17 -0
  23. package/dist/adapters/banal/index.d.ts.map +1 -0
  24. package/dist/adapters/banal/index.js +56 -0
  25. package/dist/adapters/banal/index.js.map +1 -0
  26. package/dist/adapters/banal/install.d.ts +26 -0
  27. package/dist/adapters/banal/install.d.ts.map +1 -0
  28. package/dist/adapters/banal/install.js +15 -0
  29. package/dist/adapters/banal/install.js.map +1 -0
  30. package/dist/adapters/banal/invocation.d.ts +48 -0
  31. package/dist/adapters/banal/invocation.d.ts.map +1 -0
  32. package/dist/adapters/banal/invocation.js +43 -0
  33. package/dist/adapters/banal/invocation.js.map +1 -0
  34. package/dist/adapters/banal/locate.d.ts +50 -0
  35. package/dist/adapters/banal/locate.d.ts.map +1 -0
  36. package/dist/adapters/banal/locate.js +34 -0
  37. package/dist/adapters/banal/locate.js.map +1 -0
  38. package/dist/adapters/banal/output.d.ts +27 -0
  39. package/dist/adapters/banal/output.d.ts.map +1 -0
  40. package/dist/adapters/banal/output.js +112 -0
  41. package/dist/adapters/banal/output.js.map +1 -0
  42. package/dist/adapters/banal/pin.d.ts +19 -0
  43. package/dist/adapters/banal/pin.d.ts.map +1 -0
  44. package/dist/adapters/banal/pin.js +15 -0
  45. package/dist/adapters/banal/pin.js.map +1 -0
  46. package/dist/adapters/banal/probe.d.ts +12 -0
  47. package/dist/adapters/banal/probe.d.ts.map +1 -0
  48. package/dist/adapters/banal/probe.js +27 -0
  49. package/dist/adapters/banal/probe.js.map +1 -0
  50. package/dist/adapters/banal/run.d.ts +89 -0
  51. package/dist/adapters/banal/run.d.ts.map +1 -0
  52. package/dist/adapters/banal/run.js +104 -0
  53. package/dist/adapters/banal/run.js.map +1 -0
  54. package/dist/adapters/banal/settings.d.ts +18 -0
  55. package/dist/adapters/banal/settings.d.ts.map +1 -0
  56. package/dist/adapters/banal/settings.js +29 -0
  57. package/dist/adapters/banal/settings.js.map +1 -0
  58. package/dist/adapters/banal/xml.d.ts +48 -0
  59. package/dist/adapters/banal/xml.d.ts.map +1 -0
  60. package/dist/adapters/banal/xml.js +67 -0
  61. package/dist/adapters/banal/xml.js.map +1 -0
  62. package/dist/adapters/curl/download.io.d.ts +14 -0
  63. package/dist/adapters/curl/download.io.d.ts.map +1 -0
  64. package/dist/adapters/curl/download.io.js +69 -0
  65. package/dist/adapters/curl/download.io.js.map +1 -0
  66. package/dist/adapters/curl/index.d.ts +6 -0
  67. package/dist/adapters/curl/index.d.ts.map +1 -0
  68. package/dist/adapters/curl/index.js +6 -0
  69. package/dist/adapters/curl/index.js.map +1 -0
  70. package/dist/adapters/memory/index.d.ts +43 -0
  71. package/dist/adapters/memory/index.d.ts.map +1 -0
  72. package/dist/adapters/memory/index.js +79 -0
  73. package/dist/adapters/memory/index.js.map +1 -0
  74. package/dist/adapters/node/files.io.d.ts +3 -0
  75. package/dist/adapters/node/files.io.d.ts.map +1 -0
  76. package/dist/adapters/node/files.io.js +31 -0
  77. package/dist/adapters/node/files.io.js.map +1 -0
  78. package/dist/adapters/node/host.io.d.ts +3 -0
  79. package/dist/adapters/node/host.io.d.ts.map +1 -0
  80. package/dist/adapters/node/host.io.js +14 -0
  81. package/dist/adapters/node/host.io.js.map +1 -0
  82. package/dist/adapters/node/index.d.ts +25 -0
  83. package/dist/adapters/node/index.d.ts.map +1 -0
  84. package/dist/adapters/node/index.js +14 -0
  85. package/dist/adapters/node/index.js.map +1 -0
  86. package/dist/adapters/node/process.io.d.ts +14 -0
  87. package/dist/adapters/node/process.io.d.ts.map +1 -0
  88. package/dist/adapters/node/process.io.js +41 -0
  89. package/dist/adapters/node/process.io.js.map +1 -0
  90. package/dist/adapters/node/workspace.io.d.ts +4 -0
  91. package/dist/adapters/node/workspace.io.d.ts.map +1 -0
  92. package/dist/adapters/node/workspace.io.js +33 -0
  93. package/dist/adapters/node/workspace.io.js.map +1 -0
  94. package/dist/adapters/pdfjs/fill.d.ts +42 -0
  95. package/dist/adapters/pdfjs/fill.d.ts.map +1 -0
  96. package/dist/adapters/pdfjs/fill.js +91 -0
  97. package/dist/adapters/pdfjs/fill.js.map +1 -0
  98. package/dist/build-engine.d.ts +48 -0
  99. package/dist/build-engine.d.ts.map +1 -0
  100. package/dist/build-engine.js +148 -0
  101. package/dist/build-engine.js.map +1 -0
  102. package/dist/build.d.ts +163 -0
  103. package/dist/build.d.ts.map +1 -0
  104. package/dist/build.js +575 -0
  105. package/dist/build.js.map +1 -0
  106. package/dist/cli.d.ts +151 -0
  107. package/dist/cli.d.ts.map +1 -0
  108. package/dist/cli.js +951 -0
  109. package/dist/cli.js.map +1 -0
  110. package/dist/doctor.d.ts +42 -0
  111. package/dist/doctor.d.ts.map +1 -0
  112. package/dist/doctor.js +280 -0
  113. package/dist/doctor.js.map +1 -0
  114. package/dist/domain/geometry.d.ts +71 -0
  115. package/dist/domain/geometry.d.ts.map +1 -0
  116. package/dist/domain/geometry.js +35 -0
  117. package/dist/domain/geometry.js.map +1 -0
  118. package/dist/domain/host.d.ts +16 -0
  119. package/dist/domain/host.d.ts.map +1 -0
  120. package/dist/domain/host.js +8 -0
  121. package/dist/domain/host.js.map +1 -0
  122. package/dist/domain/page-layout.d.ts +34 -0
  123. package/dist/domain/page-layout.d.ts.map +1 -0
  124. package/dist/domain/page-layout.js +8 -0
  125. package/dist/domain/page-layout.js.map +1 -0
  126. package/dist/domain/paths.d.ts +5 -0
  127. package/dist/domain/paths.d.ts.map +1 -0
  128. package/dist/domain/paths.js +2 -0
  129. package/dist/domain/paths.js.map +1 -0
  130. package/dist/domain/result.d.ts +23 -0
  131. package/dist/domain/result.d.ts.map +1 -0
  132. package/dist/domain/result.js +10 -0
  133. package/dist/domain/result.js.map +1 -0
  134. package/dist/domain/sha256.d.ts +7 -0
  135. package/dist/domain/sha256.d.ts.map +1 -0
  136. package/dist/domain/sha256.js +14 -0
  137. package/dist/domain/sha256.js.map +1 -0
  138. package/dist/domain/text.d.ts +6 -0
  139. package/dist/domain/text.d.ts.map +1 -0
  140. package/dist/domain/text.js +7 -0
  141. package/dist/domain/text.js.map +1 -0
  142. package/dist/engine.d.ts +93 -0
  143. package/dist/engine.d.ts.map +1 -0
  144. package/dist/engine.js +119 -0
  145. package/dist/engine.js.map +1 -0
  146. package/dist/exit-code.d.ts +22 -0
  147. package/dist/exit-code.d.ts.map +1 -0
  148. package/dist/exit-code.js +10 -0
  149. package/dist/exit-code.js.map +1 -0
  150. package/dist/facts-file.d.ts +96 -0
  151. package/dist/facts-file.d.ts.map +1 -0
  152. package/dist/facts-file.js +134 -0
  153. package/dist/facts-file.js.map +1 -0
  154. package/dist/hooks-settings.d.ts +141 -0
  155. package/dist/hooks-settings.d.ts.map +1 -0
  156. package/dist/hooks-settings.js +306 -0
  157. package/dist/hooks-settings.js.map +1 -0
  158. package/dist/init.d.ts +201 -0
  159. package/dist/init.d.ts.map +1 -0
  160. package/dist/init.js +579 -0
  161. package/dist/init.js.map +1 -0
  162. package/dist/latex-log.d.ts +80 -0
  163. package/dist/latex-log.d.ts.map +1 -0
  164. package/dist/latex-log.js +187 -0
  165. package/dist/latex-log.js.map +1 -0
  166. package/dist/latex-loop.d.ts +129 -0
  167. package/dist/latex-loop.d.ts.map +1 -0
  168. package/dist/latex-loop.js +113 -0
  169. package/dist/latex-loop.js.map +1 -0
  170. package/dist/link-skills.d.ts +51 -0
  171. package/dist/link-skills.d.ts.map +1 -0
  172. package/dist/link-skills.js +199 -0
  173. package/dist/link-skills.js.map +1 -0
  174. package/dist/new-paper.d.ts +48 -0
  175. package/dist/new-paper.d.ts.map +1 -0
  176. package/dist/new-paper.js +110 -0
  177. package/dist/new-paper.js.map +1 -0
  178. package/dist/pdf-facts.d.ts +44 -0
  179. package/dist/pdf-facts.d.ts.map +1 -0
  180. package/dist/pdf-facts.js +239 -0
  181. package/dist/pdf-facts.js.map +1 -0
  182. package/dist/pdf-geometry.d.ts +170 -0
  183. package/dist/pdf-geometry.d.ts.map +1 -0
  184. package/dist/pdf-geometry.js +158 -0
  185. package/dist/pdf-geometry.js.map +1 -0
  186. package/dist/ports/download.d.ts +9 -0
  187. package/dist/ports/download.d.ts.map +1 -0
  188. package/dist/ports/download.js +2 -0
  189. package/dist/ports/download.js.map +1 -0
  190. package/dist/ports/files.d.ts +11 -0
  191. package/dist/ports/files.d.ts.map +1 -0
  192. package/dist/ports/files.js +2 -0
  193. package/dist/ports/files.js.map +1 -0
  194. package/dist/ports/measure-geometry.d.ts +8 -0
  195. package/dist/ports/measure-geometry.d.ts.map +1 -0
  196. package/dist/ports/measure-geometry.js +2 -0
  197. package/dist/ports/measure-geometry.js.map +1 -0
  198. package/dist/ports/process.d.ts +45 -0
  199. package/dist/ports/process.d.ts.map +1 -0
  200. package/dist/ports/process.js +2 -0
  201. package/dist/ports/process.js.map +1 -0
  202. package/dist/ports/tool-installer.d.ts +29 -0
  203. package/dist/ports/tool-installer.d.ts.map +1 -0
  204. package/dist/ports/tool-installer.js +2 -0
  205. package/dist/ports/tool-installer.js.map +1 -0
  206. package/dist/ports/workspace.d.ts +18 -0
  207. package/dist/ports/workspace.d.ts.map +1 -0
  208. package/dist/ports/workspace.js +2 -0
  209. package/dist/ports/workspace.js.map +1 -0
  210. package/dist/rules-config.d.ts +34 -0
  211. package/dist/rules-config.d.ts.map +1 -0
  212. package/dist/rules-config.js +132 -0
  213. package/dist/rules-config.js.map +1 -0
  214. package/dist/structure.d.ts +34 -0
  215. package/dist/structure.d.ts.map +1 -0
  216. package/dist/structure.js +149 -0
  217. package/dist/structure.js.map +1 -0
  218. package/dist/tex-requirements.d.ts +43 -0
  219. package/dist/tex-requirements.d.ts.map +1 -0
  220. package/dist/tex-requirements.js +127 -0
  221. package/dist/tex-requirements.js.map +1 -0
  222. package/dist/toolchain.d.ts +159 -0
  223. package/dist/toolchain.d.ts.map +1 -0
  224. package/dist/toolchain.js +542 -0
  225. package/dist/toolchain.js.map +1 -0
  226. package/dist/types.d.ts +110 -0
  227. package/dist/types.d.ts.map +1 -0
  228. package/dist/types.js +2 -0
  229. package/dist/types.js.map +1 -0
  230. package/docs/configuration.md +235 -0
  231. package/docs/e2e.md +152 -0
  232. package/docs/incidents.md +59 -0
  233. package/docs/install.md +170 -0
  234. package/docs/optional-rules.md +107 -0
  235. package/docs/package-shape-options.md +262 -0
  236. package/docs/prior-art/README.md +76 -0
  237. package/docs/prior-art/blocking-vs-advisory.md +83 -0
  238. package/docs/prior-art/content-delivery.md +124 -0
  239. package/docs/prior-art/multi-mode-tools.md +106 -0
  240. package/docs/prior-art/nondeterministic-checks.md +99 -0
  241. package/docs/prior-art/package-location.md +422 -0
  242. package/docs/prior-art/paper-folder-scaffolding.md +538 -0
  243. package/docs/prior-art/readme-structure.md +69 -0
  244. package/docs/prior-art/repro/README.md +92 -0
  245. package/docs/prior-art/repro/claim1-allowedtools.mjs +66 -0
  246. package/docs/prior-art/repro/claim1-at2.mjs +40 -0
  247. package/docs/prior-art/repro/claim1-crosschannel.mjs +54 -0
  248. package/docs/prior-art/repro/claim1-frontmatter.mjs +76 -0
  249. package/docs/prior-art/repro/claim1-hook-payload-reporter.mjs +10 -0
  250. package/docs/prior-art/repro/claim1-plugin-frontmatter.mjs +27 -0
  251. package/docs/prior-art/repro/claim1-plugin-skill.mjs +52 -0
  252. package/docs/prior-art/repro/claim1-project-skill.mjs +81 -0
  253. package/docs/prior-art/repro/claim2-marketplace-flat-asclaimed.json +1 -0
  254. package/docs/prior-art/repro/claim2-marketplace-negative-control.json +1 -0
  255. package/docs/prior-art/repro/claim2-marketplace-nested-exact.json +9 -0
  256. package/docs/prior-art/repro/claim2-marketplace-nested-noversion.json +9 -0
  257. package/docs/prior-art/repro/claim2-marketplace-nested-range.json +1 -0
  258. package/docs/prior-art/repro/claim3-imports.mjs +50 -0
  259. package/docs/prior-art/repro/claim4-find-package-json.mjs +8 -0
  260. package/docs/prior-art/repro/claim4-package-dir.mjs +39 -0
  261. package/docs/prior-art/repro/claim4-parent-arg.mjs +17 -0
  262. package/docs/prior-art/repro/claim4-resolve-apis.mjs +21 -0
  263. package/docs/prior-art/repro/claim4-setup-consumers.mjs +45 -0
  264. package/docs/prior-art/repro/claim4-yarn-pnp.mjs +70 -0
  265. package/docs/prior-art/repro/claim5-bin-launch.mjs +39 -0
  266. package/docs/prior-art/repro/claim5-exports-mutation.mjs +57 -0
  267. package/docs/prior-art/repro/claim5-resolved-location-and-bin.mjs +33 -0
  268. package/docs/prior-art/repro/claim6-candidate-ambiguity.mjs +17 -0
  269. package/docs/prior-art/repro/claim6-doc-path-candidates.mjs +27 -0
  270. package/docs/prior-art/test-tooling.md +131 -0
  271. package/docs/rules.md +58 -0
  272. package/docs/texlive-install-decision.md +230 -0
  273. package/docs/toolchain.md +152 -0
  274. package/eslint-rules/doc-fields.harness.mjs +336 -0
  275. package/eslint-rules/doc-fields.mjs +186 -0
  276. package/eslint-rules/doc-fields.mutations.mjs +96 -0
  277. package/eslint-rules/install-path-literals.harness.mjs +121 -0
  278. package/eslint-rules/install-path-literals.mjs +108 -0
  279. package/eslint-rules/install-path-literals.mutations.mjs +62 -0
  280. package/eslint-rules/latex-language.harness.mjs +599 -0
  281. package/eslint-rules/latex-language.mjs +591 -0
  282. package/eslint-rules/latex-language.mutations.mjs +196 -0
  283. package/eslint-rules/paper-research-question.harness.mjs +146 -0
  284. package/eslint-rules/paper-research-question.mjs +180 -0
  285. package/eslint-rules/paper-research-question.mutations.mjs +127 -0
  286. package/eslint-rules/paper-stages.harness.mjs +356 -0
  287. package/eslint-rules/paper-stages.mjs +455 -0
  288. package/eslint-rules/paper-stages.mutations.mjs +157 -0
  289. package/eslint-rules/paper-typography.harness.mjs +291 -0
  290. package/eslint-rules/paper-typography.mjs +313 -0
  291. package/eslint-rules/paper-typography.mutations.mjs +131 -0
  292. package/eslint-rules/papers.harness.mjs +259 -0
  293. package/eslint-rules/papers.mjs +166 -0
  294. package/eslint-rules/papers.mutations.mjs +186 -0
  295. package/eslint-rules/pdf-last-page-balance.harness.mjs +206 -0
  296. package/eslint-rules/pdf-last-page-balance.mjs +208 -0
  297. package/eslint-rules/review-findings-cause.harness.mjs +228 -0
  298. package/eslint-rules/review-findings-cause.mjs +135 -0
  299. package/eslint-rules/review-findings-cause.mutations.mjs +72 -0
  300. package/eslint-rules/temp-root-realpath.harness.mjs +176 -0
  301. package/eslint-rules/temp-root-realpath.mjs +129 -0
  302. package/eslint-rules/temp-root-realpath.mutations.mjs +99 -0
  303. package/eslint-rules/tex-build.harness.mjs +753 -0
  304. package/eslint-rules/tex-build.mjs +322 -0
  305. package/eslint-rules/tex-build.mutations.mjs +258 -0
  306. package/eslint.config.mjs +521 -0
  307. package/fixtures/build-e2e/acmart/PIPELINE-STATUS.md +3 -0
  308. package/fixtures/build-e2e/acmart/paper.tex +11 -0
  309. package/fixtures/build-e2e/acmart/venue.json +1 -0
  310. package/fixtures/build-e2e/broken/PIPELINE-STATUS.md +3 -0
  311. package/fixtures/build-e2e/broken/paper.tex +7 -0
  312. package/fixtures/build-e2e/cite/PIPELINE-STATUS.md +3 -0
  313. package/fixtures/build-e2e/cite/build.sh +5 -0
  314. package/fixtures/build-e2e/cite/paper.tex +10 -0
  315. package/fixtures/build-e2e/cite/refs.bib +9 -0
  316. package/fixtures/build-e2e/empty/PIPELINE-STATUS.md +3 -0
  317. package/fixtures/build-e2e/empty/paper.tex +6 -0
  318. package/fixtures/build-e2e/fallback/PIPELINE-STATUS.md +3 -0
  319. package/fixtures/build-e2e/fallback/paper.tex +11 -0
  320. package/fixtures/build-e2e/guards/PIPELINE-STATUS.md +3 -0
  321. package/fixtures/build-e2e/guards/paper.tex +10 -0
  322. package/fixtures/build-e2e/no-source/PIPELINE-STATUS.md +3 -0
  323. package/fixtures/build-e2e/unbalanced/PIPELINE-STATUS.md +3 -0
  324. package/fixtures/build-e2e/unbalanced/paper.tex +28 -0
  325. package/fixtures/build-e2e/unbalanced/refs.bib +269 -0
  326. package/fixtures/install-path-literals/clean.fixture.mjs +3 -0
  327. package/fixtures/install-path-literals/clean.md +15 -0
  328. package/fixtures/install-path-literals/defect.fixture.mjs +3 -0
  329. package/fixtures/install-path-literals/defect.md +14 -0
  330. package/fixtures/latex-language/clean.tex +50 -0
  331. package/fixtures/latex-language/defect.tex +52 -0
  332. package/fixtures/paper-research-question/comment-only/PIPELINE-STATUS.md +9 -0
  333. package/fixtures/paper-research-question/comment-only/paper.tex +7 -0
  334. package/fixtures/paper-research-question/declared-not-in-paper/PIPELINE-STATUS.md +10 -0
  335. package/fixtures/paper-research-question/declared-not-in-paper/paper.tex +6 -0
  336. package/fixtures/paper-research-question/draft/PIPELINE-STATUS.md +6 -0
  337. package/fixtures/paper-research-question/draft/paper.tex +2 -0
  338. package/fixtures/paper-research-question/markdown-no-rq/PIPELINE-STATUS.md +9 -0
  339. package/fixtures/paper-research-question/markdown-no-rq/paper.md +4 -0
  340. package/fixtures/paper-research-question/shipped-no-rq/PIPELINE-STATUS.md +12 -0
  341. package/fixtures/paper-research-question/shipped-no-rq/paper.tex +3 -0
  342. package/fixtures/paper-research-question/shipped-with-rq/PIPELINE-STATUS.md +10 -0
  343. package/fixtures/paper-research-question/shipped-with-rq/paper.tex +2 -0
  344. package/fixtures/paper-stages/authors-ran/PIPELINE-STATUS.md +16 -0
  345. package/fixtures/paper-stages/marker-in-prose/PIPELINE-STATUS.md +17 -0
  346. package/fixtures/paper-stages/nofile/PIPELINE-STATUS.md +8 -0
  347. package/fixtures/paper-stages/noheader/PIPELINE-STATUS.md +1 -0
  348. package/fixtures/paper-stages/noheader/versions/2026-07-22-submitted.pdf +0 -0
  349. package/fixtures/paper-stages/nothing/PIPELINE-STATUS.md +3 -0
  350. package/fixtures/paper-stages/ok/PIPELINE-STATUS.md +9 -0
  351. package/fixtures/paper-stages/ok/versions/2026-07-22-submitted.pdf +0 -0
  352. package/fixtures/paper-stages/stale/PIPELINE-STATUS.md +1 -0
  353. package/fixtures/paper-stages/stale/versions/2026-07-22-submitted.STALE-WRONG-FILE.pdf +0 -0
  354. package/fixtures/paper-stages/twice/PIPELINE-STATUS.md +14 -0
  355. package/fixtures/paper-stages/twice/versions/2026-08-06-submitted.pdf +0 -0
  356. package/fixtures/paper-stages/twice/versions/2026-10-24-submitted.pdf +0 -0
  357. package/fixtures/paper-stages/undeclared/PIPELINE-STATUS.md +8 -0
  358. package/fixtures/paper-stages/undeclared/versions/2026-07-22-submitted.pdf +0 -0
  359. package/fixtures/paper-stages/undeclared/versions/2026-08-29-camera-ready.pdf +0 -0
  360. package/fixtures/paper-stages/wrongsize/PIPELINE-STATUS.md +8 -0
  361. package/fixtures/paper-stages/wrongsize/versions/2026-07-22-submitted.pdf +0 -0
  362. package/fixtures/paper-typography/clean-paper/paper.tex +29 -0
  363. package/fixtures/paper-typography/messy-paper/paper.tex +27 -0
  364. package/fixtures/pdf-facts/README.md +22 -0
  365. package/fixtures/pdf-facts/corrupt-font.pdf +0 -0
  366. package/fixtures/pdf-facts/encrypted.pdf +0 -0
  367. package/fixtures/pdf-facts/hidden-text.pdf +0 -0
  368. package/fixtures/pdf-facts/hidden-text.tex +28 -0
  369. package/fixtures/pdf-facts/t3-all.pdf +0 -0
  370. package/fixtures/pdf-facts/t3-all.tex +8 -0
  371. package/fixtures/pdf-facts/t3-mixed.pdf +0 -0
  372. package/fixtures/pdf-facts/t3-mixed.tex +9 -0
  373. package/fixtures/pdf-facts/ttf.pdf +2240 -1
  374. package/fixtures/pdf-facts/ttf.tex +6 -0
  375. package/fixtures/real-markdown-paper/baseline.json +24 -0
  376. package/fixtures/real-markdown-paper/baseline.mjs +48 -0
  377. package/fixtures/render-paper/build-clean.sh +25 -0
  378. package/fixtures/render-paper/build-defect.sh +15 -0
  379. package/fixtures/review-findings-cause/clean.md +17 -0
  380. package/fixtures/review-findings-cause/defect.md +14 -0
  381. package/fixtures/review-findings-cause/old-debt.md +14 -0
  382. package/fixtures/review-findings-cause/quiet-in-fence.md +16 -0
  383. package/fixtures/tex-build/clean.tex +21 -0
  384. package/fixtures/tex-build/defect.tex +24 -0
  385. package/fixtures/tex-build/frontmatter-clean.tex +25 -0
  386. package/fixtures/tex-build/frontmatter-defect.tex +23 -0
  387. package/fixtures/toolchain-mirror/catalog.txt +5 -0
  388. package/fixtures/toolchain-mirror/install-tl +27 -0
  389. package/fixtures/toolchain-mirror/release-texlive.txt +3 -0
  390. package/fixtures/toolchain-mirror/release-year +1 -0
  391. package/fixtures/toolchain-mirror/stub-kpsewhich +8 -0
  392. package/fixtures/toolchain-mirror/stub-pdflatex +3 -0
  393. package/fixtures/toolchain-mirror/stub-tlmgr +44 -0
  394. package/hooks/hooks.harness.mjs +713 -0
  395. package/hooks/hooks.mutations.mjs +337 -0
  396. package/hooks/paper-edit-guard.hook.d.mts +13 -0
  397. package/hooks/paper-edit-guard.hook.mjs +457 -0
  398. package/hooks/paper-skills-nudge.hook.mjs +136 -0
  399. package/hooks/paper-status-gates.hook.mjs +156 -0
  400. package/hooks/paper-status-gates.sh +91 -0
  401. package/lib/agent-cli-version.harness.mjs +165 -0
  402. package/lib/agent-cli-version.mjs +106 -0
  403. package/lib/agent-cli-version.mutations.mjs +109 -0
  404. package/lib/markdown.mjs +386 -0
  405. package/lib/mutation-driver.harness.mjs +227 -0
  406. package/lib/mutation-driver.mjs +397 -0
  407. package/lib/mutation-driver.mutations.mjs +68 -0
  408. package/lib/paper-config.d.mts +34 -0
  409. package/lib/paper-config.harness.mjs +286 -0
  410. package/lib/paper-config.mjs +142 -0
  411. package/lib/paper-config.mutations.mjs +143 -0
  412. package/lib/skill-checks.mjs +701 -0
  413. package/lib/skill-corpus.mjs +403 -0
  414. package/lib/skill-eval-fixture.mjs +63 -0
  415. package/lib/skill-eval-kit.mjs +257 -0
  416. package/lib/skill-trigger-cases.harness.mjs +170 -0
  417. package/lib/skill-trigger-cases.mjs +446 -0
  418. package/lib/skill-trigger-cases.mutations.mjs +65 -0
  419. package/lib/trigger-ledger.mjs +215 -0
  420. package/package.json +97 -0
  421. package/plugin/.claude-plugin/plugin.json +8 -0
  422. package/plugin/hooks/hooks.json +30 -0
  423. package/scripts/check.harness.mjs +177 -0
  424. package/scripts/check.mjs +239 -0
  425. package/scripts/check.mutations.mjs +110 -0
  426. package/scripts/eslint-report-guard.mjs +82 -0
  427. package/scripts/exclusive.mjs +138 -0
  428. package/scripts/harness-api.frozen.json +76 -0
  429. package/scripts/harness-api.test.ts +175 -0
  430. package/scripts/layer-legacy-frozen.d.mts +28 -0
  431. package/scripts/layer-legacy-frozen.mjs +152 -0
  432. package/scripts/layer-legacy-frozen.test.ts +115 -0
  433. package/scripts/layer-legacy.frozen.json +50 -0
  434. package/scripts/mutation-batteries-frozen.harness.mjs +204 -0
  435. package/scripts/mutation-batteries-frozen.mjs +238 -0
  436. package/scripts/mutation-batteries.frozen.json +117 -0
  437. package/scripts/release-config.test.ts +90 -0
  438. package/scripts/rules-are-content-only.harness.mjs +113 -0
  439. package/scripts/rules-are-content-only.mjs +138 -0
  440. package/scripts/rules-are-content-only.mutations.mjs +81 -0
  441. package/scripts/rules-see-files.harness.mjs +115 -0
  442. package/scripts/rules-see-files.mjs +99 -0
  443. package/scripts/rules-see-files.mutations.mjs +131 -0
  444. package/scripts/run-mutations.mjs +100 -0
  445. package/scripts/semantic-release-plugins.d.ts +16 -0
  446. package/skills/README.md +15 -0
  447. package/skills/analyze-sibling-paper/SKILL.md +170 -0
  448. package/skills/analyze-sibling-paper/SKILL.md.spec.ts +186 -0
  449. package/skills/analyze-sibling-paper/analyze-sibling-paper.eval.mjs +19 -0
  450. package/skills/analyze-sibling-paper/analyze-sibling-paper.harness.mjs +23 -0
  451. package/skills/argument-arc/SKILL.md +177 -0
  452. package/skills/argument-arc/SKILL.md.spec.ts +192 -0
  453. package/skills/argument-arc/argument-arc.eval.mjs +19 -0
  454. package/skills/argument-arc/argument-arc.harness.mjs +23 -0
  455. package/skills/build-benchmark/SKILL.md +213 -0
  456. package/skills/build-benchmark/SKILL.md.spec.ts +220 -0
  457. package/skills/build-benchmark/build-benchmark.eval.mjs +19 -0
  458. package/skills/build-benchmark/build-benchmark.harness.mjs +23 -0
  459. package/skills/build-benchmark/references/adversarial-cold-repro.md +68 -0
  460. package/skills/camera-ready/SKILL.md +148 -0
  461. package/skills/camera-ready/SKILL.md.spec.ts +164 -0
  462. package/skills/camera-ready/camera-ready.eval.mjs +19 -0
  463. package/skills/camera-ready/camera-ready.harness.mjs +23 -0
  464. package/skills/cold-read-diff/SKILL.md +160 -0
  465. package/skills/cold-read-diff/SKILL.md.spec.ts +166 -0
  466. package/skills/cold-read-diff/cold-read-diff.eval.mjs +19 -0
  467. package/skills/cold-read-diff/cold-read-diff.harness.mjs +23 -0
  468. package/skills/draft-paper/SKILL.md +152 -0
  469. package/skills/draft-paper/SKILL.md.spec.ts +169 -0
  470. package/skills/draft-paper/draft-paper.eval.mjs +19 -0
  471. package/skills/draft-paper/draft-paper.harness.mjs +23 -0
  472. package/skills/extend-paper/SKILL.md +99 -0
  473. package/skills/extend-paper/SKILL.md.spec.ts +116 -0
  474. package/skills/extend-paper/extend-paper.eval.mjs +19 -0
  475. package/skills/extend-paper/extend-paper.harness.mjs +23 -0
  476. package/skills/find-venue/SKILL.md +128 -0
  477. package/skills/find-venue/SKILL.md.spec.ts +145 -0
  478. package/skills/find-venue/find-venue.eval.mjs +19 -0
  479. package/skills/find-venue/find-venue.harness.mjs +23 -0
  480. package/skills/grade-paper-writing/SKILL.md +436 -0
  481. package/skills/grade-paper-writing/SKILL.md.spec.ts +453 -0
  482. package/skills/grade-paper-writing/fixtures/control_gopen.txt +1 -0
  483. package/skills/grade-paper-writing/fixtures/control_human_paper.txt +1 -0
  484. package/skills/grade-paper-writing/fixtures/rewrite.txt +1 -0
  485. package/skills/grade-paper-writing/fixtures/specimen.txt +1 -0
  486. package/skills/grade-paper-writing/fixtures/structure-checks.md +22 -0
  487. package/skills/grade-paper-writing/grade-paper-writing.eval.mjs +19 -0
  488. package/skills/grade-paper-writing/grade-paper-writing.harness.mjs +23 -0
  489. package/skills/grade-paper-writing/prose-lint.mjs +713 -0
  490. package/skills/harden-paper/SKILL.md +318 -0
  491. package/skills/harden-paper/SKILL.md.spec.ts +336 -0
  492. package/skills/harden-paper/check-numbers.sh +33 -0
  493. package/skills/harden-paper/check-release-claims.sh +35 -0
  494. package/skills/harden-paper/fixtures/uncited-assertions-sample.md +43 -0
  495. package/skills/harden-paper/fixtures/uncited-assertions-sample.tex +77 -0
  496. package/skills/harden-paper/harden-paper.eval.mjs +19 -0
  497. package/skills/harden-paper/harden-paper.harness.mjs +23 -0
  498. package/skills/map-prior-work/SKILL.md +211 -0
  499. package/skills/map-prior-work/SKILL.md.spec.ts +227 -0
  500. package/skills/map-prior-work/map-prior-work.eval.mjs +19 -0
  501. package/skills/map-prior-work/map-prior-work.harness.mjs +23 -0
  502. package/skills/osf-artifact-upload/SKILL.md +52 -0
  503. package/skills/osf-artifact-upload/SKILL.md.spec.ts +59 -0
  504. package/skills/osf-artifact-upload/osf-artifact-upload.eval.mjs +22 -0
  505. package/skills/osf-artifact-upload/osf-artifact-upload.harness.mjs +103 -0
  506. package/skills/paper-adversarial-review/SKILL.md +126 -0
  507. package/skills/paper-adversarial-review/SKILL.md.spec.ts +142 -0
  508. package/skills/paper-adversarial-review/paper-adversarial-review.eval.mjs +19 -0
  509. package/skills/paper-adversarial-review/paper-adversarial-review.harness.mjs +23 -0
  510. package/skills/paper-pipeline/PIPELINE-MAP.md +371 -0
  511. package/skills/paper-pipeline/SKILL.md +499 -0
  512. package/skills/paper-pipeline/SKILL.md.spec.ts +517 -0
  513. package/skills/paper-pipeline/description-language.eval.mjs +347 -0
  514. package/skills/paper-pipeline/framing-vs-vocabulary.eval.mjs +891 -0
  515. package/skills/paper-pipeline/grade-paper-writing-ablation.eval.mjs +1254 -0
  516. package/skills/paper-pipeline/paper-pipeline.eval.mjs +22 -0
  517. package/skills/paper-pipeline/paper-pipeline.harness.mjs +143 -0
  518. package/skills/paper-pipeline/pipeline-firing.baseline.json +270 -0
  519. package/skills/paper-pipeline/pipeline-firing.eval.mjs +664 -0
  520. package/skills/paper-pipeline/pipeline-language.eval.mjs +672 -0
  521. package/skills/paper-pipeline/references/acceptance-gate.md +329 -0
  522. package/skills/paper-pipeline/references/acl-venue-rules.md +142 -0
  523. package/skills/paper-pipeline/references/anonymization.md +68 -0
  524. package/skills/paper-pipeline/references/artifact-checklist.md +93 -0
  525. package/skills/paper-pipeline/references/body-vs-appendix.md +97 -0
  526. package/skills/paper-pipeline/references/credit-criteria.md +69 -0
  527. package/skills/paper-pipeline/references/occupancy-2026-08-06-probe/README.md +35 -0
  528. package/skills/paper-pipeline/references/occupancy-2026-08-06-probe/run_retext.mjs +24 -0
  529. package/skills/paper-pipeline/references/occupancy-2026-08-06-probe/sentences.txt +11 -0
  530. package/skills/paper-pipeline/references/occupancy-2026-08-06-probe/test_sentences.py +25 -0
  531. package/skills/paper-pipeline/references/occupancy-2026-08-06-prose-checkers.md +538 -0
  532. package/skills/paper-pipeline/references/occupancy-2026-08-06-reproducible-tooling.md +431 -0
  533. package/skills/paper-pipeline/references/occupancy-2026-08-06-staleness-and-orchestration.md +592 -0
  534. package/skills/paper-pipeline/references/pipeline-status-template.md +162 -0
  535. package/skills/paper-pipeline/references/review-ratchet.md +36 -0
  536. package/skills/paper-pipeline/references/sweep-2026-08-09-ideal-pipeline.md +585 -0
  537. package/skills/paper-pipeline/references/writing-craft.md +448 -0
  538. package/skills/paper-pipeline/repro/2026-08-07-description-language-control.log +63 -0
  539. package/skills/paper-pipeline/repro/2026-08-07-fork-check.log +52 -0
  540. package/skills/paper-pipeline/repro/2026-08-07-fork-check2.log +33 -0
  541. package/skills/paper-pipeline/repro/2026-08-07-language-eval-pilot.log +33 -0
  542. package/skills/paper-pipeline/repro/2026-08-07-language-eval-raw.log +166 -0
  543. package/skills/paper-pipeline/repro/2026-08-08-framing-vs-vocabulary-oracle.json +338 -0
  544. package/skills/paper-pipeline/repro/2026-08-08-framing-vs-vocabulary-oracle.log +118 -0
  545. package/skills/paper-pipeline/repro/2026-08-08-framing-vs-vocabulary-raw.log +245 -0
  546. package/skills/paper-pipeline/repro/2026-08-08-framing-vs-vocabulary.json +776 -0
  547. package/skills/paper-pipeline/repro/2026-08-08-grade-paper-writing-ablation-A6-oracle.log +53 -0
  548. package/skills/paper-pipeline/repro/2026-08-08-grade-paper-writing-ablation-A6-raw.log +89 -0
  549. package/skills/paper-pipeline/repro/2026-08-08-grade-paper-writing-ablation-oracle.json +450 -0
  550. package/skills/paper-pipeline/repro/2026-08-08-grade-paper-writing-ablation-oracle.log +136 -0
  551. package/skills/paper-pipeline/repro/2026-08-08-grade-paper-writing-ablation-raw.log +242 -0
  552. package/skills/paper-pipeline/repro/2026-08-08-grade-paper-writing-ablation-setupdiff.log +59 -0
  553. package/skills/paper-pipeline/repro/2026-08-08-grade-paper-writing-ablation.json +1032 -0
  554. package/skills/paper-pipeline/repro/2026-08-08-parent-replication-gpw.json +139 -0
  555. package/skills/paper-pipeline/repro/2026-08-08-parent-replication-gpw.log +98 -0
  556. package/skills/paper-pipeline/repro/2026-08-08-parent-replication.mjs +92 -0
  557. package/skills/paper-pipeline/repro/README.md +129 -0
  558. package/skills/paper-pipeline/repro/analyze-language-eval.py +116 -0
  559. package/skills/paper-pipeline/scripts/README.md +344 -0
  560. package/skills/paper-pipeline/scripts/announce.mjs +67 -0
  561. package/skills/paper-pipeline/scripts/artifact-coverage.harness.mjs +496 -0
  562. package/skills/paper-pipeline/scripts/artifact-coverage.mjs +397 -0
  563. package/skills/paper-pipeline/scripts/artifact-coverage.mutations.mjs +218 -0
  564. package/skills/paper-pipeline/scripts/check-provenance.mjs +184 -0
  565. package/skills/paper-pipeline/scripts/consumer.d.mts +32 -0
  566. package/skills/paper-pipeline/scripts/consumer.harness.mjs +562 -0
  567. package/skills/paper-pipeline/scripts/consumer.mjs +535 -0
  568. package/skills/paper-pipeline/scripts/consumer.mutations.mjs +190 -0
  569. package/skills/paper-pipeline/scripts/extract-ref-facts.harness.mjs +457 -0
  570. package/skills/paper-pipeline/scripts/extract-ref-facts.mjs +656 -0
  571. package/skills/paper-pipeline/scripts/extract-ref-facts.mutations.mjs +54 -0
  572. package/skills/paper-pipeline/scripts/fixtures/clean/PIPELINE-STATUS.md +51 -0
  573. package/skills/paper-pipeline/scripts/fixtures/dirty/PIPELINE-STATUS.md +52 -0
  574. package/skills/paper-pipeline/scripts/fixtures/dirty/paper.md +6 -0
  575. package/skills/paper-pipeline/scripts/fixtures/real-bib/refs.bib +153 -0
  576. package/skills/paper-pipeline/scripts/generated-code.harness.mjs +466 -0
  577. package/skills/paper-pipeline/scripts/generated-code.mjs +338 -0
  578. package/skills/paper-pipeline/scripts/generated-code.mutations.mjs +254 -0
  579. package/skills/paper-pipeline/scripts/ledger.mjs +623 -0
  580. package/skills/paper-pipeline/scripts/ledger.selftest.mjs +286 -0
  581. package/skills/paper-pipeline/scripts/pipeline-check.harness.mjs +389 -0
  582. package/skills/paper-pipeline/scripts/pipeline-check.mjs +737 -0
  583. package/skills/paper-pipeline/scripts/pipeline-check.mutations.mjs +54 -0
  584. package/skills/paper-pipeline/scripts/pipeline-edges.mjs +169 -0
  585. package/skills/paper-pipeline/scripts/population-map.harness.mjs +178 -0
  586. package/skills/paper-pipeline/scripts/population-map.mjs +181 -0
  587. package/skills/paper-pipeline/scripts/population-map.mutations.mjs +65 -0
  588. package/skills/paper-pipeline/scripts/population-map.selftest.mjs +122 -0
  589. package/skills/paper-pipeline/scripts/provenance.harness.mjs +240 -0
  590. package/skills/paper-pipeline/scripts/provenance.mutations.mjs +59 -0
  591. package/skills/paper-pipeline/scripts/round-diff.harness.mjs +881 -0
  592. package/skills/paper-pipeline/scripts/round-diff.mjs +576 -0
  593. package/skills/paper-pipeline/scripts/round-diff.mutations.mjs +276 -0
  594. package/skills/paper-pipeline/scripts/run-mechanical.mjs +633 -0
  595. package/skills/paper-pipeline/scripts/status.mjs +295 -0
  596. package/skills/paper-status/SKILL.md +183 -0
  597. package/skills/paper-status/SKILL.md.spec.ts +190 -0
  598. package/skills/paper-status/paper-status.eval.mjs +22 -0
  599. package/skills/paper-status/paper-status.harness.mjs +25 -0
  600. package/skills/pc-panel-review/SKILL.md +263 -0
  601. package/skills/pc-panel-review/SKILL.md.spec.ts +280 -0
  602. package/skills/pc-panel-review/pc-panel-review.eval.mjs +19 -0
  603. package/skills/pc-panel-review/pc-panel-review.harness.mjs +23 -0
  604. package/skills/plan-paper-timeline/SKILL.md +182 -0
  605. package/skills/plan-paper-timeline/SKILL.md.spec.ts +200 -0
  606. package/skills/plan-paper-timeline/fixtures/fake-google-calendar.mjs +239 -0
  607. package/skills/plan-paper-timeline/plan-paper-timeline.effects.harness.mjs +431 -0
  608. package/skills/plan-paper-timeline/plan-paper-timeline.effects.mutations.mjs +65 -0
  609. package/skills/plan-paper-timeline/plan-paper-timeline.eval.mjs +19 -0
  610. package/skills/plan-paper-timeline/plan-paper-timeline.harness.mjs +23 -0
  611. package/skills/render-paper/SKILL.md +159 -0
  612. package/skills/render-paper/SKILL.md.spec.ts +166 -0
  613. package/skills/render-paper/check-render.sh +419 -0
  614. package/skills/render-paper/checkers-requirements.txt +55 -0
  615. package/skills/render-paper/ensure-checkers.sh +69 -0
  616. package/skills/render-paper/extract-pdf-facts.harness.mjs +166 -0
  617. package/skills/render-paper/extract-pdf-facts.mjs +144 -0
  618. package/skills/render-paper/render-paper.eval.mjs +19 -0
  619. package/skills/render-paper/render-paper.harness.mjs +339 -0
  620. package/skills/research-ideate/SKILL.md +136 -0
  621. package/skills/research-ideate/SKILL.md.spec.ts +152 -0
  622. package/skills/research-ideate/research-ideate.eval.mjs +19 -0
  623. package/skills/research-ideate/research-ideate.harness.mjs +23 -0
  624. package/skills/skill-contract.mutations.mjs +179 -0
  625. package/skills/study-accepted-papers/SKILL.md +206 -0
  626. package/skills/study-accepted-papers/SKILL.md.spec.ts +223 -0
  627. package/skills/study-accepted-papers/study-accepted-papers.eval.mjs +19 -0
  628. package/skills/study-accepted-papers/study-accepted-papers.harness.mjs +23 -0
  629. package/skills/submit-paper/SKILL.md +182 -0
  630. package/skills/submit-paper/SKILL.md.spec.ts +199 -0
  631. package/skills/submit-paper/check-deanon.sh +149 -0
  632. package/skills/submit-paper/references/publishers/acm.md +92 -0
  633. package/skills/submit-paper/references/venues/agenticdev.jsonc +108 -0
  634. package/skills/submit-paper/references/venues/agenticdev.md +139 -0
  635. package/skills/submit-paper/references/venues/agenticdev.tex +19 -0
  636. package/skills/submit-paper/references/venues/aisec.jsonc +101 -0
  637. package/skills/submit-paper/references/venues/aisec.md +105 -0
  638. package/skills/submit-paper/references/venues/paper-guards.tex +41 -0
  639. package/skills/submit-paper/references/venues/realm.jsonc +81 -0
  640. package/skills/submit-paper/references/venues/realm.md +155 -0
  641. package/skills/submit-paper/references/venues/tex-base.jsonc +50 -0
  642. package/skills/submit-paper/references/venues/venue-profile.schema.json +74 -0
  643. package/skills/submit-paper/submit-paper.eval.mjs +19 -0
  644. package/skills/submit-paper/submit-paper.harness.mjs +23 -0
  645. package/skills/sweep-design-space/SKILL.md +269 -0
  646. package/skills/sweep-design-space/SKILL.md.spec.ts +285 -0
  647. package/skills/sweep-design-space/sweep-design-space.eval.mjs +19 -0
  648. package/skills/sweep-design-space/sweep-design-space.harness.mjs +23 -0
  649. package/skills/tighten-paper/SKILL.md +368 -0
  650. package/skills/tighten-paper/SKILL.md.spec.ts +384 -0
  651. package/skills/tighten-paper/structure.mjs +371 -0
  652. package/skills/tighten-paper/tighten-paper.eval.mjs +19 -0
  653. package/skills/tighten-paper/tighten-paper.harness.mjs +23 -0
  654. package/skills/verify-citations/SKILL.md +328 -0
  655. package/skills/verify-citations/SKILL.md.spec.ts +345 -0
  656. package/skills/verify-citations/scripts/bib-authors.mjs +479 -0
  657. package/skills/verify-citations/scripts/bib-authors.test.mjs +175 -0
  658. package/skills/verify-citations/scripts/verify-cites.mjs +1108 -0
  659. package/skills/verify-citations/scripts/verify-cites.test.mjs +735 -0
  660. package/skills/verify-citations/verify-citations.eval.mjs +19 -0
  661. package/skills/verify-citations/verify-citations.harness.mjs +23 -0
  662. package/src/CLAUDE.md +51 -0
  663. package/src/action-ref.test.ts +26 -0
  664. package/src/action-ref.ts +15 -0
  665. package/src/adapters/banal/failure.test.ts +63 -0
  666. package/src/adapters/banal/failure.ts +118 -0
  667. package/src/adapters/banal/index.test.ts +119 -0
  668. package/src/adapters/banal/index.ts +100 -0
  669. package/src/adapters/banal/install.test.ts +20 -0
  670. package/src/adapters/banal/install.ts +41 -0
  671. package/src/adapters/banal/invocation.test.ts +74 -0
  672. package/src/adapters/banal/invocation.ts +95 -0
  673. package/src/adapters/banal/locate.test.ts +52 -0
  674. package/src/adapters/banal/locate.ts +84 -0
  675. package/src/adapters/banal/output.test.ts +140 -0
  676. package/src/adapters/banal/output.ts +141 -0
  677. package/src/adapters/banal/pin.ts +30 -0
  678. package/src/adapters/banal/probe.ts +35 -0
  679. package/src/adapters/banal/run.test.ts +191 -0
  680. package/src/adapters/banal/run.ts +244 -0
  681. package/src/adapters/banal/settings.test.ts +31 -0
  682. package/src/adapters/banal/settings.ts +55 -0
  683. package/src/adapters/banal/xml.test.ts +111 -0
  684. package/src/adapters/banal/xml.ts +112 -0
  685. package/src/adapters/curl/download.io.ts +73 -0
  686. package/src/adapters/curl/download.test.ts +55 -0
  687. package/src/adapters/curl/index.ts +5 -0
  688. package/src/adapters/memory/index.ts +131 -0
  689. package/src/adapters/node/files.io.ts +39 -0
  690. package/src/adapters/node/files.test.ts +28 -0
  691. package/src/adapters/node/host.io.ts +15 -0
  692. package/src/adapters/node/index.ts +36 -0
  693. package/src/adapters/node/process.io.ts +49 -0
  694. package/src/adapters/node/process.test.ts +46 -0
  695. package/src/adapters/node/workspace.io.ts +40 -0
  696. package/src/adapters/node/workspace.test.ts +58 -0
  697. package/src/adapters/pdfjs/fill.test.ts +111 -0
  698. package/src/adapters/pdfjs/fill.ts +141 -0
  699. package/src/build-engine.harness.mjs +314 -0
  700. package/src/build-engine.ts +219 -0
  701. package/src/build.harness.mjs +631 -0
  702. package/src/build.mutations.mjs +195 -0
  703. package/src/build.ts +793 -0
  704. package/src/cli.harness.mjs +2007 -0
  705. package/src/cli.mutations.mjs +448 -0
  706. package/src/cli.ts +1189 -0
  707. package/src/doctor.harness.mjs +396 -0
  708. package/src/doctor.mutations.mjs +175 -0
  709. package/src/doctor.ts +356 -0
  710. package/src/domain/geometry.ts +108 -0
  711. package/src/domain/host.ts +23 -0
  712. package/src/domain/page-layout.ts +32 -0
  713. package/src/domain/paths.ts +5 -0
  714. package/src/domain/result.test.ts +26 -0
  715. package/src/domain/result.ts +29 -0
  716. package/src/domain/sha256.test.ts +12 -0
  717. package/src/domain/sha256.ts +21 -0
  718. package/src/domain/text.ts +11 -0
  719. package/src/engine.harness.mjs +252 -0
  720. package/src/engine.ts +176 -0
  721. package/src/exit-code.test.ts +21 -0
  722. package/src/exit-code.ts +38 -0
  723. package/src/facts-file.test.ts +240 -0
  724. package/src/facts-file.ts +241 -0
  725. package/src/hooks-settings.harness.mjs +386 -0
  726. package/src/hooks-settings.mutations.mjs +116 -0
  727. package/src/hooks-settings.ts +434 -0
  728. package/src/init.ts +900 -0
  729. package/src/latex-log.harness.mjs +226 -0
  730. package/src/latex-log.ts +234 -0
  731. package/src/latex-loop.harness.mjs +449 -0
  732. package/src/latex-loop.ts +211 -0
  733. package/src/link-skills.harness.mjs +273 -0
  734. package/src/link-skills.mutations.mjs +136 -0
  735. package/src/link-skills.ts +258 -0
  736. package/src/new-paper.harness.mjs +216 -0
  737. package/src/new-paper.mutations.mjs +79 -0
  738. package/src/new-paper.ts +158 -0
  739. package/src/pdf-facts.harness.mjs +188 -0
  740. package/src/pdf-facts.ts +327 -0
  741. package/src/pdf-geometry.harness.mjs +254 -0
  742. package/src/pdf-geometry.ts +300 -0
  743. package/src/ports/download.ts +10 -0
  744. package/src/ports/files.ts +11 -0
  745. package/src/ports/measure-geometry.ts +8 -0
  746. package/src/ports/process.ts +46 -0
  747. package/src/ports/tool-installer.ts +33 -0
  748. package/src/ports/workspace.ts +20 -0
  749. package/src/rules-config.harness.mjs +114 -0
  750. package/src/rules-config.ts +178 -0
  751. package/src/structure.harness.mjs +179 -0
  752. package/src/structure.mutations.mjs +83 -0
  753. package/src/structure.ts +166 -0
  754. package/src/tex-requirements.harness.mjs +238 -0
  755. package/src/tex-requirements.ts +181 -0
  756. package/src/toolchain.harness.mjs +651 -0
  757. package/src/toolchain.ts +755 -0
  758. package/src/types.ts +106 -0
  759. package/templates/paper/PIPELINE-STATUS.md +72 -0
  760. package/templates/paper/paper.md +4 -0
  761. package/templates/paper/paper.tex +8 -0
  762. package/tsconfig.json +23 -0
@@ -0,0 +1,108 @@
1
+ // Venue format profile — DATA read by the `pdf/profile` rule in eslint-rules/pdf-facts.mjs.
2
+ // Prose about the venue is in agenticdev.md nearby.
3
+ // Source for the numbers: the Conference Publishing author instructions 2026-08-25 + ACM's
4
+ // requirements.
5
+ //
6
+ // 🔴 Why JSONC and not YAML (decided 08-26). I had this in YAML, justifying it with "JSON has no
7
+ // comments, and every number here carries a quote from the instructions." That objection turned
8
+ // out to be false: @eslint/json ships three languages — json, jsonc, json5 — and jsonc is exactly
9
+ // JSON with comments. So the quotes stay in place, the file is read by a real parser
10
+ // (@humanwhocodes/momoa, already a transitive dependency), AND it's linted by the same engine as
11
+ // everything else. One extra dependency (js-yaml on this path) goes away.
12
+ {
13
+ "template": "acmart",
14
+
15
+ // TeX Live packages the acmart template needs ON TOP OF tex-base.jsonc, each with the files that
16
+ // prove it is present (checked with kpsewhich after every install). Read by `paperlint toolchain` and
17
+ // `paperlint build`; the shape is venue-profile.schema.json.
18
+ // libertine · inconsolata (zi4) · newtx — acmart.cls checks ALL THREE and, if ANY is missing,
19
+ // silently falls back to Computer Modern: the PDF compiles, looks normal, is set in the wrong
20
+ // font, and the other metric gives another pagination. A submitted paper went out that way.
21
+ // kastrup (binhex.tex) — pulled in by newtx. Missing it is a HARD stop, so adding the fonts
22
+ // without it breaks a build that worked.
23
+ // fancyhdr — required by acmart itself; present on most images by accident, absent on a
24
+ // minimal one ("File `fancyhdr.sty' not found", measured on TinyTeX, issue #37).
25
+ // the rest — pulled in by acmart ITSELF, not by the paper, so reading \usepackage never finds
26
+ // them. Found 2026-09-01 by the loop build → missing file → tlmgr search --file → install.
27
+ "tex": {
28
+ "packages": {
29
+ "acmart": ["acmart.cls"],
30
+ "amscls": ["amsart.cls"],
31
+ "libertine": ["libertine.sty"],
32
+ "inconsolata": ["zi4.sty"],
33
+ "newtx": ["newtxmath.sty"],
34
+ "kastrup": ["binhex.tex"],
35
+ "fancyhdr": ["fancyhdr.sty"],
36
+ "totpages": ["totpages.sty"],
37
+ "environ": ["environ.sty"],
38
+ "preprint": ["balance.sty"],
39
+ // acmart's `pbalance` option (the vendor's first fix for an unbalanced last page, which the
40
+ // optional rule `pdf/last-page-balance` recommends) loads pbalance, which needs filehook and
41
+ // zref. Measured 2026-09-25 on an acmart sigconf camera-ready: without them the option stops
42
+ // the build; with them the last page went from 639.6 / 224.1 to 424.4 / 439.2 pt, same page count.
43
+ "pbalance": ["pbalance.sty"],
44
+ "filehook": ["filehook.sty"],
45
+ "zref": ["zref-abspage.sty"],
46
+ "xstring": ["xstring.sty"],
47
+ "everyshi": ["everyshi.sty"],
48
+ "hyperxmp": ["hyperxmp.sty"],
49
+ "ncctools": ["manyfoot.sty"],
50
+ "cmap": ["cmap.sty"],
51
+ "float": ["float.sty"],
52
+ "comment": ["comment.sty"],
53
+ "upquote": ["upquote.sty"],
54
+ "doclicense": ["doclicense.sty"],
55
+ "textcase": ["textcase.sty"],
56
+ },
57
+ },
58
+
59
+ // 8.5 x 11 in
60
+ "page_size": "letter",
61
+ "page_w_in": 8.5,
62
+ "page_h_in": 11.0,
63
+
64
+ // «text width must not exceed 18 cm»
65
+ "textblock_w_in": 7.087,
66
+ // «text height must not exceed 23.5 cm»
67
+ "textblock_h_in": 9.252,
68
+ // Last-page balance is NOT a profile field. It is the optional lint rule pdf/last-page-balance,
69
+ // which a consumer turns on for the papers whose publisher asks (Conference Publishing bounced
70
+ // an accepted paper for it on 08-29: "Please correct the last page balancing") — see
71
+ // docs/optional-rules.md.
72
+
73
+ "columns": 2,
74
+
75
+ // «font size is 9 pt for all body text»
76
+ "body_pt": 9,
77
+ // banal measures the MODE of the rendered text, not the declared size (measured 08-26: 9.30 at
78
+ // acmart's declared 9). Hence the tolerance — and hence why body size stays a nudge, not a gate.
79
+ "body_pt_tol": 0.5,
80
+
81
+ // «font size of the references can be from 7 pt to 9 pt»
82
+ "ref_pt_min": 7,
83
+ "ref_pt_max": 9,
84
+
85
+ // «text must be in serif font (Libertine)»
86
+ "fonts_text": "LinLibertine",
87
+ // «The title must be in sans-serif font (Biolinum)»
88
+ "fonts_title": "LinBiolinum",
89
+
90
+ // The limits are a property of the paper's TYPE at this venue, not of the venue itself.
91
+ // A given paper's type is stated in its <paper-dir>/venue.json.
92
+ "kinds": {
93
+ "short": {
94
+ "body_pages_max": 5,
95
+ // «up to 2 extra pages of references»
96
+ "ref_pages_max": 2,
97
+ },
98
+ "full": {
99
+ // «Full ≤10pp (mature)»
100
+ "body_pages_max": 10,
101
+ "ref_pages_max": 2,
102
+ },
103
+ "demo": {
104
+ "body_pages_max": 5,
105
+ "ref_pages_max": 2,
106
+ },
107
+ },
108
+ }
@@ -0,0 +1,139 @@
1
+ ---
2
+ title: "AgenticDev @ ASE — venue card (data)"
3
+ ---
4
+
5
+ # AgenticDev @ ASE venue card
6
+
7
+ > **This is a venue DATA file, not a skill.** Follow the `submit-paper` skill for the end-to-end
8
+ > mechanics; the facts below are the venue-specific data. (Formerly the `submit-paper-agenticdev` skill;
9
+ > demoted to a reference doc so venue data doesn't proliferate the skill namespace.) **Re-verify the
10
+ > CFP each year** (`conf.researchr.org/home/ase-2026/agenticdev-2026`).
11
+
12
+ ## The facts (2026 edition)
13
+
14
+ - **Venue**: Workshop on Agentic AI for Next-Generation Software Development, co-located with **ASE**
15
+ (Automated Software Engineering), Munich, Oct 2026.
16
+ - **HotCRP**: `https://agenticdev2026.hotcrp.com/paper/new`.
17
+ - **Deadline**: **July 15, 2026, AoE** (≈ 9 AM July 16 at UTC+5). Notify Aug 21, camera-ready Aug 28.
18
+ - **Types / limits**: Full ≤10pp (mature); **Short ≤5pp** (WIP / vision / position); Demo/Tool ≤5pp.
19
+ Up to **2 extra pages of references** on top.
20
+ - **Format**: ACM `\documentclass[sigconf,review,anonymous]{acmart}` → **double-blind**. Build:
21
+ `pdflatex; bibtex; pdflatex; pdflatex`; add `\microtypesetup{expansion=false}` (the #1 acmart crash).
22
+ - **Archival**: accepted papers → **ASE workshop proceedings, DOI**. 🔴 **Correction 2026-08-26: the
23
+ earlier wording "ACM DL / IEEE Xplore" is FALSE — there is no dual publication.** ASE's publisher
24
+ **alternates by year**: ASEW '24 — ACM (`10.1145/3691621.*`, ISBN 979-8-4007-1249-4), ASE 2025
25
+ Workshops — **IEEE** (`csdl/proceedings/asew/2025`, ISBN 979-8-3315-8503-7). The main track does the
26
+ same: '22 ACM, '23 IEEE, '24 ACM, '25 IEEE. The `10.5555` prefix in ACM DL is a Guide catalog
27
+ entry, NOT an ACM publication. By the alternation pattern, **ACM is expected for 2026**, which
28
+ lines up with an APC even being charged — but ⚠️ **no verbatim statement from ASE 2026 about the
29
+ publisher was found**. If it turns out to be IEEE, the ACM-APC question is moot entirely. Confirm
30
+ with the chairs before paying; selected papers
31
+ invited to a **journal special issue**. This is real authorship-criterion evidence.
32
+ - **⚠️ No supplementary-material upload field** on the HotCRP form (fields are just Title, Submission,
33
+ Abstract, Authors, ACM corresponding, Contacts, PC conflicts). → **Host the artifact externally** (OSF
34
+ anonymized view-only link) and `\url{}` it in the paper's Availability. See `submit-paper` §2.
35
+ - **Remote presentation**: CFP doesn't state a policy; what counts is the indexed
36
+ publication, not attendance. Only ask organizers about remote _after_ acceptance (don't draw attention
37
+ pre-decision under double-blind).
38
+
39
+ ## 🔴 How to name the venue — what CAN and CANNOT be claimed
40
+
41
+ The question came up on 2026-08-24 and will come up every time (a post, a site, a résumé, an
42
+ application). Checked against primary sources, not a search-engine summary.
43
+
44
+ **Facts:**
45
+
46
+ - **ASE is CORE A\*** (top tier), together with ICSE and FSE it's software engineering's "big
47
+ three."
48
+ - **AgenticDev is an ASE 2026 workshop**, officially listed on ASE's own _Co-Located Events_ page
49
+ (`conf.researchr.org/track/ase-2026/ase-2026-workshops`). It is not a third-party conference
50
+ that rented a room nearby, and it is not "sponsorship" — the workshop runs under ASE's umbrella.
51
+ - **Proceedings:** accepted papers go into the **ASE 2026 Workshop Proceedings** (ACM DL, DOI).
52
+ - **But it is NOT the ASE main track.** The main track has its own program, its own PC, and its
53
+ own selectivity; the workshop is reviewed separately and more leniently.
54
+
55
+ | ✅ OK to write | ❌ NOT OK |
56
+ | -------------------------------------------------------- | ------------------------------------ |
57
+ | "accepted at AgenticDev 2026, a workshop of ASE 2026" | "accepted at ASE 2026" |
58
+ | "workshop paper, ASE 2026 workshop proceedings (ACM DL)" | "published at a CORE A\* conference" |
59
+ | "ASE is CORE A\*; AgenticDev is one of its workshops" | "my paper is CORE A\*" |
60
+
61
+ ⚠️ **Why this isn't pedantry:** a mismatch in how the narrative is framed is a recorded reason
62
+ reviewers reject any claimed credentials. A reviewer sees the "workshop vs. main track"
63
+ distinction in one minute by checking the conference program, and the cost is trust in the whole
64
+ application, not just one line. The phrasing "a workshop of ASE 2026" is not weaker — it carries
65
+ ASE's weight on its own while staying accurate.
66
+
67
+ ## Attendance, registration, and proceedings — what affects what
68
+
69
+ - **Traveling to present does NOT affect the credit.** What counts is _authorship of scholarly
70
+ articles_ — that is, **the publication**, not attendance. "Presented at a conference" isn't on
71
+ the list of countable achievements at all.
72
+ - 🔴 **What DOES matter: whether payment becomes a condition of MAKING IT INTO proceedings.** Many
73
+ venues require at least one author to register, or the paper gets pulled from the proceedings.
74
+ In that case what disappears isn't the trip, it's the proof itself. That's the exact question
75
+ put to the chairs on 2026-08-24, and it matters more than the money.
76
+ - Cost for 2026: **APC $350** (ACM went fully open-access as of 2026-01-01) + registration €350
77
+ (early rate through 08-31). The correspondence with the chairs is broken down in the author's
78
+ private notes (`<paper>/reviews/2026-08-24-perepiska-cheyry.md`).
79
+
80
+ ## PC members (for 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). An independent author
84
+ with no ties to any of them checks **none**. (List grows year to year — read the current PC page.)
85
+
86
+ ## Topic fit (foreground these in the framing)
87
+
88
+ Trustworthiness / verification / validation of AI agents; benchmarking & empirical evaluation;
89
+ integration into developer workflows; agent-based coding/testing. A cost-aware, correctness-gated
90
+ _validation_ paper is dead-center — name those keywords in the abstract/intro.
91
+
92
+ ## After acceptance — the prestige upgrade
93
+
94
+ AgenticDev is a workshop (lightest authorship tier, but it counts). Extend the accepted paper (≥30% new
95
+ material) into a higher-prestige indexed venue as a **second** publication: **MSR 2027** (deadline
96
+ ~Oct 23, 2026) or **NeurIPS 2027 Evaluations & Datasets** (~May 2027). AgenticDev explicitly invites
97
+ journal extensions. Don't dual-submit the same paper — extend it.
98
+
99
+ ## Provenance
100
+
101
+ "Measuring the Wrong Number" submitted here 2026-07-13 (#20, ready-for-review), 4pp short paper, OSF
102
+ anonymized artifact linked in Availability, PC-panel estimate ~85–90% accept.
103
+
104
+ ## Camera-ready (2026 edition)
105
+
106
+ **The ACM mechanics are generic and live one level up: `../publishers/acm.md`** (eRights first,
107
+ the preamble, the copyright block, CCS, source files). Here — only what's specific to AgenticDev:
108
+
109
+ - **Camera-ready deadline**: **28 Aug 2026, 2 PM AoE** (≈ 7 AM on August 29 at UTC+5).
110
+ - **DOI**: `10.1145/3843282.3843715` · **ACM ISBN**: `979-8-4007-2985-0/26/10`.
111
+ - **Copyright block**: `AgenticDev '26, October 12–16, 2026, Munich, Germany`.
112
+ - **No longer double-blind.** The submission used `[sigconf,review,anonymous]`; both options come
113
+ off for the final.
114
+ - **Same page limit**: body ≤5 pp + up to 2 pp for references only. A sixth page taken up by the
115
+ bibliography still counts within the limit.
116
+ - **Title changes are allowed** — the portal explicitly asks for it "exactly as it should appear
117
+ in the ACM DL." But decide before eRights (see the publisher card).
118
+
119
+ ## Attendance / registration
120
+
121
+ The CFP is silent on remote participation, and **that does not mean "you don't have to show
122
+ up"**: ACM has no blanket no-show policy, IEEE does have one and allows a "qualified proxy" plus
123
+ exceptions for circumstances outside the author's control. Which one applies to the ASE workshop
124
+ **cannot be derived from public sources** — only by writing to the chairs.
125
+
126
+ - Workshop-day registration (non-member): **€350** through 08-31, €410 through 09-20, €460
127
+ on-site. This is a **publication gate**, not a travel expense.
128
+ - If entry requires a visa, the timeline for it is real → ask the chairs right after acceptance,
129
+ don't delay.
130
+
131
+ ## 🤖 Machine-readable format profile
132
+
133
+ Read by ESLint rules over `<paper>/_build/paper.facts.json` (the facts are captured by
134
+ `extract-pdf-facts.mjs`). **The numbers live here, not in code** — this venue has its own, the
135
+ next one will have different ones. Source: the Conference Publishing author instructions
136
+ (2026-08-25) and ACM's requirements.
137
+
138
+ **The format profile is in [`agenticdev.yaml`](agenticdev.yaml)** next to this file. Data lives
139
+ there, prose lives here.
@@ -0,0 +1,19 @@
1
+ % agenticdev.tex — venue numbers for the guards IN THE PREAMBLE. LaTeX doesn't read YAML, so the
2
+ % values are duplicated from venues/agenticdev.jsonc (the source of truth — read by the
3
+ % `pdf/profile` rule, see eslint-rules/pdf-facts.mjs:128). in = inches.
4
+ %
5
+ % 🔴 THIS USED TO SAY `venues/agenticdev.yaml`, AND NO SUCH FILE EXISTS (fixed 2026-09-12). The
6
+ % link went stale during the YAML → JSONC move on 08-26 and survived it, because a comment isn't
7
+ % checked by anything: the "source of truth" named a file that doesn't exist, while the real one
8
+ % sat right next to it.
9
+ % ⚠️ And the duplicate is kept in sync BY HAND. Checked 09-12: 7.087 / 9.252 / 2 / 9 / 5 / 2 match
10
+ % the .jsonc — as of today. There is no mechanism guaranteeing this; a candidate is generating this
11
+ % file from the .jsonc with one build step, which would make the drift unrepresentable (see
12
+ % idei/paper-pipeline-extraction/10-latex-carriers-2026-09-12.md).
13
+ % ⚠️ w/h are CEILINGS ("text width must not exceed 18 cm"), not targets: acmart sets them smaller.
14
+ \def\venuetextblockw{7.087}
15
+ \def\venuetextblockh{9.252}
16
+ \def\venuecolumns{2}
17
+ \def\venuebodypt{9}
18
+ \def\venuebodypagesmax{5}
19
+ \def\venuerefpagesmax{2}
@@ -0,0 +1,101 @@
1
+ // AISec @ ACM CCS format profile. Data for the `pdf/*` rules over `_build/paper.facts.json`.
2
+ // Prose about the venue and tracks is in `aisec.md` nearby.
3
+ //
4
+ // PAGE LIMITS — verbatim from https://aisec.cc/ (verified 2026-08-26, not from memory):
5
+ // «Submitted papers must be at most 10 pages long in double-column ACM format---excluding
6
+ // bibliography and well-marked appendices, for which up to two additional pages can be used
7
+ // (hence, the paper's overall length must be of 12 pages at most).»
8
+ // Our card used to say "up to ~10pp" — an approximate number that cannot be put into a gate: it
9
+ // would either let an overage through or redden on a correct paper.
10
+ //
11
+ // ⚠️ A venue caveat worth remembering: "if ... you get a warning stating that 'Too many
12
+ // pages: the limit is 12 pages, found 13', this is OK -- as long as the 13th page contains ONLY
13
+ // the 'Generative AI paragraph'". Our gate does NOT know about this exception and will redden on
14
+ // a 13th page. That's deliberate: the case is rare, and automation that knows "sometimes it's
15
+ // fine" is worse than a plain rejection a human clears by eye.
16
+ //
17
+ // GEOMETRY AND FONTS are inherited from `acmart sigconf` — the same class as agenticdev, and
18
+ // measured the same way (banal + pdffonts, 08-26). AISec points to the "main ACM CCS'26 formatting
19
+ // instructions" and does not publish its own numbers.
20
+ {
21
+ "template": "acmart",
22
+
23
+ // TeX Live packages the acmart template needs ON TOP OF tex-base.jsonc, each with the files that
24
+ // prove it is present (checked with kpsewhich after every install). Read by `paperlint toolchain` and
25
+ // `paperlint build`; the shape is venue-profile.schema.json.
26
+ // libertine · inconsolata (zi4) · newtx — acmart.cls checks ALL THREE and, if ANY is missing,
27
+ // silently falls back to Computer Modern: the PDF compiles, looks normal, is set in the wrong
28
+ // font, and the other metric gives another pagination. A submitted paper went out that way.
29
+ // kastrup (binhex.tex) — pulled in by newtx. Missing it is a HARD stop, so adding the fonts
30
+ // without it breaks a build that worked.
31
+ // fancyhdr — required by acmart itself; present on most images by accident, absent on a
32
+ // minimal one ("File `fancyhdr.sty' not found", measured on TinyTeX, issue #37).
33
+ // the rest — pulled in by acmart ITSELF, not by the paper, so reading \usepackage never finds
34
+ // them. Found 2026-09-01 by the loop build → missing file → tlmgr search --file → install.
35
+ "tex": {
36
+ "packages": {
37
+ "acmart": ["acmart.cls"],
38
+ "amscls": ["amsart.cls"],
39
+ "libertine": ["libertine.sty"],
40
+ "inconsolata": ["zi4.sty"],
41
+ "newtx": ["newtxmath.sty"],
42
+ "kastrup": ["binhex.tex"],
43
+ "fancyhdr": ["fancyhdr.sty"],
44
+ "totpages": ["totpages.sty"],
45
+ "environ": ["environ.sty"],
46
+ "preprint": ["balance.sty"],
47
+ // acmart's `pbalance` option (the vendor's first fix for an unbalanced last page, which the
48
+ // optional rule `pdf/last-page-balance` recommends) loads pbalance, which needs filehook and
49
+ // zref. Measured 2026-09-25 on an acmart sigconf camera-ready: without them the option stops
50
+ // the build; with them the last page went from 639.6 / 224.1 to 424.4 / 439.2 pt, same page count.
51
+ "pbalance": ["pbalance.sty"],
52
+ "filehook": ["filehook.sty"],
53
+ "zref": ["zref-abspage.sty"],
54
+ "xstring": ["xstring.sty"],
55
+ "everyshi": ["everyshi.sty"],
56
+ "hyperxmp": ["hyperxmp.sty"],
57
+ "ncctools": ["manyfoot.sty"],
58
+ "cmap": ["cmap.sty"],
59
+ "float": ["float.sty"],
60
+ "comment": ["comment.sty"],
61
+ "upquote": ["upquote.sty"],
62
+ "doclicense": ["doclicense.sty"],
63
+ "textcase": ["textcase.sty"],
64
+ },
65
+ },
66
+
67
+ "page_size": "letter",
68
+ "page_w_in": 8.5,
69
+ "page_h_in": 11.0,
70
+
71
+ "textblock_w_in": 7.087,
72
+ "textblock_h_in": 9.252,
73
+ // Last-page balance is NOT a profile field. It is the optional lint rule pdf/last-page-balance,
74
+ // which a consumer turns on for the papers whose publisher asks (Conference Publishing bounced
75
+ // an accepted paper for it on 08-29: "Please correct the last page balancing") — see
76
+ // docs/optional-rules.md.
77
+
78
+ "columns": 2,
79
+
80
+ "body_pt": 9,
81
+ // banal measures the rendered text's mode, not the declared size (measured: 9.30 at a
82
+ // declared 9).
83
+ "body_pt_tol": 0.5,
84
+
85
+ "ref_pt_min": 7,
86
+ "ref_pt_max": 9,
87
+
88
+ "fonts_text": "LinLibertine",
89
+ "fonts_title": "LinBiolinum",
90
+
91
+ // Four tracks (original research · position/open-problem · SoK · benchmark) — the limits are
92
+ // the SAME for all of them, the venue doesn't split them. The keys are kept separate so a
93
+ // paper's `venue.json` can name its own track: not for the numbers, but so it's visible which
94
+ // track it was submitted under.
95
+ "kinds": {
96
+ "research": { "body_pages_max": 10, "ref_pages_max": 2 },
97
+ "benchmark": { "body_pages_max": 10, "ref_pages_max": 2 },
98
+ "position": { "body_pages_max": 10, "ref_pages_max": 2 },
99
+ "sok": { "body_pages_max": 10, "ref_pages_max": 2 },
100
+ },
101
+ }
@@ -0,0 +1,105 @@
1
+ ---
2
+ title: "AISec @ ACM CCS — venue card (data)"
3
+ ---
4
+
5
+ # AISec @ ACM CCS venue card
6
+
7
+ > **This is a venue DATA file, not a skill.** Follow the `submit-paper` skill for the end-to-end
8
+ > mechanics; the facts below are the venue-specific data. (Formerly the `submit-paper-aisec` skill;
9
+ > demoted to a reference doc so venue data doesn't proliferate the skill namespace.) **Re-verify the
10
+ > CFP each year** (`https://aisec.cc/`) — deadline, page limit, and tracks shift year to year.
11
+
12
+ ## The bar (read this first)
13
+
14
+ AISec is **not** a first-edition welcoming workshop. It is the long-running AI-security workshop of
15
+ **ACM CCS — a top-4 security conference** — so calibrate to a _harder_ bar than a fresh workshop:
16
+ mature threat modeling, honest evaluation, and airtight ethics are table stakes, not bonuses. A
17
+ security PC rejects on soundness and ethics grounds that a SE workshop would wave through.
18
+
19
+ ## The facts (2026 edition)
20
+
21
+ - **Venue**: ACM Workshop on Artificial Intelligence and Security (**AISec**), co-located with **ACM
22
+ CCS** (Computer and Communications Security).
23
+ - **Deadline**: **24 July 2026** (verify the AoE cutoff, and convert it into your own zone, on the CFP each cycle).
24
+ - **Types / tracks**: **full research papers**; **benchmark papers** (new evaluation frameworks /
25
+ datasets **with artifact sharing** — a first-class track, not an afterthought); **position / SoK**
26
+ (systematization-of-knowledge) papers. Pick the track and pitch to _its_ bar.
27
+ - **Format**: ACM double-column (`sigconf`), up to **~10pp**. Build:
28
+ `pdflatex; bibtex; pdflatex; pdflatex`; add `\microtypesetup{expansion=false}` (the #1 acmart crash).
29
+ - **Blind model**: **double-blind** — `\documentclass[sigconf,review,anonymous]{acmart}`, author
30
+ `Anonymous Author(s)`. See `submit-paper` §0/§4 for de-anon hygiene.
31
+ - **Archival**: accepted papers → **CCS workshop proceedings in the ACM Digital Library** (DOI). Real
32
+ indexed-authorship evidence, at a top-tier-security-adjacent venue.
33
+ - **⚠️ No supplementary-material upload field** on the form. → **Host the artifact externally,
34
+ anonymized** (OSF private project + anonymized view-only link) and `\url{}` it in Availability. See
35
+ `submit-paper` §2 and `paper-pipeline/references/anonymization.md`.
36
+
37
+ ## Security-venue specifics that DECIDE acceptance (this is the whole game here)
38
+
39
+ 1. **Threat-model soundness.** Name the **attacker** explicitly and their **capabilities** (what they
40
+ observe, what they control, their goal, their budget). **Separate accidental failure from an
41
+ adaptive adversary** — "the model gets it wrong sometimes" and "a motivated attacker steers it" are
42
+ different papers; conflating them is the classic security-PC reject. Put the threat model up front,
43
+ not in a footnote.
44
+ 2. **Ethics / responsible disclosure — CRITICAL, a hard reject-vector.**
45
+ - **Anonymize studied third parties too**, not just yourself. Do **not** punch down on named
46
+ maintainers/projects — aggregate the stats and use anonymized IDs (e.g. `G01…G46`) for the
47
+ entities you studied.
48
+ - **Disclose findings to affected parties BEFORE any de-anonymized release.** The paper must state
49
+ the disclosure timeline and that a **release gate** blocks publishing de-anonymized data until
50
+ disclosure completes.
51
+ - No supplementary slot → the anonymized artifact on **OSF** must itself be leak-clean (the released
52
+ files, not just the PDF). A named-entity leak in the _artifact_ is invisible to a paper-only read
53
+ and is the single highest reject-vector — see Provenance.
54
+ 3. **Dual-use.** If you publish an **evasion / attack technique, publish its fix in the same paper** —
55
+ net-defensive framing. A security PC will reject a pure attack recipe with no mitigation as
56
+ irresponsible; the same result framed as "here is the weakness AND how to close it" is a
57
+ contribution.
58
+ 4. **GenAI-use disclosure.** ACM/CCS require disclosing how generative AI was used in producing the
59
+ work (writing, code, experiments). Add the disclosure statement; don't omit it.
60
+
61
+ ## Track fit (foreground these in the framing)
62
+
63
+ Adversarial ML, ML for security / security for ML, LLM/agent safety and security, evaluation &
64
+ benchmarking of AI-security defenses, poisoning/evasion/extraction, and **rigorous measurement of
65
+ whether a claimed safety mechanism actually holds**. A benchmark/measurement paper that ships a
66
+ reusable eval framework + an anonymized artifact is dead-center for the **benchmark track** — name
67
+ those keywords in the abstract/intro and cite the track by name.
68
+
69
+ ## After acceptance — the prestige upgrade
70
+
71
+ AISec@CCS is a workshop, but co-located with a top-4 venue it is the strongest workshop tier a
72
+ dossier can hold. Extend the accepted paper (≥30% new material) into a higher-prestige indexed venue as
73
+ a **second** publication — e.g. a full security conference or a journal. Don't dual-submit the same
74
+ paper; extend it. Plan the **camera-ready de-anonymization + release gate** at acceptance (see
75
+ `camera-ready`).
76
+
77
+ ## Provenance
78
+
79
+ "Safety Theater in Agentic Coding" hardened for this venue (PC-panel estimate **~87–88%** accept). Its
80
+ accept **hinged on closing an ethics reject-vector**: the released artifact had named **46 maintainers**
81
+ — a paper-only review missed it; the `pc-panel-review` artifact-runner + ethics lens caught it. Fixed
82
+ by **anonymized provenance (`G01–G46`)** plus a **release gate** blocking de-anonymized release until
83
+ disclosure completes. Lesson baked into this card: at a security venue the two things that most move
84
+ the decision — an ethics/disclosure contradiction and an anonymization leak — live in the **artifact**,
85
+ so verify the shipped files, not just the PDF.
86
+
87
+ ## Compose with
88
+
89
+ - `submit-paper` (mechanics: HotCRP form, OSF hosting, "ready for review", PDF-only, profile, dossier notes).
90
+ - `camera-ready` (de-anonymization + the release gate after acceptance).
91
+ - `pc-panel-review` — run it LAST as the gate, and specifically field its **ethics lens** and
92
+ **artifact-runner lens** (stress-test the release gate: plant a leak, confirm it's caught).
93
+ - Canonical shared detail: `paper-pipeline/references/artifact-checklist.md` (artifact build) and
94
+ `paper-pipeline/references/anonymization.md` (de-anon deny-list + verify).
95
+
96
+ ## Camera-ready
97
+
98
+ AISec is also **ACM** (a CCS workshop), so the final's mechanics are generic and live in
99
+ **`../publishers/acm.md`**: eRights is filled in FIRST and requires the final title; the preamble
100
+ is converted out of submission mode (`printacmref=false` / `setcopyright{none}` /
101
+ `pagestyle{plain}` / the `review` option — all of it removed); Source files are mandatory
102
+ alongside the PDF; CCS codes come from the 2012 CCS Browser.
103
+
104
+ What's AISec's own — its own DOI/ISBN, its own venue line in the copyright block, and its own
105
+ dates: fill those in here once they arrive (the card gets filled in from fact, not from memory).
@@ -0,0 +1,41 @@
1
+ % paper-guards.tex — guards that turn a paper defect into a BUILD FAILURE.
2
+ %
3
+ % Included from the paper's preamble: \input{paper-guards}
4
+ % Found via TEXINPUTS, which check-render.sh sets (the `references/venues/` directory).
5
+ %
6
+ % WHY A SEPARATE FILE, NOT A COPY IN EVERY PAPER. The first edition of the guard (08-26) lived
7
+ % inline in `agenticdev-2026/paper.tex`, and a measurement that same evening showed the cost: of
8
+ % three papers in LaTeX, the guard existed in exactly ONE. So grepping the log in
9
+ % `check-render.sh` was not redundant with it — for the other two it was the only check at all. A
10
+ % per-paper copy degrades exactly the way any convention that only gets written down degrades.
11
+ %
12
+ % 🔴 BOTH HALVES ARE PROVEN BY MEASUREMENT, AND THE ORDER IS EXACTLY THIS (the `papers/CLAUDE.md`
13
+ % rule): first, "silent on the correct case." On a clean `agenticdev-2026/paper.tex`: 0 errors, PDF
14
+ % 621,325 bytes. With a planted `\ref{ghost-xyz}`: `! Package paper Error: undefined references`.
15
+ % With a planted `\cite{ghost-xyz}`: `! Package paper Error: undefined citations (natbib)`.
16
+ %
17
+ % 🔴 GATED ON \finalpass, AND THIS IS LOAD-BEARING. On the first pass `.aux` is empty, so ALL
18
+ % references are UNDEFINED by construction. Measured 08-26 with the unconditional form: pass 1
19
+ % fails ⇒ `.aux` never gets written ⇒ pass 2 fails on the same thing ⇒ the cycle NEVER CONVERGES
20
+ % and no PDF appears at all. The final pass gets `\def\finalpass{}` on the command line (see
21
+ % `check-render.sh`), ordinary passes stay silent.
22
+ %
23
+ % 🔴 TWO FLAGS, NOT ONE, AND THIS IS ALSO A MEASUREMENT. The first version only looked at LaTeX
24
+ % core's `\@refundefined`, and a planted `\cite{ghost}` sailed right through: `acmart` loads
25
+ % NATBIB, which prints ITS OWN warning and never touches the core flag. natbib's flag is
26
+ % `\NAT@undefined` (`\newcommand\NAT@citeundefined{\gdef\NAT@undefined{...}}`, natbib.sty:1095).
27
+ % Caught by planting the defect, not by reading the code: the guard reported "clean" on a paper
28
+ % whose log contained `Package natbib Warning: Citation 'ghost' on page 6 undefined`.
29
+ %
30
+ % ⚠️ The file deliberately contains nothing besides the reference guards. Geometry and page-limit
31
+ % checks are venue-specific and live in each venue's own `<venue>.tex`.
32
+ \makeatletter
33
+ \AtEndDocument{%
34
+ \ifdefined\finalpass
35
+ \ifx\@refundefined\relax\else
36
+ \PackageError{paper}{undefined references - see the log}{}\fi
37
+ \@ifundefined{NAT@undefined}{}{%
38
+ \PackageError{paper}{undefined citations (natbib) - see the log}{}}%
39
+ \fi
40
+ }
41
+ \makeatother
@@ -0,0 +1,81 @@
1
+ // REALM @ EMNLP 2026 format profile — ACL family, NOT ACM. Prose is in `realm.md` nearby,
2
+ // the family's shared rules are in `paper-pipeline/references/acl-venue-rules.md`.
3
+ //
4
+ // 🔴 THE GEOMETRY NUMBERS ARE MEASURED, NOT COPIED. banal run against our own build
5
+ // (`repro/build-submission.sh` → `build/acl_latex.pdf`, 2026-08-26):
6
+ // A4 8.26 x 11.69 in (595 x 842 pt) · 2 columns · body size 11.3 · leading 13.6 ·
7
+ // reference size 10.3 · margins [72, 67, 66, 68] pt · 0 Type 3 fonts
8
+ // acmart (letter 8.5x11, size 9, Libertine) shares NOTHING with this — copying the numbers from
9
+ // `agenticdev.jsonc` would give a gate that reddens on a correct paper.
10
+ {
11
+ "template": "acl",
12
+
13
+ // TeX Live packages the ACL template needs ON TOP OF tex-base.jsonc (the shape is
14
+ // venue-profile.schema.json). acl.sty itself travels with the paper; these are what it loads.
15
+ // times · helvetic · courier · symbol · zapfding — without them "Font ptmr8t not loadable" and
16
+ // no PDF at all. The proof is a font metric file, because that is what failed.
17
+ // `urw-base35` once stood in this list and was INVENTED: tlmgr answers "package urw-base35 not
18
+ // present in repository". The five names above are enough.
19
+ "tex": {
20
+ "packages": {
21
+ "lineno": ["lineno.sty"],
22
+ "psnfss": ["times.sty"],
23
+ "times": ["ptmr8t.tfm"],
24
+ "helvetic": ["phvr8t.tfm"],
25
+ "courier": ["pcrr8t.tfm"],
26
+ "symbol": ["psyr.tfm"],
27
+ "zapfding": ["uzdr.tfm"],
28
+ },
29
+ },
30
+
31
+ "page_size": "a4",
32
+ "page_w_in": 8.27,
33
+ "page_h_in": 11.69,
34
+
35
+ "columns": 2,
36
+
37
+ // ACL's stated body size is 11pt; banal measures the render's mode and gives 11.3.
38
+ "body_pt": 11,
39
+ "body_pt_tol": 0.5,
40
+
41
+ // ⚠️ The range is derived from a SINGLE measurement (10.3), not from ACL's spec — I could not
42
+ // find ACL's own numbers for the reference size. So it's set wide: for an `error`-level rule, a
43
+ // false positive is worse than a miss. Narrow it once a primary source turns up.
44
+ "ref_pt_min": 9,
45
+ "ref_pt_max": 11,
46
+
47
+ // The Times clone from the ACL template. Headings are NOT gated: the build also contains
48
+ // NimbusSanL-Bold, but a `pdffonts` measurement can't establish exactly what the heading is set
49
+ // in — it only says a typeface IS present in the file, not where it's applied.
50
+ "fonts_text": "NimbusRomNo9L",
51
+
52
+ // 🔴 PAGE LIMITS ARE NOT GATED HERE, AND THAT IS A MEASUREMENT, NOT LAZINESS.
53
+ //
54
+ // banal classifies pages by content and counts Limitations and Ethics as part of the BODY.
55
+ // ACL excludes them from the limit. Measured 08-26 on our own paper: banal said "body 13," the
56
+ // build's own counter said "body pages: 9," and both are right — they're just counting
57
+ // different things (the body ends at Conclusion on p.9; pp.10-13 are Limitations/Ethics; the
58
+ // bibliography starts at 14).
59
+ //
60
+ // A gate on banal's number would give 13 against a limit of 8 and would redden on a paper that
61
+ // is within the limit. For an `error`-level rule that is the worst outcome. The limit stays
62
+ // owned by the counter inside `build-submission.sh`: it reads the markdown source and therefore
63
+ // KNOWS where the body ends, which the PDF does not.
64
+ //
65
+ // The numbers below are DATA for that counter and for humans, not an input to the rule. Source:
66
+ // `realm.md`, verified by directly fetching the 2026-08-02/03 CFP.
67
+ "page_limits_not_gated": {
68
+ "_": "8 at submission, 9 at camera-ready (+1 page). Both numbers are CURRENTLY hardcoded in build-submission.sh — 8 in the header, 9 in the run — which reads like a mismatch even though these are different STAGES. The script should pull them from here instead.",
69
+ "long_submission": 8,
70
+ "long_camera_ready": 9,
71
+ "short_submission": 4,
72
+ "short_camera_ready": 5,
73
+ "refs_and_appendices": "unlimited",
74
+ "limitations_and_ethics": "not counted (ACL rule)",
75
+ },
76
+
77
+ "kinds": {
78
+ "long": {},
79
+ "short": {},
80
+ },
81
+ }