paperlint 3.2.0 → 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 (312) hide show
  1. package/CLAUDE.md +2 -2
  2. package/dist/adapters/banal/failure.d.ts +1 -7
  3. package/dist/adapters/banal/failure.d.ts.map +1 -1
  4. package/dist/adapters/banal/failure.js +5 -7
  5. package/dist/adapters/banal/failure.js.map +1 -1
  6. package/dist/adapters/banal/index.d.ts.map +1 -1
  7. package/dist/adapters/banal/index.js +8 -11
  8. package/dist/adapters/banal/index.js.map +1 -1
  9. package/dist/adapters/banal/install.d.ts.map +1 -1
  10. package/dist/adapters/banal/install.js +4 -3
  11. package/dist/adapters/banal/install.js.map +1 -1
  12. package/dist/adapters/banal/invocation.d.ts +9 -4
  13. package/dist/adapters/banal/invocation.d.ts.map +1 -1
  14. package/dist/adapters/banal/invocation.js +13 -1
  15. package/dist/adapters/banal/invocation.js.map +1 -1
  16. package/dist/adapters/banal/locate.d.ts +12 -9
  17. package/dist/adapters/banal/locate.d.ts.map +1 -1
  18. package/dist/adapters/banal/locate.js +19 -12
  19. package/dist/adapters/banal/locate.js.map +1 -1
  20. package/dist/adapters/banal/run.d.ts +10 -1
  21. package/dist/adapters/banal/run.d.ts.map +1 -1
  22. package/dist/adapters/banal/run.js +8 -4
  23. package/dist/adapters/banal/run.js.map +1 -1
  24. package/dist/adapters/banal/settings.d.ts +1 -1
  25. package/dist/adapters/banal/settings.d.ts.map +1 -1
  26. package/dist/adapters/banal/settings.js +2 -1
  27. package/dist/adapters/banal/settings.js.map +1 -1
  28. package/dist/adapters/memory/index.d.ts.map +1 -1
  29. package/dist/adapters/memory/index.js +8 -2
  30. package/dist/adapters/memory/index.js.map +1 -1
  31. package/dist/adapters/node/process.io.d.ts +6 -3
  32. package/dist/adapters/node/process.io.d.ts.map +1 -1
  33. package/dist/adapters/node/process.io.js.map +1 -1
  34. package/dist/adapters/node/workspace.io.d.ts.map +1 -1
  35. package/dist/adapters/node/workspace.io.js +4 -2
  36. package/dist/adapters/node/workspace.io.js.map +1 -1
  37. package/dist/adapters/references/index.d.ts.map +1 -1
  38. package/dist/adapters/references/index.js +4 -2
  39. package/dist/adapters/references/index.js.map +1 -1
  40. package/dist/build-engine.d.ts +1 -1
  41. package/dist/build-engine.d.ts.map +1 -1
  42. package/dist/build-engine.js +8 -1
  43. package/dist/build-engine.js.map +1 -1
  44. package/dist/build.d.ts +2 -3
  45. package/dist/build.d.ts.map +1 -1
  46. package/dist/build.js +5 -6
  47. package/dist/build.js.map +1 -1
  48. package/dist/caller-path.d.ts +3 -0
  49. package/dist/caller-path.d.ts.map +1 -0
  50. package/dist/caller-path.js +13 -0
  51. package/dist/caller-path.js.map +1 -0
  52. package/dist/cli.d.ts +10 -17
  53. package/dist/cli.d.ts.map +1 -1
  54. package/dist/cli.js +62 -12
  55. package/dist/cli.js.map +1 -1
  56. package/dist/doctor.d.ts +12 -3
  57. package/dist/doctor.d.ts.map +1 -1
  58. package/dist/doctor.js +2 -1
  59. package/dist/doctor.js.map +1 -1
  60. package/dist/domain/paths.d.ts +8 -2
  61. package/dist/domain/paths.d.ts.map +1 -1
  62. package/dist/domain/paths.js +12 -1
  63. package/dist/domain/paths.js.map +1 -1
  64. package/dist/domain/ready.d.ts +24 -0
  65. package/dist/domain/ready.d.ts.map +1 -0
  66. package/dist/domain/ready.js +11 -0
  67. package/dist/domain/ready.js.map +1 -0
  68. package/dist/domain/record.d.ts +8 -0
  69. package/dist/domain/record.d.ts.map +1 -0
  70. package/dist/domain/record.js +8 -0
  71. package/dist/domain/record.js.map +1 -0
  72. package/dist/domain/sha256.d.ts.map +1 -1
  73. package/dist/domain/sha256.js +4 -2
  74. package/dist/domain/sha256.js.map +1 -1
  75. package/dist/engine.d.ts +23 -22
  76. package/dist/engine.d.ts.map +1 -1
  77. package/dist/engine.js.map +1 -1
  78. package/dist/eslint-rules/bib-reachable-entry.d.ts +1 -1
  79. package/dist/eslint-rules/bib-reachable-entry.js.map +1 -1
  80. package/dist/eslint-rules/install-path-literals.d.ts +2 -2
  81. package/dist/eslint-rules/install-path-literals.js.map +1 -1
  82. package/dist/eslint-rules/paper-research-question.d.ts +1 -1
  83. package/dist/eslint-rules/paper-research-question.js.map +1 -1
  84. package/dist/eslint-rules/paper-stages.d.ts +2 -2
  85. package/dist/eslint-rules/paper-stages.js.map +1 -1
  86. package/dist/eslint-rules/paper-typography.d.ts +6 -6
  87. package/dist/eslint-rules/paper-typography.js.map +1 -1
  88. package/dist/eslint-rules/pdf-last-page-balance.d.ts +1 -1
  89. package/dist/eslint-rules/pdf-last-page-balance.js.map +1 -1
  90. package/dist/eslint-rules/review-frontmatter.d.ts +2 -2
  91. package/dist/eslint-rules/review-frontmatter.js.map +1 -1
  92. package/dist/eslint-rules/sibling-frontmatter.d.ts +1 -1
  93. package/dist/eslint-rules/sibling-frontmatter.d.ts.map +1 -1
  94. package/dist/eslint-rules/temp-root-realpath.d.ts +1 -1
  95. package/dist/eslint-rules/temp-root-realpath.js.map +1 -1
  96. package/dist/eslint-rules/tex-build.d.ts +2 -2
  97. package/dist/eslint-rules/tex-build.js.map +1 -1
  98. package/dist/facts-file.d.ts.map +1 -1
  99. package/dist/facts-file.js +29 -26
  100. package/dist/facts-file.js.map +1 -1
  101. package/dist/hooks-settings.d.ts.map +1 -1
  102. package/dist/hooks-settings.js +17 -2
  103. package/dist/hooks-settings.js.map +1 -1
  104. package/dist/init.d.ts +3 -4
  105. package/dist/init.d.ts.map +1 -1
  106. package/dist/init.js +18 -8
  107. package/dist/init.js.map +1 -1
  108. package/dist/lib/paper-config.d.ts.map +1 -1
  109. package/dist/lib/paper-config.js +1 -5
  110. package/dist/lib/paper-config.js.map +1 -1
  111. package/dist/new-paper.d.ts.map +1 -1
  112. package/dist/new-paper.js +5 -1
  113. package/dist/new-paper.js.map +1 -1
  114. package/dist/paper-files.d.ts +4 -4
  115. package/dist/paper-files.d.ts.map +1 -1
  116. package/dist/paper-files.js +6 -6
  117. package/dist/paper-files.js.map +1 -1
  118. package/dist/paper-settings.js +3 -3
  119. package/dist/paper-settings.js.map +1 -1
  120. package/dist/pdf-facts.d.ts +51 -1
  121. package/dist/pdf-facts.d.ts.map +1 -1
  122. package/dist/pdf-facts.js +23 -15
  123. package/dist/pdf-facts.js.map +1 -1
  124. package/dist/pdf-geometry.d.ts.map +1 -1
  125. package/dist/pdf-geometry.js +2 -3
  126. package/dist/pdf-geometry.js.map +1 -1
  127. package/dist/ports/tool-installer.d.ts +2 -14
  128. package/dist/ports/tool-installer.d.ts.map +1 -1
  129. package/dist/presets.d.ts.map +1 -1
  130. package/dist/presets.js +16 -4
  131. package/dist/presets.js.map +1 -1
  132. package/dist/references.d.ts.map +1 -1
  133. package/dist/references.js +4 -4
  134. package/dist/references.js.map +1 -1
  135. package/dist/rules-config.d.ts +26 -1
  136. package/dist/rules-config.d.ts.map +1 -1
  137. package/dist/rules-config.js +9 -9
  138. package/dist/rules-config.js.map +1 -1
  139. package/dist/tex-requirements.d.ts +4 -0
  140. package/dist/tex-requirements.d.ts.map +1 -1
  141. package/dist/tex-requirements.js +14 -2
  142. package/dist/tex-requirements.js.map +1 -1
  143. package/dist/types.d.ts +5 -3
  144. package/dist/types.d.ts.map +1 -1
  145. package/dist/venue-rules.d.ts.map +1 -1
  146. package/dist/venue-rules.js +20 -7
  147. package/dist/venue-rules.js.map +1 -1
  148. package/docs/configuration.md +2 -2
  149. package/eslint-rules/bib-reachable-entry.ts +1 -1
  150. package/eslint-rules/install-path-literals.ts +2 -2
  151. package/eslint-rules/paper-research-question.ts +1 -1
  152. package/eslint-rules/paper-stages.ts +2 -2
  153. package/eslint-rules/paper-typography.ts +2 -2
  154. package/eslint-rules/pdf-last-page-balance.ts +1 -1
  155. package/eslint-rules/review-frontmatter.ts +1 -1
  156. package/eslint-rules/temp-root-realpath.ts +1 -1
  157. package/eslint-rules/tex-build.ts +2 -2
  158. package/eslint.config.mjs +7 -0
  159. package/fixtures/install-path-literals/clean.fixture.mjs +1 -1
  160. package/fixtures/install-path-literals/clean.md +2 -2
  161. package/fixtures/install-path-literals/defect.fixture.mjs +1 -1
  162. package/fixtures/install-path-literals/defect.md +2 -2
  163. package/hooks/paper-status-gates.sh +9 -19
  164. package/lib/paper-config.harness.mjs +1 -1
  165. package/lib/paper-config.ts +1 -5
  166. package/lib/skill-checks.mjs +24 -381
  167. package/lib/skill-checks.test.mjs +63 -115
  168. package/lib/skill-corpus.mjs +10 -251
  169. package/lib/skill-corpus.test.mjs +2 -13
  170. package/lib/skill-trigger-cases.mjs +1 -1
  171. package/package.json +1 -1
  172. package/scripts/coverage-config.test.ts +0 -1
  173. package/scripts/harness-api.frozen.json +0 -1
  174. package/skills/analyze-sibling-paper/SKILL.md +1 -39
  175. package/skills/analyze-sibling-paper/SKILL.md.spec.ts +0 -38
  176. package/skills/argument-arc/SKILL.md +2 -36
  177. package/skills/argument-arc/SKILL.md.spec.ts +1 -43
  178. package/skills/build-benchmark/SKILL.md +1 -41
  179. package/skills/build-benchmark/SKILL.md.spec.ts +0 -40
  180. package/skills/camera-ready/SKILL.md +1 -34
  181. package/skills/camera-ready/SKILL.md.spec.ts +0 -33
  182. package/skills/cold-read-diff/SKILL.md +1 -35
  183. package/skills/cold-read-diff/SKILL.md.spec.ts +0 -34
  184. package/skills/draft-paper/SKILL.md +2 -41
  185. package/skills/draft-paper/SKILL.md.spec.ts +1 -50
  186. package/skills/extend-paper/SKILL.md +2 -33
  187. package/skills/extend-paper/SKILL.md.spec.ts +1 -42
  188. package/skills/find-venue/SKILL.md +2 -38
  189. package/skills/find-venue/SKILL.md.spec.ts +1 -47
  190. package/skills/grade-paper-writing/SKILL.md +3 -38
  191. package/skills/grade-paper-writing/SKILL.md.spec.ts +2 -47
  192. package/skills/grade-paper-writing/prose-lint.mjs +2 -3
  193. package/skills/grade-paper-writing/prose-lint.test.ts +1 -1
  194. package/skills/harden-paper/SKILL.md +1 -39
  195. package/skills/harden-paper/SKILL.md.spec.ts +0 -38
  196. package/skills/map-prior-work/SKILL.md +1 -35
  197. package/skills/map-prior-work/SKILL.md.spec.ts +0 -34
  198. package/skills/osf-artifact-upload/osf-artifact-upload.harness.ts +3 -4
  199. package/skills/paper-adversarial-review/SKILL.md +2 -35
  200. package/skills/paper-adversarial-review/SKILL.md.spec.ts +1 -43
  201. package/skills/paper-pipeline/SKILL.md +2 -28
  202. package/skills/paper-pipeline/SKILL.md.spec.ts +1 -27
  203. package/skills/paper-pipeline/grade-paper-writing-ablation.eval.mjs +1 -1
  204. package/skills/paper-pipeline/paper-pipeline.harness.mjs +25 -40
  205. package/skills/paper-pipeline/references/acceptance-gate.md +1 -6
  206. package/skills/paper-pipeline/references/pipeline-status-template.md +8 -35
  207. package/skills/paper-pipeline/scripts/README.md +30 -225
  208. package/skills/paper-pipeline/scripts/artifact-coverage.harness.mjs +4 -8
  209. package/skills/paper-pipeline/scripts/consumer.harness.mjs +6 -104
  210. package/skills/paper-pipeline/scripts/consumer.mjs +23 -104
  211. package/skills/paper-pipeline/scripts/generated-code.harness.mjs +2 -3
  212. package/skills/paper-pipeline/scripts/population-map.harness.mjs +3 -3
  213. package/skills/paper-status/SKILL.md +2 -42
  214. package/skills/paper-status/SKILL.md.spec.ts +1 -41
  215. package/skills/pc-panel-review/SKILL.md +2 -46
  216. package/skills/pc-panel-review/SKILL.md.spec.ts +1 -45
  217. package/skills/plan-paper-timeline/SKILL.md +2 -36
  218. package/skills/plan-paper-timeline/SKILL.md.spec.ts +0 -36
  219. package/skills/render-paper/SKILL.md +1 -37
  220. package/skills/render-paper/SKILL.md.spec.ts +0 -36
  221. package/skills/research-ideate/SKILL.md +2 -39
  222. package/skills/research-ideate/SKILL.md.spec.ts +1 -47
  223. package/skills/study-accepted-papers/SKILL.md +1 -34
  224. package/skills/study-accepted-papers/SKILL.md.spec.ts +0 -33
  225. package/skills/submit-paper/SKILL.md +1 -33
  226. package/skills/submit-paper/SKILL.md.spec.ts +0 -32
  227. package/skills/sweep-design-space/SKILL.md +1 -38
  228. package/skills/sweep-design-space/SKILL.md.spec.ts +0 -37
  229. package/skills/tighten-paper/SKILL.md +2 -39
  230. package/skills/tighten-paper/SKILL.md.spec.ts +1 -47
  231. package/skills/tighten-paper/structure.mjs +4 -11
  232. package/skills/verify-citations/SKILL.md +2 -38
  233. package/skills/verify-citations/SKILL.md.spec.ts +1 -37
  234. package/src/adapters/banal/failure.ts +9 -10
  235. package/src/adapters/banal/index.test.ts +2 -2
  236. package/src/adapters/banal/index.ts +8 -10
  237. package/src/adapters/banal/install.ts +9 -4
  238. package/src/adapters/banal/invocation.test.ts +20 -8
  239. package/src/adapters/banal/invocation.ts +23 -8
  240. package/src/adapters/banal/locate.test.ts +2 -2
  241. package/src/adapters/banal/locate.ts +27 -21
  242. package/src/adapters/banal/run.test.ts +2 -2
  243. package/src/adapters/banal/run.ts +16 -10
  244. package/src/adapters/banal/settings.ts +2 -2
  245. package/src/adapters/curl/download.test.ts +4 -4
  246. package/src/adapters/memory/index.ts +4 -3
  247. package/src/adapters/node/files.test.ts +5 -3
  248. package/src/adapters/node/process.io.ts +9 -2
  249. package/src/adapters/node/process.test.ts +4 -4
  250. package/src/adapters/node/workspace.io.ts +9 -4
  251. package/src/adapters/references/index.ts +7 -2
  252. package/src/build-engine.test.ts +11 -6
  253. package/src/build-engine.ts +10 -5
  254. package/src/build.test.ts +10 -11
  255. package/src/build.ts +8 -9
  256. package/src/caller-path.ts +13 -0
  257. package/src/cli.harness.mjs +0 -2
  258. package/src/cli.test.ts +19 -8
  259. package/src/cli.ts +82 -25
  260. package/src/doctor.test.ts +1 -1
  261. package/src/doctor.ts +14 -5
  262. package/src/domain/paths.test.ts +15 -0
  263. package/src/domain/paths.ts +20 -1
  264. package/src/domain/ready.ts +31 -0
  265. package/src/domain/record.test.ts +20 -0
  266. package/src/domain/record.ts +12 -0
  267. package/src/domain/sha256.ts +5 -3
  268. package/src/engine.ts +30 -2
  269. package/src/facts-file.ts +43 -28
  270. package/src/hooks-settings.harness.ts +17 -0
  271. package/src/hooks-settings.ts +28 -4
  272. package/src/init.test.ts +25 -5
  273. package/src/init.ts +26 -12
  274. package/src/new-paper.harness.mjs +7 -23
  275. package/src/new-paper.ts +7 -3
  276. package/src/paper-files.test.ts +22 -19
  277. package/src/paper-files.ts +16 -27
  278. package/src/paper-settings.test.ts +2 -2
  279. package/src/paper-settings.ts +5 -5
  280. package/src/pdf-facts.test.ts +16 -5
  281. package/src/pdf-facts.ts +79 -22
  282. package/src/pdf-geometry.ts +5 -3
  283. package/src/ports/tool-installer.ts +2 -17
  284. package/src/presets.ts +28 -14
  285. package/src/references.test.ts +25 -19
  286. package/src/references.ts +4 -5
  287. package/src/rules-config.ts +40 -11
  288. package/src/tex-requirements.test.ts +21 -0
  289. package/src/tex-requirements.ts +29 -6
  290. package/src/toolchain.test.ts +9 -5
  291. package/src/toolchain.ts +2 -2
  292. package/src/types.ts +5 -3
  293. package/src/venue-rules.test.ts +8 -4
  294. package/src/venue-rules.ts +21 -11
  295. package/skills/paper-pipeline/scripts/announce.mjs +0 -67
  296. package/skills/paper-pipeline/scripts/announce.test.mjs +0 -102
  297. package/skills/paper-pipeline/scripts/fixtures/clean/PIPELINE-STATUS.md +0 -51
  298. package/skills/paper-pipeline/scripts/fixtures/dirty/PIPELINE-STATUS.md +0 -52
  299. package/skills/paper-pipeline/scripts/fixtures/dirty/paper.md +0 -6
  300. package/skills/paper-pipeline/scripts/fixtures/scorecard.ts +0 -100
  301. package/skills/paper-pipeline/scripts/ledger.cli.test.mjs +0 -302
  302. package/skills/paper-pipeline/scripts/ledger.mjs +0 -623
  303. package/skills/paper-pipeline/scripts/ledger.test.mjs +0 -254
  304. package/skills/paper-pipeline/scripts/pipeline-check.cli.test.mjs +0 -474
  305. package/skills/paper-pipeline/scripts/pipeline-check.harness.mjs +0 -328
  306. package/skills/paper-pipeline/scripts/pipeline-check.mjs +0 -750
  307. package/skills/paper-pipeline/scripts/pipeline-edges.mjs +0 -169
  308. package/skills/paper-pipeline/scripts/pipeline-edges.test.mjs +0 -73
  309. package/skills/paper-pipeline/scripts/run-mechanical.mjs +0 -648
  310. package/skills/paper-pipeline/scripts/run-mechanical.test.mjs +0 -468
  311. package/skills/paper-pipeline/scripts/status.mjs +0 -295
  312. package/skills/paper-pipeline/scripts/status.test.mjs +0 -232
