paperlint 3.2.0 โ†’ 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (442) hide show
  1. package/.github/workflows/ci.yml +16 -23
  2. package/CLAUDE.md +33 -13
  3. package/CONTRIBUTING.md +23 -7
  4. package/README.md +11 -8
  5. package/dist/adapters/banal/failure.d.ts +1 -7
  6. package/dist/adapters/banal/failure.d.ts.map +1 -1
  7. package/dist/adapters/banal/failure.js +5 -7
  8. package/dist/adapters/banal/failure.js.map +1 -1
  9. package/dist/adapters/banal/index.d.ts.map +1 -1
  10. package/dist/adapters/banal/index.js +8 -11
  11. package/dist/adapters/banal/index.js.map +1 -1
  12. package/dist/adapters/banal/install.d.ts.map +1 -1
  13. package/dist/adapters/banal/install.js +4 -3
  14. package/dist/adapters/banal/install.js.map +1 -1
  15. package/dist/adapters/banal/invocation.d.ts +10 -5
  16. package/dist/adapters/banal/invocation.d.ts.map +1 -1
  17. package/dist/adapters/banal/invocation.js +13 -1
  18. package/dist/adapters/banal/invocation.js.map +1 -1
  19. package/dist/adapters/banal/locate.d.ts +12 -9
  20. package/dist/adapters/banal/locate.d.ts.map +1 -1
  21. package/dist/adapters/banal/locate.js +19 -12
  22. package/dist/adapters/banal/locate.js.map +1 -1
  23. package/dist/adapters/banal/run.d.ts +10 -1
  24. package/dist/adapters/banal/run.d.ts.map +1 -1
  25. package/dist/adapters/banal/run.js +8 -4
  26. package/dist/adapters/banal/run.js.map +1 -1
  27. package/dist/adapters/banal/settings.d.ts +1 -1
  28. package/dist/adapters/banal/settings.d.ts.map +1 -1
  29. package/dist/adapters/banal/settings.js +2 -1
  30. package/dist/adapters/banal/settings.js.map +1 -1
  31. package/dist/adapters/latex/document-class.d.ts +22 -0
  32. package/dist/adapters/latex/document-class.d.ts.map +1 -0
  33. package/dist/adapters/latex/document-class.js +102 -0
  34. package/dist/adapters/latex/document-class.js.map +1 -0
  35. package/dist/adapters/latex/hidden.d.ts +16 -0
  36. package/dist/adapters/latex/hidden.d.ts.map +1 -0
  37. package/dist/adapters/latex/hidden.js +49 -0
  38. package/dist/adapters/latex/hidden.js.map +1 -0
  39. package/dist/adapters/latex/index.d.ts +29 -0
  40. package/dist/adapters/latex/index.d.ts.map +1 -0
  41. package/dist/adapters/latex/index.js +18 -0
  42. package/dist/adapters/latex/index.js.map +1 -0
  43. package/dist/adapters/latex/nodes.d.ts +54 -0
  44. package/dist/adapters/latex/nodes.d.ts.map +1 -0
  45. package/dist/adapters/latex/nodes.js +93 -0
  46. package/dist/adapters/latex/nodes.js.map +1 -0
  47. package/dist/adapters/latex/outline.d.ts +10 -0
  48. package/dist/adapters/latex/outline.d.ts.map +1 -0
  49. package/dist/adapters/latex/outline.js +39 -0
  50. package/dist/adapters/latex/outline.js.map +1 -0
  51. package/dist/adapters/latex/parse.d.ts +42 -0
  52. package/dist/adapters/latex/parse.d.ts.map +1 -0
  53. package/dist/adapters/latex/parse.js +94 -0
  54. package/dist/adapters/latex/parse.js.map +1 -0
  55. package/dist/adapters/latex/rendered.d.ts +10 -0
  56. package/dist/adapters/latex/rendered.d.ts.map +1 -0
  57. package/dist/adapters/latex/rendered.js +39 -0
  58. package/dist/adapters/latex/rendered.js.map +1 -0
  59. package/dist/adapters/memory/index.d.ts.map +1 -1
  60. package/dist/adapters/memory/index.js +8 -2
  61. package/dist/adapters/memory/index.js.map +1 -1
  62. package/dist/adapters/node/process.io.d.ts +6 -3
  63. package/dist/adapters/node/process.io.d.ts.map +1 -1
  64. package/dist/adapters/node/process.io.js.map +1 -1
  65. package/dist/adapters/node/workspace.io.d.ts.map +1 -1
  66. package/dist/adapters/node/workspace.io.js +4 -2
  67. package/dist/adapters/node/workspace.io.js.map +1 -1
  68. package/dist/adapters/pdfjs/fill.d.ts.map +1 -1
  69. package/dist/adapters/pdfjs/fill.js +12 -12
  70. package/dist/adapters/pdfjs/fill.js.map +1 -1
  71. package/dist/adapters/references/index.d.ts.map +1 -1
  72. package/dist/adapters/references/index.js +4 -2
  73. package/dist/adapters/references/index.js.map +1 -1
  74. package/dist/build-engine.d.ts +1 -1
  75. package/dist/build-engine.d.ts.map +1 -1
  76. package/dist/build-engine.js +8 -1
  77. package/dist/build-engine.js.map +1 -1
  78. package/dist/build.d.ts +2 -3
  79. package/dist/build.d.ts.map +1 -1
  80. package/dist/build.js +9 -10
  81. package/dist/build.js.map +1 -1
  82. package/dist/caller-path.d.ts +3 -0
  83. package/dist/caller-path.d.ts.map +1 -0
  84. package/dist/caller-path.js +13 -0
  85. package/dist/caller-path.js.map +1 -0
  86. package/dist/cli.d.ts +10 -17
  87. package/dist/cli.d.ts.map +1 -1
  88. package/dist/cli.js +91 -17
  89. package/dist/cli.js.map +1 -1
  90. package/dist/doctor.d.ts +12 -3
  91. package/dist/doctor.d.ts.map +1 -1
  92. package/dist/doctor.js +2 -1
  93. package/dist/doctor.js.map +1 -1
  94. package/dist/domain/paths.d.ts +8 -2
  95. package/dist/domain/paths.d.ts.map +1 -1
  96. package/dist/domain/paths.js +12 -1
  97. package/dist/domain/paths.js.map +1 -1
  98. package/dist/domain/ready.d.ts +24 -0
  99. package/dist/domain/ready.d.ts.map +1 -0
  100. package/dist/domain/ready.js +11 -0
  101. package/dist/domain/ready.js.map +1 -0
  102. package/dist/domain/record.d.ts +8 -0
  103. package/dist/domain/record.d.ts.map +1 -0
  104. package/dist/domain/record.js +8 -0
  105. package/dist/domain/record.js.map +1 -0
  106. package/dist/domain/sha256.d.ts.map +1 -1
  107. package/dist/domain/sha256.js +4 -2
  108. package/dist/domain/sha256.js.map +1 -1
  109. package/dist/domain/tex-document.d.ts +84 -0
  110. package/dist/domain/tex-document.d.ts.map +1 -0
  111. package/dist/domain/tex-document.js +43 -0
  112. package/dist/domain/tex-document.js.map +1 -0
  113. package/dist/engine.d.ts +23 -22
  114. package/dist/engine.d.ts.map +1 -1
  115. package/dist/engine.js.map +1 -1
  116. package/dist/eslint-rules/bib-reachable-entry.d.ts +1 -1
  117. package/dist/eslint-rules/bib-reachable-entry.js.map +1 -1
  118. package/dist/eslint-rules/install-path-literals.d.ts +2 -2
  119. package/dist/eslint-rules/install-path-literals.js.map +1 -1
  120. package/dist/eslint-rules/paper-research-question.d.ts +1 -1
  121. package/dist/eslint-rules/paper-research-question.js.map +1 -1
  122. package/dist/eslint-rules/paper-stages.d.ts +2 -2
  123. package/dist/eslint-rules/paper-stages.js.map +1 -1
  124. package/dist/eslint-rules/paper-typography.d.ts +6 -6
  125. package/dist/eslint-rules/paper-typography.js.map +1 -1
  126. package/dist/eslint-rules/pdf-last-page-balance.d.ts +1 -1
  127. package/dist/eslint-rules/pdf-last-page-balance.js.map +1 -1
  128. package/dist/eslint-rules/review-frontmatter.d.ts +2 -2
  129. package/dist/eslint-rules/review-frontmatter.js.map +1 -1
  130. package/dist/eslint-rules/sibling-frontmatter.d.ts +1 -1
  131. package/dist/eslint-rules/sibling-frontmatter.d.ts.map +1 -1
  132. package/dist/eslint-rules/temp-root-realpath.d.ts +1 -1
  133. package/dist/eslint-rules/temp-root-realpath.js.map +1 -1
  134. package/dist/eslint-rules/tex-build.d.ts +2 -2
  135. package/dist/eslint-rules/tex-build.js.map +1 -1
  136. package/dist/facts-file.d.ts.map +1 -1
  137. package/dist/facts-file.js +31 -28
  138. package/dist/facts-file.js.map +1 -1
  139. package/dist/hooks-settings.d.ts.map +1 -1
  140. package/dist/hooks-settings.js +17 -2
  141. package/dist/hooks-settings.js.map +1 -1
  142. package/dist/init.d.ts +3 -4
  143. package/dist/init.d.ts.map +1 -1
  144. package/dist/init.js +18 -8
  145. package/dist/init.js.map +1 -1
  146. package/dist/lib/paper-config.d.ts.map +1 -1
  147. package/dist/lib/paper-config.js +1 -5
  148. package/dist/lib/paper-config.js.map +1 -1
  149. package/dist/new-paper.d.ts +5 -0
  150. package/dist/new-paper.d.ts.map +1 -1
  151. package/dist/new-paper.js +8 -1
  152. package/dist/new-paper.js.map +1 -1
  153. package/dist/package-dirs.d.ts +5 -0
  154. package/dist/package-dirs.d.ts.map +1 -0
  155. package/dist/package-dirs.js +14 -0
  156. package/dist/package-dirs.js.map +1 -0
  157. package/dist/paper-files.d.ts +4 -4
  158. package/dist/paper-files.d.ts.map +1 -1
  159. package/dist/paper-files.js +6 -6
  160. package/dist/paper-files.js.map +1 -1
  161. package/dist/paper-settings.js +3 -3
  162. package/dist/paper-settings.js.map +1 -1
  163. package/dist/pdf-facts.d.ts +51 -1
  164. package/dist/pdf-facts.d.ts.map +1 -1
  165. package/dist/pdf-facts.js +23 -15
  166. package/dist/pdf-facts.js.map +1 -1
  167. package/dist/pdf-geometry.d.ts.map +1 -1
  168. package/dist/pdf-geometry.js +2 -3
  169. package/dist/pdf-geometry.js.map +1 -1
  170. package/dist/ports/latex.d.ts +24 -0
  171. package/dist/ports/latex.d.ts.map +1 -0
  172. package/dist/ports/latex.js +2 -0
  173. package/dist/ports/latex.js.map +1 -0
  174. package/dist/ports/tool-installer.d.ts +2 -14
  175. package/dist/ports/tool-installer.d.ts.map +1 -1
  176. package/dist/presets.d.ts +15 -2
  177. package/dist/presets.d.ts.map +1 -1
  178. package/dist/presets.js +35 -10
  179. package/dist/presets.js.map +1 -1
  180. package/dist/references.d.ts.map +1 -1
  181. package/dist/references.js +4 -4
  182. package/dist/references.js.map +1 -1
  183. package/dist/rules-config.d.ts +26 -1
  184. package/dist/rules-config.d.ts.map +1 -1
  185. package/dist/rules-config.js +9 -9
  186. package/dist/rules-config.js.map +1 -1
  187. package/dist/tex-requirements.d.ts +15 -0
  188. package/dist/tex-requirements.d.ts.map +1 -1
  189. package/dist/tex-requirements.js +28 -10
  190. package/dist/tex-requirements.js.map +1 -1
  191. package/dist/tex-venue-rules.d.ts +83 -0
  192. package/dist/tex-venue-rules.d.ts.map +1 -0
  193. package/dist/tex-venue-rules.js +254 -0
  194. package/dist/tex-venue-rules.js.map +1 -0
  195. package/dist/types.d.ts +5 -3
  196. package/dist/types.d.ts.map +1 -1
  197. package/dist/venue-rules.d.ts +1 -1
  198. package/dist/venue-rules.d.ts.map +1 -1
  199. package/dist/venue-rules.js +20 -7
  200. package/dist/venue-rules.js.map +1 -1
  201. package/docs/configuration.md +5 -4
  202. package/docs/e2e.md +69 -40
  203. package/docs/install.md +1 -1
  204. package/docs/prior-art/README.md +1 -1
  205. package/docs/prior-art/package-location.md +5 -5
  206. package/docs/prior-art/repro/README.md +1 -1
  207. package/docs/prior-art/test-tooling.md +21 -10
  208. package/docs/rules/tex/required-section.md +73 -0
  209. package/docs/rules/tex/template.md +62 -0
  210. package/docs/rules/tex/venue-leftover.md +71 -0
  211. package/docs/rules.md +70 -48
  212. package/docs/testing.md +17 -4
  213. package/docs/texlive-install-decision.md +1 -1
  214. package/docs/toolchain.md +2 -2
  215. package/eslint-rules/bib-reachable-entry.ts +1 -1
  216. package/eslint-rules/install-path-literals.ts +2 -2
  217. package/eslint-rules/paper-research-question.ts +1 -1
  218. package/eslint-rules/paper-stages.ts +2 -2
  219. package/eslint-rules/paper-typography.ts +2 -2
  220. package/eslint-rules/pdf-last-page-balance.ts +1 -1
  221. package/eslint-rules/review-frontmatter.ts +1 -1
  222. package/eslint-rules/temp-root-realpath.ts +1 -1
  223. package/eslint-rules/tex-build.ts +2 -2
  224. package/eslint.config.mjs +162 -15
  225. package/fixtures/build-e2e/acmart/expect.json +26 -0
  226. package/fixtures/build-e2e/aidc/PIPELINE-STATUS.md +3 -0
  227. package/fixtures/build-e2e/aidc/expect.json +14 -0
  228. package/fixtures/build-e2e/aidc/paper.tex +46 -0
  229. package/fixtures/build-e2e/aidc/paperlint.json +1 -0
  230. package/fixtures/build-e2e/broken/expect.json +11 -0
  231. package/fixtures/build-e2e/cite/expect.json +27 -0
  232. package/fixtures/build-e2e/empty/expect.json +12 -0
  233. package/fixtures/build-e2e/fallback/expect.json +53 -0
  234. package/fixtures/build-e2e/guards/expect.json +6 -0
  235. package/fixtures/build-e2e/no-source/expect.json +10 -0
  236. package/fixtures/build-e2e/unbalanced/expect.json +60 -0
  237. package/fixtures/install-path-literals/clean.fixture.mjs +1 -1
  238. package/fixtures/install-path-literals/clean.md +2 -2
  239. package/fixtures/install-path-literals/defect.fixture.mjs +1 -1
  240. package/fixtures/install-path-literals/defect.md +2 -2
  241. package/fixtures/pdf-facts/README.md +1 -1
  242. package/fixtures/real-markdown-paper/baseline.ts +1 -1
  243. package/fixtures/render-paper/build-clean.sh +3 -5
  244. package/hooks/paper-status-gates.sh +9 -19
  245. package/lib/paper-config.harness.mjs +1 -1
  246. package/lib/paper-config.ts +1 -5
  247. package/lib/skill-checks.mjs +24 -381
  248. package/lib/skill-checks.test.mjs +63 -115
  249. package/lib/skill-corpus.mjs +10 -251
  250. package/lib/skill-corpus.test.mjs +2 -13
  251. package/lib/skill-trigger-cases.mjs +1 -1
  252. package/package.json +13 -2
  253. package/{skills/submit-paper/references/venues โ†’ presets}/acm-sigconf.jsonc +4 -1
  254. package/{skills/submit-paper/references/venues โ†’ presets}/agenticdev.jsonc +4 -0
  255. package/presets/aidc.jsonc +73 -0
  256. package/{skills/submit-paper/references/venues โ†’ presets}/aisec.jsonc +4 -0
  257. package/presets/ieee-conference.jsonc +66 -0
  258. package/{skills/submit-paper/references/venues โ†’ presets}/realm.jsonc +8 -1
  259. package/{skills/submit-paper/references/venues โ†’ presets/tex}/paper-guards.tex +1 -1
  260. package/{skills/submit-paper/references/venues โ†’ presets}/venue-profile.schema.json +30 -2
  261. package/scripts/check.harness.ts +64 -10
  262. package/scripts/check.test.ts +60 -13
  263. package/scripts/check.ts +83 -30
  264. package/scripts/coverage-config.test.ts +0 -1
  265. package/scripts/harness-api.frozen.json +0 -1
  266. package/scripts/test.test.ts +1 -1
  267. package/scripts/test.ts +1 -1
  268. package/skills/analyze-sibling-paper/SKILL.md +1 -39
  269. package/skills/analyze-sibling-paper/SKILL.md.spec.ts +0 -38
  270. package/skills/argument-arc/SKILL.md +2 -36
  271. package/skills/argument-arc/SKILL.md.spec.ts +1 -43
  272. package/skills/build-benchmark/SKILL.md +1 -41
  273. package/skills/build-benchmark/SKILL.md.spec.ts +0 -40
  274. package/skills/camera-ready/SKILL.md +1 -34
  275. package/skills/camera-ready/SKILL.md.spec.ts +0 -33
  276. package/skills/cold-read-diff/SKILL.md +1 -35
  277. package/skills/cold-read-diff/SKILL.md.spec.ts +0 -34
  278. package/skills/draft-paper/SKILL.md +2 -41
  279. package/skills/draft-paper/SKILL.md.spec.ts +1 -50
  280. package/skills/extend-paper/SKILL.md +2 -33
  281. package/skills/extend-paper/SKILL.md.spec.ts +1 -42
  282. package/skills/find-venue/SKILL.md +2 -38
  283. package/skills/find-venue/SKILL.md.spec.ts +1 -47
  284. package/skills/grade-paper-writing/SKILL.md +3 -38
  285. package/skills/grade-paper-writing/SKILL.md.spec.ts +2 -47
  286. package/skills/grade-paper-writing/prose-lint.mjs +2 -3
  287. package/skills/grade-paper-writing/prose-lint.test.ts +1 -1
  288. package/skills/harden-paper/SKILL.md +1 -39
  289. package/skills/harden-paper/SKILL.md.spec.ts +0 -38
  290. package/skills/map-prior-work/SKILL.md +1 -35
  291. package/skills/map-prior-work/SKILL.md.spec.ts +0 -34
  292. package/skills/osf-artifact-upload/osf-artifact-upload.harness.ts +3 -4
  293. package/skills/paper-adversarial-review/SKILL.md +2 -35
  294. package/skills/paper-adversarial-review/SKILL.md.spec.ts +1 -43
  295. package/skills/paper-pipeline/PIPELINE-MAP.md +2 -2
  296. package/skills/paper-pipeline/SKILL.md +3 -29
  297. package/skills/paper-pipeline/SKILL.md.spec.ts +2 -28
  298. package/skills/paper-pipeline/grade-paper-writing-ablation.eval.mjs +1 -1
  299. package/skills/paper-pipeline/paper-pipeline.harness.mjs +25 -40
  300. package/skills/paper-pipeline/references/acceptance-gate.md +1 -6
  301. package/skills/paper-pipeline/references/pipeline-status-template.md +8 -35
  302. package/skills/paper-pipeline/scripts/README.md +30 -225
  303. package/skills/paper-pipeline/scripts/artifact-coverage.harness.mjs +4 -8
  304. package/skills/paper-pipeline/scripts/consumer.d.mts +0 -2
  305. package/skills/paper-pipeline/scripts/consumer.harness.mjs +6 -104
  306. package/skills/paper-pipeline/scripts/consumer.mjs +24 -119
  307. package/skills/paper-pipeline/scripts/generated-code.harness.mjs +2 -3
  308. package/skills/paper-pipeline/scripts/population-map.harness.mjs +3 -3
  309. package/skills/paper-status/SKILL.md +2 -42
  310. package/skills/paper-status/SKILL.md.spec.ts +1 -41
  311. package/skills/pc-panel-review/SKILL.md +2 -46
  312. package/skills/pc-panel-review/SKILL.md.spec.ts +1 -45
  313. package/skills/plan-paper-timeline/SKILL.md +2 -36
  314. package/skills/plan-paper-timeline/SKILL.md.spec.ts +0 -36
  315. package/skills/render-paper/SKILL.md +2 -38
  316. package/skills/render-paper/SKILL.md.spec.ts +1 -37
  317. package/skills/render-paper/check-render.sh +16 -63
  318. package/skills/render-paper/render-paper.harness.mjs +17 -59
  319. package/skills/research-ideate/SKILL.md +2 -39
  320. package/skills/research-ideate/SKILL.md.spec.ts +1 -47
  321. package/skills/study-accepted-papers/SKILL.md +1 -34
  322. package/skills/study-accepted-papers/SKILL.md.spec.ts +0 -33
  323. package/skills/submit-paper/SKILL.md +1 -33
  324. package/skills/submit-paper/SKILL.md.spec.ts +0 -32
  325. package/skills/sweep-design-space/SKILL.md +1 -38
  326. package/skills/sweep-design-space/SKILL.md.spec.ts +0 -37
  327. package/skills/tighten-paper/SKILL.md +2 -39
  328. package/skills/tighten-paper/SKILL.md.spec.ts +1 -47
  329. package/skills/tighten-paper/structure.mjs +4 -11
  330. package/skills/verify-citations/SKILL.md +2 -38
  331. package/skills/verify-citations/SKILL.md.spec.ts +1 -37
  332. package/src/adapters/banal/failure.ts +9 -10
  333. package/src/adapters/banal/index.test.ts +3 -3
  334. package/src/adapters/banal/index.ts +8 -10
  335. package/src/adapters/banal/install.ts +9 -4
  336. package/src/adapters/banal/invocation.test.ts +20 -8
  337. package/src/adapters/banal/invocation.ts +24 -9
  338. package/src/adapters/banal/locate.test.ts +2 -2
  339. package/src/adapters/banal/locate.ts +27 -21
  340. package/src/adapters/banal/output.test.ts +1 -1
  341. package/src/adapters/banal/run.test.ts +3 -3
  342. package/src/adapters/banal/run.ts +16 -10
  343. package/src/adapters/banal/settings.ts +2 -2
  344. package/src/adapters/banal/xml.test.ts +1 -1
  345. package/src/adapters/curl/download.test.ts +4 -4
  346. package/src/adapters/latex/document-class.ts +147 -0
  347. package/src/adapters/latex/hidden.ts +70 -0
  348. package/src/adapters/latex/index.test.ts +361 -0
  349. package/src/adapters/latex/index.ts +55 -0
  350. package/src/adapters/latex/nodes.ts +141 -0
  351. package/src/adapters/latex/outline.ts +64 -0
  352. package/src/adapters/latex/parse.ts +136 -0
  353. package/src/adapters/latex/rendered.ts +59 -0
  354. package/src/adapters/memory/index.ts +4 -3
  355. package/src/adapters/node/files.test.ts +5 -3
  356. package/src/adapters/node/process.io.ts +9 -2
  357. package/src/adapters/node/process.test.ts +4 -4
  358. package/src/adapters/node/workspace.io.ts +9 -4
  359. package/src/adapters/pdfjs/fill.test.ts +1 -1
  360. package/src/adapters/pdfjs/fill.ts +18 -10
  361. package/src/adapters/references/index.ts +7 -2
  362. package/src/build-engine.test.ts +11 -6
  363. package/src/build-engine.ts +10 -5
  364. package/src/build.harness.mjs +5 -7
  365. package/src/build.test.ts +10 -11
  366. package/src/build.ts +12 -13
  367. package/src/caller-path.ts +13 -0
  368. package/src/cli.harness.mjs +1 -3
  369. package/src/cli.test.ts +21 -16
  370. package/src/cli.ts +115 -33
  371. package/src/doctor.test.ts +1 -1
  372. package/src/doctor.ts +14 -5
  373. package/src/domain/paths.test.ts +15 -0
  374. package/src/domain/paths.ts +20 -1
  375. package/src/domain/ready.ts +31 -0
  376. package/src/domain/record.test.ts +20 -0
  377. package/src/domain/record.ts +12 -0
  378. package/src/domain/sha256.ts +5 -3
  379. package/src/domain/tex-document.test.ts +80 -0
  380. package/src/domain/tex-document.ts +110 -0
  381. package/src/engine.harness.mjs +1 -1
  382. package/src/engine.ts +30 -2
  383. package/src/facts-file.test.ts +4 -7
  384. package/src/facts-file.ts +45 -30
  385. package/src/hooks-settings.harness.ts +17 -0
  386. package/src/hooks-settings.ts +28 -4
  387. package/src/init.test.ts +25 -5
  388. package/src/init.ts +26 -12
  389. package/src/latex-loop.harness.ts +1 -1
  390. package/src/new-paper.harness.mjs +7 -23
  391. package/src/new-paper.test.ts +28 -3
  392. package/src/new-paper.ts +15 -3
  393. package/src/package-dirs.ts +17 -0
  394. package/src/paper-files.test.ts +22 -19
  395. package/src/paper-files.ts +16 -27
  396. package/src/paper-settings-commands.test.ts +6 -1
  397. package/src/paper-settings.test.ts +2 -2
  398. package/src/paper-settings.ts +5 -5
  399. package/src/pdf-facts.test.ts +16 -5
  400. package/src/pdf-facts.ts +79 -22
  401. package/src/pdf-geometry.ts +5 -3
  402. package/src/ports/latex.ts +29 -0
  403. package/src/ports/tool-installer.ts +2 -17
  404. package/src/presets.test.ts +65 -4
  405. package/src/presets.ts +65 -28
  406. package/src/references.test.ts +25 -19
  407. package/src/references.ts +4 -5
  408. package/src/rule-cases.test.ts +474 -0
  409. package/src/rule-docs.test.ts +159 -0
  410. package/src/rules-config.ts +40 -11
  411. package/src/tex-requirements.harness.ts +13 -23
  412. package/src/tex-requirements.test.ts +21 -0
  413. package/src/tex-requirements.ts +64 -14
  414. package/src/tex-venue-rules.test.ts +659 -0
  415. package/src/tex-venue-rules.ts +429 -0
  416. package/src/toolchain.harness.mjs +1 -1
  417. package/src/toolchain.test.ts +9 -5
  418. package/src/toolchain.ts +2 -2
  419. package/src/types.ts +5 -3
  420. package/src/venue-rules.test.ts +104 -8
  421. package/src/venue-rules.ts +22 -12
  422. package/templates/paper/paper.tex +2 -1
  423. package/skills/paper-pipeline/scripts/announce.mjs +0 -67
  424. package/skills/paper-pipeline/scripts/announce.test.mjs +0 -102
  425. package/skills/paper-pipeline/scripts/fixtures/clean/PIPELINE-STATUS.md +0 -51
  426. package/skills/paper-pipeline/scripts/fixtures/dirty/PIPELINE-STATUS.md +0 -52
  427. package/skills/paper-pipeline/scripts/fixtures/dirty/paper.md +0 -6
  428. package/skills/paper-pipeline/scripts/fixtures/scorecard.ts +0 -100
  429. package/skills/paper-pipeline/scripts/ledger.cli.test.mjs +0 -302
  430. package/skills/paper-pipeline/scripts/ledger.mjs +0 -623
  431. package/skills/paper-pipeline/scripts/ledger.test.mjs +0 -254
  432. package/skills/paper-pipeline/scripts/pipeline-check.cli.test.mjs +0 -474
  433. package/skills/paper-pipeline/scripts/pipeline-check.harness.mjs +0 -328
  434. package/skills/paper-pipeline/scripts/pipeline-check.mjs +0 -750
  435. package/skills/paper-pipeline/scripts/pipeline-edges.mjs +0 -169
  436. package/skills/paper-pipeline/scripts/pipeline-edges.test.mjs +0 -73
  437. package/skills/paper-pipeline/scripts/run-mechanical.mjs +0 -648
  438. package/skills/paper-pipeline/scripts/run-mechanical.test.mjs +0 -468
  439. package/skills/paper-pipeline/scripts/status.mjs +0 -295
  440. package/skills/paper-pipeline/scripts/status.test.mjs +0 -232
  441. /package/{skills/submit-paper/references/venues โ†’ presets/tex}/agenticdev.tex +0 -0
  442. /package/{skills/submit-paper/references/venues โ†’ presets}/tex-base.jsonc +0 -0
