paperlint 2.1.0 → 3.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.
- package/CLAUDE.md +6 -1
- package/README.md +233 -224
- package/action.yml +4 -6
- package/dist/adapters/references/index.d.ts +13 -0
- package/dist/adapters/references/index.d.ts.map +1 -0
- package/dist/adapters/references/index.js +55 -0
- package/dist/adapters/references/index.js.map +1 -0
- package/dist/adapters/references/reach.io.d.ts +3 -0
- package/dist/adapters/references/reach.io.d.ts.map +1 -0
- package/dist/adapters/references/reach.io.js +14 -0
- package/dist/adapters/references/reach.io.js.map +1 -0
- package/dist/build.d.ts +15 -0
- package/dist/build.d.ts.map +1 -1
- package/dist/build.js +38 -4
- package/dist/build.js.map +1 -1
- package/dist/cli.d.ts +28 -25
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +277 -265
- package/dist/cli.js.map +1 -1
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +40 -72
- package/dist/doctor.js.map +1 -1
- package/dist/facts-file.d.ts +2 -2
- package/dist/facts-file.js +2 -2
- package/dist/hooks-settings.d.ts +0 -21
- package/dist/hooks-settings.d.ts.map +1 -1
- package/dist/hooks-settings.js +17 -135
- package/dist/hooks-settings.js.map +1 -1
- package/dist/init.d.ts +39 -29
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +143 -172
- package/dist/init.js.map +1 -1
- package/dist/link-skills.d.ts +1 -1
- package/dist/link-skills.d.ts.map +1 -1
- package/dist/link-skills.js +11 -29
- package/dist/link-skills.js.map +1 -1
- package/dist/new-paper.d.ts.map +1 -1
- package/dist/new-paper.js +2 -13
- package/dist/new-paper.js.map +1 -1
- package/dist/paper-files.d.ts +63 -0
- package/dist/paper-files.d.ts.map +1 -0
- package/dist/paper-files.js +69 -0
- package/dist/paper-files.js.map +1 -0
- package/dist/paper-settings.d.ts +13 -41
- package/dist/paper-settings.d.ts.map +1 -1
- package/dist/paper-settings.js +71 -71
- package/dist/paper-settings.js.map +1 -1
- package/dist/ports/check-references.d.ts +31 -0
- package/dist/ports/check-references.d.ts.map +1 -0
- package/dist/ports/check-references.js +7 -0
- package/dist/ports/check-references.js.map +1 -0
- package/dist/presets.d.ts +1 -1
- package/dist/presets.d.ts.map +1 -1
- package/dist/presets.js +4 -6
- package/dist/presets.js.map +1 -1
- package/dist/reference-rules.d.ts +47 -0
- package/dist/reference-rules.d.ts.map +1 -0
- package/dist/reference-rules.js +156 -0
- package/dist/reference-rules.js.map +1 -0
- package/dist/references.d.ts +36 -0
- package/dist/references.d.ts.map +1 -0
- package/dist/references.js +91 -0
- package/dist/references.js.map +1 -0
- package/dist/rules-config.d.ts +5 -3
- package/dist/rules-config.d.ts.map +1 -1
- package/dist/rules-config.js +15 -6
- package/dist/rules-config.js.map +1 -1
- package/dist/structure.js +3 -3
- package/dist/structure.js.map +1 -1
- package/dist/tex-requirements.js +2 -2
- package/dist/tex-requirements.js.map +1 -1
- package/dist/types.d.ts +20 -18
- package/dist/types.d.ts.map +1 -1
- package/dist/venue-rules.d.ts.map +1 -1
- package/dist/venue-rules.js +11 -9
- package/dist/venue-rules.js.map +1 -1
- package/docs/configuration.md +119 -104
- package/docs/e2e.md +1 -1
- package/docs/install.md +25 -40
- package/docs/optional-rules.md +5 -4
- package/docs/rules.md +60 -23
- package/eslint-rules/bib-reachable-entry.mjs +75 -0
- package/eslint-rules/latex-language.mjs +29 -1
- package/eslint-rules/paper-stages.harness.mjs +1 -117
- package/eslint-rules/paper-stages.mjs +0 -120
- package/eslint-rules/paper-stages.mutations.mjs +0 -76
- package/eslint-rules/paper-typography.mjs +267 -192
- package/eslint-rules/paper-typography.test.mjs +297 -0
- package/eslint-rules/papers.harness.mjs +8 -12
- package/eslint-rules/papers.mjs +17 -31
- package/eslint-rules/pdf-last-page-balance.mjs +4 -7
- package/eslint-rules/review-frontmatter.mjs +118 -0
- package/eslint-rules/review-frontmatter.schema.json +36 -0
- package/eslint-rules/review-frontmatter.test.mjs +118 -0
- package/eslint-rules/sibling-frontmatter.mjs +19 -0
- package/eslint-rules/sibling-frontmatter.schema.json +14 -0
- package/eslint.config.mjs +0 -15
- package/fixtures/real-markdown-paper/baseline.json +6 -7
- package/hooks/hooks.harness.mjs +39 -98
- package/hooks/hooks.mutations.mjs +6 -6
- package/hooks/paper-edit-guard.hook.d.mts +2 -3
- package/hooks/paper-edit-guard.hook.mjs +31 -42
- package/hooks/paper-skills-nudge.hook.mjs +21 -19
- package/hooks/paper-status-gates.hook.mjs +21 -19
- package/hooks/paper-status-gates.sh +8 -13
- package/lib/paper-config.d.mts +15 -25
- package/lib/paper-config.harness.mjs +18 -35
- package/lib/paper-config.mjs +83 -105
- package/lib/paper-config.mutations.mjs +2 -2
- package/lib/skill-checks.mjs +1 -1
- package/lib/skill-trigger-cases.harness.mjs +9 -8
- package/lib/skill-trigger-cases.mjs +7 -15
- package/package.json +1 -1
- package/scripts/eslint-report-guard.mjs +1 -1
- package/scripts/harness-api.frozen.json +0 -3
- package/scripts/mutation-batteries.frozen.json +4 -13
- package/skills/analyze-sibling-paper/SKILL.md +16 -12
- package/skills/analyze-sibling-paper/SKILL.md.spec.ts +15 -11
- package/skills/cold-read-diff/SKILL.md +20 -1
- package/skills/cold-read-diff/SKILL.md.spec.ts +19 -0
- package/skills/grade-paper-writing/SKILL.md +20 -1
- package/skills/grade-paper-writing/SKILL.md.spec.ts +19 -0
- package/skills/paper-pipeline/scripts/consumer.d.mts +0 -1
- package/skills/paper-pipeline/scripts/consumer.harness.mjs +8 -12
- package/skills/paper-pipeline/scripts/consumer.mjs +19 -33
- package/skills/paper-pipeline/scripts/extract-ref-facts.harness.mjs +6 -4
- package/skills/paper-pipeline/scripts/run-mechanical.mjs +2 -11
- package/skills/plan-paper-timeline/SKILL.md +2 -2
- package/skills/plan-paper-timeline/SKILL.md.spec.ts +1 -1
- package/skills/plan-paper-timeline/plan-paper-timeline.effects.harness.mjs +1 -1
- package/skills/plan-paper-timeline/plan-paper-timeline.effects.mutations.mjs +2 -2
- package/skills/render-paper/check-render.sh +2 -3
- package/skills/render-paper/render-paper.harness.mjs +2 -2
- package/skills/verify-citations/SKILL.md +10 -1
- package/skills/verify-citations/SKILL.md.spec.ts +9 -0
- package/skills/verify-citations/scripts/bib-authors.mjs +48 -26
- package/src/adapters/references/index.ts +102 -0
- package/src/adapters/references/reach.io.ts +12 -0
- package/src/build.harness.mjs +8 -4
- package/src/build.ts +62 -6
- package/src/cli.harness.mjs +147 -292
- package/src/cli.mutations.mjs +35 -44
- package/src/cli.ts +344 -304
- package/src/doctor.harness.mjs +41 -84
- package/src/doctor.mutations.mjs +9 -9
- package/src/doctor.ts +44 -89
- package/src/facts-file.test.ts +0 -7
- package/src/facts-file.ts +2 -2
- package/src/hooks-settings.harness.mjs +7 -92
- package/src/hooks-settings.mutations.mjs +2 -17
- package/src/hooks-settings.ts +18 -162
- package/src/init.test.ts +206 -0
- package/src/init.ts +186 -230
- package/src/link-skills.harness.mjs +1 -38
- package/src/link-skills.mutations.mjs +9 -5
- package/src/link-skills.ts +10 -34
- package/src/lint-fix.test.ts +120 -0
- package/src/new-paper.test.ts +1 -13
- package/src/new-paper.ts +2 -17
- package/src/paper-files.test.ts +290 -0
- package/src/paper-files.ts +144 -0
- package/src/paper-settings-commands.test.ts +84 -121
- package/src/paper-settings.test.ts +93 -64
- package/src/paper-settings.ts +99 -97
- package/src/ports/check-references.ts +28 -0
- package/src/presets.ts +5 -15
- package/src/reference-rules.ts +229 -0
- package/src/references.test.ts +209 -0
- package/src/references.ts +138 -0
- package/src/rules-config.harness.mjs +24 -8
- package/src/rules-config.ts +19 -7
- package/src/structure.harness.mjs +3 -1
- package/src/structure.ts +3 -3
- package/src/tex-requirements.ts +2 -2
- package/src/types.ts +30 -18
- package/src/venue-rules.test.ts +20 -11
- package/src/venue-rules.ts +11 -13
- package/eslint-rules/doc-fields.harness.mjs +0 -336
- package/eslint-rules/doc-fields.mjs +0 -186
- package/eslint-rules/doc-fields.mutations.mjs +0 -96
- package/eslint-rules/paper-typography.harness.mjs +0 -291
- package/eslint-rules/paper-typography.mutations.mjs +0 -131
- package/eslint-rules/review-findings-cause.harness.mjs +0 -228
- package/eslint-rules/review-findings-cause.mjs +0 -135
- package/eslint-rules/review-findings-cause.mutations.mjs +0 -72
- package/fixtures/paper-stages/authors-ran/PIPELINE-STATUS.md +0 -16
- package/fixtures/paper-stages/marker-in-prose/PIPELINE-STATUS.md +0 -17
- package/fixtures/review-findings-cause/clean.md +0 -17
- package/fixtures/review-findings-cause/defect.md +0 -14
- package/fixtures/review-findings-cause/old-debt.md +0 -14
- package/fixtures/review-findings-cause/quiet-in-fence.md +0 -16
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `review/findings-cause` — a review report with findings and no analysis of the ROOT CAUSE.
|
|
3
|
-
*
|
|
4
|
-
* ── WHAT THIS RULE IS ──────────────────────────────────────────────────────────
|
|
5
|
-
* Pipeline convention: a paper review does not end with a list of findings, it ends
|
|
6
|
-
* with an answer to "what in the PIPELINE let this through" — a defective skill, a
|
|
7
|
-
* missing skill, a hook, a rule. Otherwise the paper text gets fixed while the tool
|
|
8
|
-
* that missed it stays the same, and the next paper arrives with the same defect.
|
|
9
|
-
*
|
|
10
|
-
* ── WHY THIS IS A MOVE, NOT A NEW RULE ──────────────────────────────────────────
|
|
11
|
-
* First unit of step 9 of the extraction: until 2026-09-15 the check lived in the
|
|
12
|
-
* consumer as `checkReviewFindingsCause` in `.claude/hooks/paper-lint.mjs` — a
|
|
13
|
-
* directory walk plus three regexes over the text.
|
|
14
|
-
*
|
|
15
|
-
* 🔴 AND THE MOVE HERE IS NOT A COPY, IT REMOVES A WHOLE CLASS OF BUGS. The old
|
|
16
|
-
* version counted findings like this:
|
|
17
|
-
*
|
|
18
|
-
* tableRows ← ^\|\s*\d+\s*\| a line starting with "| <number> |"
|
|
19
|
-
* boldItems ← ^\s*[-*]\s+\*\* a list item starting bold
|
|
20
|
-
*
|
|
21
|
-
* (the regexes are given WITHOUT trailing slashes and flags on purpose: an
|
|
22
|
-
* "asterisk-slash" sequence inside a block comment closes it — I tripped on this
|
|
23
|
-
* twice in one hour, the second time right here.)
|
|
24
|
-
*
|
|
25
|
-
* That is, a "table row" was recognized by how it's written, not by its markup: the
|
|
26
|
-
* same line inside a ``` fence counted as a finding, a leading space in the cell
|
|
27
|
-
* broke the count, and `*` and `-` had to be listed by hand. In the AST a table row
|
|
28
|
-
* is a `tableRow` node, and all three misses become inexpressible. This is exactly
|
|
29
|
-
* the base rule "parse markdown with a PARSER".
|
|
30
|
-
*
|
|
31
|
-
* ── WHAT STAYS AS CONSUMER DATA ───────────────────────────────────────────────
|
|
32
|
-
* The findings threshold is an option. The "rule from a date" (reports older than a
|
|
33
|
-
* given date are known debt, not a finding) DOES NOT MOVE HERE AT ALL: it's a fact
|
|
34
|
-
* about one consumer's corpus, and its home is that consumer's config via `ignores`,
|
|
35
|
-
* not the mechanism. The mechanism goes in the package, the data stays with the consumer.
|
|
36
|
-
*/
|
|
37
|
-
|
|
38
|
-
/** Numbered cell: the first column of a table row holding a single number. */
|
|
39
|
-
const isNumbered = (row) => {
|
|
40
|
-
const first = row.children?.[0];
|
|
41
|
-
const text = (first?.children ?? [])
|
|
42
|
-
.map((c) => c.value ?? "")
|
|
43
|
-
.join("")
|
|
44
|
-
.trim();
|
|
45
|
-
return /^\d+$/.test(text);
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
/** Finding item: a list element starting with bold text — the finding's heading. */
|
|
49
|
-
const isBoldItem = (item) => {
|
|
50
|
-
const para = item.children?.find((c) => c.type === "paragraph");
|
|
51
|
-
return para?.children?.[0]?.type === "strong";
|
|
52
|
-
};
|
|
53
|
-
|
|
54
|
-
export default {
|
|
55
|
-
rules: {
|
|
56
|
-
"findings-cause": {
|
|
57
|
-
meta: {
|
|
58
|
-
type: "suggestion",
|
|
59
|
-
docs: {
|
|
60
|
-
description:
|
|
61
|
-
"a review report with findings names what in the pipeline let them through",
|
|
62
|
-
},
|
|
63
|
-
schema: [
|
|
64
|
-
{
|
|
65
|
-
type: "object",
|
|
66
|
-
properties: {
|
|
67
|
-
minFindings: { type: "integer", minimum: 1 },
|
|
68
|
-
causeMarker: { type: "string" },
|
|
69
|
-
sinceCreated: {
|
|
70
|
-
type: "string",
|
|
71
|
-
pattern: "^\\d{4}-\\d{2}-\\d{2}$",
|
|
72
|
-
},
|
|
73
|
-
},
|
|
74
|
-
additionalProperties: false,
|
|
75
|
-
},
|
|
76
|
-
],
|
|
77
|
-
messages: {
|
|
78
|
-
noCause:
|
|
79
|
-
"{{count}} findings and not one «{{marker}}» note. First name what in the PIPELINE let them through (a defective skill · a missing skill · a hook · a rule) and fix THAT: the text edit falls out of running the fixed tool, not instead of it.",
|
|
80
|
-
},
|
|
81
|
-
},
|
|
82
|
-
create(context) {
|
|
83
|
-
const {
|
|
84
|
-
minFindings = 3,
|
|
85
|
-
causeMarker = "Cause:",
|
|
86
|
-
sinceCreated,
|
|
87
|
-
} = context.options[0] ?? {};
|
|
88
|
-
let findings = 0;
|
|
89
|
-
let hasCause = false;
|
|
90
|
-
let created = "";
|
|
91
|
-
|
|
92
|
-
return {
|
|
93
|
-
// 🔴 "RULE FROM A DATE" — MECHANISM, DATE — DATA. A new check that opens with a
|
|
94
|
-
// wall of findings on a historical corpus gets muted the same day; so the
|
|
95
|
-
// consumer needs a way to say "before such-and-such date this is known debt,
|
|
96
|
-
// not a finding". Measured on the first consumer: 84 reports, 0 new would fire
|
|
97
|
-
// and 49 old — without this option the rule would have opened with forty-nine
|
|
98
|
-
// findings. The date is NOT hardcoded: it comes in as an option, read from
|
|
99
|
-
// `created` in the frontmatter, and a document with no date is treated as OLD
|
|
100
|
-
// only when the option is set — otherwise a missing frontmatter would become a
|
|
101
|
-
// way to dodge the rule.
|
|
102
|
-
yaml(node) {
|
|
103
|
-
created =
|
|
104
|
-
/^created:\s*(\d{4}-\d{2}-\d{2})/m.exec(node.value ?? "")?.[1] ??
|
|
105
|
-
"";
|
|
106
|
-
},
|
|
107
|
-
tableRow(node) {
|
|
108
|
-
if (isNumbered(node)) findings++;
|
|
109
|
-
},
|
|
110
|
-
listItem(node) {
|
|
111
|
-
if (isBoldItem(node)) findings++;
|
|
112
|
-
},
|
|
113
|
-
text(node) {
|
|
114
|
-
if (node.value.includes(causeMarker)) hasCause = true;
|
|
115
|
-
},
|
|
116
|
-
"root:exit"(node) {
|
|
117
|
-
if (hasCause || findings < minFindings) return;
|
|
118
|
-
if (sinceCreated && (!created || created < sinceCreated)) return;
|
|
119
|
-
// A finding about the FILE, not a line: what's missing isn't anywhere. So the
|
|
120
|
-
// position is the start of the document, the only honest place for "this is missing".
|
|
121
|
-
context.report({
|
|
122
|
-
loc: {
|
|
123
|
-
start: { line: 1, column: 0 },
|
|
124
|
-
end: { line: 1, column: 1 },
|
|
125
|
-
},
|
|
126
|
-
messageId: "noCause",
|
|
127
|
-
data: { count: String(findings), marker: causeMarker },
|
|
128
|
-
node,
|
|
129
|
-
});
|
|
130
|
-
},
|
|
131
|
-
};
|
|
132
|
-
},
|
|
133
|
-
},
|
|
134
|
-
},
|
|
135
|
-
};
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Battery for `review/findings-cause`. Three mutations, three different asserts: the rule
|
|
3
|
-
* must FIRE, must STAY SILENT when there's a cause analysis, and the threshold must come
|
|
4
|
-
* in as an option.
|
|
5
|
-
*/
|
|
6
|
-
import { fileURLToPath } from "node:url";
|
|
7
|
-
import { dirname, join, resolve } from "node:path";
|
|
8
|
-
import { runMutations } from "../lib/mutation-driver.mjs";
|
|
9
|
-
|
|
10
|
-
const HERE = dirname(fileURLToPath(import.meta.url));
|
|
11
|
-
const ROOT = resolve(HERE, "..");
|
|
12
|
-
const RULE = join(HERE, "review-findings-cause.mjs");
|
|
13
|
-
const HARNESS = join(HERE, "review-findings-cause.harness.mjs");
|
|
14
|
-
|
|
15
|
-
process.exit(
|
|
16
|
-
runMutations({
|
|
17
|
-
root: ROOT,
|
|
18
|
-
runner: "node",
|
|
19
|
-
cases: [
|
|
20
|
-
{
|
|
21
|
-
name: "the rule stops reporting",
|
|
22
|
-
harness: HARNESS,
|
|
23
|
-
expect: "one finding was expected",
|
|
24
|
-
disables:
|
|
25
|
-
"the verdict itself — a report without a cause analysis passes silently",
|
|
26
|
-
edits: [
|
|
27
|
-
[
|
|
28
|
-
RULE,
|
|
29
|
-
"if (hasCause || findings < minFindings) return;",
|
|
30
|
-
"if (true) return;",
|
|
31
|
-
],
|
|
32
|
-
],
|
|
33
|
-
},
|
|
34
|
-
{
|
|
35
|
-
name: 'the "Cause:" marker stops being noticed',
|
|
36
|
-
harness: HARNESS,
|
|
37
|
-
expect: "the rule must stay silent",
|
|
38
|
-
disables:
|
|
39
|
-
"the exemption — a report WITH a cause analysis starts going red",
|
|
40
|
-
edits: [
|
|
41
|
-
[
|
|
42
|
-
RULE,
|
|
43
|
-
"if (node.value.includes(causeMarker)) hasCause = true;",
|
|
44
|
-
"void node;",
|
|
45
|
-
],
|
|
46
|
-
],
|
|
47
|
-
},
|
|
48
|
-
{
|
|
49
|
-
name: '"rule from a date" stops exempting',
|
|
50
|
-
harness: HARNESS,
|
|
51
|
-
expect: "debt, not a finding",
|
|
52
|
-
disables:
|
|
53
|
-
"exemption of the historical corpus — the rule opens with a wall of findings",
|
|
54
|
-
edits: [
|
|
55
|
-
[
|
|
56
|
-
RULE,
|
|
57
|
-
"if (sinceCreated && (!created || created < sinceCreated)) return;",
|
|
58
|
-
"if (false) return;",
|
|
59
|
-
],
|
|
60
|
-
],
|
|
61
|
-
},
|
|
62
|
-
{
|
|
63
|
-
name: "the threshold stops being an option",
|
|
64
|
-
harness: HARNESS,
|
|
65
|
-
expect: "the threshold is data",
|
|
66
|
-
disables:
|
|
67
|
-
"passing the threshold in from outside — the mechanism claims the data for itself",
|
|
68
|
-
edits: [[RULE, "context.options[0] ?? {}", "{}"]],
|
|
69
|
-
},
|
|
70
|
-
],
|
|
71
|
-
}),
|
|
72
|
-
);
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
stages:
|
|
3
|
-
- stage: submitted
|
|
4
|
-
date: 2026-07-22
|
|
5
|
-
venue: A Venue 2026
|
|
6
|
-
pdf: versions/2026-07-22-submitted.pdf
|
|
7
|
-
bytes: 100
|
|
8
|
-
---
|
|
9
|
-
# PIPELINE-STATUS
|
|
10
|
-
|
|
11
|
-
<!-- Evidence of a run lives in the PROSE of a note cell — it has no node of its own, so the
|
|
12
|
-
rule looks for the marker across the whole scorecard. The fixture repeats that shape on purpose. -->
|
|
13
|
-
|
|
14
|
-
| id | what | with | ok | when | note |
|
|
15
|
-
|---|---|---|---|---|---|
|
|
16
|
-
| cites | any \cite edit | verify-citations | ☑ | 2026-08-24 | `bib-authors` ran: 27 entries, 1 discrepancy, fixed |
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
stages:
|
|
3
|
-
- stage: submitted
|
|
4
|
-
date: 2026-07-22
|
|
5
|
-
pdf: versions/a.pdf
|
|
6
|
-
bytes: 1
|
|
7
|
-
---
|
|
8
|
-
# PIPELINE-STATUS
|
|
9
|
-
|
|
10
|
-
Need to run `bib-authors` before camera-ready — never got round to it.
|
|
11
|
-
|
|
12
|
-
Exactly the case GREP cannot tell apart from a record of a run: the marker is in the file,
|
|
13
|
-
but the scorecard is empty. An intention read as a fact.
|
|
14
|
-
|
|
15
|
-
| id | what | ok | note |
|
|
16
|
-
|---|---|---|---|
|
|
17
|
-
| build | pdf builds | ☑ | nothing to note |
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: "Paper review — round 3"
|
|
3
|
-
created: 2026-09-01
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Findings
|
|
7
|
-
|
|
8
|
-
| # | what | where |
|
|
9
|
-
|---|---|---|
|
|
10
|
-
| 1 | the number in the abstract does not match table 2 | §1 |
|
|
11
|
-
| 2 | a reference to a withdrawn work | §4 |
|
|
12
|
-
| 3 | a past-tense promise about something unpublished | §6 |
|
|
13
|
-
|
|
14
|
-
## Analysis
|
|
15
|
-
|
|
16
|
-
Cause: the numbers gate read only `paper.md` and never opened `.tex`, so the table
|
|
17
|
-
and the abstract were compared in different files. Fix the gate, not the paragraph.
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: "Paper review — round 3"
|
|
3
|
-
created: 2026-09-01
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Findings
|
|
7
|
-
|
|
8
|
-
| # | what | where |
|
|
9
|
-
|---|---|---|
|
|
10
|
-
| 1 | the number in the abstract does not match table 2 | §1 |
|
|
11
|
-
| 2 | a reference to a withdrawn work | §4 |
|
|
12
|
-
| 3 | a past-tense promise about something unpublished | §6 |
|
|
13
|
-
|
|
14
|
-
Text edits follow.
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: "Paper review — an old report"
|
|
3
|
-
created: 2026-01-01
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Findings
|
|
7
|
-
|
|
8
|
-
| # | what | where |
|
|
9
|
-
|---|---|---|
|
|
10
|
-
| 1 | the number does not match | §1 |
|
|
11
|
-
| 2 | a reference to a withdrawn work | §4 |
|
|
12
|
-
| 3 | a promise about something unpublished | §6 |
|
|
13
|
-
|
|
14
|
-
There is no analysis of causes here — the report predates the rule.
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: "A note on the report format"
|
|
3
|
-
created: 2026-09-01
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
An example of WHAT a findings table looks like — not itself a finding:
|
|
7
|
-
|
|
8
|
-
```markdown
|
|
9
|
-
| # | what | where |
|
|
10
|
-
|---|---|---|
|
|
11
|
-
| 1 | example | §1 |
|
|
12
|
-
| 2 | example | §2 |
|
|
13
|
-
| 3 | example | §3 |
|
|
14
|
-
```
|
|
15
|
-
|
|
16
|
-
There must be no analysis of causes here: this describes the format, it is not a report.
|