paperlint 13.1.0 → 13.3.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 (141) hide show
  1. package/.github/workflows/ci.yml +10 -0
  2. package/CLAUDE.md +9 -1
  3. package/dist/adapters/git/index.d.ts.map +1 -1
  4. package/dist/adapters/git/index.js +13 -0
  5. package/dist/adapters/git/index.js.map +1 -1
  6. package/dist/adapters/study-registry/index.d.ts +142 -1
  7. package/dist/adapters/study-registry/index.d.ts.map +1 -1
  8. package/dist/adapters/study-registry/index.js +160 -1
  9. package/dist/adapters/study-registry/index.js.map +1 -1
  10. package/dist/cli.d.ts.map +1 -1
  11. package/dist/cli.js +3 -0
  12. package/dist/cli.js.map +1 -1
  13. package/dist/doctor.d.ts.map +1 -1
  14. package/dist/doctor.js +2 -2
  15. package/dist/doctor.js.map +1 -1
  16. package/dist/domain/decide-first.d.ts +43 -0
  17. package/dist/domain/decide-first.d.ts.map +1 -1
  18. package/dist/domain/decide-first.js +45 -2
  19. package/dist/domain/decide-first.js.map +1 -1
  20. package/dist/domain/study-gates.d.ts +96 -0
  21. package/dist/domain/study-gates.d.ts.map +1 -0
  22. package/dist/domain/study-gates.js +56 -0
  23. package/dist/domain/study-gates.js.map +1 -0
  24. package/dist/domain/study-mode.d.ts +6 -0
  25. package/dist/domain/study-mode.d.ts.map +1 -1
  26. package/dist/domain/study-mode.js.map +1 -1
  27. package/dist/domain/study-registry.d.ts +24 -4
  28. package/dist/domain/study-registry.d.ts.map +1 -1
  29. package/dist/domain/study-registry.js +39 -2
  30. package/dist/domain/study-registry.js.map +1 -1
  31. package/dist/domain/study-result.d.ts +151 -0
  32. package/dist/domain/study-result.d.ts.map +1 -0
  33. package/dist/domain/study-result.js +175 -0
  34. package/dist/domain/study-result.js.map +1 -0
  35. package/dist/outputs-before-decision-rule.d.ts.map +1 -1
  36. package/dist/outputs-before-decision-rule.js +37 -3
  37. package/dist/outputs-before-decision-rule.js.map +1 -1
  38. package/dist/ports/git-history.d.ts +12 -0
  39. package/dist/ports/git-history.d.ts.map +1 -1
  40. package/dist/ports/study-registry-codec.d.ts +3 -0
  41. package/dist/ports/study-registry-codec.d.ts.map +1 -1
  42. package/dist/skills/assess-novelty/scripts/candidate_page.d.ts +1 -0
  43. package/dist/skills/assess-novelty/scripts/novelty_reader_brief.d.ts +25 -0
  44. package/dist/skills/build-label-page/scripts/label-page-cli.d.ts +6 -0
  45. package/dist/skills/build-label-page/scripts/label-page-commands.d.ts +14 -0
  46. package/dist/skills/build-label-page/scripts/label-page-core.d.ts +149 -0
  47. package/dist/skills/build-label-page/scripts/label-page-html.d.ts +5 -0
  48. package/dist/skills/build-label-page/scripts/label-page.d.ts +2 -0
  49. package/dist/study-modes.d.ts +3 -0
  50. package/dist/study-modes.d.ts.map +1 -1
  51. package/dist/study-modes.js +8 -1
  52. package/dist/study-modes.js.map +1 -1
  53. package/dist/study-registry-rule.d.ts.map +1 -1
  54. package/dist/study-registry-rule.js +1 -0
  55. package/dist/study-registry-rule.js.map +1 -1
  56. package/dist/study-result-rule.d.ts +12 -0
  57. package/dist/study-result-rule.d.ts.map +1 -0
  58. package/dist/study-result-rule.js +87 -0
  59. package/dist/study-result-rule.js.map +1 -0
  60. package/docs/design/study-gates.md +208 -0
  61. package/docs/rules/repro/outputs-before-decision.md +8 -0
  62. package/docs/rules/repro/study-registered.md +38 -15
  63. package/docs/rules/repro/study-result.md +100 -0
  64. package/docs/rules.md +1 -0
  65. package/docs/toolchain.md +1 -1
  66. package/eslint.config.mjs +52 -0
  67. package/package.json +3 -1
  68. package/presets/agentverify.md +15 -4
  69. package/schemas/plan.v2.schema.json +341 -0
  70. package/skills/assess-novelty/scripts/candidate_page.css +31 -0
  71. package/skills/assess-novelty/scripts/candidate_page.html +934 -0
  72. package/skills/assess-novelty/scripts/candidate_page.js +165 -0
  73. package/skills/assess-novelty/scripts/candidate_page.test.ts +401 -0
  74. package/skills/assess-novelty/scripts/candidate_page.ts +194 -0
  75. package/skills/assess-novelty/scripts/check_novelty.py +230 -0
  76. package/skills/assess-novelty/scripts/check_novelty.test.ts +490 -0
  77. package/skills/assess-novelty/scripts/check_novelty_coverage.test.ts +176 -0
  78. package/skills/assess-novelty/scripts/crop_quote.py +104 -0
  79. package/skills/assess-novelty/scripts/crop_quote.test.ts +130 -0
  80. package/skills/assess-novelty/scripts/fixtures/crop-quote/make_sample.py +42 -0
  81. package/skills/assess-novelty/scripts/fixtures/crop-quote/sample.pdf +106 -0
  82. package/skills/assess-novelty/scripts/fixtures/novelty/CLAIMS.md +11 -0
  83. package/skills/assess-novelty/scripts/fixtures/novelty/paper.tex +10 -0
  84. package/skills/assess-novelty/scripts/fixtures/novelty/siblings/2026-10-27-novelty-refutation.md +8 -0
  85. package/skills/assess-novelty/scripts/fixtures/novelty/siblings/data/doe-preprint.txt +63 -0
  86. package/skills/assess-novelty/scripts/fixtures/novelty/siblings/novelty.json +54 -0
  87. package/skills/assess-novelty/scripts/novelty_candidates.py +136 -0
  88. package/skills/assess-novelty/scripts/novelty_candidates.test.ts +222 -0
  89. package/skills/assess-novelty/scripts/novelty_cells.py +88 -0
  90. package/skills/assess-novelty/scripts/novelty_cells.test.ts +159 -0
  91. package/skills/assess-novelty/scripts/novelty_coverage.py +55 -0
  92. package/skills/assess-novelty/scripts/novelty_reader_brief.js +165 -0
  93. package/skills/assess-novelty/scripts/novelty_reader_brief.test.ts +251 -0
  94. package/skills/assess-novelty/scripts/novelty_reader_brief.ts +215 -0
  95. package/skills/assess-novelty/scripts/quote_match.py +34 -0
  96. package/skills/assess-novelty/scripts/script_edges.test.ts +174 -0
  97. package/skills/build-label-page/SKILL.md +85 -54
  98. package/skills/build-label-page/SKILL.md.spec.ts +85 -53
  99. package/skills/build-label-page/build-label-page.test.ts +10 -941
  100. package/skills/build-label-page/references/checklist.md +45 -3
  101. package/skills/build-label-page/references/closed-choice-generator.md +88 -0
  102. package/skills/build-label-page/scripts/label-page-cli.js +72 -0
  103. package/skills/build-label-page/scripts/label-page-cli.ts +85 -0
  104. package/skills/build-label-page/scripts/label-page-commands.js +14 -0
  105. package/skills/build-label-page/scripts/label-page-commands.ts +14 -0
  106. package/skills/build-label-page/scripts/label-page-core.js +850 -0
  107. package/skills/build-label-page/scripts/label-page-core.test.ts +1164 -0
  108. package/skills/build-label-page/scripts/label-page-core.ts +1210 -0
  109. package/skills/build-label-page/scripts/label-page-html.js +33 -0
  110. package/skills/build-label-page/scripts/label-page-html.test.ts +413 -0
  111. package/skills/build-label-page/scripts/label-page-html.ts +43 -0
  112. package/skills/build-label-page/scripts/label-page.js +70 -0
  113. package/skills/build-label-page/scripts/label-page.test.ts +71 -0
  114. package/skills/build-label-page/scripts/label-page.ts +71 -0
  115. package/skills/build-label-page/scripts/page-template.html +513 -0
  116. package/src/adapters/git/index.test.ts +33 -0
  117. package/src/adapters/git/index.ts +19 -0
  118. package/src/adapters/study-registry/gates.test.ts +181 -0
  119. package/src/adapters/study-registry/index.ts +219 -1
  120. package/src/adapters/study-registry/mode.test.ts +6 -0
  121. package/src/cli.ts +3 -0
  122. package/src/doctor.ts +4 -2
  123. package/src/domain/decide-first.test.ts +131 -0
  124. package/src/domain/decide-first.ts +92 -2
  125. package/src/domain/study-gates.ts +125 -0
  126. package/src/domain/study-measurements.test.ts +71 -0
  127. package/src/domain/study-mode.ts +6 -0
  128. package/src/domain/study-registry.ts +64 -2
  129. package/src/domain/study-result.test.ts +300 -0
  130. package/src/domain/study-result.ts +358 -0
  131. package/src/outputs-before-decision-rule.test.ts +115 -2
  132. package/src/outputs-before-decision-rule.ts +50 -2
  133. package/src/ports/git-history.ts +12 -0
  134. package/src/ports/study-registry-codec.ts +3 -0
  135. package/src/rule-cases.test.ts +74 -0
  136. package/src/studies.test.ts +3 -0
  137. package/src/study-modes.ts +10 -1
  138. package/src/study-registry-rule.ts +1 -0
  139. package/src/study-result-rule.test.ts +281 -0
  140. package/src/study-result-rule.ts +123 -0
  141. package/skills/build-label-page/references/example-generator.py +0 -803