@@ -1,28 +1,13 @@
1
1
  ---
2
2
  name: research-ideate
3
3
  description: "Decide whether a research idea is worth doing at all โ€” before any work goes into it. Use when someone has an idea and asks: is this worth pursuing, should we take it on, is it a paper or just a blog post, is there a quick minimal result that doesn't need a dramatic finding, will it pull us away from our main line of work. Returns a go / no-go verdict with the sharpest framing, the minimal finding and the kinds of venue that would take it. Judges the idea by what counts in a body of work: a peer-reviewed indexed publication, a reusable method or benchmark rather than a one-off \"tool X is bad\", onward citations rather than GitHub stars, and one connected line rather than scattered topics. Stage: conception, before find-venue and before any draft; hands off to find-venue, build-benchmark, draft-paper."
4
- allowed-tools: [Read, Write, Grep, Glob, Agent, Skill, Bash(node .claude/skills/paper-pipeline/scripts/announce.mjs:*), Bash(node .claude/skills/paper-pipeline/scripts/ledger.mjs:*)]
4
+ allowed-tools: [Read, Write, Grep, Glob, Agent, Skill]
5
5
  ---
6
6
 
7
- <!-- vigiles:sha256:f0ccfb74162bca40 compiled from skills/research-ideate/SKILL.md.spec.ts -->
7
+ <!-- vigiles:sha256:03a0131d306d7ab0 compiled from skills/research-ideate/SKILL.md.spec.ts -->
8
8
 