@@ -1,24 +1,13 @@
1
1
  ---
2
2
  name: extend-paper
3
3
  description: Turn an accepted workshop / short paper into a second, stronger publication at a higher-prestige indexed venue — the "body of work" a strong dossier needs, not a one-hit paper. Covers the ≥30% new-material rule, the never-dual-submit rule, what genuinely counts as new content, and picking + timelining the upgrade venue. Use after a paper is accepted and you want the follow-on publication. Compose with find-venue, plan-paper-timeline, camera-ready, research-ideate.
4
- allowed-tools: [Read, Write, Grep, Glob, WebSearch, WebFetch, 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, WebSearch, WebFetch, Skill]
5
5
  ---
6
6
 
7
- <!-- vigiles:sha256:436bb3586d84a654 compiled from skills/extend-paper/SKILL.md.spec.ts -->
7
+ <!-- vigiles:sha256:6310b1e7748e10de compiled from skills/extend-paper/SKILL.md.spec.ts -->
8
8
 
9
9
  # extend-paper — workshop/short paper → a second, stronger publication
10
10
 
11
- ## Run me
12
-
13
- 🔴 FIRST, before any other step:
14
-
15
- ```
16
- node .claude/skills/paper-pipeline/scripts/announce.mjs extend-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
  One accepted paper is a data point; two related papers climbing in prestige is a **trajectory**, and
23
12
  "sustained acclaim" is what a body-of-work review actually rewards. Workshop→conference and
24
13
  conference→journal extensions are a standard, expected move — venues invite them. The catch: an
@@ -66,26 +55,6 @@ submissions**. A burst of papers clustered right before an external filing deadl
66
55
  manufactured, not sustained — a documented reason for refusal, not a stylistic worry. Aim the extension to land a few months after the first paper's
67
56
  acceptance so the record shows steady output over time, one ORCID tying every version together.
68
57
 
69
- ## Record the verdict
70
-
71
- 🔴 LAST step, once the deliverable exists:
72
-
73
- ```
74
- node .claude/skills/paper-pipeline/scripts/ledger.mjs record extend-paper <paper-dir> FINDING <count> <report-path>
75
- node .claude/skills/paper-pipeline/scripts/ledger.mjs record extend-paper <paper-dir> ABSTAINED <reason> "<one line>"
76
- ```
77
-
78
- **FINDING** — `<count>` open items before the extension is legitimate; `<report-path>` is the plan.
79
- Add `--blocking` when the ≥30% cannot honestly be pointed at, which sends the work back to
80
- `research-ideate`.
81
- **ABSTAINED** — `no-witness`: a legitimate extension is scoped — ≥30% genuinely new material, one
82
- named venue, no dual submission — and nothing is open. `blocked`: there is no accepted base paper
83
- to extend.
84
-
85
- 🔴 **There is no PASS**, and here that matters more than anywhere: the tempting move at this moment
86
- is to resubmit the same paper with a new title, and a stored "legitimate" would have been exactly
87
- the paperwork for it. The blocking finding is what the pipeline is watching for; nothing else is.
88
-
89
58
  ## Compose with
90
59
  - **find-venue** — choose the higher-prestige indexed target and confirm it welcomes extensions.
91
60
  - **plan-paper-timeline** — schedule the new experiments + write-up against the target deadline.
@@ -10,31 +10,10 @@ export default experimental_skill({
10
10
  name: "extend-paper",
11
11
  description:
12
12
  'Turn an accepted workshop / short paper into a second, stronger publication at a higher-prestige indexed venue — the "body of work" a strong dossier needs, not a one-hit paper. Covers the ≥30% new-material rule, the never-dual-submit rule, what genuinely counts as new content, and picking + timelining the upgrade venue. Use after a paper is accepted and you want the follow-on publication. Compose with find-venue, plan-paper-timeline, camera-ready, research-ideate.',
13
- tools: [
14
- "Read",
15
- "Write",
16
- "Grep",
17
- "Glob",
18
- "WebSearch",
19
- "WebFetch",
20
- "Skill",
21
- "Bash(node .claude/skills/paper-pipeline/scripts/announce.mjs:*)",
22
- "Bash(node .claude/skills/paper-pipeline/scripts/ledger.mjs:*)",
23
- ],
13
+ tools: ["Read", "Write", "Grep", "Glob", "WebSearch", "WebFetch", "Skill"],
24
14
  body: `
