paperlint 3.1.3 → 4.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 (527) hide show
  1. package/.github/workflows/ci.yml +12 -7
  2. package/CLAUDE.md +5 -5
  3. package/CONTRIBUTING.md +34 -5
  4. package/dist/adapters/banal/failure.d.ts +1 -7
  5. package/dist/adapters/banal/failure.d.ts.map +1 -1
  6. package/dist/adapters/banal/failure.js +5 -7
  7. package/dist/adapters/banal/failure.js.map +1 -1
  8. package/dist/adapters/banal/index.d.ts.map +1 -1
  9. package/dist/adapters/banal/index.js +4 -3
  10. package/dist/adapters/banal/index.js.map +1 -1
  11. package/dist/adapters/banal/install.d.ts.map +1 -1
  12. package/dist/adapters/banal/install.js +4 -3
  13. package/dist/adapters/banal/install.js.map +1 -1
  14. package/dist/adapters/banal/invocation.d.ts +10 -5
  15. package/dist/adapters/banal/invocation.d.ts.map +1 -1
  16. package/dist/adapters/banal/invocation.js +13 -1
  17. package/dist/adapters/banal/invocation.js.map +1 -1
  18. package/dist/adapters/banal/locate.d.ts +12 -9
  19. package/dist/adapters/banal/locate.d.ts.map +1 -1
  20. package/dist/adapters/banal/locate.js +19 -12
  21. package/dist/adapters/banal/locate.js.map +1 -1
  22. package/dist/adapters/banal/run.d.ts +10 -1
  23. package/dist/adapters/banal/run.d.ts.map +1 -1
  24. package/dist/adapters/banal/run.js +8 -4
  25. package/dist/adapters/banal/run.js.map +1 -1
  26. package/dist/adapters/banal/settings.d.ts +1 -1
  27. package/dist/adapters/banal/settings.d.ts.map +1 -1
  28. package/dist/adapters/banal/settings.js +2 -1
  29. package/dist/adapters/banal/settings.js.map +1 -1
  30. package/dist/adapters/memory/index.d.ts.map +1 -1
  31. package/dist/adapters/memory/index.js +8 -2
  32. package/dist/adapters/memory/index.js.map +1 -1
  33. package/dist/adapters/node/files.io.d.ts.map +1 -1
  34. package/dist/adapters/node/files.io.js +2 -1
  35. package/dist/adapters/node/files.io.js.map +1 -1
  36. package/dist/adapters/node/process.io.d.ts +5 -7
  37. package/dist/adapters/node/process.io.d.ts.map +1 -1
  38. package/dist/adapters/node/process.io.js +4 -3
  39. package/dist/adapters/node/process.io.js.map +1 -1
  40. package/dist/adapters/node/workspace.io.d.ts.map +1 -1
  41. package/dist/adapters/node/workspace.io.js +4 -2
  42. package/dist/adapters/node/workspace.io.js.map +1 -1
  43. package/dist/adapters/pdfjs/fill.d.ts.map +1 -1
  44. package/dist/adapters/pdfjs/fill.js +13 -7
  45. package/dist/adapters/pdfjs/fill.js.map +1 -1
  46. package/dist/adapters/references/index.d.ts.map +1 -1
  47. package/dist/adapters/references/index.js +8 -7
  48. package/dist/adapters/references/index.js.map +1 -1
  49. package/dist/adapters/references/pool.d.ts.map +1 -1
  50. package/dist/adapters/references/pool.js +4 -5
  51. package/dist/adapters/references/pool.js.map +1 -1
  52. package/dist/adapters/references/reach.io.d.ts.map +1 -1
  53. package/dist/adapters/references/reach.io.js +2 -1
  54. package/dist/adapters/references/reach.io.js.map +1 -1
  55. package/dist/build-engine.d.ts +1 -1
  56. package/dist/build-engine.d.ts.map +1 -1
  57. package/dist/build-engine.js +10 -3
  58. package/dist/build-engine.js.map +1 -1
  59. package/dist/build.d.ts +2 -3
  60. package/dist/build.d.ts.map +1 -1
  61. package/dist/build.js +19 -17
  62. package/dist/build.js.map +1 -1
  63. package/dist/caller-path.d.ts +3 -0
  64. package/dist/caller-path.d.ts.map +1 -0
  65. package/dist/caller-path.js +13 -0
  66. package/dist/caller-path.js.map +1 -0
  67. package/dist/cli.d.ts +10 -17
  68. package/dist/cli.d.ts.map +1 -1
  69. package/dist/cli.js +93 -46
  70. package/dist/cli.js.map +1 -1
  71. package/dist/doctor.d.ts +12 -3
  72. package/dist/doctor.d.ts.map +1 -1
  73. package/dist/doctor.js +5 -3
  74. package/dist/doctor.js.map +1 -1
  75. package/dist/domain/lookup-cache.d.ts.map +1 -1
  76. package/dist/domain/lookup-cache.js +10 -8
  77. package/dist/domain/lookup-cache.js.map +1 -1
  78. package/dist/domain/paths.d.ts +8 -2
  79. package/dist/domain/paths.d.ts.map +1 -1
  80. package/dist/domain/paths.js +12 -1
  81. package/dist/domain/paths.js.map +1 -1
  82. package/dist/domain/ready.d.ts +24 -0
  83. package/dist/domain/ready.d.ts.map +1 -0
  84. package/dist/domain/ready.js +11 -0
  85. package/dist/domain/ready.js.map +1 -0
  86. package/dist/domain/record.d.ts +8 -0
  87. package/dist/domain/record.d.ts.map +1 -0
  88. package/dist/domain/record.js +8 -0
  89. package/dist/domain/record.js.map +1 -0
  90. package/dist/domain/sha256.d.ts.map +1 -1
  91. package/dist/domain/sha256.js +4 -2
  92. package/dist/domain/sha256.js.map +1 -1
  93. package/dist/domain/text.d.ts +12 -0
  94. package/dist/domain/text.d.ts.map +1 -1
  95. package/dist/domain/text.js +17 -0
  96. package/dist/domain/text.js.map +1 -1
  97. package/dist/engine.d.ts +23 -22
  98. package/dist/engine.d.ts.map +1 -1
  99. package/dist/engine.js +4 -3
  100. package/dist/engine.js.map +1 -1
  101. package/dist/eslint-rules/bib-reachable-entry.d.ts +22 -0
  102. package/dist/eslint-rules/bib-reachable-entry.d.ts.map +1 -0
  103. package/dist/eslint-rules/bib-reachable-entry.js +75 -0
  104. package/dist/eslint-rules/bib-reachable-entry.js.map +1 -0
  105. package/dist/eslint-rules/install-path-literals.d.ts +80 -0
  106. package/dist/eslint-rules/install-path-literals.d.ts.map +1 -0
  107. package/dist/eslint-rules/install-path-literals.js +105 -0
  108. package/dist/eslint-rules/install-path-literals.js.map +1 -0
  109. package/dist/eslint-rules/latex-language.d.ts +136 -0
  110. package/dist/eslint-rules/latex-language.d.ts.map +1 -0
  111. package/dist/eslint-rules/latex-language.js +639 -0
  112. package/dist/eslint-rules/latex-language.js.map +1 -0
  113. package/dist/eslint-rules/paper-research-question.d.ts +31 -0
  114. package/dist/eslint-rules/paper-research-question.d.ts.map +1 -0
  115. package/dist/eslint-rules/paper-research-question.js +188 -0
  116. package/dist/eslint-rules/paper-research-question.js.map +1 -0
  117. package/dist/eslint-rules/paper-stages.d.ts +83 -0
  118. package/dist/eslint-rules/paper-stages.d.ts.map +1 -0
  119. package/dist/eslint-rules/paper-stages.js +358 -0
  120. package/dist/eslint-rules/paper-stages.js.map +1 -0
  121. package/dist/eslint-rules/paper-typography.d.ts +74 -0
  122. package/dist/eslint-rules/paper-typography.d.ts.map +1 -0
  123. package/dist/eslint-rules/paper-typography.js +404 -0
  124. package/dist/eslint-rules/paper-typography.js.map +1 -0
  125. package/dist/eslint-rules/papers.d.ts +42 -0
  126. package/dist/eslint-rules/papers.d.ts.map +1 -0
  127. package/dist/eslint-rules/papers.js +145 -0
  128. package/dist/eslint-rules/papers.js.map +1 -0
  129. package/dist/eslint-rules/pdf-last-page-balance.d.ts +72 -0
  130. package/dist/eslint-rules/pdf-last-page-balance.d.ts.map +1 -0
  131. package/dist/eslint-rules/pdf-last-page-balance.js +237 -0
  132. package/dist/eslint-rules/pdf-last-page-balance.js.map +1 -0
  133. package/dist/eslint-rules/review-frontmatter.d.ts +57 -0
  134. package/dist/eslint-rules/review-frontmatter.d.ts.map +1 -0
  135. package/dist/eslint-rules/review-frontmatter.js +126 -0
  136. package/dist/eslint-rules/review-frontmatter.js.map +1 -0
  137. package/dist/eslint-rules/review-frontmatter.schema.json +36 -0
  138. package/dist/eslint-rules/rule-context.d.ts +55 -0
  139. package/dist/eslint-rules/rule-context.d.ts.map +1 -0
  140. package/dist/eslint-rules/rule-context.js +9 -0
  141. package/dist/eslint-rules/rule-context.js.map +1 -0
  142. package/dist/eslint-rules/sibling-frontmatter.d.ts +25 -0
  143. package/dist/eslint-rules/sibling-frontmatter.d.ts.map +1 -0
  144. package/dist/eslint-rules/sibling-frontmatter.js +16 -0
  145. package/dist/eslint-rules/sibling-frontmatter.js.map +1 -0
  146. package/dist/eslint-rules/sibling-frontmatter.schema.json +14 -0
  147. package/dist/eslint-rules/temp-root-realpath.d.ts +71 -0
  148. package/dist/eslint-rules/temp-root-realpath.d.ts.map +1 -0
  149. package/dist/eslint-rules/temp-root-realpath.js +139 -0
  150. package/dist/eslint-rules/temp-root-realpath.js.map +1 -0
  151. package/dist/eslint-rules/tex-build.d.ts +35 -0
  152. package/dist/eslint-rules/tex-build.d.ts.map +1 -0
  153. package/dist/eslint-rules/tex-build.js +313 -0
  154. package/dist/eslint-rules/tex-build.js.map +1 -0
  155. package/dist/facts-file.d.ts.map +1 -1
  156. package/dist/facts-file.js +31 -27
  157. package/dist/facts-file.js.map +1 -1
  158. package/dist/hooks-settings.d.ts +1 -1
  159. package/dist/hooks-settings.d.ts.map +1 -1
  160. package/dist/hooks-settings.js +31 -11
  161. package/dist/hooks-settings.js.map +1 -1
  162. package/dist/init.d.ts +8 -9
  163. package/dist/init.d.ts.map +1 -1
  164. package/dist/init.js +33 -15
  165. package/dist/init.js.map +1 -1
  166. package/dist/latex-loop.d.ts +2 -2
  167. package/dist/latex-loop.d.ts.map +1 -1
  168. package/dist/latex-loop.js +2 -2
  169. package/dist/latex-loop.js.map +1 -1
  170. package/dist/lib/agent-cli-version.d.ts +65 -0
  171. package/dist/lib/agent-cli-version.d.ts.map +1 -0
  172. package/dist/lib/agent-cli-version.js +77 -0
  173. package/dist/lib/agent-cli-version.js.map +1 -0
  174. package/dist/lib/check.d.ts +19 -0
  175. package/dist/lib/check.d.ts.map +1 -0
  176. package/dist/lib/check.js +52 -0
  177. package/dist/lib/check.js.map +1 -0
  178. package/dist/lib/markdown.d.ts +180 -0
  179. package/dist/lib/markdown.d.ts.map +1 -0
  180. package/dist/lib/markdown.js +302 -0
  181. package/dist/lib/markdown.js.map +1 -0
  182. package/dist/lib/paper-config.d.ts +84 -0
  183. package/dist/lib/paper-config.d.ts.map +1 -0
  184. package/dist/lib/paper-config.js +138 -0
  185. package/dist/lib/paper-config.js.map +1 -0
  186. package/dist/lib/skill-eval-fixture.d.ts +29 -0
  187. package/dist/lib/skill-eval-fixture.d.ts.map +1 -0
  188. package/dist/lib/skill-eval-fixture.js +62 -0
  189. package/dist/lib/skill-eval-fixture.js.map +1 -0
  190. package/dist/link-skills.d.ts.map +1 -1
  191. package/dist/link-skills.js +5 -4
  192. package/dist/link-skills.js.map +1 -1
  193. package/dist/new-paper.d.ts.map +1 -1
  194. package/dist/new-paper.js +7 -3
  195. package/dist/new-paper.js.map +1 -1
  196. package/dist/paper-files.d.ts +4 -4
  197. package/dist/paper-files.d.ts.map +1 -1
  198. package/dist/paper-files.js +6 -6
  199. package/dist/paper-files.js.map +1 -1
  200. package/dist/paper-settings.d.ts.map +1 -1
  201. package/dist/paper-settings.js +8 -7
  202. package/dist/paper-settings.js.map +1 -1
  203. package/dist/pdf-facts.d.ts +51 -1
  204. package/dist/pdf-facts.d.ts.map +1 -1
  205. package/dist/pdf-facts.js +25 -16
  206. package/dist/pdf-facts.js.map +1 -1
  207. package/dist/pdf-geometry.d.ts.map +1 -1
  208. package/dist/pdf-geometry.js +3 -4
  209. package/dist/pdf-geometry.js.map +1 -1
  210. package/dist/ports/tool-installer.d.ts +2 -14
  211. package/dist/ports/tool-installer.d.ts.map +1 -1
  212. package/dist/presets.d.ts.map +1 -1
  213. package/dist/presets.js +19 -6
  214. package/dist/presets.js.map +1 -1
  215. package/dist/references.d.ts.map +1 -1
  216. package/dist/references.js +15 -10
  217. package/dist/references.js.map +1 -1
  218. package/dist/rules-config.d.ts +26 -1
  219. package/dist/rules-config.d.ts.map +1 -1
  220. package/dist/rules-config.js +15 -12
  221. package/dist/rules-config.js.map +1 -1
  222. package/dist/structure.js +1 -1
  223. package/dist/structure.js.map +1 -1
  224. package/dist/tex-requirements.d.ts +4 -0
  225. package/dist/tex-requirements.d.ts.map +1 -1
  226. package/dist/tex-requirements.js +22 -5
  227. package/dist/tex-requirements.js.map +1 -1
  228. package/dist/toolchain.d.ts.map +1 -1
  229. package/dist/toolchain.js +21 -16
  230. package/dist/toolchain.js.map +1 -1
  231. package/dist/types.d.ts +5 -3
  232. package/dist/types.d.ts.map +1 -1
  233. package/dist/venue-rules.d.ts.map +1 -1
  234. package/dist/venue-rules.js +21 -8
  235. package/dist/venue-rules.js.map +1 -1
  236. package/docs/configuration.md +2 -2
  237. package/docs/e2e.md +7 -7
  238. package/docs/install.md +1 -1
  239. package/docs/prior-art/README.md +1 -1
  240. package/docs/prior-art/package-location.md +5 -5
  241. package/docs/prior-art/repro/README.md +1 -1
  242. package/docs/prior-art/test-tooling.md +2 -2
  243. package/docs/testing.md +11 -8
  244. package/docs/toolchain.md +1 -1
  245. package/eslint-rules/{bib-reachable-entry.mjs → bib-reachable-entry.ts} +5 -4
  246. package/eslint-rules/install-path-literals.harness.mjs +1 -1
  247. package/eslint-rules/{install-path-literals.mjs → install-path-literals.ts} +18 -10
  248. package/eslint-rules/latex-language.harness.mjs +2 -2
  249. package/eslint-rules/latex-language.test.mjs +7 -1
  250. package/eslint-rules/{latex-language.mjs → latex-language.ts} +297 -109
  251. package/eslint-rules/paper-research-question.harness.mjs +3 -3
  252. package/eslint-rules/{paper-research-question.mjs → paper-research-question.ts} +35 -16
  253. package/eslint-rules/paper-stages.harness.mjs +2 -2
  254. package/eslint-rules/paper-stages.test.mjs +8 -2
  255. package/eslint-rules/{paper-stages.mjs → paper-stages.ts} +76 -31
  256. package/eslint-rules/paper-typography.test.mjs +3 -3
  257. package/eslint-rules/{paper-typography.mjs → paper-typography.ts} +134 -56
  258. package/eslint-rules/papers.harness.mjs +2 -2
  259. package/eslint-rules/{papers.mjs → papers.ts} +7 -4
  260. package/eslint-rules/pdf-last-page-balance.harness.mjs +3 -3
  261. package/eslint-rules/{pdf-last-page-balance.mjs → pdf-last-page-balance.ts} +89 -32
  262. package/eslint-rules/review-frontmatter.test.mjs +2 -2
  263. package/eslint-rules/{review-frontmatter.mjs → review-frontmatter.ts} +38 -16
  264. package/eslint-rules/rule-context.ts +62 -0
  265. package/eslint-rules/{sibling-frontmatter.mjs → sibling-frontmatter.ts} +1 -1
  266. package/eslint-rules/temp-root-realpath.harness.mjs +1 -1
  267. package/eslint-rules/{temp-root-realpath.mjs → temp-root-realpath.ts} +20 -7
  268. package/eslint-rules/tex-build.harness.mjs +2 -2
  269. package/eslint-rules/{tex-build.mjs → tex-build.ts} +6 -5
  270. package/eslint.config.mjs +146 -30
  271. package/fixtures/install-path-literals/clean.fixture.mjs +1 -1
  272. package/fixtures/install-path-literals/clean.md +2 -2
  273. package/fixtures/install-path-literals/defect.fixture.mjs +1 -1
  274. package/fixtures/install-path-literals/defect.md +2 -2
  275. package/fixtures/pdf-facts/README.md +2 -2
  276. package/fixtures/real-markdown-paper/{baseline.mjs → baseline.ts} +31 -10
  277. package/hooks/{hooks.harness.mjs → hooks.harness.ts} +51 -34
  278. package/hooks/paper-edit-guard.hook.mjs +1 -1
  279. package/hooks/{paper-edit-guard.test.mjs → paper-edit-guard.test.ts} +3 -7
  280. package/hooks/paper-skills-nudge.hook.mjs +1 -1
  281. package/hooks/{paper-skills-nudge.test.mjs → paper-skills-nudge.test.ts} +2 -6
  282. package/hooks/paper-status-gates.sh +9 -19
  283. package/hooks/{paper-status-gates.test.mjs → paper-status-gates.test.ts} +2 -6
  284. package/lib/agent-cli-version.harness.mjs +1 -1
  285. package/lib/{agent-cli-version.mjs → agent-cli-version.ts} +32 -18
  286. package/lib/check.test.ts +14 -9
  287. package/lib/{check.mjs → check.ts} +22 -9
  288. package/lib/markdown.test.mjs +7 -7
  289. package/lib/{markdown.mjs → markdown.ts} +68 -29
  290. package/lib/paper-config.harness.mjs +9 -9
  291. package/lib/{paper-config.mjs → paper-config.ts} +20 -19
  292. package/lib/skill-checks.mjs +24 -381
  293. package/lib/skill-checks.test.mjs +64 -116
  294. package/lib/skill-corpus.mjs +10 -251
  295. package/lib/skill-corpus.test.mjs +2 -13
  296. package/lib/skill-eval-kit.mjs +1 -1
  297. package/lib/skill-trigger-cases.mjs +1 -1
  298. package/package.json +42 -10
  299. package/scripts/{check.harness.mjs → check.harness.ts} +111 -10
  300. package/scripts/{check.test.mjs → check.test.ts} +13 -10
  301. package/scripts/{check.mjs → check.ts} +116 -42
  302. package/scripts/coverage-config.test.ts +80 -38
  303. package/scripts/eslint-report-guard.test.mjs +1 -1
  304. package/scripts/harness-api.frozen.json +14 -16
  305. package/scripts/harness-api.test.ts +8 -5
  306. package/scripts/layer-legacy-frozen.test.ts +17 -13
  307. package/scripts/{layer-legacy-frozen.mjs → layer-legacy-frozen.ts} +128 -39
  308. package/scripts/release-config.test.ts +12 -4
  309. package/scripts/rules-see-files.test.mjs +1 -1
  310. package/scripts/test.test.ts +78 -0
  311. package/scripts/test.ts +87 -0
  312. package/skills/analyze-sibling-paper/SKILL.md +1 -39
  313. package/skills/analyze-sibling-paper/SKILL.md.spec.ts +0 -38
  314. package/skills/argument-arc/SKILL.md +2 -36
  315. package/skills/argument-arc/SKILL.md.spec.ts +1 -43
  316. package/skills/build-benchmark/SKILL.md +1 -41
  317. package/skills/build-benchmark/SKILL.md.spec.ts +0 -40
  318. package/skills/camera-ready/SKILL.md +1 -34
  319. package/skills/camera-ready/SKILL.md.spec.ts +0 -33
  320. package/skills/cold-read-diff/SKILL.md +1 -35
  321. package/skills/cold-read-diff/SKILL.md.spec.ts +0 -34
  322. package/skills/draft-paper/SKILL.md +2 -41
  323. package/skills/draft-paper/SKILL.md.spec.ts +1 -50
  324. package/skills/extend-paper/SKILL.md +2 -33
  325. package/skills/extend-paper/SKILL.md.spec.ts +1 -42
  326. package/skills/find-venue/SKILL.md +2 -38
  327. package/skills/find-venue/SKILL.md.spec.ts +1 -47
  328. package/skills/grade-paper-writing/SKILL.md +3 -38
  329. package/skills/grade-paper-writing/SKILL.md.spec.ts +2 -47
  330. package/skills/grade-paper-writing/prose-lint.mjs +3 -4
  331. package/skills/grade-paper-writing/{prose-lint.test.mjs → prose-lint.test.ts} +3 -3
  332. package/skills/harden-paper/SKILL.md +1 -39
  333. package/skills/harden-paper/SKILL.md.spec.ts +0 -38
  334. package/skills/map-prior-work/SKILL.md +1 -35
  335. package/skills/map-prior-work/SKILL.md.spec.ts +0 -34
  336. package/skills/osf-artifact-upload/{osf-artifact-upload.harness.mjs → osf-artifact-upload.harness.ts} +3 -4
  337. package/skills/paper-adversarial-review/SKILL.md +2 -35
  338. package/skills/paper-adversarial-review/SKILL.md.spec.ts +1 -43
  339. package/skills/paper-pipeline/SKILL.md +2 -28
  340. package/skills/paper-pipeline/SKILL.md.spec.ts +1 -27
  341. package/skills/paper-pipeline/description-language.eval.mjs +1 -1
  342. package/skills/paper-pipeline/framing-vs-vocabulary.eval.mjs +1 -1
  343. package/skills/paper-pipeline/grade-paper-writing-ablation.eval.mjs +2 -2
  344. package/skills/paper-pipeline/paper-pipeline.harness.mjs +25 -40
  345. package/skills/paper-pipeline/pipeline-firing.eval.mjs +1 -1
  346. package/skills/paper-pipeline/pipeline-language.eval.mjs +1 -1
  347. package/skills/paper-pipeline/references/acceptance-gate.md +1 -6
  348. package/skills/paper-pipeline/references/pipeline-status-template.md +8 -35
  349. package/skills/paper-pipeline/scripts/README.md +30 -225
  350. package/skills/paper-pipeline/scripts/artifact-coverage.harness.mjs +4 -8
  351. package/skills/paper-pipeline/scripts/artifact-coverage.mjs +1 -1
  352. package/skills/paper-pipeline/scripts/{artifact-coverage.test.mjs → artifact-coverage.test.ts} +2 -2
  353. package/skills/paper-pipeline/scripts/consumer.harness.mjs +6 -104
  354. package/skills/paper-pipeline/scripts/consumer.mjs +24 -109
  355. package/skills/paper-pipeline/scripts/consumer.test.mjs +1 -1
  356. package/skills/paper-pipeline/scripts/extract-ref-facts.harness.mjs +1 -1
  357. package/skills/paper-pipeline/scripts/extract-ref-facts.mjs +1 -4
  358. package/skills/paper-pipeline/scripts/extract-ref-facts.test.mjs +1 -1
  359. package/skills/paper-pipeline/scripts/generated-code.harness.mjs +2 -3
  360. package/skills/paper-pipeline/scripts/{generated-code.test.mjs → generated-code.test.ts} +3 -3
  361. package/skills/paper-pipeline/scripts/population-map.harness.mjs +3 -3
  362. package/skills/paper-pipeline/scripts/population-map.mjs +1 -4
  363. package/skills/paper-pipeline/scripts/population-map.test.mjs +1 -1
  364. package/skills/paper-pipeline/scripts/{round-diff.harness.mjs → round-diff.harness.ts} +45 -18
  365. package/skills/paper-pipeline/scripts/round-diff.mjs +1 -1
  366. package/skills/paper-pipeline/scripts/round-diff.test.mjs +1 -1
  367. package/skills/paper-status/SKILL.md +2 -42
  368. package/skills/paper-status/SKILL.md.spec.ts +1 -41
  369. package/skills/pc-panel-review/SKILL.md +2 -46
  370. package/skills/pc-panel-review/SKILL.md.spec.ts +1 -45
  371. package/skills/plan-paper-timeline/SKILL.md +2 -36
  372. package/skills/plan-paper-timeline/SKILL.md.spec.ts +0 -36
  373. package/skills/plan-paper-timeline/fixtures/{fake-google-calendar.mjs → fake-google-calendar.ts} +101 -70
  374. package/skills/plan-paper-timeline/plan-paper-timeline.effects.harness.mjs +3 -3
  375. package/skills/render-paper/SKILL.md +1 -37
  376. package/skills/render-paper/SKILL.md.spec.ts +0 -36
  377. package/skills/render-paper/{extract-pdf-facts.harness.mjs → extract-pdf-facts.harness.ts} +34 -9
  378. package/skills/render-paper/render-paper.harness.mjs +2 -2
  379. package/skills/research-ideate/SKILL.md +2 -39
  380. package/skills/research-ideate/SKILL.md.spec.ts +1 -47
  381. package/skills/study-accepted-papers/SKILL.md +1 -34
  382. package/skills/study-accepted-papers/SKILL.md.spec.ts +0 -33
  383. package/skills/submit-paper/SKILL.md +1 -33
  384. package/skills/submit-paper/SKILL.md.spec.ts +0 -32
  385. package/skills/sweep-design-space/SKILL.md +1 -38
  386. package/skills/sweep-design-space/SKILL.md.spec.ts +0 -37
  387. package/skills/tighten-paper/SKILL.md +2 -39
  388. package/skills/tighten-paper/SKILL.md.spec.ts +1 -47
  389. package/skills/tighten-paper/structure.mjs +5 -12
  390. package/skills/tighten-paper/{structure.test.mjs → structure.test.ts} +4 -3
  391. package/skills/verify-citations/SKILL.md +2 -38
  392. package/skills/verify-citations/SKILL.md.spec.ts +1 -37
  393. package/skills/verify-citations/scripts/{bib-authors.cli.test.mjs → bib-authors.cli.test.ts} +14 -4
  394. package/skills/verify-citations/scripts/bib-authors.d.mts +63 -0
  395. package/skills/verify-citations/scripts/bib-authors.mjs +1 -4
  396. package/skills/verify-citations/scripts/{verify-cites.cli.test.mjs → verify-cites.cli.test.ts} +32 -9
  397. package/skills/verify-citations/scripts/verify-cites.d.mts +58 -0
  398. package/src/CLAUDE.md +1 -1
  399. package/src/adapters/banal/failure.ts +9 -10
  400. package/src/adapters/banal/index.test.ts +5 -8
  401. package/src/adapters/banal/index.ts +8 -7
  402. package/src/adapters/banal/install.ts +9 -4
  403. package/src/adapters/banal/invocation.test.ts +23 -9
  404. package/src/adapters/banal/invocation.ts +24 -9
  405. package/src/adapters/banal/locate.test.ts +2 -2
  406. package/src/adapters/banal/locate.ts +27 -21
  407. package/src/adapters/banal/output.test.ts +1 -1
  408. package/src/adapters/banal/run.test.ts +5 -5
  409. package/src/adapters/banal/run.ts +16 -10
  410. package/src/adapters/banal/settings.ts +2 -2
  411. package/src/adapters/banal/xml.test.ts +1 -1
  412. package/src/adapters/curl/download.test.ts +8 -6
  413. package/src/adapters/memory/index.ts +4 -3
  414. package/src/adapters/node/files.io.ts +2 -2
  415. package/src/adapters/node/files.test.ts +8 -4
  416. package/src/adapters/node/process.io.ts +13 -5
  417. package/src/adapters/node/process.test.ts +5 -5
  418. package/src/adapters/node/workspace.io.ts +9 -4
  419. package/src/adapters/node/workspace.test.ts +3 -1
  420. package/src/adapters/pdfjs/fill.test.ts +2 -2
  421. package/src/adapters/pdfjs/fill.ts +14 -7
  422. package/src/adapters/references/index.test.ts +31 -38
  423. package/src/adapters/references/index.ts +33 -60
  424. package/src/adapters/references/pool.ts +3 -5
  425. package/src/adapters/references/reach.io.ts +2 -1
  426. package/src/build-engine.harness.mjs +1 -1
  427. package/src/build-engine.test.ts +13 -8
  428. package/src/build-engine.ts +12 -7
  429. package/src/build.harness.mjs +2 -2
  430. package/src/build.test.ts +24 -24
  431. package/src/build.ts +34 -26
  432. package/src/caller-path.ts +13 -0
  433. package/src/cli.harness.mjs +6 -8
  434. package/src/cli.test.ts +31 -13
  435. package/src/cli.ts +117 -58
  436. package/src/doctor.harness.mjs +3 -3
  437. package/src/doctor.test.ts +1 -1
  438. package/src/doctor.ts +17 -7
  439. package/src/domain/lookup-cache.ts +21 -11
  440. package/src/domain/paths.test.ts +15 -0
  441. package/src/domain/paths.ts +20 -1
  442. package/src/domain/ready.ts +31 -0
  443. package/src/domain/record.test.ts +20 -0
  444. package/src/domain/record.ts +12 -0
  445. package/src/domain/result.test.ts +2 -2
  446. package/src/domain/sha256.ts +5 -3
  447. package/src/domain/text.test.ts +32 -0
  448. package/src/domain/text.ts +23 -0
  449. package/src/engine.harness.mjs +2 -2
  450. package/src/engine.ts +34 -5
  451. package/src/facts-file.test.ts +9 -7
  452. package/src/facts-file.ts +45 -29
  453. package/src/{hooks-settings.harness.mjs → hooks-settings.harness.ts} +56 -20
  454. package/src/hooks-settings.ts +48 -13
  455. package/src/init.test.ts +37 -14
  456. package/src/init.ts +48 -24
  457. package/src/{latex-log.harness.mjs → latex-log.harness.ts} +14 -14
  458. package/src/{latex-loop.harness.mjs → latex-loop.harness.ts} +64 -36
  459. package/src/latex-loop.ts +3 -3
  460. package/src/{link-skills.harness.mjs → link-skills.harness.ts} +19 -19
  461. package/src/link-skills.test.ts +3 -3
  462. package/src/link-skills.ts +5 -4
  463. package/src/lint-fix.test.ts +4 -6
  464. package/src/linted-set.test.ts +2 -2
  465. package/src/new-paper.harness.mjs +9 -25
  466. package/src/new-paper.test.ts +8 -10
  467. package/src/new-paper.ts +9 -5
  468. package/src/paper-files.test.ts +25 -24
  469. package/src/paper-files.ts +16 -27
  470. package/src/paper-settings-commands.test.ts +5 -4
  471. package/src/paper-settings.test.ts +7 -7
  472. package/src/paper-settings.ts +13 -14
  473. package/src/{pdf-facts.harness.mjs → pdf-facts.harness.ts} +9 -8
  474. package/src/pdf-facts.test.ts +25 -15
  475. package/src/pdf-facts.ts +81 -23
  476. package/src/{pdf-geometry.harness.mjs → pdf-geometry.harness.ts} +19 -12
  477. package/src/pdf-geometry.ts +8 -4
  478. package/src/ports/tool-installer.ts +2 -17
  479. package/src/presets.ts +31 -16
  480. package/src/references.test.ts +76 -62
  481. package/src/references.ts +18 -12
  482. package/src/{rules-config.harness.mjs → rules-config.harness.ts} +7 -13
  483. package/src/rules-config.ts +46 -14
  484. package/src/rules-off.test.ts +6 -4
  485. package/src/{structure.harness.mjs → structure.harness.ts} +26 -15
  486. package/src/structure.ts +1 -1
  487. package/src/{tex-requirements.harness.mjs → tex-requirements.harness.ts} +50 -22
  488. package/src/tex-requirements.test.ts +21 -0
  489. package/src/tex-requirements.ts +37 -11
  490. package/src/toolchain.harness.mjs +2 -2
  491. package/src/toolchain.test.ts +10 -6
  492. package/src/toolchain.ts +31 -17
  493. package/src/types.ts +5 -3
  494. package/src/venue-rules.test.ts +70 -68
  495. package/src/venue-rules.ts +22 -12
  496. package/tsconfig.json +6 -3
  497. package/tsconfig.pkg.json +10 -0
  498. package/lib/check.d.mts +0 -17
  499. package/lib/paper-config.d.mts +0 -31
  500. package/scripts/layer-legacy-frozen.d.mts +0 -36
  501. package/scripts/rules-are-content-only.harness.mjs +0 -105
  502. package/scripts/rules-are-content-only.mjs +0 -148
  503. package/scripts/rules-are-content-only.test.mjs +0 -61
  504. package/scripts/test.mjs +0 -44
  505. package/scripts/test.test.mjs +0 -52
  506. package/skills/paper-pipeline/scripts/announce.mjs +0 -67
  507. package/skills/paper-pipeline/scripts/announce.test.mjs +0 -102
  508. package/skills/paper-pipeline/scripts/fixtures/clean/PIPELINE-STATUS.md +0 -51
  509. package/skills/paper-pipeline/scripts/fixtures/dirty/PIPELINE-STATUS.md +0 -52
  510. package/skills/paper-pipeline/scripts/fixtures/dirty/paper.md +0 -6
  511. package/skills/paper-pipeline/scripts/fixtures/scorecard.mjs +0 -71
  512. package/skills/paper-pipeline/scripts/ledger.cli.test.mjs +0 -302
  513. package/skills/paper-pipeline/scripts/ledger.mjs +0 -623
  514. package/skills/paper-pipeline/scripts/ledger.test.mjs +0 -254
  515. package/skills/paper-pipeline/scripts/pipeline-check.cli.test.mjs +0 -474
  516. package/skills/paper-pipeline/scripts/pipeline-check.harness.mjs +0 -328
  517. package/skills/paper-pipeline/scripts/pipeline-check.mjs +0 -753
  518. package/skills/paper-pipeline/scripts/pipeline-edges.mjs +0 -169
  519. package/skills/paper-pipeline/scripts/pipeline-edges.test.mjs +0 -73
  520. package/skills/paper-pipeline/scripts/run-mechanical.mjs +0 -648
  521. package/skills/paper-pipeline/scripts/run-mechanical.test.mjs +0 -468
  522. package/skills/paper-pipeline/scripts/status.mjs +0 -295
  523. package/skills/paper-pipeline/scripts/status.test.mjs +0 -232
  524. /package/bin/{paperlint.test.mjs → paperlint.test.ts} +0 -0
  525. /package/lib/{skill-eval-fixture.mjs → skill-eval-fixture.ts} +0 -0
  526. /package/skills/grade-paper-writing/__snapshots__/{prose-lint.test.mjs.snap → prose-lint.test.ts.snap} +0 -0
  527. /package/skills/tighten-paper/__snapshots__/{structure.test.mjs.snap → structure.test.ts.snap} +0 -0