9
9
  # research-ideate โ€” is this idea worth a paper, and does the paper earn authorship credit?
10
10
 
11
- ## Run me
12
-
13
- ๐Ÿ”ด FIRST, before any other step:
14
-
15
- ```
16
- node .claude/skills/paper-pipeline/scripts/announce.mjs research-ideate <dir>
17
- ```
18
-
19
- An advisory pass cannot be observed failing โ€” silence is both its error state and its normal
20
- state โ€” so starting is an event, and events get written down.
21
-
22
- The `<dir>` argument is **optional in spirit**: this skill can run before a paper directory exists, so
23
- pass whichever directory the work lives in, or `.`. The ledger row is written either way, and a plain
24
- dot is more honest than an invented path.
25
-
26
11
  Runs BEFORE any effort is spent. An idea can be interesting and still be a bad *publication*
27
12
  investment โ€” the wrong framing produces something un-publishable or un-citable, which counts for
28
13
  nothing toward a body of work. This skill kills those ideas early and reshapes the survivors into the framing
@@ -87,28 +72,6 @@ Emit a compact verdict:
87
72
  e.g. "security-of-AI-coding workshop @ a top-tier security conference," "SE-measurement workshop @
88
73
  ASE/FSE," "eval/benchmark track." Hand these to `find-venue`.