25
15
  # extend-paper — workshop/short paper → a second, stronger publication
26
16
 
27
- ## Run me
28
-
29
- 🔴 FIRST, before any other step:
30
-
31
- \`\`\`
32
- node .claude/skills/paper-pipeline/scripts/announce.mjs extend-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
17
  One accepted paper is a data point; two related papers climbing in prestige is a **trajectory**, and
39
18
  "sustained acclaim" is what a body-of-work review actually rewards. Workshop→conference and
40
19
  conference→journal extensions are a standard, expected move — venues invite them. The catch: an
@@ -82,26 +61,6 @@ submissions**. A burst of papers clustered right before an external filing deadl
82
61
  manufactured, not sustained — a documented reason for refusal, not a stylistic worry. Aim the extension to land a few months after the first paper's
83
62
  acceptance so the record shows steady output over time, one ORCID tying every version together.
84
63
 
85
- ## Record the verdict
86
-
87
- 🔴 LAST step, once the deliverable exists:
88
-
89
- \`\`\`
90
- node .claude/skills/paper-pipeline/scripts/ledger.mjs record extend-paper <paper-dir> FINDING <count> <report-path>
91
- node .claude/skills/paper-pipeline/scripts/ledger.mjs record extend-paper <paper-dir> ABSTAINED <reason> "<one line>"
92
- \`\`\`
93
-
94
- **FINDING** — \`<count>\` open items before the extension is legitimate; \`<report-path>\` is the plan.
95
- Add \`--blocking\` when the ≥30% cannot honestly be pointed at, which sends the work back to
96
- \`research-ideate\`.
97
- **ABSTAINED** — \`no-witness\`: a legitimate extension is scoped — ≥30% genuinely new material, one
98
- named venue, no dual submission — and nothing is open. \`blocked\`: there is no accepted base paper
99
- to extend.
100
-
101
- 🔴 **There is no PASS**, and here that matters more than anywhere: the tempting move at this moment
102
- is to resubmit the same paper with a new title, and a stored "legitimate" would have been exactly
103
- the paperwork for it. The blocking finding is what the pipeline is watching for; nothing else is.
104
-
105
64
  ## Compose with
106
65
  - **find-venue** — choose the higher-prestige indexed target and confirm it welcomes extensions.
107
66
  - **plan-paper-timeline** — schedule the new experiments + write-up against the target deadline.
@@ -1,28 +1,13 @@
1
1
  ---
2
2
  name: find-venue
3
3
  description: "Discover and rank real venues for a given paper, scored by authorship credit not just prestige. Fetch candidate CFPs (WebSearch/WebFetch), capture deadline / page limit / paper-type fit / indexing (ACM DL / IEEE Xplore / archival vs non-archival) / double-blind / remote-attendance / selectivity, then rank by credit-weight (peer-reviewed + indexed + parent-venue prestige) × topic fit × accept-probability × deadline feasibility × remote-friendliness. Emit a comparison table and a keep/switch recommendation. Encodes: workshop newness does NOT hurt authorship; non-archival workshops rank LOW; the prestige move is to EXTEND the accepted paper later, not hold out. Compose with research-ideate (upstream), plan-paper-timeline, the submit-paper venue data cards (submit-paper/references/venues/<venue>.md), and extend-paper."
4
- allowed-tools: [Read, Write, Grep, Glob, WebSearch, WebFetch, Agent, 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, WebSearch, WebFetch, Agent]
5
5
  ---
6
6
 
7
- <!-- vigiles:sha256:5efdcc0e1b178c1a compiled from skills/find-venue/SKILL.md.spec.ts -->
7
+ <!-- vigiles:sha256:bfda3e840d81d95d compiled from skills/find-venue/SKILL.md.spec.ts -->
8
8
 
9
9
  # find-venue — rank real venues by what earns the credit, then keep or switch
10
10
 
11
- ## Run me
12
-
13
- 🔴 FIRST, before any other step:
14
-
15
- ```
16
- node .claude/skills/paper-pipeline/scripts/announce.mjs find-venue <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
  Takes a paper (or the candidate venue *types* from `research-ideate`) and finds the best real place to