@@ -1,5 +1,5 @@
1
1
  /**
2
- * prose-lint.mjs as a process — the way the skill and `run-mechanical.mjs` run it. Every mode, on
2
+ * prose-lint.mjs as a process — the way the skill runs it. Every mode, on
3
3
  * fixtures written here, with the WHOLE output compared: the report is the product, so a changed
4
4
  * number or a dropped line is a changed result.
5
5
  */
@@ -8,14 +8,14 @@ import { join } from "node:path";
8
8
  import { dirname } from "node:path";
9
9
  import { fileURLToPath } from "node:url";
10
10
  import { expect, test } from "vitest";
11
- import { runNode, useTempDir, writeTree } from "../../test/support.mjs";
11
+ import { runNode, useTempDir, writeTree } from "../../test/support.ts";
12
12
 
13
13
  const SCRIPT = join(dirname(fileURLToPath(import.meta.url)), "prose-lint.mjs");
14
14
  const root = useTempDir("prose-lint-");
15
15
 
16
16
  const LONG_CAPTION_SENTENCE = Array.from(
17
17
  { length: 45 },
18
- (_, i) => `word${i}`,
18
+ (_, i) => `word${String(i)}`,
19
19
  ).join(" ");
20
20
  const PAPER = `---
21
21
  title: A title the linter must not read as a sentence
@@ -4,7 +4,7 @@ description: Use when asking "is this paper actually ready to submit?" / "what's
4
4
  allowed-tools: [Read, Write, Edit, Grep, Glob, Bash, WebSearch, WebFetch, Agent, Skill]
5
5
  ---
6
6
 
7
- <!-- vigiles:sha256:7fb5e8709eb4c363 compiled from skills/harden-paper/SKILL.md.spec.ts -->
7
+ <!-- vigiles:sha256:5283c1dbb4693721 compiled from skills/harden-paper/SKILL.md.spec.ts -->
8
8
 
9
9
  # harden-paper — the multi-axis pre-submit gate
10
10
 
@@ -15,17 +15,6 @@ allowed-tools: [Read, Write, Edit, Grep, Glob, Bash, WebSearch, WebFetch, Agent,
15
15
  > doesn't systematically hit — the submission-readiness gate. Run it after the draft is written and
16
16
  > before `submit-paper`. It does not re-implement the sub-skills; it calls them and checks the rest.
17
17
 
18
- ## Run me
19
-
20
- 🔴 FIRST, before any other step:
21
-
22
- ```
23
- node .claude/skills/paper-pipeline/scripts/announce.mjs harden-paper <paper-dir>
24
- ```
25
-
26
- An advisory pass cannot be observed failing — silence is both its error state and its normal
27
- state — so starting is an event, and events get written down.
28
-
29
18
  **Principle:** a paper dies from any *one* unclosed axis. Reviewers only *read* — so every claim,
30
19
  number, and omission must survive on the page. Go axis by axis; for each, **find → fix → re-verify**,
31
20
  don't just list. Below, each axis says what to run / check and the specific traps that recur.
@@ -285,33 +274,6 @@ framing, the one quotable stat, the reusable artifact, any dry-humour line and w
285
274
  list of items only the author can close (host artifact, click submit, disclose-before-public, post the
286
275
  preprint). If every gate passes and every axis is PASS/FIXED → hand off to `submit-paper`.
287
276
 
288
- ## Record the verdict
289
-
290
- 🔴 LAST step, once the deliverable exists:
291
-
292
- ```
293
- node .claude/skills/paper-pipeline/scripts/ledger.mjs record harden-paper <paper-dir> FINDING <count> <report-path>
294
- node .claude/skills/paper-pipeline/scripts/ledger.mjs record harden-paper <paper-dir> ABSTAINED <reason> "<one line>"
295
- ```
296
-
297
- **FINDING** — `<count>` is the number of failing gates plus still-OPEN axes and `<report-path>` the
298
- worst-gate-first vector. Add `--blocking` when any gate in the vector fails, as opposed to an axis
299
- merely being open.
300
- **ABSTAINED** — `no-witness`: every gate answered and no axis is open, which is the state that hands
301
- off to `submit-paper`. `blocked`: a gate in the vector has never been run, so the vector has a hole
302
- in it and there is nothing to hand off.
303
-
304
- 🔴 **There is no PASS, and this skill must not reinvent one.** Its whole design is that the verdict
305
- is a VECTOR reported worst-gate-first, and a stored scalar acquittal was the single value that could
306
- flatten it. `no-witness` here means every gate answered and none of them found anything — it is not
307
- "ready", and the readiness call is a sentence a human writes in the report.
308
-
309
- 🔴 **Never record the accept-probability as the count.** A single scalar hiding a multi-dimensional
310
- failure is the exact thing this skill refuses to report in prose, and a ledger row is prose that
311
- survives longer.
312
-
313
- The artifact-coverage script files separately as `harden-paper/artifact-coverage`. One check, one row.
314
-
315
277
  ## Composes with
316
278
  `tighten-paper` (axis 0, run FIRST — structure before sentences), `paper-adversarial-review` +
317
279
  `pc-panel-review` + `verify-citations` + `grade-paper-writing` (called by this), `render-paper` (if LaTeX
@@ -32,17 +32,6 @@ export default experimental_skill({
32
32
  > doesn't systematically hit — the submission-readiness gate. Run it after the draft is written and
33
33
  > before \`submit-paper\`. It does not re-implement the sub-skills; it calls them and checks the rest.
34
34
 
35
- ## Run me
36
-
37
- 🔴 FIRST, before any other step:
38
-
39
- \`\`\`
40
- node .claude/skills/paper-pipeline/scripts/announce.mjs harden-paper <paper-dir>
41
- \`\`\`
42
-
43
- An advisory pass cannot be observed failing — silence is both its error state and its normal
44
- state — so starting is an event, and events get written down.
45
-
46
35
  **Principle:** a paper dies from any *one* unclosed axis. Reviewers only *read* — so every claim,
47
36
  number, and omission must survive on the page. Go axis by axis; for each, **find → fix → re-verify**,
48
37
  don't just list. Below, each axis says what to run / check and the specific traps that recur.
@@ -302,33 +291,6 @@ framing, the one quotable stat, the reusable artifact, any dry-humour line and w
302
291
  list of items only the author can close (host artifact, click submit, disclose-before-public, post the
303
292
  preprint). If every gate passes and every axis is PASS/FIXED → hand off to \`submit-paper\`.
304
293
 
305
- ## Record the verdict
306
-
307
- 🔴 LAST step, once the deliverable exists:
308
-
309
- \`\`\`
310
- node .claude/skills/paper-pipeline/scripts/ledger.mjs record harden-paper <paper-dir> FINDING <count> <report-path>
311
- node .claude/skills/paper-pipeline/scripts/ledger.mjs record harden-paper <paper-dir> ABSTAINED <reason> "<one line>"
312
- \`\`\`
313
-
314
- **FINDING** — \`<count>\` is the number of failing gates plus still-OPEN axes and \`<report-path>\` the
315
- worst-gate-first vector. Add \`--blocking\` when any gate in the vector fails, as opposed to an axis
316
- merely being open.
317
- **ABSTAINED** — \`no-witness\`: every gate answered and no axis is open, which is the state that hands
318
- off to \`submit-paper\`. \`blocked\`: a gate in the vector has never been run, so the vector has a hole
319
- in it and there is nothing to hand off.
320
-
321
- 🔴 **There is no PASS, and this skill must not reinvent one.** Its whole design is that the verdict
322
- is a VECTOR reported worst-gate-first, and a stored scalar acquittal was the single value that could
323
- flatten it. \`no-witness\` here means every gate answered and none of them found anything — it is not
324
- "ready", and the readiness call is a sentence a human writes in the report.
325
-
326
- 🔴 **Never record the accept-probability as the count.** A single scalar hiding a multi-dimensional
327
- failure is the exact thing this skill refuses to report in prose, and a ledger row is prose that
328
- survives longer.
329
-
330
- The artifact-coverage script files separately as \`harden-paper/artifact-coverage\`. One check, one row.
331
-
332
294
  ## Composes with
333
295
  \`tighten-paper\` (axis 0, run FIRST — structure before sentences), \`paper-adversarial-review\` +
334
296
  \`pc-panel-review\` + \`verify-citations\` + \`grade-paper-writing\` (called by this), \`render-paper\` (if LaTeX
@@ -5,21 +5,10 @@ context: fork
5
5
  allowed-tools: [WebSearch, WebFetch, Read, Write, Grep, Glob, Bash, Agent]
6
6
  ---
7
7
 
8
- <!-- vigiles:sha256:353e5a21b731a548 compiled from skills/map-prior-work/SKILL.md.spec.ts -->
8
+ <!-- vigiles:sha256:55971644308c470f compiled from skills/map-prior-work/SKILL.md.spec.ts -->
9
9
 
10
10
  # map-prior-work — find out who already did it, while you can still change course
11
11
 
12
- ## Run me
13
-
14
- 🔴 FIRST, before any other step:
15
-
16
- ```
17
- node .claude/skills/paper-pipeline/scripts/announce.mjs map-prior-work <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
  The expensive failure this prevents, in one sentence: **you discover the paper that already did your