89
74
 
90
- ## Record the verdict
91
-
92
- ๐Ÿ”ด LAST step, once the deliverable exists:
93
-
94
- ```
95
- node .claude/skills/paper-pipeline/scripts/ledger.mjs record research-ideate <dir> FINDING <count> <report-path>
96
- node .claude/skills/paper-pipeline/scripts/ledger.mjs record research-ideate <dir> ABSTAINED <reason> "<one line>"
97
- ```
98
-
99
- ๐Ÿ”ด **There is no PASS**, so there is no way to write down "go" as a value. A clean go is the
100
- absence of findings across the axes, and whoever wants to call it a go says so themselves.
101
-
102
- **FINDING** โ€” go with reshaping, where `<count>` is the number of axes that need it and
103
- `<report-path>` is the output. Add `--blocking` for a no-go: axis (a) is a hard stop, not a weight,
104
- and a no-go is the loudest finding this skill produces.
105
- **ABSTAINED** โ€” `no-witness`: all axes were scored and none needed reshaping. `blocked`: the idea
106
- was too vague to score, which is a different thing from a no-go and must not be recorded as one.
107
-
108
- A recorded no-go is the cheapest artifact in this whole pipeline, and the one most often lost: an idea
109
- killed in conversation comes back three months later wearing a different name, and nothing in the repo
110
- remembers that it was already judged.
111
-
112
75
  ## Rules
113
76
  - Axis (a) is a gate, not a weight โ€” no indexed peer review, no idea. Everything else reshapes.
114
77
  - Never justify an idea by GitHub stars, demo virality, or "it'd be a great blog post." Those don't