27
12
  submit it. "Best" here means **best for the publication record**, which is not the same as most prestigious —
28
13
  an indexed workshop you can actually hit beats a top conference whose deadline already closed. This
@@ -82,27 +67,6 @@ rank = credit-weight × topic-fit × accept-probability × deadline-feasibility
82
67
  already has a target) an explicit **keep** or **switch** verdict against it. Note the intended
83
68
  `extend-paper` upgrade target for later.
84
69
 
85
- ## Record the verdict
86
-
87
- 🔴 LAST step, once the deliverable exists:
88
-
89
- ```
90
- node .claude/skills/paper-pipeline/scripts/ledger.mjs record find-venue <dir> FINDING <count> <report-path>
91
- node .claude/skills/paper-pipeline/scripts/ledger.mjs record find-venue <dir> ABSTAINED <reason> "<one line>"
92
- ```
93
-
94
- 🔴 **There is no PASS.** A shortlist is a set of findings about the world, not a certificate that
95
- the venue question is settled.
96
-
97
- **FINDING** — the sweep produced a ranked shortlist with an explicit keep/switch call; `<count>` is
98
- the number of candidates ranked and `<report-path>` the comparison table. Add `--blocking` when
99
- nothing open clears the peer-reviewed + indexed gate — a real answer, and not an empty run.
100
- **ABSTAINED** — `no-witness`: CFPs were read and no candidate could be ranked either way.
101
- `input-missing`: there is no paper description to match venues against.
102
-
103
- Record the whole table's path, not just the winner. The next sweep starts from the candidates that were
104
- dropped and why, and a verdict with no table behind it cannot be re-checked when a deadline moves.
105
-
106
70
  ## Rules