24
13
  contribution after the draft is finished, when the only move left is rewriting the claim under deadline.**
25
14
 
@@ -173,29 +162,6 @@ you looked.
173
162
 
174
163
  ---
175
164
 
176
- ## Step 8 — record the verdict
177
-
178
- 🔴 LAST step, once the deliverable exists:
179
-
180
- ```
181
- node .claude/skills/paper-pipeline/scripts/ledger.mjs record map-prior-work <paper-dir> FINDING <count> <report-path>
182
- node .claude/skills/paper-pipeline/scripts/ledger.mjs record map-prior-work <paper-dir> ABSTAINED <reason> "<one line>"
183
- ```
184
-
185
- **FINDING** — `<count>` is the number of rivals triaged 🔴 or 🟠 (they threaten the claim),
186
- `<report-path>` is the sweep file. Add `--blocking` when a rival did the contribution first and the
187
- claim has to change.
188
- **ABSTAINED** — `no-witness`: swept, and nothing found threatens what you claim. `blocked`: the
189
- paper has no stated contribution yet, so there is nothing to sweep against.
190
-
191
- That blocking finding is the outcome this skill was written from, discovered at T−10 days by
192
- accident. Recorded here it is a dated fact about the field rather than a memory of a bad night.
193
-
194
- 🔴 **There is no PASS**, and this skill is where the reason is easiest to see. "Nothing threatens
195
- the claim" is a statement about everything that exists, made by a sweep that read a bounded list —
196
- so it can never be witnessed, only ever failed to be refuted. `no-witness` says that in one word,
197
- and the sweep's own coverage-gaps section says how far the reading actually went.
198
-
199
165
  ## Rules
