paperlint 13.2.0 β 13.3.1
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.
- package/.github/workflows/ci.yml +43 -1
- package/CLAUDE.md +3 -3
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +2 -2
- package/dist/doctor.js.map +1 -1
- package/dist/skills/assess-novelty/scripts/candidate_page.d.ts +1 -0
- package/dist/skills/assess-novelty/scripts/novelty_reader_brief.d.ts +25 -0
- package/docs/testing.md +5 -2
- package/docs/toolchain.md +1 -1
- package/docs/website.md +10 -0
- package/eslint.config.mjs +52 -0
- package/package.json +2 -1
- package/presets/agentverify.md +15 -4
- package/scripts/check.ts +4 -1
- package/skills/assess-novelty/scripts/candidate_page.css +31 -0
- package/skills/assess-novelty/scripts/candidate_page.html +934 -0
- package/skills/assess-novelty/scripts/candidate_page.js +165 -0
- package/skills/assess-novelty/scripts/candidate_page.test.ts +401 -0
- package/skills/assess-novelty/scripts/candidate_page.ts +194 -0
- package/skills/assess-novelty/scripts/check_novelty.py +275 -0
- package/skills/assess-novelty/scripts/check_novelty.test.ts +624 -0
- package/skills/assess-novelty/scripts/check_novelty_coverage.test.ts +176 -0
- package/skills/assess-novelty/scripts/crop_quote.py +104 -0
- package/skills/assess-novelty/scripts/crop_quote.test.ts +130 -0
- package/skills/assess-novelty/scripts/fixtures/crop-quote/make_sample.py +42 -0
- package/skills/assess-novelty/scripts/fixtures/crop-quote/sample.pdf +106 -0
- package/skills/assess-novelty/scripts/fixtures/novelty/CLAIMS.md +11 -0
- package/skills/assess-novelty/scripts/fixtures/novelty/paper.tex +10 -0
- package/skills/assess-novelty/scripts/fixtures/novelty/siblings/2026-10-27-novelty-refutation.md +8 -0
- package/skills/assess-novelty/scripts/fixtures/novelty/siblings/data/doe-preprint.txt +63 -0
- package/skills/assess-novelty/scripts/fixtures/novelty/siblings/novelty.json +54 -0
- package/skills/assess-novelty/scripts/novelty_candidates.py +136 -0
- package/skills/assess-novelty/scripts/novelty_candidates.test.ts +222 -0
- package/skills/assess-novelty/scripts/novelty_cells.py +88 -0
- package/skills/assess-novelty/scripts/novelty_cells.test.ts +159 -0
- package/skills/assess-novelty/scripts/novelty_coverage.py +55 -0
- package/skills/assess-novelty/scripts/novelty_reader_brief.js +165 -0
- package/skills/assess-novelty/scripts/novelty_reader_brief.test.ts +251 -0
- package/skills/assess-novelty/scripts/novelty_reader_brief.ts +215 -0
- package/skills/assess-novelty/scripts/quote_match.py +34 -0
- package/skills/assess-novelty/scripts/script_edges.test.ts +174 -0
- package/src/doctor.ts +4 -2
package/.github/workflows/ci.yml
CHANGED
|
@@ -86,6 +86,11 @@ jobs:
|
|
|
86
86
|
run: npm ci
|
|
87
87
|
timeout-minutes: 5
|
|
88
88
|
|
|
89
|
+
# skills/assess-novelty/scripts/crop_quote.py reads PDFs with PyMuPDF (python3 ships on the runners).
|
|
90
|
+
- name: PyMuPDF for the novelty scripts
|
|
91
|
+
run: python3 -m pip install --break-system-packages pymupdf
|
|
92
|
+
timeout-minutes: 3
|
|
93
|
+
|
|
89
94
|
# Harnesses. `--min=1` is inside the script: it refuses a run where NOTHING matched.
|
|
90
95
|
#
|
|
91
96
|
# π΄ WHAT IT DOES NOT DO, contrary to what was written here before 17.09: it does NOT protect
|
|
@@ -199,6 +204,28 @@ jobs:
|
|
|
199
204
|
run: npm run test:e2e:studies
|
|
200
205
|
timeout-minutes: 5
|
|
201
206
|
|
|
207
|
+
# ββ DOES THIS PULL REQUEST CHANGE ANYTHING BUT DOCS? ββββββββββββββββββββββββββββββββββββββββββββ
|
|
208
|
+
# dorny/paths-filter lists a PR's files from the API (no checkout). With `every`, a file counts as
|
|
209
|
+
# code only if it matches all three patterns: anything, but not root or docs/ Markdown.
|
|
210
|
+
changes:
|
|
211
|
+
if: github.event_name == 'pull_request' && github.event.pull_request.draft == false
|
|
212
|
+
runs-on: ubuntu-latest
|
|
213
|
+
timeout-minutes: 3
|
|
214
|
+
permissions:
|
|
215
|
+
pull-requests: read
|
|
216
|
+
outputs:
|
|
217
|
+
code: ${{ steps.filter.outputs.code }}
|
|
218
|
+
steps:
|
|
219
|
+
- uses: dorny/paths-filter@v3
|
|
220
|
+
id: filter
|
|
221
|
+
with:
|
|
222
|
+
predicate-quantifier: every
|
|
223
|
+
filters: |
|
|
224
|
+
code:
|
|
225
|
+
- "**"
|
|
226
|
+
- "!*.md"
|
|
227
|
+
- "!docs/**/*.md"
|
|
228
|
+
|
|
202
229
|
# ββ BUILDING THE PAPER WITH REAL pdflatex, ON LINUX AND macOS ββββββββββββββββββββββββββββββββββ
|
|
203
230
|
#
|
|
204
231
|
# π΄ ONE JOB, TWO OPERATING SYSTEMS. TeX Live comes from `paperlint toolchain` β the same command a user
|
|
@@ -215,8 +242,18 @@ jobs:
|
|
|
215
242
|
# paper typeset in the wrong font. This repository is public, so the macOS minutes are free.
|
|
216
243
|
#
|
|
217
244
|
# `CI` is set: absence of TeX locally is a legitimate skip; here it is an environment failure.
|
|
245
|
+
#
|
|
246
|
+
# π΄ EXCEPT A PULL REQUEST THAT CHANGES ONLY DOCS. A README or docs/*.md edit cannot change what
|
|
247
|
+
# this job builds, and it used to wait for TeX Live on two systems anyway (#343: one new
|
|
248
|
+
# docs/website.md). `changes` below decides; `gates` still runs on such a PR, because tests read
|
|
249
|
+
# the docs. On a push to main or a manual run `changes` does not run and this job always does.
|
|
218
250
|
build-e2e:
|
|
219
|
-
|
|
251
|
+
needs: changes
|
|
252
|
+
# `!cancelled()`: without it a skipped `changes` (every push to main) would skip this job too.
|
|
253
|
+
if: >-
|
|
254
|
+
!cancelled() && (github.event_name != 'pull_request' ||
|
|
255
|
+
(github.event.pull_request.draft == false && needs.changes.result == 'success' &&
|
|
256
|
+
needs.changes.outputs.code == 'true'))
|
|
220
257
|
strategy:
|
|
221
258
|
fail-fast: false
|
|
222
259
|
matrix:
|
|
@@ -236,6 +273,11 @@ jobs:
|
|
|
236
273
|
run: npm ci
|
|
237
274
|
timeout-minutes: 8
|
|
238
275
|
|
|
276
|
+
# skills/assess-novelty/scripts/crop_quote.py reads PDFs with PyMuPDF (python3 ships on the runners).
|
|
277
|
+
- name: PyMuPDF for the novelty scripts
|
|
278
|
+
run: python3 -m pip install --break-system-packages pymupdf
|
|
279
|
+
timeout-minutes: 3
|
|
280
|
+
|
|
239
281
|
# Issue #9's distinction: prints BOTH spellings of the temp root. If they match, this machine
|
|
240
282
|
# is not the platform the macOS cell exists for, and green below says nothing about it.
|
|
241
283
|
- name: two spellings of one directory β does this machine see them
|
package/CLAUDE.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<!-- vigiles:sha256:
|
|
1
|
+
<!-- vigiles:sha256:58c66e374c084cc5 compiled from CLAUDE.md.spec.ts -->
|
|
2
2
|
|
|
3
3
|
# CLAUDE.md
|
|
4
4
|
|
|
@@ -37,9 +37,9 @@ This file loads on every turn, so it holds only what applies to **any** change h
|
|
|
37
37
|
| changing CI, Dependabot or the release | [`.github/CLAUDE.md`](.github/CLAUDE.md) | cost, Dependabot cadence, release from the PR title |
|
|
38
38
|
| writing a test | [`docs/testing.md`](docs/testing.md), [`docs/e2e.md`](docs/e2e.md) | which kind of test, fakes, the e2e triggers |
|
|
39
39
|
|
|
40
|
-
## Before
|
|
40
|
+
## Before leaving draft and before merge
|
|
41
41
|
|
|
42
|
-
`npm run check`, exit code read without a pipe. Red first Β· assert the whole value Β· no test touches the real network Β· 100% coverage, no `c8 ignore`. In a container without TeX Live, only the TeX e2e gate fails, and it says so; `npx paperlint toolchain` installs it.
|
|
42
|
+
`npm run check`, exit code read without a pipe; a `wip:` push to a DRAFT pull request needs only the tests of what it touched (`npx vitest run <dir>`), and is never reported as "the gates", because CI does not run the gates on a draft. Red first Β· assert the whole value Β· no test touches the real network Β· 100% coverage, no `c8 ignore`. In a container without TeX Live, only the TeX e2e gate fails, and it says so; `npx paperlint toolchain` installs it.
|
|
43
43
|
|
|
44
44
|
## Commits
|
|
45
45
|
|
package/dist/doctor.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,KAAK,MAAM,EAAyC,MAAM,SAAS,CAAC;AAa7E,OAAO,EAA2B,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAK5E,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED;;;;GAIG;AACH;;;;GAIG;AACH,eAAO,MAAM,WAAW,gHACuF,CAAC;AAEhH,eAAO,MAAM,QAAQ,EAAE,SAAS,OAAO,
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,KAAK,MAAM,EAAyC,MAAM,SAAS,CAAC;AAa7E,OAAO,EAA2B,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAK5E,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED;;;;GAIG;AACH;;;;GAIG;AACH,eAAO,MAAM,WAAW,gHACuF,CAAC;AAEhH,eAAO,MAAM,QAAQ,EAAE,SAAS,OAAO,EAyCtC,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,CACzB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,EAAE;IAAE,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAA;CAAE,KACxD;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAExC,eAAO,MAAM,KAAK,GAAI,KAAK,MAAM,EAAE,MAAK,YAAwB,KAAG,OACS,CAAC;AAE7E,2FAA2F;AAC3F,KAAK,OAAO,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;AAGzC,+FAA+F;AAC/F,wBAAgB,YAAY,CAC1B,GAAG,EAAE,MAAM,EACX,KAAK,SAAI,EACT,OAAO,GAAE,OAAiB,GACzB,MAAM,EAAE,CAmCV;AAiFD,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,OAAO,OAAO,CAAC,GAAG,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,+FAA+F;IAC/F,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,YAAY,CAAC;IACnB,yFAAyF;IACzF,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,+FAA+F;IAC/F,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,UAAU,CAAC;CAC3C;AAED;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,EACrB,GAAiB,EAEjB,GAAmB,EACnB,UAAU,EACV,GAAe,EACf,SAAgB,EAChB,UAA2D,GAC5D,GAAE,aAAkB,GAAG,MAAM,CAqF7B"}
|
package/dist/doctor.js
CHANGED
|
@@ -78,8 +78,8 @@ export const PROGRAMS = [
|
|
|
78
78
|
{
|
|
79
79
|
bin: "python3",
|
|
80
80
|
from: "your system",
|
|
81
|
-
without: "the analysis and report scripts do not start",
|
|
82
|
-
install: "apt-get install -y python3",
|
|
81
|
+
without: "the analysis and report scripts and the novelty checks (assess-novelty) do not start",
|
|
82
|
+
install: "apt-get install -y python3; crop_quote.py also needs PyMuPDF: pip install pymupdf",
|
|
83
83
|
},
|
|
84
84
|
];
|
|
85
85
|
export const found = (bin, run = spawnSync) => run("command", ["-v", bin], { shell: true, stdio: "ignore" }).status === 0;
|
package/dist/doctor.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,6FAA6F;AAC7F,OAAO,EAAe,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpD,6FAA6F;AAC7F,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,kGAAkG;AAClG,kDAAkD;AAClD,OAAO,EACL,UAAU,EACV,mBAAmB,EACnB,gBAAgB,EAChB,WAAW,GACZ,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,WAAW,EAAmB,MAAM,kBAAkB,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAS7C;;;;GAIG;AACH;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GACtB,6GAA6G,CAAC;AAEhH,MAAM,CAAC,MAAM,QAAQ,GAAuB;IAC1C;QACE,GAAG,EAAE,UAAU;QACf,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,oBAAoB;QAC7B,OAAO,EAAE,WAAW;KACrB;IACD;QACE,GAAG,EAAE,QAAQ;QACb,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,kCAAkC;QAC3C,OAAO,EAAE,WAAW;KACrB;IACD;QACE,GAAG,EAAE,UAAU;QACf,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,8BAA8B;QACvC,OAAO,EAAE,WAAW;KACrB;IACD;QACE,GAAG,EAAE,MAAM;QACX,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,gEAAgE;QACzE,OAAO,EAAE,yCAAyC;KACnD;IACD;QACE,GAAG,EAAE,MAAM;QACX,IAAI,EAAE,8BAA8B;QACpC,OAAO,EACL,gFAAgF;QAClF,OAAO,EACL,0EAA0E;KAC7E;IACD;QACE,GAAG,EAAE,SAAS;QACd,IAAI,EAAE,aAAa;QACnB,OAAO,
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
type Neighbour = {
|
|
3
|
+
id: string;
|
|
4
|
+
text: string;
|
|
5
|
+
url?: string;
|
|
6
|
+
title?: string;
|
|
7
|
+
};
|
|
8
|
+
type Claim = {
|
|
9
|
+
id: string;
|
|
10
|
+
sentence: string;
|
|
11
|
+
pieces: Record<string, string>;
|
|
12
|
+
};
|
|
13
|
+
/** Lines exactly as Read and the coverage checker number them (novelty_coverage.py: removesuffix("\n").split("\n")). */
|
|
14
|
+
export declare const lineCount: (text: string) => number;
|
|
15
|
+
/** Share of non-blank lines with a 6+ space gap: two page columns glued into one line by `pdftotext -layout`. */
|
|
16
|
+
export declare const glue: (text: string) => number;
|
|
17
|
+
/**
|
|
18
|
+
* The fewest chunks of at most CHUNK lines, spread evenly: 401 lines are [1, 201] [202, 401], not [1, 400] [401, 401].
|
|
19
|
+
* A stub last chunk (a lone page break or page number) holds no 8-word quote, so a complete read could not be proved.
|
|
20
|
+
*/
|
|
21
|
+
export declare const chunks: (n: number) => [number, number][];
|
|
22
|
+
export declare const claimsText: (claims: Claim[]) => string;
|
|
23
|
+
/** The brief, pure. `lines` = the saved text's line count; `repair` = the checker's errors for this neighbour. */
|
|
24
|
+
export declare const readerBrief: (paper: string, n: Neighbour, claims: Claim[], lines: number, repair?: string[]) => string;
|
|
25
|
+
export {};
|
package/docs/testing.md
CHANGED
|
@@ -105,8 +105,11 @@ npm run check # every gate CI runs, and the list of what it
|
|
|
105
105
|
```
|
|
106
106
|
|
|
107
107
|
While editing, run the tests you touched, `npx tsc --noEmit`, `npx eslint <files>` and
|
|
108
|
-
`npm run fmt:check`.
|
|
109
|
-
|
|
108
|
+
`npm run fmt:check`. A `wip:` push to a draft pull request needs only that: CI skips the gates on a
|
|
109
|
+
draft, and the push is not "the gates passed". **Before taking a pull request out of draft, and
|
|
110
|
+
before merging, run `npm run check` and read its exit code** β the coverage gate cannot be judged
|
|
111
|
+
from one file. Waiting ten minutes for the whole suite on every wip push bought nothing the
|
|
112
|
+
pre-ready run does not (2026-11-03).
|
|
110
113
|
|
|
111
114
|
β οΈ **Not `vigiles test .`**, and never drop `--min=1` from `npm test`. Measured 2026-09-11:
|
|
112
115
|
|
package/docs/toolchain.md
CHANGED
|
@@ -16,7 +16,7 @@ after deciding to use the tool, not before.
|
|
|
16
16
|
| `texcount` | TeX Live (`paperlint toolchain`) | render-paper, grade-paper-writing | the length checks cannot run |
|
|
17
17
|
| `checkcites` | TeX Live (`paperlint toolchain`) | render-paper | nothing asks whether a bibliography entry is uncited |
|
|
18
18
|
| `java` | any JRE (21 works) | render-paper | TeXtidote does not run, and **nothing else spell-checks the text** |
|
|
19
|
-
| `python3` | your system | the analysis
|
|
19
|
+
| `python3` | your system | assess-novelty, the analysis scripts | those scripts do not start (`crop_quote.py` also needs `pymupdf`) |
|
|
20
20
|
| `tlmgr` | TeX Live | the TeX installer itself | you cannot add a TeX package |
|
|
21
21
|
| `banal` | HotCRP (`paperlint toolchain`) | `paperlint build`, extract-pdf-facts | page size, columns and font sizes are `null` in the facts file |
|
|
22
22
|
| `perl` | your system (macOS has it) | banal | banal cannot run β the same `null`, and `paperlint toolchain` refuses |
|
package/docs/website.md
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# Website
|
|
2
|
+
|
|
3
|
+
The project's domain is **[paperlint.dev](https://paperlint.dev)**, registered in November 2026
|
|
4
|
+
through Vercel. No site is deployed on it yet: the first version is
|
|
5
|
+
[#342](https://github.com/zernie/paperlint/issues/342).
|
|
6
|
+
|
|
7
|
+
- `.dev` is on the HSTS preload list, so browsers only open it over HTTPS: the site needs a
|
|
8
|
+
certificate from its first deploy.
|
|
9
|
+
- Until the site exists, the npm page links to the GitHub README: `package.json` sets no
|
|
10
|
+
`homepage`, only `repository`.
|
package/eslint.config.mjs
CHANGED
|
@@ -135,6 +135,36 @@ const RATCHET = {
|
|
|
135
135
|
"skills/plan-paper-timeline/fixtures/fake-google-calendar.ts": {
|
|
136
136
|
"max-lines-per-function": 31,
|
|
137
137
|
},
|
|
138
|
+
"skills/assess-novelty/scripts/candidate_page.test.ts": {
|
|
139
|
+
"max-lines-per-function": 343,
|
|
140
|
+
"max-nested-callbacks": 4,
|
|
141
|
+
},
|
|
142
|
+
"skills/assess-novelty/scripts/check_novelty.test.ts": {
|
|
143
|
+
"max-lines-per-function": 419,
|
|
144
|
+
},
|
|
145
|
+
"skills/assess-novelty/scripts/check_novelty_coverage.test.ts": {
|
|
146
|
+
"max-lines-per-function": 131,
|
|
147
|
+
},
|
|
148
|
+
"skills/assess-novelty/scripts/crop_quote.test.ts": {
|
|
149
|
+
"max-lines-per-function": 96,
|
|
150
|
+
},
|
|
151
|
+
"skills/assess-novelty/scripts/novelty_candidates.test.ts": {
|
|
152
|
+
"max-lines-per-function": 179,
|
|
153
|
+
},
|
|
154
|
+
"skills/assess-novelty/scripts/novelty_cells.test.ts": {
|
|
155
|
+
"max-lines-per-function": 117,
|
|
156
|
+
},
|
|
157
|
+
"skills/assess-novelty/scripts/novelty_reader_brief.test.ts": {
|
|
158
|
+
"max-lines-per-function": 180,
|
|
159
|
+
complexity: 11,
|
|
160
|
+
},
|
|
161
|
+
"skills/assess-novelty/scripts/candidate_page.ts": {
|
|
162
|
+
"max-lines-per-function": 55,
|
|
163
|
+
},
|
|
164
|
+
"skills/assess-novelty/scripts/novelty_reader_brief.ts": {
|
|
165
|
+
"max-lines-per-function": 32,
|
|
166
|
+
"max-params": 5,
|
|
167
|
+
},
|
|
138
168
|
"src/adapters/curl/download.io.ts": { "max-lines-per-function": 39 },
|
|
139
169
|
"src/adapters/references/index.ts": { "max-lines-per-function": 36 },
|
|
140
170
|
"src/build-engine.ts": { "max-lines-per-function": 33 },
|
|
@@ -667,6 +697,28 @@ export default [
|
|
|
667
697
|
files: TEST_FILES,
|
|
668
698
|
rules: { "max-lines-per-function": ["error", MAX_LINES_TESTS] },
|
|
669
699
|
},
|
|
700
|
+
// π΄ DEBT, NOT A PERMISSION. The novelty-check scripts and their harnesses were moved from a consumer
|
|
701
|
+
// repository AS THEY WERE (the 2026-11-02 decision): untyped JSON in, `any` throughout. Making them pass the
|
|
702
|
+
// type-safety rules below means rewriting them, which is paperlint#339 (TypeScript rewrite of the Python
|
|
703
|
+
// checkers) and paperlint#338 (the regex priority-sentence detector). Only the rules that need typed data
|
|
704
|
+
// are off, only here; the rules about behaviour (`complexity`, `max-depth`, `no-empty`, ...) still apply.
|
|
705
|
+
// Delete this block with the rewrite.
|
|
706
|
+
{
|
|
707
|
+
files: ["skills/assess-novelty/scripts/*.ts"],
|
|
708
|
+
rules: {
|
|
709
|
+
"@typescript-eslint/no-unsafe-member-access": "off",
|
|
710
|
+
"@typescript-eslint/no-unsafe-call": "off",
|
|
711
|
+
"@typescript-eslint/no-unsafe-assignment": "off",
|
|
712
|
+
"@typescript-eslint/no-unsafe-argument": "off",
|
|
713
|
+
"@typescript-eslint/no-unsafe-return": "off",
|
|
714
|
+
"@typescript-eslint/no-explicit-any": "off",
|
|
715
|
+
"@typescript-eslint/consistent-type-assertions": "off",
|
|
716
|
+
"@typescript-eslint/restrict-template-expressions": "off",
|
|
717
|
+
"@typescript-eslint/no-unnecessary-condition": "off",
|
|
718
|
+
"@typescript-eslint/no-confusing-void-expression": "off",
|
|
719
|
+
"@typescript-eslint/no-non-null-assertion": "off",
|
|
720
|
+
},
|
|
721
|
+
},
|
|
670
722
|
// Hexagonal layers, both axes (src/CLAUDE.md): knowledge by element, purity by file category.
|
|
671
723
|
IO_GLOBALS,
|
|
672
724
|
NO_CLOCK,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "paperlint",
|
|
3
|
-
"version": "13.
|
|
3
|
+
"version": "13.3.1",
|
|
4
4
|
"description": "A linter for scientific papers written in LaTeX: catches mistakes before you submit to a conference or journal.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -58,6 +58,7 @@
|
|
|
58
58
|
"eslint-plugin-project-structure": "^3.14.5",
|
|
59
59
|
"eslint-plugin-sonarjs": "^4.2.1",
|
|
60
60
|
"jsonc-parser": "^3.3.1",
|
|
61
|
+
"playwright-core": "^1.64.1",
|
|
61
62
|
"prettier": "^3.8.1",
|
|
62
63
|
"semantic-release": "25.0.9",
|
|
63
64
|
"typescript-eslint": "^8.70.1",
|
package/presets/agentverify.md
CHANGED
|
@@ -26,8 +26,10 @@ researchr page `conf.researchr.org/home/agentverify-2027` only redirects to the
|
|
|
26
26
|
preset keeps the family's `\documentclass[conference]{IEEEtran}`.
|
|
27
27
|
- **Publisher**: Β«Accepted papers will appear in the ICSE 2027 workshop proceedings by default.Β»
|
|
28
28
|
The ICSE workshops page: Β«The workshop papers will be published by the IEEE.Β» The CFP does not
|
|
29
|
-
say what a non-default route would be, or whether it is archival.
|
|
30
|
-
|
|
29
|
+
say what a non-default route would be, or whether it is archival. The organizers: no other route
|
|
30
|
+
is offered (below).
|
|
31
|
+
- **Presenting**: Β«At least one author of each accepted paper must register and present.Β» Remote
|
|
32
|
+
presentation is allowed (below).
|
|
31
33
|
- **Deadlines (AoE)**: submission 13 Nov 2026, reviews due 5 Dec, final notification 11 Dec 2026,
|
|
32
34
|
camera-ready 29 Jan 2027.
|
|
33
35
|
|
|
@@ -65,10 +67,19 @@ and are over the limit. Count the PDF's pages yourself before submitting.
|
|
|
65
67
|
scheduled workflow; notification and camera-ready are the site's. No `registration`: there is no
|
|
66
68
|
abstract deadline.
|
|
67
69
|
|
|
70
|
+
## Answered by the organizers (emails to an author, not public)
|
|
71
|
+
|
|
72
|
+
- **Remote presentation** (2026-10-23): Β«In general, remote presentations will be allowed for
|
|
73
|
+
authors who are unable to attend the workshop in person. However, at least one author of each
|
|
74
|
+
accepted paper must register for the workshop to ensure its inclusion in the proceedings.Β»
|
|
75
|
+
- **APC** (2026-10-27), for every paper kind: Β«APC. It is free completely.Β»
|
|
76
|
+
- **Proceedings** (2026-10-27): Β«Workshop papers are normally published in an ICSE companion
|
|
77
|
+
IEEE/ACM proceedings.Β» Asked whether a non-archival option exists: Β«The non-trivial [sic:
|
|
78
|
+
non-archival] option is not offered.Β» So every accepted paper is archival.
|
|
79
|
+
|
|
68
80
|
## Not verified
|
|
69
81
|
|
|
70
|
-
- **
|
|
71
|
-
- **Archival / non-archival choice**: Β«by defaultΒ» suggests an alternative; none is described.
|
|
82
|
+
- **Digital library**: whether the 2027 companion volume goes to IEEE Xplore or the ACM DL.
|
|
72
83
|
- **AI / LLM usage policy and required sections**: none stated.
|
|
73
84
|
|
|
74
85
|
## What the preset resolves to
|
package/scripts/check.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* `npm run check` β ONE command you run on yourself before
|
|
3
|
+
* `npm run check` β ONE command you run on yourself before a pull request leaves draft, and before merge.
|
|
4
4
|
*
|
|
5
5
|
* ββ WHY IT EXISTS, AND IT IS A MEASURED FAILURE, NOT A TIDINESS IDEA βββββββββββββββββββββββ
|
|
6
6
|
* On 2026-09-19 a change to a lint rule was pushed that broke the test suite.
|
|
@@ -201,6 +201,9 @@ export function commandOf(gate: Gate): readonly [string, ...string[]] {
|
|
|
201
201
|
export const NOT_COVERED: Readonly<Record<string, string>> = {
|
|
202
202
|
// build-e2e's macOS cell is the one part of a covered job no local command can stand in for:
|
|
203
203
|
// it exists because issue #9 appeared on macOS alone (/var is a symlink to /private/var).
|
|
204
|
+
changes:
|
|
205
|
+
"ci.yml asks dorny/paths-filter whether a pull request changes anything but docs, so " +
|
|
206
|
+
"build-e2e can skip; it checks nothing itself, and a local run always builds.",
|
|
204
207
|
merge:
|
|
205
208
|
"dependabot-automerge.yml merges the bot's own pull requests once CI is green. It checks " +
|
|
206
209
|
"nothing itself; there is no local equivalent because it acts on GitHub, not on the tree.",
|
|
@@ -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
|
+
}
|