@@ -10,34 +10,10 @@ export default experimental_skill({
10
10
  name: "research-ideate",
11
11
  description:
12
12
  'Decide whether a research idea is worth doing at all โ€” before any work goes into it. Use when someone has an idea and asks: is this worth pursuing, should we take it on, is it a paper or just a blog post, is there a quick minimal result that doesn\'t need a dramatic finding, will it pull us away from our main line of work. Returns a go / no-go verdict with the sharpest framing, the minimal finding and the kinds of venue that would take it. Judges the idea by what counts in a body of work: a peer-reviewed indexed publication, a reusable method or benchmark rather than a one-off "tool X is bad", onward citations rather than GitHub stars, and one connected line rather than scattered topics. Stage: conception, before find-venue and before any draft; hands off to find-venue, build-benchmark, draft-paper.',
13
- tools: [
14
- "Read",
15
- "Write",
16
- "Grep",
17
- "Glob",
18
- "Agent",
19
- "Skill",
20
- "Bash(node .claude/skills/paper-pipeline/scripts/announce.mjs:*)",
21
- "Bash(node .claude/skills/paper-pipeline/scripts/ledger.mjs:*)",
22
- ],
13
+ tools: ["Read", "Write", "Grep", "Glob", "Agent", "Skill"],
23
14
  body: `
24
15
  # research-ideate โ€” is this idea worth a paper, and does the paper earn authorship credit?
25
16
 
26
- ## Run me
27
-
28
- ๐Ÿ”ด FIRST, before any other step:
29
-
30
- \`\`\`
31
- node .claude/skills/paper-pipeline/scripts/announce.mjs research-ideate <dir>
32
- \`\`\`
33
-
34
- An advisory pass cannot be observed failing โ€” silence is both its error state and its normal
35
- state โ€” so starting is an event, and events get written down.
36
-
37
- The \`<dir>\` argument is **optional in spirit**: this skill can run before a paper directory exists, so
38
- pass whichever directory the work lives in, or \`.\`. The ledger row is written either way, and a plain
39
- dot is more honest than an invented path.
40
-
41
17
  Runs BEFORE any effort is spent. An idea can be interesting and still be a bad *publication*
42
18
  investment โ€” the wrong framing produces something un-publishable or un-citable, which counts for
43
19
  nothing toward a body of work. This skill kills those ideas early and reshapes the survivors into the framing
@@ -102,28 +78,6 @@ Emit a compact verdict:
102
78
  e.g. "security-of-AI-coding workshop @ a top-tier security conference," "SE-measurement workshop @
103
79
  ASE/FSE," "eval/benchmark track." Hand these to \`find-venue\`.
104
80
 
105
- ## Record the verdict
106
-
107
- ๐Ÿ”ด LAST step, once the deliverable exists:
108
-
109
- \`\`\`
110
- node .claude/skills/paper-pipeline/scripts/ledger.mjs record research-ideate <dir> FINDING <count> <report-path>
111
- node .claude/skills/paper-pipeline/scripts/ledger.mjs record research-ideate <dir> ABSTAINED <reason> "<one line>"
112
- \`\`\`
113
-
114
- ๐Ÿ”ด **There is no PASS**, so there is no way to write down "go" as a value. A clean go is the
115
- absence of findings across the axes, and whoever wants to call it a go says so themselves.
116
-
117
- **FINDING** โ€” go with reshaping, where \`<count>\` is the number of axes that need it and
118
- \`<report-path>\` is the output. Add \`--blocking\` for a no-go: axis (a) is a hard stop, not a weight,
119
- and a no-go is the loudest finding this skill produces.
120
- **ABSTAINED** โ€” \`no-witness\`: all axes were scored and none needed reshaping. \`blocked\`: the idea
121
- was too vague to score, which is a different thing from a no-go and must not be recorded as one.
122
-
123
- A recorded no-go is the cheapest artifact in this whole pipeline, and the one most often lost: an idea
124
- killed in conversation comes back three months later wearing a different name, and nothing in the repo
125
- remembers that it was already judged.
126
-
127
81
  ## Rules
128
82
  - Axis (a) is a gate, not a weight โ€” no indexed peer review, no idea. Everything else reshapes.
129
83
  - Never justify an idea by GitHub stars, demo virality, or "it'd be a great blog post." Those don't
@@ -5,21 +5,10 @@ context: fork
5
5
  allowed-tools: [Read, Write, Edit, Grep, Glob, Bash, WebSearch, WebFetch, Agent]
6
6
  ---
7
7
 
8
- <!-- vigiles:sha256:177ca8805990361e compiled from skills/study-accepted-papers/SKILL.md.spec.ts -->
8
+ <!-- vigiles:sha256:e199b342e4e98338 compiled from skills/study-accepted-papers/SKILL.md.spec.ts -->
9
9
 
10
10
  # study-accepted-papers โ€” learn the venue's bar from its own accepted corpus, then lever your draft up
11
11
 
12
- ## Run me
13
-
14
- ๐Ÿ”ด FIRST, before any other step:
15
-
16
- ```
17
- node .claude/skills/paper-pipeline/scripts/announce.mjs study-accepted-papers <paper-dir>
18
- ```
19
-
20
- An advisory pass cannot be observed failing โ€” silence is both its error state and its normal
21
- state โ€” so starting is an event, and events get written down.
22
-
23
12
  Reviewers don't score in a vacuum โ€” they score against the papers that got in last cycle. This skill
24
13
  makes that reference standard explicit: pull the venue's **actually-accepted** papers of your type,
25
14
  extract the concrete properties that separated the strong ones from the weak-accepts, and diff your
@@ -157,28 +146,6 @@ being violated, and the **things previously believed that the corpus disproved**
157
146
  valuable lines in the file, because without them the pipeline re-derives the wrong belief). Keep it
158
147
  short enough that it survives being loaded into every session.
159
148
 
160
- ## Record the verdict
161
-
162
- ๐Ÿ”ด LAST step, once the deliverable exists:
163
-
164
- ```
165
- node .claude/skills/paper-pipeline/scripts/ledger.mjs record study-accepted-papers <paper-dir> FINDING <count> <report-path>
166
- node .claude/skills/paper-pipeline/scripts/ledger.mjs record study-accepted-papers <paper-dir> ABSTAINED <reason> "<one line>"
167
- ```
168
-
169
- **FINDING** โ€” `<count>` is the number of levers, `<report-path>` the ranked CHEAP/EXPENSIVE list.
170
- Add `--blocking` when the draft is missing something the track *requires* (an artifact link, a named
171
- benchmark, a metric definition): a desk-reject, never a weak accept, and worth the loudest thing
172
- this skill can say.
173
- **ABSTAINED** โ€” `no-witness`: the corpus was read and no lever came out of it. `input-missing`: the
174
- venue publishes no accepted papers to mine.
175
-
176
- ๐Ÿ”ด **There is no PASS**, and the reason is visible here. "The draft already sits at the venue's bar"
177
- is only meaningful next to the corpus it was measured against โ€” *33 of 34 accepted papers*, not
178
- *most of them* โ€” and a stored acquittal carried that denominator nowhere. Put the corpus size in the
179
- `ABSTAINED` note and in the report; without it the row is an impression with a machine-readable
180
- label on it.
181
-
182
149
  ## Rules
183
150
  - **Fetch real accepted papers.** Never fabricate a title, author, or "what made it strong". Unverifiable โ†’ drop or mark VERIFY.
184
151
  - **A lever-proposed citation is not written into the `.tex`/bib until `verify-citations` confirms it** (real
@@ -25,17 +25,6 @@ export default experimental_skill({
25
25
  body: `
26
26
  # study-accepted-papers โ€” learn the venue's bar from its own accepted corpus, then lever your draft up
27
27
 
28
- ## Run me
29
-
30
- ๐Ÿ”ด FIRST, before any other step:
31
-
32
- \`\`\`
33
- node .claude/skills/paper-pipeline/scripts/announce.mjs study-accepted-papers <paper-dir>
34
- \`\`\`
35
-
36
- An advisory pass cannot be observed failing โ€” silence is both its error state and its normal
37
- state โ€” so starting is an event, and events get written down.
38
-
39
28
  Reviewers don't score in a vacuum โ€” they score against the papers that got in last cycle. This skill
40
29
  makes that reference standard explicit: pull the venue's **actually-accepted** papers of your type,
41
30
  extract the concrete properties that separated the strong ones from the weak-accepts, and diff your
@@ -173,28 +162,6 @@ being violated, and the **things previously believed that the corpus disproved**
173
162
  valuable lines in the file, because without them the pipeline re-derives the wrong belief). Keep it
174
163
  short enough that it survives being loaded into every session.
175
164
 
176
- ## Record the verdict
177
-
178
- ๐Ÿ”ด LAST step, once the deliverable exists:
179
-
180
- \`\`\`
181
- node .claude/skills/paper-pipeline/scripts/ledger.mjs record study-accepted-papers <paper-dir> FINDING <count> <report-path>
182
- node .claude/skills/paper-pipeline/scripts/ledger.mjs record study-accepted-papers <paper-dir> ABSTAINED <reason> "<one line>"
183
- \`\`\`
184
-
185
- **FINDING** โ€” \`<count>\` is the number of levers, \`<report-path>\` the ranked CHEAP/EXPENSIVE list.
186
- Add \`--blocking\` when the draft is missing something the track *requires* (an artifact link, a named
187
- benchmark, a metric definition): a desk-reject, never a weak accept, and worth the loudest thing
188
- this skill can say.
189
- **ABSTAINED** โ€” \`no-witness\`: the corpus was read and no lever came out of it. \`input-missing\`: the
190
- venue publishes no accepted papers to mine.
191
-
192
- ๐Ÿ”ด **There is no PASS**, and the reason is visible here. "The draft already sits at the venue's bar"
193
- is only meaningful next to the corpus it was measured against โ€” *33 of 34 accepted papers*, not
194
- *most of them* โ€” and a stored acquittal carried that denominator nowhere. Put the corpus size in the
195
- \`ABSTAINED\` note and in the report; without it the row is an impression with a machine-readable
196
- label on it.
197
-
198
165
  ## Rules
199
166
  - **Fetch real accepted papers.** Never fabricate a title, author, or "what made it strong". Unverifiable โ†’ drop or mark VERIFY.
200
167
  - **A lever-proposed citation is not written into the \`.tex\`/bib until \`verify-citations\` confirms it** (real
@@ -4,21 +4,10 @@ description: End-to-end playbook for submitting a peer-reviewed paper to a doubl
4
4
  allowed-tools: [Read, Write, Edit, Grep, Glob, Bash, WebSearch, WebFetch, Skill]
5
5
  ---
6
6
 
7
- <!-- vigiles:sha256:4a42424fd18098e5 compiled from skills/submit-paper/SKILL.md.spec.ts -->
7
+ <!-- vigiles:sha256:9e57bcb2ba1fb055 compiled from skills/submit-paper/SKILL.md.spec.ts -->
8
8
 
9
9
  # submit-paper โ€” get a reviewed paper from "done" to "ready for review"
10
10
 
11
- ## Run me
12
-
13
- ๐Ÿ”ด FIRST, before any other step:
14
-
15
- ```
16
- node .claude/skills/paper-pipeline/scripts/announce.mjs submit-paper <paper-dir>
17
- ```
18
-
19
- An advisory pass cannot be observed failing โ€” silence is both its error state and its normal
20
- state โ€” so starting is an event, and events get written down.
21
-
22
11
  Assumes the paper is already hardened (run `pc-panel-review` โ€” incl. its venue-fit mode โ€” +
23
12
  `paper-adversarial-review` first). This skill is the submission mechanics โ€” the part that bit us with
24
13
  avoidable friction the first time. Distilled from the AgenticDev 2026 submission.
@@ -155,27 +144,6 @@ the file inside was the wrong build (340 952 B vs the real 352 357 B). It surfac
155
144
  cited `L. 166` and there was nothing to resolve the line against. A folder without a checker is a
156
145
  convention with no reader.
157
146
 
158
- ## 8. Record the verdict
159
-
160
- ๐Ÿ”ด LAST step, once the deliverable exists:
161
-
162
- ```
163
- node .claude/skills/paper-pipeline/scripts/ledger.mjs record submit-paper <paper-dir> FINDING <count> <report-path>
164
- node .claude/skills/paper-pipeline/scripts/ledger.mjs record submit-paper <paper-dir> ABSTAINED <reason> "<one line>"
165
- ```
166
-
167
- **FINDING** โ€” `check-deanon.sh` exited non-zero, `access` is not green, the PDF is over the limit, or
168
- the ready-for-review click never happened; `<count>` is the number of blocking items and
169
- `<report-path>` names them. Always `--blocking` โ€” every item here stops the submission.
170
- **ABSTAINED** โ€” `no-witness`: uploaded **and** marked ready for review, with the venue card or the
171
- submission id in the note. `blocked`: the portal account is not through moderation yet.
172
-
173
- ๐Ÿ”ด **A saved draft must never be recorded as done โ€” and it now cannot be.** A saved-but-not-submitted
174
- paper is the one failure this skill's provenance names by hand, and it was invisible to every other
175
- check in the pipeline. There is no constructor for "submitted"; there is only the absence of blocking
176
- items, plus a submission id in the note that a human can go and look up. The id IS the witness, and
177
- recording `no-witness` without one is the same lie in a new vocabulary.
178
-
179
147
  ## Compose with
180
148
  - Harden first: `pc-panel-review` (incl. its venue-fit mode), `paper-adversarial-review`, `render-paper`.
181
149
  - Publisher mechanics (camera-ready): `references/publishers/<publisher>.md`.
@@ -24,17 +24,6 @@ export default experimental_skill({
24
24
  body: `
25
25
  # submit-paper โ€” get a reviewed paper from "done" to "ready for review"
26
26
 
27
- ## Run me
28
-
29
- ๐Ÿ”ด FIRST, before any other step:
30
-
31
- \`\`\`
32
- node .claude/skills/paper-pipeline/scripts/announce.mjs submit-paper <paper-dir>
33
- \`\`\`
34
-
35
- An advisory pass cannot be observed failing โ€” silence is both its error state and its normal
36
- state โ€” so starting is an event, and events get written down.
37
-
38
27
  Assumes the paper is already hardened (run \`pc-panel-review\` โ€” incl. its venue-fit mode โ€” +
39
28
  \`paper-adversarial-review\` first). This skill is the submission mechanics โ€” the part that bit us with
40
29
  avoidable friction the first time. Distilled from the AgenticDev 2026 submission.
@@ -171,27 +160,6 @@ the file inside was the wrong build (340 952 B vs the real 352 357 B). It surfac
171
160
  cited \`L. 166\` and there was nothing to resolve the line against. A folder without a checker is a
172
161
  convention with no reader.
173
162
 
174
- ## 8. Record the verdict
175
-
176
- ๐Ÿ”ด LAST step, once the deliverable exists:
177
-
178
- \`\`\`
179
- node .claude/skills/paper-pipeline/scripts/ledger.mjs record submit-paper <paper-dir> FINDING <count> <report-path>
180
- node .claude/skills/paper-pipeline/scripts/ledger.mjs record submit-paper <paper-dir> ABSTAINED <reason> "<one line>"
181
- \`\`\`
182
-
183
- **FINDING** โ€” \`check-deanon.sh\` exited non-zero, \`access\` is not green, the PDF is over the limit, or
184
- the ready-for-review click never happened; \`<count>\` is the number of blocking items and
185
- \`<report-path>\` names them. Always \`--blocking\` โ€” every item here stops the submission.
186
- **ABSTAINED** โ€” \`no-witness\`: uploaded **and** marked ready for review, with the venue card or the
187
- submission id in the note. \`blocked\`: the portal account is not through moderation yet.
188
-
189
- ๐Ÿ”ด **A saved draft must never be recorded as done โ€” and it now cannot be.** A saved-but-not-submitted
190
- paper is the one failure this skill's provenance names by hand, and it was invisible to every other
191
- check in the pipeline. There is no constructor for "submitted"; there is only the absence of blocking
192
- items, plus a submission id in the note that a human can go and look up. The id IS the witness, and
193
- recording \`no-witness\` without one is the same lie in a new vocabulary.
194
-
195
163
  ## Compose with
196
164
  - Harden first: \`pc-panel-review\` (incl. its venue-fit mode), \`paper-adversarial-review\`, \`render-paper\`.
197
165
  - Publisher mechanics (camera-ready): \`references/publishers/<publisher>.md\`.
@@ -5,25 +5,10 @@ context: fork
5
5
  allowed-tools: [WebSearch, WebFetch, Read, Write, Grep, Glob, Bash, Agent]
6
6
  ---
7
7
 
8
- <!-- vigiles:sha256:1822c8c01e352f42 compiled from skills/sweep-design-space/SKILL.md.spec.ts -->
8
+ <!-- vigiles:sha256:46cb38ac1731883d compiled from skills/sweep-design-space/SKILL.md.spec.ts -->
9
9
 
10
10
  # sweep-design-space โ€” stop circling, sweep
11
11
 
12
- ## Run me
13
-
14
- ๐Ÿ”ด FIRST, before any other step:
15
-
16
- ```
17
- node .claude/skills/paper-pipeline/scripts/announce.mjs sweep-design-space <dir>
18
- ```
19
-
20
- An advisory pass cannot be observed failing โ€” silence is both its error state and its normal
21
- state โ€” so starting is an event, and events get written down.
22
-
23
- The `<dir>` argument is **optional in spirit**: this skill can run before a paper directory exists, so
24
- pass whichever directory the work lives in, or `.`. The ledger row is written either way, and a plain
25
- dot is more honest than an invented path.
26
-
27
12
  A model asked for "a solution" returns the three designs nearest its training prior, then variations of
28
13
  those, then variations of the variations. The user experiences this as *"you are thinking very narrowly"* โ€”
29
14
  and they are right. The fix is not to think harder in place; it is to **sweep named source domains on
@@ -214,28 +199,6 @@ assurance levels already exist; the question is whether anyone has carried them
214
199
 
215
200
  ---
216
201
 
217
- ## Record the verdict
218
-
219
- ๐Ÿ”ด LAST step, once the deliverable exists:
220
-
221
- ```
222
- node .claude/skills/paper-pipeline/scripts/ledger.mjs record sweep-design-space <dir> FINDING <count> <report-path>
223
- node .claude/skills/paper-pipeline/scripts/ledger.mjs record sweep-design-space <dir> ABSTAINED <reason> "<one line>"
224
- ```
225
-
226
- ๐Ÿ”ด **There is no PASS.** A sweep that turns up survivors has not certified anything; it has found
227
- candidates, and candidates are findings.
228
-
229
- **FINDING** โ€” the sweep produced something to act on; `<count>` is the number of survivors and
230
- `<report-path>` the sweep, including the groups that yielded nothing. Add `--blocking` when the
231
- whole sweep died on the filters โ€” that is the loudest thing this skill can say.
232
- **ABSTAINED** โ€” `no-witness`: the sweep ran and neither found a survivor nor established that none
233
- exists. `blocked`: there was no problem statement to sweep against.
234
-
235
- The skill's own rules already say negative results count. The ledger is how that survives the session:
236
- a recorded finding names the groups that were swept, so the next sweep starts from named constructs
237
- instead of from memory โ€” which is the failure mode this skill exists to break.
238
-
239
202
  ## Rules
240
203
 
241
204
  - **Name the forbidden options in the generation brief.** Without an explicit "do not return these"
@@ -24,21 +24,6 @@ export default experimental_skill({
24
24
  body: `
25
25
  # sweep-design-space โ€” stop circling, sweep
26
26
 
27
- ## Run me
28
-
29
- ๐Ÿ”ด FIRST, before any other step:
30
-
31
- \`\`\`
32
- node .claude/skills/paper-pipeline/scripts/announce.mjs sweep-design-space <dir>
33
- \`\`\`
34
-
35
- An advisory pass cannot be observed failing โ€” silence is both its error state and its normal
36
- state โ€” so starting is an event, and events get written down.
37
-
38
- The \`<dir>\` argument is **optional in spirit**: this skill can run before a paper directory exists, so
39
- pass whichever directory the work lives in, or \`.\`. The ledger row is written either way, and a plain
40
- dot is more honest than an invented path.
41
-
42
27
  A model asked for "a solution" returns the three designs nearest its training prior, then variations of
43
28
  those, then variations of the variations. The user experiences this as *"you are thinking very narrowly"* โ€”
44
29
  and they are right. The fix is not to think harder in place; it is to **sweep named source domains on
@@ -229,28 +214,6 @@ assurance levels already exist; the question is whether anyone has carried them
229
214
 
230
215
  ---
231
216
 
232
- ## Record the verdict
233
-
234
- ๐Ÿ”ด LAST step, once the deliverable exists:
235
-
236
- \`\`\`
237
- node .claude/skills/paper-pipeline/scripts/ledger.mjs record sweep-design-space <dir> FINDING <count> <report-path>
238
- node .claude/skills/paper-pipeline/scripts/ledger.mjs record sweep-design-space <dir> ABSTAINED <reason> "<one line>"
239
- \`\`\`
240
-
241
- ๐Ÿ”ด **There is no PASS.** A sweep that turns up survivors has not certified anything; it has found
242
- candidates, and candidates are findings.
243
-
244
- **FINDING** โ€” the sweep produced something to act on; \`<count>\` is the number of survivors and
245
- \`<report-path>\` the sweep, including the groups that yielded nothing. Add \`--blocking\` when the
246
- whole sweep died on the filters โ€” that is the loudest thing this skill can say.
247
- **ABSTAINED** โ€” \`no-witness\`: the sweep ran and neither found a survivor nor established that none
248
- exists. \`blocked\`: there was no problem statement to sweep against.
249
-
250
- The skill's own rules already say negative results count. The ledger is how that survives the session:
251
- a recorded finding names the groups that were swept, so the next sweep starts from named constructs
252
- instead of from memory โ€” which is the failure mode this skill exists to break.
253
-
254
217
  ## Rules
255
218
 
256
219
  - **Name the forbidden options in the generation brief.** Without an explicit "do not return these"
@@ -1,24 +1,13 @@
1
1
  ---
2
2
  name: tighten-paper
3
3
  description: "Use when a paper \"feels long / bloated / overly complex / hard to read / doesn't deliver its point / the middle drags\" โ€” or after review rounds deposited hedge-mass. The developmental / editorial pass on a DRAFTED paper: what a real human editor thinks reading it cover to cover โ€” the ONE point, does every section earn its place, can it be SKIMMED, is it too long for its contribution, which sections are TMI that belong in the artifact/appendix, does the conclusion pay off the intro's promise. Produces a structural verdict + a concrete cut / fold / merge / reorder plan โ€” NOT sentence fixes. Its verdict is a required INPUT to pc-panel-review and a hard gate in harden-paper. NOT sentence craft or a writing grade (grade-paper-writing), NOT jargon stalls (the persona stall pass), NOT scientific defects (pc-panel-review / paper-adversarial-review). Run it BEFORE those on a bloated draft โ€” no point polishing sentences in a section that should be cut."
4
- allowed-tools: [Read, Write, Edit, Grep, Glob, Agent, Bash(node .claude/skills/paper-pipeline/scripts/announce.mjs:*), Bash(node .claude/skills/paper-pipeline/scripts/ledger.mjs:*)]
4
+ allowed-tools: [Read, Write, Edit, Grep, Glob, Agent]
5
5
  ---
6
6
 
7
- <!-- vigiles:sha256:79a018d2fd2bf3e7 compiled from skills/tighten-paper/SKILL.md.spec.ts -->
7
+ <!-- vigiles:sha256:fd00cde33ea4b81c compiled from skills/tighten-paper/SKILL.md.spec.ts -->
8
8
 
9
9
  # tighten-paper โ€” the developmental edit
10
10
 
11
- ## Run me
12
-
13
- ๐Ÿ”ด FIRST, before any other step:
14
-
15
- ```
16
- node .claude/skills/paper-pipeline/scripts/announce.mjs tighten-paper <paper-dir>
17
- ```
18
-
19
- An advisory pass cannot be observed failing โ€” silence is both its error state and its normal
20
- state โ€” so starting is an event, and events get written down.
21
-
22
11
  Sentence-level passes make a wall of text into readable text. They do **not** tell you the wall shouldn't be there
23
12
  at all. This pass is the editor who reads the whole paper once and asks: *is this the right paper, at the right
24
13
  length, delivering the right point?* Its deliverable is a **cut/fold/merge/reorder plan and a length verdict**, not
@@ -321,32 +310,6 @@ Produce:
321
310
  - **The middle-sag diagnosis** and the fix (consolidate these findings, lead each with its point).
322
311
  - **Skim-test failures** (headings/lead-sentences that don't carry the argument).
323
312
 
324
- ## Record the verdict
325
-
326
- ๐Ÿ”ด LAST step, once the deliverable exists:
327
-
328
- ```
329
- node .claude/skills/paper-pipeline/scripts/ledger.mjs record tighten-paper <paper-dir> FINDING <count> <report-path>
330
- node .claude/skills/paper-pipeline/scripts/ledger.mjs record tighten-paper <paper-dir> ABSTAINED <reason> "<one line>"
331
- ```
332
-
333
- **FINDING** is the normal row โ€” `<count>` is the number of CUT / FOLD / MERGE / REORDER actions in
334
- the plan and `<report-path>` is the plan itself. Add `--blocking` when the paper is over its limit
335
- and the plan cannot get it under.
336
- **ABSTAINED** โ€” `no-witness`: a cover-to-cover read produced no action at all, which on a real draft
337
- should be rare. `blocked`: the declined pass of the section above โ€” content is still being added, so
338
- there was nothing to read whole.
339
-
340
- ๐Ÿ”ด **This is the check with the documented history of never saying no**: a tightening pass once
341
- returned KEEP on 80 of 81 sections and still counted as run. It is also one of the three failures
342
- that deleted `PASS` โ€” the word made "I read it all and nothing moved" indistinguishable from "I did
343
- not really read it". `status.mjs` reports a check that has never recorded a finding, on the
344
- mutation-testing principle that a test which kills no mutant is not a test. So an `ABSTAINED
345
- no-witness` here owes a note saying what was read and why nothing moved.
346
-
347
- The mechanical half of this skill files separately, under `tighten-paper/structure` โ€” one check, one
348
- row. Do not record a `structure.mjs` result here.
349
-
350
313
  ## Compose
351
314
  Run this FIRST on a draft that "feels bloated" โ€” before grade-paper-writing / the stall pass / pc-panel, because
352
315
  polishing sentences in a section that should be folded to the artifact is wasted work. After the plan is applied,
@@ -10,30 +10,10 @@ export default experimental_skill({
10
10
  name: "tighten-paper",
11
11
  description:
12
12
  "Use when a paper \"feels long / bloated / overly complex / hard to read / doesn't deliver its point / the middle drags\" โ€” or after review rounds deposited hedge-mass. The developmental / editorial pass on a DRAFTED paper: what a real human editor thinks reading it cover to cover โ€” the ONE point, does every section earn its place, can it be SKIMMED, is it too long for its contribution, which sections are TMI that belong in the artifact/appendix, does the conclusion pay off the intro's promise. Produces a structural verdict + a concrete cut / fold / merge / reorder plan โ€” NOT sentence fixes. Its verdict is a required INPUT to pc-panel-review and a hard gate in harden-paper. NOT sentence craft or a writing grade (grade-paper-writing), NOT jargon stalls (the persona stall pass), NOT scientific defects (pc-panel-review / paper-adversarial-review). Run it BEFORE those on a bloated draft โ€” no point polishing sentences in a section that should be cut.",
13
- tools: [
14
- "Read",
15
- "Write",
16
- "Edit",
17
- "Grep",
18
- "Glob",
19
- "Agent",
20
- "Bash(node .claude/skills/paper-pipeline/scripts/announce.mjs:*)",
21
- "Bash(node .claude/skills/paper-pipeline/scripts/ledger.mjs:*)",
22
- ],
13
+ tools: ["Read", "Write", "Edit", "Grep", "Glob", "Agent"],
23
14
  body: `
24
15
  # tighten-paper โ€” the developmental edit
25
16
 
26
- ## Run me
27
-
28
- ๐Ÿ”ด FIRST, before any other step:
29
-
30
- \`\`\`
31
- node .claude/skills/paper-pipeline/scripts/announce.mjs tighten-paper <paper-dir>
32
- \`\`\`
33
-
34
- An advisory pass cannot be observed failing โ€” silence is both its error state and its normal
35
- state โ€” so starting is an event, and events get written down.
36
-
37
17
  Sentence-level passes make a wall of text into readable text. They do **not** tell you the wall shouldn't be there
38
18
  at all. This pass is the editor who reads the whole paper once and asks: *is this the right paper, at the right
39
19
  length, delivering the right point?* Its deliverable is a **cut/fold/merge/reorder plan and a length verdict**, not
@@ -336,32 +316,6 @@ Produce:
336
316
  - **The middle-sag diagnosis** and the fix (consolidate these findings, lead each with its point).
337
317
  - **Skim-test failures** (headings/lead-sentences that don't carry the argument).
338
318
 
339
- ## Record the verdict
340
-
341
- ๐Ÿ”ด LAST step, once the deliverable exists:
342
-
343
- \`\`\`
344
- node .claude/skills/paper-pipeline/scripts/ledger.mjs record tighten-paper <paper-dir> FINDING <count> <report-path>
345
- node .claude/skills/paper-pipeline/scripts/ledger.mjs record tighten-paper <paper-dir> ABSTAINED <reason> "<one line>"
346
- \`\`\`
347
-
348
- **FINDING** is the normal row โ€” \`<count>\` is the number of CUT / FOLD / MERGE / REORDER actions in
349
- the plan and \`<report-path>\` is the plan itself. Add \`--blocking\` when the paper is over its limit
350
- and the plan cannot get it under.
351
- **ABSTAINED** โ€” \`no-witness\`: a cover-to-cover read produced no action at all, which on a real draft
352
- should be rare. \`blocked\`: the declined pass of the section above โ€” content is still being added, so
353
- there was nothing to read whole.
354
-
355
- ๐Ÿ”ด **This is the check with the documented history of never saying no**: a tightening pass once
356
- returned KEEP on 80 of 81 sections and still counted as run. It is also one of the three failures
357
- that deleted \`PASS\` โ€” the word made "I read it all and nothing moved" indistinguishable from "I did
358
- not really read it". \`status.mjs\` reports a check that has never recorded a finding, on the
359
- mutation-testing principle that a test which kills no mutant is not a test. So an \`ABSTAINED
360
- no-witness\` here owes a note saying what was read and why nothing moved.
361
-
362
- The mechanical half of this skill files separately, under \`tighten-paper/structure\` โ€” one check, one
363
- row. Do not record a \`structure.mjs\` result here.
364
-
365
319
  ## Compose
366
320
  Run this FIRST on a draft that "feels bloated" โ€” before grade-paper-writing / the stall pass / pc-panel, because
367
321
  polishing sentences in a section that should be folded to the artifact is wasted work. After the plan is applied,
@@ -22,7 +22,7 @@
22
22
  *
23
23
  * โ”€โ”€ 2026-08-26, EVENING: BOTH NAMED CONSUMERS ARE CLOSED, AND A THIRD ONE TURNED UP โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
24
24
  *
25
- * The paragraph above named two callers and said that until they are converted, the ledger writes
25
+ * The paragraph above named two callers and said that until they are converted, they read
26
26
  * "no findings" BY SILENCE. That was true and measured: on `the reference paper/paper.md`
27
27
  * `--flags-only` printed 0 lines, while the same bytes through ESLint give **6 findings**
28
28
  * (`subsection-size` ร—2 ยท `section-lead` ยท `free-section-size` ร—2 ยท `block-ungraded`).
@@ -31,11 +31,6 @@
31
31
  * stood next to it, running the same rules over the same glob; a measurement showed a
32
32
  * byte-identical list of files. The full justification is in the comment where the removed
33
33
  * step used to be.
34
- * `run-mechanical.mjs`, the `tighten-paper/structure` line โ†’ CONVERTED to ESLint
35
- * (`read: 'eslint'`, filtered by the rules from `eslint-rules/paper-structure.mjs`). Not
36
- * deleted: ESLint writes nothing into the ledger, and the ledger is the only place where the
37
- * fact "somebody looked at this paper's structure on these bytes" is stored with a hash of the
38
- * input.
39
34
  *
40
35
  * ๐Ÿ”ด A THIRD CALLER THE BANNER DID NOT KNOW ABOUT: `.githooks/pre-commit`. It printed nothing and
41
36
  * swallowed the exit code through `|| true`. The lesson is exactly the one already recorded in
@@ -294,11 +289,9 @@ const freeTotal = freeSections.reduce((a, r) => a + r.words, 0);
294
289
  // edit, and there is nothing to settle the question of which one is right.
295
290
 
296
291
  if (flagsOnly) {
297
- // Silence and exit code 0 โ€” ALWAYS. Deliberately not one line on stdout/stderr:
298
- // `run-mechanical.mjs` reads this mode as `read: 'flags'`, that is, "non-empty output = a
299
- // finding", and a pointer saying "the checks have moved" would turn into a permanent false finding
300
- // in the ledger. The limitation of this mode is named in the banner at the top; it is cured by
301
- // converting both callers to `npx eslint`, not here.
292
+ // Silence and exit code 0 โ€” ALWAYS. Deliberately not one line on stdout/stderr: a caller that
293
+ // reads "non-empty output = a finding" would turn a pointer saying "the checks have moved" into a
294
+ // permanent false finding. The limitation of this mode is named in the banner at the top.
302
295
  process.exit(0);
303
296
  }
304
297