@@ -0,0 +1,341 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "type": "object",
4
+ "properties": {
5
+ "question": {
6
+ "type": "string"
7
+ },
8
+ "population": {
9
+ "type": "object",
10
+ "properties": {
11
+ "source": {
12
+ "type": "string"
13
+ },
14
+ "draw": {
15
+ "oneOf": [
16
+ {
17
+ "type": "object",
18
+ "properties": {
19
+ "kind": {
20
+ "type": "string",
21
+ "const": "seeded"
22
+ },
23
+ "method": {
24
+ "type": "string"
25
+ },
26
+ "seed": {
27
+ "type": ["string", "number"]
28
+ }
29
+ },
30
+ "required": ["kind", "method", "seed"],
31
+ "additionalProperties": false
32
+ },
33
+ {
34
+ "type": "object",
35
+ "properties": {
36
+ "kind": {
37
+ "type": "string",
38
+ "const": "all"
39
+ },
40
+ "method": {
41
+ "type": "string"
42
+ }
43
+ },
44
+ "required": ["kind", "method"],
45
+ "additionalProperties": false
46
+ }
47
+ ]
48
+ }
49
+ },
50
+ "required": ["source", "draw"],
51
+ "additionalProperties": false
52
+ },
53
+ "arms": {
54
+ "type": "array",
55
+ "items": {
56
+ "type": "object",
57
+ "properties": {
58
+ "name": {
59
+ "type": "string",
60
+ "minLength": 1
61
+ }
62
+ },
63
+ "required": ["name"],
64
+ "additionalProperties": false
65
+ }
66
+ },
67
+ "primary_outcome": {
68
+ "type": "string"
69
+ },
70
+ "author_check": {
71
+ "anyOf": [
72
+ {
73
+ "type": "object",
74
+ "properties": {
75
+ "by": {
76
+ "type": "string",
77
+ "minLength": 1
78
+ },
79
+ "date": {
80
+ "type": "string",
81
+ "format": "date",
82
+ "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
83
+ },
84
+ "quote": {
85
+ "type": "string",
86
+ "minLength": 1
87
+ }
88
+ },
89
+ "required": ["by", "date", "quote"],
90
+ "additionalProperties": false
91
+ },
92
+ {
93
+ "type": "null"
94
+ }
95
+ ]
96
+ },
97
+ "extra": {
98
+ "type": "object",
99
+ "propertyNames": {
100
+ "type": "string"
101
+ },
102
+ "additionalProperties": {}
103
+ },
104
+ "mode": {
105
+ "oneOf": [
106
+ {
107
+ "type": "object",
108
+ "properties": {
109
+ "kind": {
110
+ "type": "string",
111
+ "const": "decide_before_run"
112
+ },
113
+ "outputs": {
114
+ "type": "array",
115
+ "items": {
116
+ "type": "string",
117
+ "minLength": 1
118
+ }
119
+ },
120
+ "decision": {
121
+ "type": "object",
122
+ "properties": {
123
+ "file": {
124
+ "type": "string"
125
+ },
126
+ "note": {
127
+ "type": "string"
128
+ }
129
+ },
130
+ "required": ["file", "note"],
131
+ "additionalProperties": false
132
+ },
133
+ "we_lose_if": {
134
+ "anyOf": [
135
+ {
136
+ "anyOf": [
137
+ {
138
+ "type": "object",
139
+ "properties": {
140
+ "result": {
141
+ "type": "string",
142
+ "minLength": 1
143
+ },
144
+ "below": {
145
+ "type": "number"
146
+ }
147
+ },
148
+ "required": ["result", "below"],
149
+ "additionalProperties": false
150
+ },
151
+ {
152
+ "type": "object",
153
+ "properties": {
154
+ "result": {
155
+ "type": "string",
156
+ "minLength": 1
157
+ },
158
+ "above": {
159
+ "type": "number"
160
+ }
161
+ },
162
+ "required": ["result", "above"],
163
+ "additionalProperties": false
164
+ }
165
+ ]
166
+ },
167
+ {
168
+ "type": "null"
169
+ }
170
+ ]
171
+ }
172
+ },
173
+ "required": ["kind", "outputs", "decision"],
174
+ "additionalProperties": false
175
+ },
176
+ {
177
+ "type": "object",
178
+ "properties": {
179
+ "kind": {
180
+ "type": "string",
181
+ "const": "exploratory"
182
+ },
183
+ "reason": {
184
+ "type": "string"
185
+ }
186
+ },
187
+ "required": ["kind", "reason"],
188
+ "additionalProperties": false
189
+ }
190
+ ]
191
+ },
192
+ "$schema": {
193
+ "type": "string",
194
+ "const": "https://unpkg.com/paperlint/schemas/plan.v2.schema.json"
195
+ },
196
+ "second_check": {
197
+ "anyOf": [
198
+ {
199
+ "anyOf": [
200
+ {
201
+ "type": "string",
202
+ "const": "none"
203
+ },
204
+ {
205
+ "minItems": 1,
206
+ "type": "array",
207
+ "items": {
208
+ "type": "object",
209
+ "properties": {
210
+ "step": {
211
+ "type": "string",
212
+ "minLength": 1
213
+ },
214
+ "min_kappa": {
215
+ "type": "number",
216
+ "exclusiveMinimum": 0,
217
+ "maximum": 1
218
+ }
219
+ },
220
+ "required": ["step", "min_kappa"],
221
+ "additionalProperties": false
222
+ }
223
+ }
224
+ ]
225
+ },
226
+ {
227
+ "type": "null"
228
+ }
229
+ ]
230
+ },
231
+ "self_test": {
232
+ "anyOf": [
233
+ {
234
+ "anyOf": [
235
+ {
236
+ "type": "string",
237
+ "const": "none"
238
+ },
239
+ {
240
+ "type": "object",
241
+ "properties": {
242
+ "made_by": {
243
+ "type": "string",
244
+ "minLength": 1
245
+ }
246
+ },
247
+ "required": ["made_by"],
248
+ "additionalProperties": false
249
+ },
250
+ {
251
+ "type": "object",
252
+ "properties": {
253
+ "must_catch": {
254
+ "type": "string",
255
+ "minLength": 1
256
+ },
257
+ "must_pass": {
258
+ "type": "string",
259
+ "minLength": 1
260
+ }
261
+ },
262
+ "required": ["must_catch", "must_pass"],
263
+ "additionalProperties": false
264
+ }
265
+ ]
266
+ },
267
+ {
268
+ "type": "null"
269
+ }
270
+ ]
271
+ },
272
+ "funnel": {
273
+ "anyOf": [
274
+ {
275
+ "anyOf": [
276
+ {
277
+ "type": "string",
278
+ "const": "none"
279
+ },
280
+ {
281
+ "minItems": 1,
282
+ "type": "array",
283
+ "items": {
284
+ "type": "string",
285
+ "minLength": 1
286
+ }
287
+ }
288
+ ]
289
+ },
290
+ {
291
+ "type": "null"
292
+ }
293
+ ]
294
+ },
295
+ "recall_audit": {
296
+ "anyOf": [
297
+ {
298
+ "anyOf": [
299
+ {
300
+ "type": "string",
301
+ "const": "none"
302
+ },
303
+ {
304
+ "type": "object",
305
+ "properties": {
306
+ "n_files": {
307
+ "type": "integer",
308
+ "exclusiveMinimum": 0,
309
+ "maximum": 9007199254740991
310
+ },
311
+ "min_recall": {
312
+ "type": "number",
313
+ "exclusiveMinimum": 0,
314
+ "maximum": 1
315
+ }
316
+ },
317
+ "required": ["n_files", "min_recall"],
318
+ "additionalProperties": false
319
+ }
320
+ ]
321
+ },
322
+ {
323
+ "type": "null"
324
+ }
325
+ ]
326
+ }
327
+ },
328
+ "required": [
329
+ "question",
330
+ "population",
331
+ "arms",
332
+ "primary_outcome",
333
+ "author_check",
334
+ "$schema",
335
+ "second_check",
336
+ "self_test",
337
+ "funnel",
338
+ "recall_audit"
339
+ ],
340
+ "additionalProperties": false
341
+ }
@@ -0,0 +1,31 @@
1
+ /* Material Ocean, the palette of the candidate decision page.
2
+ candidate_page.ts inlines this file at the top of the page's <style>. Dark only, on
3
+ purpose: the page commits to one look, so every color below is set explicitly and nothing depends on the
4
+ viewer's theme. No purple anywhere: Material Ocean's purple (#C792EA) is left out of the set. */
5
+ :root {
6
+ color-scheme: dark;
7
+ --bg: #0f111a; /* page */
8
+ --surface: #1a1c25; /* the one raised block a section may have (a decision box, a table) */
9
+ --line: #262a3a; /* hairlines between sections and around the raised block */
10
+ --text: #a6accd; /* body */
11
+ --muted: #7e84a3; /* captions, metadata (4.8:1 on --bg; Ocean's own comment grey is too faint to read) */
12
+ --strong: #eeffff; /* headings and the current tab */
13
+ --accent: #82aaff; /* links, the current tab's underline, the primary button: the only accent */
14
+ --good: #c3e88d; /* "add", saved, passed */
15
+ --mark: #ffcb6b; /* highlighted passage, and warnings */
16
+ --bad: #f07178; /* errors only */
17
+ --mark-bg: rgba(255, 203, 107, 0.08);
18
+ --paper: #ffffff; /* only behind a page image (a PDF crop), never a page surface */
19
+ --sans: "Roboto", system-ui, -apple-system, "Segoe UI", sans-serif;
20
+ --mono: "Roboto Mono", ui-monospace, "SFMono-Regular", Menlo, monospace;
21
+ --gap-section: 48px; /* between sections */
22
+ --gap-item: 16px; /* between items inside a section */
23
+ --measure: 68ch; /* longest line of running text */
24
+ }
25
+ body {
26
+ background: var(--bg);
27
+ color: var(--text);
28
+ font-family: var(--sans);
29
+ font-size: 16px;
30
+ line-height: 1.6;
31
+ }