200
166
 
201
167
  - **Mark evidence level on every claim:** `[A]` full text · `[B]` abstract/metadata · `[C]` your
@@ -24,17 +24,6 @@ export default experimental_skill({
24
24
  body: `
25
25
  # map-prior-work — find out who already did it, while you can still change course
26
26
 
27
- ## Run me
28
-
29
- 🔴 FIRST, before any other step:
30
-
31
- \`\`\`
32
- node .claude/skills/paper-pipeline/scripts/announce.mjs map-prior-work <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
  The expensive failure this prevents, in one sentence: **you discover the paper that already did your
39
28
  contribution after the draft is finished, when the only move left is rewriting the claim under deadline.**
40
29
 
@@ -188,29 +177,6 @@ you looked.
188
177
 
189
178
  ---
190
179
 
191
- ## Step 8 — record the verdict
192
-
193
- 🔴 LAST step, once the deliverable exists:
194
-
195
- \`\`\`
196
- node .claude/skills/paper-pipeline/scripts/ledger.mjs record map-prior-work <paper-dir> FINDING <count> <report-path>
197
- node .claude/skills/paper-pipeline/scripts/ledger.mjs record map-prior-work <paper-dir> ABSTAINED <reason> "<one line>"
198
- \`\`\`
199
-
200
- **FINDING** — \`<count>\` is the number of rivals triaged 🔴 or 🟠 (they threaten the claim),
201
- \`<report-path>\` is the sweep file. Add \`--blocking\` when a rival did the contribution first and the
202
- claim has to change.
203
- **ABSTAINED** — \`no-witness\`: swept, and nothing found threatens what you claim. \`blocked\`: the
204
- paper has no stated contribution yet, so there is nothing to sweep against.
205
-
206
- That blocking finding is the outcome this skill was written from, discovered at T−10 days by
207
- accident. Recorded here it is a dated fact about the field rather than a memory of a bad night.
208
-
209
- 🔴 **There is no PASS**, and this skill is where the reason is easiest to see. "Nothing threatens
210
- the claim" is a statement about everything that exists, made by a sweep that read a bounded list —
211
- so it can never be witnessed, only ever failed to be refuted. \`no-witness\` says that in one word,
212
- and the sweep's own coverage-gaps section says how far the reading actually went.
213
-
214
180
  ## Rules
215
181
 
216
182
  - **Mark evidence level on every claim:** \`[A]\` full text · \`[B]\` abstract/metadata · \`[C]\` your
@@ -1,10 +1,9 @@
1
1
  /**
2
2
  * osf-artifact-upload — the free, deterministic tier. No model, no network, no OSF.
3
3
  *
4
- * WHY THIS ONE IS NOT A `checkSkill()` ONE-LINER. It carries no
5
- * `announce.mjs <self>` line, so by the pipeline's own membership contract it is
6
- * not a stage — it is a utility `submit-paper` composes with, and the shared
7
- * per-skill checks would (correctly) reject it.
4
+ * WHY THIS ONE IS NOT A `checkSkill()` ONE-LINER. It is not a stage — it is a
5
+ * utility `submit-paper` composes with — and what matters about it is the rules
6
+ * it states about its own commands, which the shared per-skill checks do not read.
8
7
  *
9
8
  * WHAT IT CHECKS: the two rules this skill states about its OWN commands, in its
10
9
  * own §gotchas — that every `curl` carries `-g` (bracketed OSF params glob and
@@ -2,10 +2,10 @@
2
2
  name: paper-adversarial-review
3
3
  description: Use when asking "red-team this paper" / "what would Reviewer 2 attack?" / "find the weaknesses before I submit" — ONE fast hostile-but-fair review of a paper draft. Surfaces overclaims, methodology holes, missing baselines/citations, novelty concerns, threats to validity, and desk-reject risks, with concrete fixes, led by a multi-axis 1–5 scorecard whose card composes into a pc-panel-review panel. NOT the multi-reviewer accept/reject decision (pc-panel-review), a writing grade (grade-paper-writing — this skill consumes its stall inventory rather than re-grading prose), or the full pre-submit gate (harden-paper). Especially for security and agentic-coding measurement papers.
4
4
  context: fork
5
- 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:*)]
5
+ allowed-tools: [Read, Write, Grep, Glob, Agent, Skill]
6
6
  ---
7
7
 
8
- <!-- vigiles:sha256:2da081a03ae7fee3 compiled from skills/paper-adversarial-review/SKILL.md.spec.ts -->
8
+ <!-- vigiles:sha256:68dcbcc1b7ab5348 compiled from skills/paper-adversarial-review/SKILL.md.spec.ts -->
9
9
 
10
10
  # paper-adversarial-review — be the reviewer who wants to reject it
11
11
 
@@ -15,17 +15,6 @@ allowed-tools: [Read, Write, Grep, Glob, Agent, Skill, Bash(node .claude/skills/
15
15
  > CFP-fit score (formerly `venue-review-sim`). Reach for an atom (this, or venue-fit mode) for a quick
16
16
  > spot-check; run the panel for the decision.
17
17
 
18
- ## Run me
19
-
20
- 🔴 FIRST, before any other step:
21
-
22
- ```
23
- node .claude/skills/paper-pipeline/scripts/announce.mjs paper-adversarial-review <paper-dir>
24
- ```
25
-
26
- An advisory pass cannot be observed failing — silence is both its error state and its normal
27
- state — so starting is an event, and events get written down.
28
-
29
18
  Purpose: catch what a real peer reviewer will hit, while it's still fixable. Peer review is
30
19
  **read, not run** — reviewers judge the *text, figures, and reported numbers*, rarely execute code.
31
20
  So the paper must be self-contained and airtight on its face. This skill simulates the skeptical
@@ -91,28 +80,6 @@ venue + paper type (short/full/position/benchmark). Ask for the structured outpu
91
80
  - **Strongest reframing** if the contribution is undersold or misframed.
92
81
  - **What to cut** (for length / TMI) and **what to add** (for soundness).
93
82
 
94
- ## Record the verdict
95
-
96
- 🔴 LAST step, once the deliverable exists:
97
-
98
- ```
99
- node .claude/skills/paper-pipeline/scripts/ledger.mjs record paper-adversarial-review <paper-dir> FINDING <count> <report-path>
100
- node .claude/skills/paper-pipeline/scripts/ledger.mjs record paper-adversarial-review <paper-dir> ABSTAINED <reason> "<one line>"
101
- ```
102
-
103
- **FINDING** — `<count>` is the number of ranked weaknesses, `<report-path>` the review with its
104
- scorecard. Add `--blocking` when the leaning is reject, or there is a live desk-reject risk.
105
- **ABSTAINED** — `no-witness`: the hostile read found nothing. `blocked`: there was no rendered
106
- draft to attack.
107
-
108
- 🔴 **There is no PASS, and this skill is the reason the word was dangerous.** A hostile read that
109
- found nothing either met a very good paper or was not hostile, and the old vocabulary wrote the
110
- same word for both. `no-witness` says the true thing — this reader has no witness for the paper
111
- being sound — and leaves the second possibility standing where it belongs, in view.
112
-
113
- Record the weakness count, not the Overall 1–5. The average is exactly what this skill tells its own
114
- reviewer to distrust — the lowest one or two axes are the story.
115
-
116
83
  ## Rules
117
84
  - Be adversarial but *fair* and *specific* — "weak" is useless; "the 65% claim in the abstract isn't
118
85
  supported because the pooled bill is −1%, reword to X" is useful.
@@ -11,16 +11,7 @@ export default experimental_skill({
11
11
  description:
12
12
  'Use when asking "red-team this paper" / "what would Reviewer 2 attack?" / "find the weaknesses before I submit" — ONE fast hostile-but-fair review of a paper draft. Surfaces overclaims, methodology holes, missing baselines/citations, novelty concerns, threats to validity, and desk-reject risks, with concrete fixes, led by a multi-axis 1–5 scorecard whose card composes into a pc-panel-review panel. NOT the multi-reviewer accept/reject decision (pc-panel-review), a writing grade (grade-paper-writing — this skill consumes its stall inventory rather than re-grading prose), or the full pre-submit gate (harden-paper). Especially for security and agentic-coding measurement papers.',
13
13
  context: "fork",
14
- tools: [
15
- "Read",
16
- "Write",
17
- "Grep",
18
- "Glob",
19
- "Agent",
20
- "Skill",
21
- "Bash(node .claude/skills/paper-pipeline/scripts/announce.mjs:*)",
22
- "Bash(node .claude/skills/paper-pipeline/scripts/ledger.mjs:*)",
23
- ],
14
+ tools: ["Read", "Write", "Grep", "Glob", "Agent", "Skill"],
24
15
  body: `
25
16
  # paper-adversarial-review — be the reviewer who wants to reject it
26
17
 
@@ -30,17 +21,6 @@ export default experimental_skill({
30
21
  > CFP-fit score (formerly \`venue-review-sim\`). Reach for an atom (this, or venue-fit mode) for a quick
31
22
  > spot-check; run the panel for the decision.
32
23
 
33
- ## Run me
34
-
35
- 🔴 FIRST, before any other step:
36
-
37
- \`\`\`
38
- node .claude/skills/paper-pipeline/scripts/announce.mjs paper-adversarial-review <paper-dir>
39
- \`\`\`
40
-
41
- An advisory pass cannot be observed failing — silence is both its error state and its normal
42
- state — so starting is an event, and events get written down.
43
-
44
24
  Purpose: catch what a real peer reviewer will hit, while it's still fixable. Peer review is
45
25
  **read, not run** — reviewers judge the *text, figures, and reported numbers*, rarely execute code.
46
26
  So the paper must be self-contained and airtight on its face. This skill simulates the skeptical
@@ -106,28 +86,6 @@ venue + paper type (short/full/position/benchmark). Ask for the structured outpu
106
86
  - **Strongest reframing** if the contribution is undersold or misframed.
107
87
  - **What to cut** (for length / TMI) and **what to add** (for soundness).
108
88
 
109
- ## Record the verdict
110
-
111
- 🔴 LAST step, once the deliverable exists:
112
-
113
- \`\`\`
114
- node .claude/skills/paper-pipeline/scripts/ledger.mjs record paper-adversarial-review <paper-dir> FINDING <count> <report-path>
115
- node .claude/skills/paper-pipeline/scripts/ledger.mjs record paper-adversarial-review <paper-dir> ABSTAINED <reason> "<one line>"
116
- \`\`\`
117
-
118
- **FINDING** — \`<count>\` is the number of ranked weaknesses, \`<report-path>\` the review with its
119
- scorecard. Add \`--blocking\` when the leaning is reject, or there is a live desk-reject risk.
120
- **ABSTAINED** — \`no-witness\`: the hostile read found nothing. \`blocked\`: there was no rendered
121
- draft to attack.
122
-
123
- 🔴 **There is no PASS, and this skill is the reason the word was dangerous.** A hostile read that
124
- found nothing either met a very good paper or was not hostile, and the old vocabulary wrote the
125
- same word for both. \`no-witness\` says the true thing — this reader has no witness for the paper
126
- being sound — and leaves the second possibility standing where it belongs, in view.
127
-
128
- Record the weakness count, not the Overall 1–5. The average is exactly what this skill tells its own
129
- reviewer to distrust — the lowest one or two axes are the story.
130
-
131
89
  ## Rules
132
90
  - Be adversarial but *fair* and *specific* — "weak" is useless; "the 65% claim in the abstract isn't
133
91
  supported because the pooled bill is −1%, reword to X" is useful.
@@ -4,7 +4,7 @@ description: The orchestrator for writing a research paper end-to-end, from idea
4
4
  allowed-tools: [Read, Write, Edit, Grep, Glob, Bash, WebSearch, WebFetch, Agent, Skill]
5
5
  ---
6
6
 
7
- <!-- vigiles:sha256:291d2266e29874be compiled from skills/paper-pipeline/SKILL.md.spec.ts -->
7
+ <!-- vigiles:sha256:a15a3fcf5fdfedf7 compiled from skills/paper-pipeline/SKILL.md.spec.ts -->
8
8
 
9
9
  # paper-pipeline — the conductor for the whole organism
10
10
 
@@ -44,30 +44,6 @@ their grade/result, what's open,* and a one-line **submit-ready verdict**. Rules
44
44
  - **"Is paper X ready / what's checked?"** = read this file (verdict + any `☐`/`◐`/`⚠` rows), don't
45
45
  reconstruct from chat.
46
46
  - Distinct from `SUBMIT-CHECKLIST.md` (venue-format compliance); both must be green before upload.
47
- - 🔴 **Enforcement leg (prose-isn't-policy), and it is a script, not a paragraph.**
48
- `scripts/pipeline-check.mjs` reads this file on every paper edit and reports the failures that
49
- actually happened on real papers: a CONTINUOUS check whose last run predates the current text, a GATE
50
- that ran without its required input, **a `Requires` cell that omits an edge the pipeline declares**
51
- (the canonical set is `scripts/pipeline-edges.mjs`, with the admitting sentence per edge), a study
52
- that ran with no stated claim, the `access` row not green inside the moderation window, and a verdict
53
- line that is just an accept probability. Run it directly
54
- with `node .claude/skills/paper-pipeline/scripts/pipeline-check.mjs <paper-dir>`; it is wired into
55
- `.claude/hooks/paper-status-gates.sh` and asserted in `.claude/hooks/hooks.harness.mjs`.
56
- **The grading itself stays judgment** (that is the skills' job) — only the mechanically checkable
57
- parts are compiled. *Added 2026-08-03, the day three hooks in this repo were found to have been dead
58
- for weeks: an advisory that is never exercised is indistinguishable from one that works.*
59
-
60
- 🔴 **As of 2026-08-26, this file is read by TWO things.** Sixteen checks over it live as
61
- `@eslint/markdown` rules in `eslint-rules/pipeline-status.mjs` (run:
62
- `npx eslint <paper-dir>/PIPELINE-STATUS.md`; five of them are `error`), while
63
- `scripts/pipeline-check.mjs` holds six whose input lies OUTSIDE the file — git, the clock, the
64
- `reviews/` directory, `process.env`. The classification of all 22 lives in the
65
- author's private notes (`<papers-root>/research/2026-08-26-klassifikatsiya-pipeline-check.md`).
66
-
67
- ⚠️ The paragraph above lived for a day NOT HERE but directly in `SKILL.md` — i.e. in the
68
- generated file. The very first `vigiles compile` (27.08) ate it, and it was not a human who
69
- noticed but an agent whose compile had just erased someone else's edit. **An edit to `SKILL.md`
70
- without `.spec.ts` is an edit with an expiration date: the next compile.**
71
47
 
72
48
  ## 🗺️ Where every check actually runs — and where it can be walked around
73
49
 
@@ -133,9 +109,7 @@ Prior art is named in the file header (`adewale/skill-eval-harness` does this to
133
109
 
134
110
  🔴 **Still manual, and no mechanism has been found for it:** the **cold read** — a reader with no
135
111
  context restating each sentence — is the only check that catches a sentence that is short, true,
136
- threshold-passing and meaningless. It needs a fresh subagent, so no hook can run it. What IS
137
- mechanised is noticing that it is *overdue*: `pipeline-check.mjs` reports `stale-cold-read` when the
138
- prose changed after the last one.
112
+ threshold-passing and meaningless. It needs a fresh subagent, so no hook can run it.
139
113
 
140
114
  Install the git hook once per clone: `git config core.hooksPath .githooks`.
141
115
 
@@ -61,30 +61,6 @@ their grade/result, what's open,* and a one-line **submit-ready verdict**. Rules
61
61
  - **"Is paper X ready / what's checked?"** = read this file (verdict + any \`☐\`/\`◐\`/\`⚠\` rows), don't
62
62
  reconstruct from chat.
63
63
  - Distinct from \`SUBMIT-CHECKLIST.md\` (venue-format compliance); both must be green before upload.
64
- - 🔴 **Enforcement leg (prose-isn't-policy), and it is a script, not a paragraph.**
65
- \`scripts/pipeline-check.mjs\` reads this file on every paper edit and reports the failures that
66
- actually happened on real papers: a CONTINUOUS check whose last run predates the current text, a GATE
67
- that ran without its required input, **a \`Requires\` cell that omits an edge the pipeline declares**
68
- (the canonical set is \`scripts/pipeline-edges.mjs\`, with the admitting sentence per edge), a study
69
- that ran with no stated claim, the \`access\` row not green inside the moderation window, and a verdict
70
- line that is just an accept probability. Run it directly
71
- with \`node .claude/skills/paper-pipeline/scripts/pipeline-check.mjs <paper-dir>\`; it is wired into
72
- \`.claude/hooks/paper-status-gates.sh\` and asserted in \`.claude/hooks/hooks.harness.mjs\`.
73
- **The grading itself stays judgment** (that is the skills' job) — only the mechanically checkable
74
- parts are compiled. *Added 2026-08-03, the day three hooks in this repo were found to have been dead
75
- for weeks: an advisory that is never exercised is indistinguishable from one that works.*
76
-
77
- 🔴 **As of 2026-08-26, this file is read by TWO things.** Sixteen checks over it live as
78
- \`@eslint/markdown\` rules in \`eslint-rules/pipeline-status.mjs\` (run:
79
- \`npx eslint <paper-dir>/PIPELINE-STATUS.md\`; five of them are \`error\`), while
80
- \`scripts/pipeline-check.mjs\` holds six whose input lies OUTSIDE the file — git, the clock, the
81
- \`reviews/\` directory, \`process.env\`. The classification of all 22 lives in the
82
- author's private notes (\`<papers-root>/research/2026-08-26-klassifikatsiya-pipeline-check.md\`).
83
-
84
- ⚠️ The paragraph above lived for a day NOT HERE but directly in \`SKILL.md\` — i.e. in the
85
- generated file. The very first \`vigiles compile\` (27.08) ate it, and it was not a human who
86
- noticed but an agent whose compile had just erased someone else's edit. **An edit to \`SKILL.md\`
87
- without \`.spec.ts\` is an edit with an expiration date: the next compile.**
88
64
 
89
65
  ## 🗺️ Where every check actually runs — and where it can be walked around
90
66
 
@@ -150,9 +126,7 @@ Prior art is named in the file header (\`adewale/skill-eval-harness\` does this
150
126
 
151
127
  🔴 **Still manual, and no mechanism has been found for it:** the **cold read** — a reader with no
152
128
  context restating each sentence — is the only check that catches a sentence that is short, true,
153
- threshold-passing and meaningless. It needs a fresh subagent, so no hook can run it. What IS
154
- mechanised is noticing that it is *overdue*: \`pipeline-check.mjs\` reports \`stale-cold-read\` when the
155
- prose changed after the last one.
129
+ threshold-passing and meaningless. It needs a fresh subagent, so no hook can run it.
156
130
 
157
131
  Install the git hook once per clone: \`git config core.hooksPath .githooks\`.
158
132
 
@@ -82,7 +82,7 @@ import { assertPromptDiversity, skillResolved, skip } from "vigiles";
82
82
  import { paid_measureTriggerRate as measureTriggerRate } from "vigiles/eval";
83
83
  import { existsSync, readFileSync } from "node:fs";
84
84
  import { join } from "node:path";
85
- import { frontmatterBlock } from "../../lib/markdown.mjs";
85
+ import { frontmatterBlock } from "#lib/markdown";
86
86
  import { parseFm } from "../../lib/skill-corpus.mjs";
87
87
  import { installedSkills } from "./scripts/consumer.mjs";
88
88
 
@@ -250,7 +250,7 @@ import { assertPromptDiversity, skip } from "vigiles";
250
250
  import { paid_measureTriggerRate as measureTriggerRate } from "vigiles/eval";
251
251
  import { existsSync, readFileSync, writeFileSync, mkdirSync } from "node:fs";
252
252
  import { join } from "node:path";
253
- import { frontmatterBlock } from "../../lib/markdown.mjs";
253
+ import { frontmatterBlock } from "#lib/markdown";
254
254
  import { parseFm } from "../../lib/skill-corpus.mjs";
255
255
  import { installedSkills } from "./scripts/consumer.mjs";
256
256
 
@@ -226,7 +226,7 @@
226
226
  *
227
227
  * ⚠️ 2026-08-09: A0 IS TWO TOKENS OFF THE TEXT MEASURED BELOW. The scorecard row ids were
228
228
  * renamed from two-letter codes to words (`Hn` → `claims`) because the two-letter space had
229
- * collided — see `scripts/pipeline-edges.mjs`. The target's description carried one such
229
+ * collided. The target's description carried one such
230
230
  * reference, so "…mandates the Hn claim-preservation diff." became "…mandates the
231
231
  * claims-preservation diff (row `claims`)." A0 is still read from disk and every guard still
232
232
  * passes; the numbers below were measured on the pre-rename bytes and are left as recorded.
@@ -375,7 +375,7 @@ import {
375
375
  realpathSync,
376
376
  } from "node:fs";
377
377
  import { join } from "node:path";
378
- import { frontmatterBlock } from "../../lib/markdown.mjs";
378
+ import { frontmatterBlock } from "#lib/markdown";
379
379
  import { parseFm } from "../../lib/skill-corpus.mjs";
380
380
  import { installedSkills } from "./scripts/consumer.mjs";
381
381
  import { execFileSync } from "node:child_process";
@@ -10,16 +10,14 @@
10
10
  * -> catches a skill renamed or removed while the conductor still
11
11
  * points at the old name. The agent reads a route to nowhere.
12
12
  *
13
- * backward every pipeline-wired skill is named by the conductor
13
+ * backward every skill this package ships is named by the conductor
14
14
  * -> catches the far more common one: a stage skill added and never
15
15
  * wired into the map, so the orchestrated run silently skips it.
16
16
  *
17
- * 🔴 THE BACKWARD DIRECTION IS RED TODAY, WHICH IS WHY IT IS WORTH WRITING.
18
- * Three wired skills are absent from the conductor (see MISSING below). Two are
19
- * genuine stages. They are held in an explicit list rather than asserted away,
20
- * and the list is checked for rot in both directions: an entry naming a skill
21
- * that stopped being wired, or one that HAS since been routed, fails — so the
22
- * debt cannot quietly become permanent.
17
+ * The skills the map does not name are held in an explicit list (NOT_IN_MAP), each
18
+ * with its reason, and the list is checked for rot in both directions: an entry
19
+ * naming a skill that no longer ships, or one the map HAS since named, fails — so
20
+ * an exception cannot quietly outlive its reason.
23
21
  *
24
22
  * ⚠️ COVERAGE NOTE. Before this file, `paper-pipeline` counted as covered because
25
23
  * five older eval files sit in its directory — and every one of them measures
@@ -37,13 +35,8 @@ const HERE = dirname(fileURLToPath(import.meta.url));
37
35
  const SKILLS_DIR = join(HERE, "..");
38
36
  const SELF = "paper-pipeline";
39
37
 
40
- /** Same contract `skill-checks.mjs` derives membership from: a skill announces ITSELF. */
41
- const PIPELINE_MARKER =
42
- /^\s*node\s+\.claude\/skills\/paper-pipeline\/scripts\/announce\.mjs\s+([a-z0-9-]+)/m;
43
-
44
38
  const dirs = installedSkills(SKILLS_DIR);
45
39
  const read = (d) => readFileSync(join(SKILLS_DIR, d, "SKILL.md"), "utf-8");
46
- const wired = dirs.filter((d) => PIPELINE_MARKER.test(read(d)));
47
40
 
48
41
  const src = read(SELF);
49
42
 
@@ -82,62 +75,54 @@ for (const name of new Set(asserted)) {
82
75
  recordCheck();
83
76
  }
84
77
 
85
- // ── backward: every wired stage skill is named somewhere in the map ──
86
- /**
87
- * Wired skills the conductor does NOT name, each with why it is tolerated TODAY.
88
- * Dated, because an undated allowance is indistinguishable from an oversight —
89
- * the same argument `skill-checks.mjs` makes about its own EXCLUDED map.
90
- */
91
- const MISSING = new Map([
78
+ // ── backward: every shipped skill is named somewhere in the map ──
79
+ /** Shipped skills the conductor does NOT name, each with why. */
80
+ const NOT_IN_MAP = new Map([
92
81
  [
93
82
  "cold-read-diff",
94
- "2026-08-11 — absent from the MAP but NOT unreachable: it is in EXPECTED_GATES and `grade-paper-writing` routes to it, so a run gets there. Belongs in the map for discoverability; not added here because the pipeline is being reworked in parallel",
83
+ "reached through `grade-paper-writing`, which routes to it; missing only from the map",
95
84
  ],
96
85
  [
97
86
  "sweep-design-space",
98
- "2026-08-11 — same shape: in EXPECTED_GATES, reached via `argument-arc`, missing only from the map. Deferred to the rework",
87
+ "reached through `argument-arc`; missing only from the map",
99
88
  ],
100
89
  [
101
90
  "paper-status",
102
91
  "reports ON the pipeline rather than being a stage in it — the conductor has nothing to route to it",
103
92
  ],
93
+ [
94
+ "osf-artifact-upload",
95
+ "a helper that uploads an artifact file, not a stage of writing a paper",
96
+ ],
104
97
  ]);
105
98
 
106
- for (const name of wired) {
99
+ for (const name of dirs) {
107
100
  if (name === SELF) continue;
108
- if (MISSING.has(name)) continue;
101
+ if (NOT_IN_MAP.has(name)) continue;
109
102
  assert.ok(
110
103
  routed.has(name),
111
- `${name} is a wired pipeline skill and paper-pipeline never names it. Whether that STRANDS ` +
112
- `it depends on whether a sibling routes to it — check before calling it unreachable ` +
113
- `(measured 2026-08-11: both known-absent skills WERE reachable via a sibling, and the ` +
114
- `first version of this message claimed otherwise). What it always costs is discoverability: ` +
115
- `a reader of the map does not learn the stage exists.`,
104
+ `${name} ships with this package and paper-pipeline never names it. A reader of the map ` +
105
+ `does not learn the stage exists; name it in the map, or add it to NOT_IN_MAP with a reason.`,
116
106
  );
117
107
  recordCheck();
118
108
  }
119
109
 
120
- // ── the allowance list must not rot, in BOTH directions ──
121
- for (const [name, reason] of MISSING) {
110
+ // ── the exception list must not rot, in BOTH directions ──
111
+ for (const [name, reason] of NOT_IN_MAP) {
122
112
  assert.ok(
123
113
  dirs.includes(name),
124
- `MISSING names "${name}" and no such skill exists — delete the entry. Recorded reason: "${reason}"`,
125
- );
126
- assert.ok(
127
- wired.includes(name),
128
- `MISSING names "${name}", which is no longer a wired pipeline skill, so the allowance covers ` +
129
- `nothing. Recorded reason: "${reason}"`,
114
+ `NOT_IN_MAP names "${name}" and no such skill ships — delete the entry. Recorded reason: "${reason}"`,
130
115
  );
131
116
  assert.ok(
132
117
  !routed.has(name),
133
- `MISSING still names "${name}", but paper-pipeline DOES name it now — the debt was paid and the ` +
134
- `entry is stale. Delete it, so the assertion above starts protecting this skill.`,
118
+ `NOT_IN_MAP still names "${name}", but paper-pipeline DOES name it now — delete the entry, ` +
119
+ `so the assertion above starts protecting this skill.`,
135
120
  );
136
121
  recordCheck();
137
122
  }
138
123
 
139
124
  console.log(
140
125
  `✓ paper-pipeline routing: ${String(new Set(asserted).size)} routes resolve · ` +
141
- `${String(wired.length - MISSING.size - 1)} wired skills reachable · ` +
142
- `${String(MISSING.size)} known-absent (${[...MISSING.keys()].join(", ")})`,
126
+ `${String(dirs.length - NOT_IN_MAP.size - 1)} skills named · ` +
127
+ `${String(NOT_IN_MAP.size)} not in the map (${[...NOT_IN_MAP.keys()].join(", ")})`,
143
128
  );
@@ -180,7 +180,7 @@ import {
180
180
  import { paid_measureTriggerRate as measureTriggerRate } from "vigiles/eval";
181
181
  import { existsSync, readFileSync } from "node:fs";
182
182
  import { join } from "node:path";
183
- import { frontmatterBlock } from "../../lib/markdown.mjs";
183
+ import { frontmatterBlock } from "#lib/markdown";
184
184
  import { parseFm } from "../../lib/skill-corpus.mjs";
185
185
  import { installedSkills } from "./scripts/consumer.mjs";
186
186