107
71
  - Fetch every CFP fact from the real page; never invent a deadline, page limit, or indexing status.
108
72
  - Indexed + peer-reviewed is a gate, not a tiebreaker — a non-archival venue cannot win on charm.
@@ -10,35 +10,10 @@ export default experimental_skill({
10
10
  name: "find-venue",
11
11
  description:
12
12
  "Discover and rank real venues for a given paper, scored by authorship credit not just prestige. Fetch candidate CFPs (WebSearch/WebFetch), capture deadline / page limit / paper-type fit / indexing (ACM DL / IEEE Xplore / archival vs non-archival) / double-blind / remote-attendance / selectivity, then rank by credit-weight (peer-reviewed + indexed + parent-venue prestige) × topic fit × accept-probability × deadline feasibility × remote-friendliness. Emit a comparison table and a keep/switch recommendation. Encodes: workshop newness does NOT hurt authorship; non-archival workshops rank LOW; the prestige move is to EXTEND the accepted paper later, not hold out. Compose with research-ideate (upstream), plan-paper-timeline, the submit-paper venue data cards (submit-paper/references/venues/<venue>.md), and extend-paper.",
13
- tools: [
14
- "Read",
15
- "Write",
16
- "Grep",
17
- "Glob",
18
- "WebSearch",
19
- "WebFetch",
20
- "Agent",
21
- "Bash(node .claude/skills/paper-pipeline/scripts/announce.mjs:*)",
22
- "Bash(node .claude/skills/paper-pipeline/scripts/ledger.mjs:*)",
23
- ],
13
+ tools: ["Read", "Write", "Grep", "Glob", "WebSearch", "WebFetch", "Agent"],
24
14
  body: `
25
15
  # find-venue — rank real venues by what earns the credit, then keep or switch
26
16
 
27
- ## Run me
28
-
29
- 🔴 FIRST, before any other step:
30
-
31
- \`\`\`
32
- node .claude/skills/paper-pipeline/scripts/announce.mjs find-venue <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
17
  Takes a paper (or the candidate venue *types* from \`research-ideate\`) and finds the best real place to
43
18
  submit it. "Best" here means **best for the publication record**, which is not the same as most prestigious —
44
19
  an indexed workshop you can actually hit beats a top conference whose deadline already closed. This
@@ -98,27 +73,6 @@ rank = credit-weight × topic-fit × accept-probability × deadline-feasibility
98
73
  already has a target) an explicit **keep** or **switch** verdict against it. Note the intended
99
74
  \`extend-paper\` upgrade target for later.
100
75
 
101
- ## Record the verdict
102
-
103
- 🔴 LAST step, once the deliverable exists:
104
-
105
- \`\`\`
106
- node .claude/skills/paper-pipeline/scripts/ledger.mjs record find-venue <dir> FINDING <count> <report-path>
107
- node .claude/skills/paper-pipeline/scripts/ledger.mjs record find-venue <dir> ABSTAINED <reason> "<one line>"
108
- \`\`\`
109
-
110
- 🔴 **There is no PASS.** A shortlist is a set of findings about the world, not a certificate that
111
- the venue question is settled.
112
-
113
- **FINDING** — the sweep produced a ranked shortlist with an explicit keep/switch call; \`<count>\` is
114
- the number of candidates ranked and \`<report-path>\` the comparison table. Add \`--blocking\` when
115
- nothing open clears the peer-reviewed + indexed gate — a real answer, and not an empty run.
116
- **ABSTAINED** — \`no-witness\`: CFPs were read and no candidate could be ranked either way.
117
- \`input-missing\`: there is no paper description to match venues against.
118
-
119
- Record the whole table's path, not just the winner. The next sweep starts from the candidates that were
120
- dropped and why, and a verdict with no table behind it cannot be re-checked when a deadline moves.
121
-
122
76
  ## Rules
123
77
  - Fetch every CFP fact from the real page; never invent a deadline, page limit, or indexing status.
124
78
  - Indexed + peer-reviewed is a gate, not a tiebreaker — a non-archival venue cannot win on charm.
@@ -1,24 +1,13 @@
1
1
  ---
2
2
  name: grade-paper-writing
3
3
  description: Use when asking "does this paper read well?" / "is the writing any good?" / "it reads like a wall of text and jargon" / "grade the writing" on a draft. Grades WRITING CRAFT only — nine dimensions 1–5 (Title, Abstract, Intro architecture, Structure, Prose clarity, Jargon discipline, Landing-the-point, Figure economy, Honesty-without-hedge-stacking) against how the best-written papers read (Peyton Jones, McEnerney, Gopen & Swan; exemplars Trusting Trust, Carlini, Greshake), naming the offending sentence and the fix for each. Runs the PERSONA cold-read stall pass (a committed non-academic persona subagent, per-section) whose stall inventory — not the rubric number — is the readability gate other skills consume (pc-panel-review, paper-adversarial-review, harden-paper). Defaults to a blind multi-grader panel; after fixes, mandates the claims-preservation diff (row `claims`). NOT a content/defect review (paper-adversarial-review / pc-panel-review), NOT a structural cut plan (tighten-paper — run that first on a bloated draft), NOT venue-bar content strength (study-accepted-papers). Compose with harden-paper (which calls it), draft-paper (generative counterpart), render-paper.
4
- allowed-tools: [Read, Write, Edit, 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, Edit, Grep, Glob, Agent, Skill]
5
5
  ---
6
6
 
7
- <!-- vigiles:sha256:c0907d5c98e2c831 compiled from skills/grade-paper-writing/SKILL.md.spec.ts -->
7
+ <!-- vigiles:sha256:c5d998b7471000fc compiled from skills/grade-paper-writing/SKILL.md.spec.ts -->
8
8
 
9
9
  # grade-paper-writing — grade how the paper READS, then fix it sentence by sentence
10
10
 
11
- ## Run me
12
-
13
- 🔴 FIRST, before any other step:
14
-
15
- ```
16
- node .claude/skills/paper-pipeline/scripts/announce.mjs grade-paper-writing <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
  The review skills hunt scientific defects; `study-accepted-papers` checks whether the contribution clears
23
12
  the venue's bar. Neither tells you the paper is a slog to read. This skill does exactly that: it grades
24
13
  the **writing craft** against how the best-written papers actually read, and turns each low score into a
@@ -212,8 +201,7 @@ is what happened.
212
201
  side effect.
213
202
 
214
203
  7. 🔴 **Put `WORST-SECTION: <section>` on the FIRST LINE of the report.** Machine-readable, one
215
- section, lowercase, no decoration. `pipeline-check.mjs` reads the last four reports and raises
216
- `repeat-finding` when the same section is worst twice running. This exists because the abstract
204
+ section, lowercase, no decoration, so the next round can compare it with the last report. This exists because the abstract
217
205
  was named worst **five consecutive times**, was faithfully recorded in the scorecard all five
218
206
  times, and was never once the next task. A review loop that only appends findings converges on a
219
207
  paper whose defects are all thoroughly documented and none of them fixed. **Naming the worst
@@ -274,29 +262,6 @@ findings:
274
262
  ---
275
263
  ```
276
264
 
277
- ## Record the verdict
278
-
279
- 🔴 LAST step, once the deliverable exists:
280
-
281
- ```
282
- node .claude/skills/paper-pipeline/scripts/ledger.mjs record grade-paper-writing <paper-dir> FINDING <count> <report-path>
283
- node .claude/skills/paper-pipeline/scripts/ledger.mjs record grade-paper-writing <paper-dir> ABSTAINED <reason> "<one line>"
284
- ```
285
-
286
- **FINDING** — `<count>` is the number of entries in the PERSONA stall inventory, and `<report-path>`
287
- is that inventory. Add `--blocking` when a dimension scored 1–2, or stall density is over its cap.
288
- **ABSTAINED** — `no-witness`: the inventory came back empty. `blocked`: no persona reader was run,
289
- so there is no inventory — which is not an empty inventory and must never be filed as one.
290
-
291
- 🔴 **There is no PASS**, and the distinction the two abstentions draw is the one that was being
292
- lost: "a reader stalled nowhere" and "nobody read it" produced the same word.
293
-
294
- 🔴 **Record the stall count, never the rubric number.** The inventory is what `pc-panel-review`,
295
- `paper-adversarial-review` and `harden-paper` consume; a 44/60 in the ledger would let a paper whose
296
- readability gate is failing look clean to every skill downstream.
297
-
298
- `prose-lint.mjs` files separately as `grade-paper-writing/prose-lint`. One check, one row.
299
-
300
265
  ## Rules
301
266
  - Grade **writing, not science.** A correct paper can still score a 2 here; say so. Don't drift into
302
267
  content/defect review — that's `paper-adversarial-review` / `pc-panel-review`.
@@ -10,31 +10,10 @@ export default experimental_skill({
10
10
  name: "grade-paper-writing",
11
11
  description:
12
12
  'Use when asking "does this paper read well?" / "is the writing any good?" / "it reads like a wall of text and jargon" / "grade the writing" on a draft. Grades WRITING CRAFT only — nine dimensions 1–5 (Title, Abstract, Intro architecture, Structure, Prose clarity, Jargon discipline, Landing-the-point, Figure economy, Honesty-without-hedge-stacking) against how the best-written papers read (Peyton Jones, McEnerney, Gopen & Swan; exemplars Trusting Trust, Carlini, Greshake), naming the offending sentence and the fix for each. Runs the PERSONA cold-read stall pass (a committed non-academic persona subagent, per-section) whose stall inventory — not the rubric number — is the readability gate other skills consume (pc-panel-review, paper-adversarial-review, harden-paper). Defaults to a blind multi-grader panel; after fixes, mandates the claims-preservation diff (row `claims`). NOT a content/defect review (paper-adversarial-review / pc-panel-review), NOT a structural cut plan (tighten-paper — run that first on a bloated draft), NOT venue-bar content strength (study-accepted-papers). Compose with harden-paper (which calls it), draft-paper (generative counterpart), render-paper.',
13
- tools: [
14
- "Read",
15
- "Write",
16
- "Edit",
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
- ],
13
+ tools: ["Read", "Write", "Edit", "Grep", "Glob", "Agent", "Skill"],
24
14
  body: `
25
15
  # grade-paper-writing — grade how the paper READS, then fix it sentence by sentence
26
16
 
27
- ## Run me
28
-
29
- 🔴 FIRST, before any other step:
30
-
31
- \`\`\`
32
- node .claude/skills/paper-pipeline/scripts/announce.mjs grade-paper-writing <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
17
  The review skills hunt scientific defects; \`study-accepted-papers\` checks whether the contribution clears
39
18
  the venue's bar. Neither tells you the paper is a slog to read. This skill does exactly that: it grades
40
19
  the **writing craft** against how the best-written papers actually read, and turns each low score into a
@@ -228,8 +207,7 @@ is what happened.
228
207
  side effect.
229
208
 
230
209
  7. 🔴 **Put \`WORST-SECTION: <section>\` on the FIRST LINE of the report.** Machine-readable, one
231
- section, lowercase, no decoration. \`pipeline-check.mjs\` reads the last four reports and raises
232
- \`repeat-finding\` when the same section is worst twice running. This exists because the abstract
210
+ section, lowercase, no decoration, so the next round can compare it with the last report. This exists because the abstract
233
211
  was named worst **five consecutive times**, was faithfully recorded in the scorecard all five
234
212
  times, and was never once the next task. A review loop that only appends findings converges on a
235
213
  paper whose defects are all thoroughly documented and none of them fixed. **Naming the worst
@@ -290,29 +268,6 @@ findings:
290
268
  ---
291
269
  \`\`\`
292
270
 
293
- ## Record the verdict
294
-
295
- 🔴 LAST step, once the deliverable exists:
296
-
297
- \`\`\`
298
- node .claude/skills/paper-pipeline/scripts/ledger.mjs record grade-paper-writing <paper-dir> FINDING <count> <report-path>
299
- node .claude/skills/paper-pipeline/scripts/ledger.mjs record grade-paper-writing <paper-dir> ABSTAINED <reason> "<one line>"
300
- \`\`\`
301
-
302
- **FINDING** — \`<count>\` is the number of entries in the PERSONA stall inventory, and \`<report-path>\`
303
- is that inventory. Add \`--blocking\` when a dimension scored 1–2, or stall density is over its cap.
304
- **ABSTAINED** — \`no-witness\`: the inventory came back empty. \`blocked\`: no persona reader was run,
305
- so there is no inventory — which is not an empty inventory and must never be filed as one.
306
-
307
- 🔴 **There is no PASS**, and the distinction the two abstentions draw is the one that was being
308
- lost: "a reader stalled nowhere" and "nobody read it" produced the same word.
309
-
310
- 🔴 **Record the stall count, never the rubric number.** The inventory is what \`pc-panel-review\`,
311
- \`paper-adversarial-review\` and \`harden-paper\` consume; a 44/60 in the ledger would let a paper whose
312
- readability gate is failing look clean to every skill downstream.
313
-
314
- \`prose-lint.mjs\` files separately as \`grade-paper-writing/prose-lint\`. One check, one row.
315
-
316
271
  ## Rules
317
272
  - Grade **writing, not science.** A correct paper can still score a 2 here; say so. Don't drift into
318
273
  content/defect review — that's \`paper-adversarial-review\` / \`pc-panel-review\`.
@@ -692,9 +692,8 @@ for (const f of args.filter((a) => !a.startsWith("--"))) {
692
692
  // `hedge-density`, `discourse-subject`, `undefined-coinage`.
693
693
  if (lines.length) {
694
694
  flagged += lines.length;
695
- // The header STATES the count. run-mechanical.mjs prefers a stated "— N finding(s)" over
696
- // counting output lines, and without it recorded header + findings + footer: one flagged
697
- // caption became three findings in the ledger.
695
+ // The header STATES the count, so a caller need not count output lines — header and footer
696
+ // are not findings.
698
697
  console.error(
699
698
  `✍️ prose-lint — ${f.split("/").pop()} — ${lines.length} finding(s):`,
700
699
  );
@@ -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
  */
@@ -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