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.
- package/CLAUDE.md +2 -2
- package/dist/adapters/banal/failure.d.ts +1 -7
- package/dist/adapters/banal/failure.d.ts.map +1 -1
- package/dist/adapters/banal/failure.js +5 -7
- package/dist/adapters/banal/failure.js.map +1 -1
- package/dist/adapters/banal/index.d.ts.map +1 -1
- package/dist/adapters/banal/index.js +8 -11
- package/dist/adapters/banal/index.js.map +1 -1
- package/dist/adapters/banal/install.d.ts.map +1 -1
- package/dist/adapters/banal/install.js +4 -3
- package/dist/adapters/banal/install.js.map +1 -1
- package/dist/adapters/banal/invocation.d.ts +9 -4
- package/dist/adapters/banal/invocation.d.ts.map +1 -1
- package/dist/adapters/banal/invocation.js +13 -1
- package/dist/adapters/banal/invocation.js.map +1 -1
- package/dist/adapters/banal/locate.d.ts +12 -9
- package/dist/adapters/banal/locate.d.ts.map +1 -1
- package/dist/adapters/banal/locate.js +19 -12
- package/dist/adapters/banal/locate.js.map +1 -1
- package/dist/adapters/banal/run.d.ts +10 -1
- package/dist/adapters/banal/run.d.ts.map +1 -1
- package/dist/adapters/banal/run.js +8 -4
- package/dist/adapters/banal/run.js.map +1 -1
- package/dist/adapters/banal/settings.d.ts +1 -1
- package/dist/adapters/banal/settings.d.ts.map +1 -1
- package/dist/adapters/banal/settings.js +2 -1
- package/dist/adapters/banal/settings.js.map +1 -1
- package/dist/adapters/memory/index.d.ts.map +1 -1
- package/dist/adapters/memory/index.js +8 -2
- package/dist/adapters/memory/index.js.map +1 -1
- package/dist/adapters/node/process.io.d.ts +6 -3
- package/dist/adapters/node/process.io.d.ts.map +1 -1
- package/dist/adapters/node/process.io.js.map +1 -1
- package/dist/adapters/node/workspace.io.d.ts.map +1 -1
- package/dist/adapters/node/workspace.io.js +4 -2
- package/dist/adapters/node/workspace.io.js.map +1 -1
- package/dist/adapters/references/index.d.ts.map +1 -1
- package/dist/adapters/references/index.js +4 -2
- package/dist/adapters/references/index.js.map +1 -1
- package/dist/build-engine.d.ts +1 -1
- package/dist/build-engine.d.ts.map +1 -1
- package/dist/build-engine.js +8 -1
- package/dist/build-engine.js.map +1 -1
- package/dist/build.d.ts +2 -3
- package/dist/build.d.ts.map +1 -1
- package/dist/build.js +5 -6
- package/dist/build.js.map +1 -1
- package/dist/caller-path.d.ts +3 -0
- package/dist/caller-path.d.ts.map +1 -0
- package/dist/caller-path.js +13 -0
- package/dist/caller-path.js.map +1 -0
- package/dist/cli.d.ts +10 -17
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +62 -12
- package/dist/cli.js.map +1 -1
- package/dist/doctor.d.ts +12 -3
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +2 -1
- package/dist/doctor.js.map +1 -1
- package/dist/domain/paths.d.ts +8 -2
- package/dist/domain/paths.d.ts.map +1 -1
- package/dist/domain/paths.js +12 -1
- package/dist/domain/paths.js.map +1 -1
- package/dist/domain/ready.d.ts +24 -0
- package/dist/domain/ready.d.ts.map +1 -0
- package/dist/domain/ready.js +11 -0
- package/dist/domain/ready.js.map +1 -0
- package/dist/domain/record.d.ts +8 -0
- package/dist/domain/record.d.ts.map +1 -0
- package/dist/domain/record.js +8 -0
- package/dist/domain/record.js.map +1 -0
- package/dist/domain/sha256.d.ts.map +1 -1
- package/dist/domain/sha256.js +4 -2
- package/dist/domain/sha256.js.map +1 -1
- package/dist/engine.d.ts +23 -22
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js.map +1 -1
- package/dist/eslint-rules/bib-reachable-entry.d.ts +1 -1
- package/dist/eslint-rules/bib-reachable-entry.js.map +1 -1
- package/dist/eslint-rules/install-path-literals.d.ts +2 -2
- package/dist/eslint-rules/install-path-literals.js.map +1 -1
- package/dist/eslint-rules/paper-research-question.d.ts +1 -1
- package/dist/eslint-rules/paper-research-question.js.map +1 -1
- package/dist/eslint-rules/paper-stages.d.ts +2 -2
- package/dist/eslint-rules/paper-stages.js.map +1 -1
- package/dist/eslint-rules/paper-typography.d.ts +6 -6
- package/dist/eslint-rules/paper-typography.js.map +1 -1
- package/dist/eslint-rules/pdf-last-page-balance.d.ts +1 -1
- package/dist/eslint-rules/pdf-last-page-balance.js.map +1 -1
- package/dist/eslint-rules/review-frontmatter.d.ts +2 -2
- package/dist/eslint-rules/review-frontmatter.js.map +1 -1
- package/dist/eslint-rules/sibling-frontmatter.d.ts +1 -1
- package/dist/eslint-rules/sibling-frontmatter.d.ts.map +1 -1
- package/dist/eslint-rules/temp-root-realpath.d.ts +1 -1
- package/dist/eslint-rules/temp-root-realpath.js.map +1 -1
- package/dist/eslint-rules/tex-build.d.ts +2 -2
- package/dist/eslint-rules/tex-build.js.map +1 -1
- package/dist/facts-file.d.ts.map +1 -1
- package/dist/facts-file.js +29 -26
- package/dist/facts-file.js.map +1 -1
- package/dist/hooks-settings.d.ts.map +1 -1
- package/dist/hooks-settings.js +17 -2
- package/dist/hooks-settings.js.map +1 -1
- package/dist/init.d.ts +3 -4
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +18 -8
- package/dist/init.js.map +1 -1
- package/dist/lib/paper-config.d.ts.map +1 -1
- package/dist/lib/paper-config.js +1 -5
- package/dist/lib/paper-config.js.map +1 -1
- package/dist/new-paper.d.ts.map +1 -1
- package/dist/new-paper.js +5 -1
- package/dist/new-paper.js.map +1 -1
- package/dist/paper-files.d.ts +4 -4
- package/dist/paper-files.d.ts.map +1 -1
- package/dist/paper-files.js +6 -6
- package/dist/paper-files.js.map +1 -1
- package/dist/paper-settings.js +3 -3
- package/dist/paper-settings.js.map +1 -1
- package/dist/pdf-facts.d.ts +51 -1
- package/dist/pdf-facts.d.ts.map +1 -1
- package/dist/pdf-facts.js +23 -15
- package/dist/pdf-facts.js.map +1 -1
- package/dist/pdf-geometry.d.ts.map +1 -1
- package/dist/pdf-geometry.js +2 -3
- package/dist/pdf-geometry.js.map +1 -1
- package/dist/ports/tool-installer.d.ts +2 -14
- package/dist/ports/tool-installer.d.ts.map +1 -1
- package/dist/presets.d.ts.map +1 -1
- package/dist/presets.js +16 -4
- package/dist/presets.js.map +1 -1
- package/dist/references.d.ts.map +1 -1
- package/dist/references.js +4 -4
- package/dist/references.js.map +1 -1
- package/dist/rules-config.d.ts +26 -1
- package/dist/rules-config.d.ts.map +1 -1
- package/dist/rules-config.js +9 -9
- package/dist/rules-config.js.map +1 -1
- package/dist/tex-requirements.d.ts +4 -0
- package/dist/tex-requirements.d.ts.map +1 -1
- package/dist/tex-requirements.js +14 -2
- package/dist/tex-requirements.js.map +1 -1
- package/dist/types.d.ts +5 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/venue-rules.d.ts.map +1 -1
- package/dist/venue-rules.js +20 -7
- package/dist/venue-rules.js.map +1 -1
- package/docs/configuration.md +2 -2
- package/eslint-rules/bib-reachable-entry.ts +1 -1
- package/eslint-rules/install-path-literals.ts +2 -2
- package/eslint-rules/paper-research-question.ts +1 -1
- package/eslint-rules/paper-stages.ts +2 -2
- package/eslint-rules/paper-typography.ts +2 -2
- package/eslint-rules/pdf-last-page-balance.ts +1 -1
- package/eslint-rules/review-frontmatter.ts +1 -1
- package/eslint-rules/temp-root-realpath.ts +1 -1
- package/eslint-rules/tex-build.ts +2 -2
- package/eslint.config.mjs +7 -0
- package/fixtures/install-path-literals/clean.fixture.mjs +1 -1
- package/fixtures/install-path-literals/clean.md +2 -2
- package/fixtures/install-path-literals/defect.fixture.mjs +1 -1
- package/fixtures/install-path-literals/defect.md +2 -2
- package/hooks/paper-status-gates.sh +9 -19
- package/lib/paper-config.harness.mjs +1 -1
- package/lib/paper-config.ts +1 -5
- package/lib/skill-checks.mjs +24 -381
- package/lib/skill-checks.test.mjs +63 -115
- package/lib/skill-corpus.mjs +10 -251
- package/lib/skill-corpus.test.mjs +2 -13
- package/lib/skill-trigger-cases.mjs +1 -1
- package/package.json +1 -1
- package/scripts/coverage-config.test.ts +0 -1
- package/scripts/harness-api.frozen.json +0 -1
- package/skills/analyze-sibling-paper/SKILL.md +1 -39
- package/skills/analyze-sibling-paper/SKILL.md.spec.ts +0 -38
- package/skills/argument-arc/SKILL.md +2 -36
- package/skills/argument-arc/SKILL.md.spec.ts +1 -43
- package/skills/build-benchmark/SKILL.md +1 -41
- package/skills/build-benchmark/SKILL.md.spec.ts +0 -40
- package/skills/camera-ready/SKILL.md +1 -34
- package/skills/camera-ready/SKILL.md.spec.ts +0 -33
- package/skills/cold-read-diff/SKILL.md +1 -35
- package/skills/cold-read-diff/SKILL.md.spec.ts +0 -34
- package/skills/draft-paper/SKILL.md +2 -41
- package/skills/draft-paper/SKILL.md.spec.ts +1 -50
- package/skills/extend-paper/SKILL.md +2 -33
- package/skills/extend-paper/SKILL.md.spec.ts +1 -42
- package/skills/find-venue/SKILL.md +2 -38
- package/skills/find-venue/SKILL.md.spec.ts +1 -47
- package/skills/grade-paper-writing/SKILL.md +3 -38
- package/skills/grade-paper-writing/SKILL.md.spec.ts +2 -47
- package/skills/grade-paper-writing/prose-lint.mjs +2 -3
- package/skills/grade-paper-writing/prose-lint.test.ts +1 -1
- package/skills/harden-paper/SKILL.md +1 -39
- package/skills/harden-paper/SKILL.md.spec.ts +0 -38
- package/skills/map-prior-work/SKILL.md +1 -35
- package/skills/map-prior-work/SKILL.md.spec.ts +0 -34
- package/skills/osf-artifact-upload/osf-artifact-upload.harness.ts +3 -4
- package/skills/paper-adversarial-review/SKILL.md +2 -35
- package/skills/paper-adversarial-review/SKILL.md.spec.ts +1 -43
- package/skills/paper-pipeline/SKILL.md +2 -28
- package/skills/paper-pipeline/SKILL.md.spec.ts +1 -27
- package/skills/paper-pipeline/grade-paper-writing-ablation.eval.mjs +1 -1
- package/skills/paper-pipeline/paper-pipeline.harness.mjs +25 -40
- package/skills/paper-pipeline/references/acceptance-gate.md +1 -6
- package/skills/paper-pipeline/references/pipeline-status-template.md +8 -35
- package/skills/paper-pipeline/scripts/README.md +30 -225
- package/skills/paper-pipeline/scripts/artifact-coverage.harness.mjs +4 -8
- package/skills/paper-pipeline/scripts/consumer.harness.mjs +6 -104
- package/skills/paper-pipeline/scripts/consumer.mjs +23 -104
- package/skills/paper-pipeline/scripts/generated-code.harness.mjs +2 -3
- package/skills/paper-pipeline/scripts/population-map.harness.mjs +3 -3
- package/skills/paper-status/SKILL.md +2 -42
- package/skills/paper-status/SKILL.md.spec.ts +1 -41
- package/skills/pc-panel-review/SKILL.md +2 -46
- package/skills/pc-panel-review/SKILL.md.spec.ts +1 -45
- package/skills/plan-paper-timeline/SKILL.md +2 -36
- package/skills/plan-paper-timeline/SKILL.md.spec.ts +0 -36
- package/skills/render-paper/SKILL.md +1 -37
- package/skills/render-paper/SKILL.md.spec.ts +0 -36
- package/skills/research-ideate/SKILL.md +2 -39
- package/skills/research-ideate/SKILL.md.spec.ts +1 -47
- package/skills/study-accepted-papers/SKILL.md +1 -34
- package/skills/study-accepted-papers/SKILL.md.spec.ts +0 -33
- package/skills/submit-paper/SKILL.md +1 -33
- package/skills/submit-paper/SKILL.md.spec.ts +0 -32
- package/skills/sweep-design-space/SKILL.md +1 -38
- package/skills/sweep-design-space/SKILL.md.spec.ts +0 -37
- package/skills/tighten-paper/SKILL.md +2 -39
- package/skills/tighten-paper/SKILL.md.spec.ts +1 -47
- package/skills/tighten-paper/structure.mjs +4 -11
- package/skills/verify-citations/SKILL.md +2 -38
- package/skills/verify-citations/SKILL.md.spec.ts +1 -37
- package/src/adapters/banal/failure.ts +9 -10
- package/src/adapters/banal/index.test.ts +2 -2
- package/src/adapters/banal/index.ts +8 -10
- package/src/adapters/banal/install.ts +9 -4
- package/src/adapters/banal/invocation.test.ts +20 -8
- package/src/adapters/banal/invocation.ts +23 -8
- package/src/adapters/banal/locate.test.ts +2 -2
- package/src/adapters/banal/locate.ts +27 -21
- package/src/adapters/banal/run.test.ts +2 -2
- package/src/adapters/banal/run.ts +16 -10
- package/src/adapters/banal/settings.ts +2 -2
- package/src/adapters/curl/download.test.ts +4 -4
- package/src/adapters/memory/index.ts +4 -3
- package/src/adapters/node/files.test.ts +5 -3
- package/src/adapters/node/process.io.ts +9 -2
- package/src/adapters/node/process.test.ts +4 -4
- package/src/adapters/node/workspace.io.ts +9 -4
- package/src/adapters/references/index.ts +7 -2
- package/src/build-engine.test.ts +11 -6
- package/src/build-engine.ts +10 -5
- package/src/build.test.ts +10 -11
- package/src/build.ts +8 -9
- package/src/caller-path.ts +13 -0
- package/src/cli.harness.mjs +0 -2
- package/src/cli.test.ts +19 -8
- package/src/cli.ts +82 -25
- package/src/doctor.test.ts +1 -1
- package/src/doctor.ts +14 -5
- package/src/domain/paths.test.ts +15 -0
- package/src/domain/paths.ts +20 -1
- package/src/domain/ready.ts +31 -0
- package/src/domain/record.test.ts +20 -0
- package/src/domain/record.ts +12 -0
- package/src/domain/sha256.ts +5 -3
- package/src/engine.ts +30 -2
- package/src/facts-file.ts +43 -28
- package/src/hooks-settings.harness.ts +17 -0
- package/src/hooks-settings.ts +28 -4
- package/src/init.test.ts +25 -5
- package/src/init.ts +26 -12
- package/src/new-paper.harness.mjs +7 -23
- package/src/new-paper.ts +7 -3
- package/src/paper-files.test.ts +22 -19
- package/src/paper-files.ts +16 -27
- package/src/paper-settings.test.ts +2 -2
- package/src/paper-settings.ts +5 -5
- package/src/pdf-facts.test.ts +16 -5
- package/src/pdf-facts.ts +79 -22
- package/src/pdf-geometry.ts +5 -3
- package/src/ports/tool-installer.ts +2 -17
- package/src/presets.ts +28 -14
- package/src/references.test.ts +25 -19
- package/src/references.ts +4 -5
- package/src/rules-config.ts +40 -11
- package/src/tex-requirements.test.ts +21 -0
- package/src/tex-requirements.ts +29 -6
- package/src/toolchain.test.ts +9 -5
- package/src/toolchain.ts +2 -2
- package/src/types.ts +5 -3
- package/src/venue-rules.test.ts +8 -4
- package/src/venue-rules.ts +21 -11
- package/skills/paper-pipeline/scripts/announce.mjs +0 -67
- package/skills/paper-pipeline/scripts/announce.test.mjs +0 -102
- package/skills/paper-pipeline/scripts/fixtures/clean/PIPELINE-STATUS.md +0 -51
- package/skills/paper-pipeline/scripts/fixtures/dirty/PIPELINE-STATUS.md +0 -52
- package/skills/paper-pipeline/scripts/fixtures/dirty/paper.md +0 -6
- package/skills/paper-pipeline/scripts/fixtures/scorecard.ts +0 -100
- package/skills/paper-pipeline/scripts/ledger.cli.test.mjs +0 -302
- package/skills/paper-pipeline/scripts/ledger.mjs +0 -623
- package/skills/paper-pipeline/scripts/ledger.test.mjs +0 -254
- package/skills/paper-pipeline/scripts/pipeline-check.cli.test.mjs +0 -474
- package/skills/paper-pipeline/scripts/pipeline-check.harness.mjs +0 -328
- package/skills/paper-pipeline/scripts/pipeline-check.mjs +0 -750
- package/skills/paper-pipeline/scripts/pipeline-edges.mjs +0 -169
- package/skills/paper-pipeline/scripts/pipeline-edges.test.mjs +0 -73
- package/skills/paper-pipeline/scripts/run-mechanical.mjs +0 -648
- package/skills/paper-pipeline/scripts/run-mechanical.test.mjs +0 -468
- package/skills/paper-pipeline/scripts/status.mjs +0 -295
- package/skills/paper-pipeline/scripts/status.test.mjs +0 -232
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
name: paper-adversarial-review
|
|
3
3
|
description: Use when asking "red-team this paper" / "what would Reviewer 2 attack?" / "find the weaknesses before I submit" — ONE fast hostile-but-fair review of a paper draft. Surfaces overclaims, methodology holes, missing baselines/citations, novelty concerns, threats to validity, and desk-reject risks, with concrete fixes, led by a multi-axis 1–5 scorecard whose card composes into a pc-panel-review panel. NOT the multi-reviewer accept/reject decision (pc-panel-review), a writing grade (grade-paper-writing — this skill consumes its stall inventory rather than re-grading prose), or the full pre-submit gate (harden-paper). Especially for security and agentic-coding measurement papers.
|
|
4
4
|
context: fork
|
|
5
|
-
allowed-tools: [Read, Write, Grep, Glob, Agent, Skill
|
|
5
|
+
allowed-tools: [Read, Write, Grep, Glob, Agent, Skill]
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
<!-- vigiles:sha256:
|
|
8
|
+
<!-- vigiles:sha256:68dcbcc1b7ab5348 compiled from skills/paper-adversarial-review/SKILL.md.spec.ts -->
|
|
9
9
|
|
|
10
10
|
# paper-adversarial-review — be the reviewer who wants to reject it
|
|
11
11
|
|
|
@@ -15,17 +15,6 @@ allowed-tools: [Read, Write, Grep, Glob, Agent, Skill, Bash(node .claude/skills/
|
|
|
15
15
|
> CFP-fit score (formerly `venue-review-sim`). Reach for an atom (this, or venue-fit mode) for a quick
|
|
16
16
|
> spot-check; run the panel for the decision.
|
|
17
17
|
|
|
18
|
-
## Run me
|
|
19
|
-
|
|
20
|
-
🔴 FIRST, before any other step:
|
|
21
|
-
|
|
22
|
-
```
|
|
23
|
-
node .claude/skills/paper-pipeline/scripts/announce.mjs paper-adversarial-review <paper-dir>
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
An advisory pass cannot be observed failing — silence is both its error state and its normal
|
|
27
|
-
state — so starting is an event, and events get written down.
|
|
28
|
-
|
|
29
18
|
Purpose: catch what a real peer reviewer will hit, while it's still fixable. Peer review is
|
|
30
19
|
**read, not run** — reviewers judge the *text, figures, and reported numbers*, rarely execute code.
|
|
31
20
|
So the paper must be self-contained and airtight on its face. This skill simulates the skeptical
|
|
@@ -91,28 +80,6 @@ venue + paper type (short/full/position/benchmark). Ask for the structured outpu
|
|
|
91
80
|
- **Strongest reframing** if the contribution is undersold or misframed.
|
|
92
81
|
- **What to cut** (for length / TMI) and **what to add** (for soundness).
|
|
93
82
|
|
|
94
|
-
## Record the verdict
|
|
95
|
-
|
|
96
|
-
🔴 LAST step, once the deliverable exists:
|
|
97
|
-
|
|
98
|
-
```
|
|
99
|
-
node .claude/skills/paper-pipeline/scripts/ledger.mjs record paper-adversarial-review <paper-dir> FINDING <count> <report-path>
|
|
100
|
-
node .claude/skills/paper-pipeline/scripts/ledger.mjs record paper-adversarial-review <paper-dir> ABSTAINED <reason> "<one line>"
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
**FINDING** — `<count>` is the number of ranked weaknesses, `<report-path>` the review with its
|
|
104
|
-
scorecard. Add `--blocking` when the leaning is reject, or there is a live desk-reject risk.
|
|
105
|
-
**ABSTAINED** — `no-witness`: the hostile read found nothing. `blocked`: there was no rendered
|
|
106
|
-
draft to attack.
|
|
107
|
-
|
|
108
|
-
🔴 **There is no PASS, and this skill is the reason the word was dangerous.** A hostile read that
|
|
109
|
-
found nothing either met a very good paper or was not hostile, and the old vocabulary wrote the
|
|
110
|
-
same word for both. `no-witness` says the true thing — this reader has no witness for the paper
|
|
111
|
-
being sound — and leaves the second possibility standing where it belongs, in view.
|
|
112
|
-
|
|
113
|
-
Record the weakness count, not the Overall 1–5. The average is exactly what this skill tells its own
|
|
114
|
-
reviewer to distrust — the lowest one or two axes are the story.
|
|
115
|
-
|
|
116
83
|
## Rules
|
|
117
84
|
- Be adversarial but *fair* and *specific* — "weak" is useless; "the 65% claim in the abstract isn't
|
|
118
85
|
supported because the pooled bill is −1%, reword to X" is useful.
|
|
@@ -11,16 +11,7 @@ export default experimental_skill({
|
|
|
11
11
|
description:
|
|
12
12
|
'Use when asking "red-team this paper" / "what would Reviewer 2 attack?" / "find the weaknesses before I submit" — ONE fast hostile-but-fair review of a paper draft. Surfaces overclaims, methodology holes, missing baselines/citations, novelty concerns, threats to validity, and desk-reject risks, with concrete fixes, led by a multi-axis 1–5 scorecard whose card composes into a pc-panel-review panel. NOT the multi-reviewer accept/reject decision (pc-panel-review), a writing grade (grade-paper-writing — this skill consumes its stall inventory rather than re-grading prose), or the full pre-submit gate (harden-paper). Especially for security and agentic-coding measurement papers.',
|
|
13
13
|
context: "fork",
|
|
14
|
-
tools: [
|
|
15
|
-
"Read",
|
|
16
|
-
"Write",
|
|
17
|
-
"Grep",
|
|
18
|
-
"Glob",
|
|
19
|
-
"Agent",
|
|
20
|
-
"Skill",
|
|
21
|
-
"Bash(node .claude/skills/paper-pipeline/scripts/announce.mjs:*)",
|
|
22
|
-
"Bash(node .claude/skills/paper-pipeline/scripts/ledger.mjs:*)",
|
|
23
|
-
],
|
|
14
|
+
tools: ["Read", "Write", "Grep", "Glob", "Agent", "Skill"],
|
|
24
15
|
body: `
|
|
25
16
|
# paper-adversarial-review — be the reviewer who wants to reject it
|
|
26
17
|
|
|
@@ -30,17 +21,6 @@ export default experimental_skill({
|
|
|
30
21
|
> CFP-fit score (formerly \`venue-review-sim\`). Reach for an atom (this, or venue-fit mode) for a quick
|
|
31
22
|
> spot-check; run the panel for the decision.
|
|
32
23
|
|
|
33
|
-
## Run me
|
|
34
|
-
|
|
35
|
-
🔴 FIRST, before any other step:
|
|
36
|
-
|
|
37
|
-
\`\`\`
|
|
38
|
-
node .claude/skills/paper-pipeline/scripts/announce.mjs paper-adversarial-review <paper-dir>
|
|
39
|
-
\`\`\`
|
|
40
|
-
|
|
41
|
-
An advisory pass cannot be observed failing — silence is both its error state and its normal
|
|
42
|
-
state — so starting is an event, and events get written down.
|
|
43
|
-
|
|
44
24
|
Purpose: catch what a real peer reviewer will hit, while it's still fixable. Peer review is
|
|
45
25
|
**read, not run** — reviewers judge the *text, figures, and reported numbers*, rarely execute code.
|
|
46
26
|
So the paper must be self-contained and airtight on its face. This skill simulates the skeptical
|
|
@@ -106,28 +86,6 @@ venue + paper type (short/full/position/benchmark). Ask for the structured outpu
|
|
|
106
86
|
- **Strongest reframing** if the contribution is undersold or misframed.
|
|
107
87
|
- **What to cut** (for length / TMI) and **what to add** (for soundness).
|
|
108
88
|
|
|
109
|
-
## Record the verdict
|
|
110
|
-
|
|
111
|
-
🔴 LAST step, once the deliverable exists:
|
|
112
|
-
|
|
113
|
-
\`\`\`
|
|
114
|
-
node .claude/skills/paper-pipeline/scripts/ledger.mjs record paper-adversarial-review <paper-dir> FINDING <count> <report-path>
|
|
115
|
-
node .claude/skills/paper-pipeline/scripts/ledger.mjs record paper-adversarial-review <paper-dir> ABSTAINED <reason> "<one line>"
|
|
116
|
-
\`\`\`
|
|
117
|
-
|
|
118
|
-
**FINDING** — \`<count>\` is the number of ranked weaknesses, \`<report-path>\` the review with its
|
|
119
|
-
scorecard. Add \`--blocking\` when the leaning is reject, or there is a live desk-reject risk.
|
|
120
|
-
**ABSTAINED** — \`no-witness\`: the hostile read found nothing. \`blocked\`: there was no rendered
|
|
121
|
-
draft to attack.
|
|
122
|
-
|
|
123
|
-
🔴 **There is no PASS, and this skill is the reason the word was dangerous.** A hostile read that
|
|
124
|
-
found nothing either met a very good paper or was not hostile, and the old vocabulary wrote the
|
|
125
|
-
same word for both. \`no-witness\` says the true thing — this reader has no witness for the paper
|
|
126
|
-
being sound — and leaves the second possibility standing where it belongs, in view.
|
|
127
|
-
|
|
128
|
-
Record the weakness count, not the Overall 1–5. The average is exactly what this skill tells its own
|
|
129
|
-
reviewer to distrust — the lowest one or two axes are the story.
|
|
130
|
-
|
|
131
89
|
## Rules
|
|
132
90
|
- Be adversarial but *fair* and *specific* — "weak" is useless; "the 65% claim in the abstract isn't
|
|
133
91
|
supported because the pooled bill is −1%, reword to X" is useful.
|
|
@@ -4,7 +4,7 @@ description: The orchestrator for writing a research paper end-to-end, from idea
|
|
|
4
4
|
allowed-tools: [Read, Write, Edit, Grep, Glob, Bash, WebSearch, WebFetch, Agent, Skill]
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
<!-- vigiles:sha256:
|
|
7
|
+
<!-- vigiles:sha256:a15a3fcf5fdfedf7 compiled from skills/paper-pipeline/SKILL.md.spec.ts -->
|
|
8
8
|
|
|
9
9
|
# paper-pipeline — the conductor for the whole organism
|
|
10
10
|
|
|
@@ -44,30 +44,6 @@ their grade/result, what's open,* and a one-line **submit-ready verdict**. Rules
|
|
|
44
44
|
- **"Is paper X ready / what's checked?"** = read this file (verdict + any `☐`/`◐`/`⚠` rows), don't
|
|
45
45
|
reconstruct from chat.
|
|
46
46
|
- Distinct from `SUBMIT-CHECKLIST.md` (venue-format compliance); both must be green before upload.
|
|
47
|
-
- 🔴 **Enforcement leg (prose-isn't-policy), and it is a script, not a paragraph.**
|
|
48
|
-
`scripts/pipeline-check.mjs` reads this file on every paper edit and reports the failures that
|
|
49
|
-
actually happened on real papers: a CONTINUOUS check whose last run predates the current text, a GATE
|
|
50
|
-
that ran without its required input, **a `Requires` cell that omits an edge the pipeline declares**
|
|
51
|
-
(the canonical set is `scripts/pipeline-edges.mjs`, with the admitting sentence per edge), a study
|
|
52
|
-
that ran with no stated claim, the `access` row not green inside the moderation window, and a verdict
|
|
53
|
-
line that is just an accept probability. Run it directly
|
|
54
|
-
with `node .claude/skills/paper-pipeline/scripts/pipeline-check.mjs <paper-dir>`; it is wired into
|
|
55
|
-
`.claude/hooks/paper-status-gates.sh` and asserted in `.claude/hooks/hooks.harness.mjs`.
|
|
56
|
-
**The grading itself stays judgment** (that is the skills' job) — only the mechanically checkable
|
|
57
|
-
parts are compiled. *Added 2026-08-03, the day three hooks in this repo were found to have been dead
|
|
58
|
-
for weeks: an advisory that is never exercised is indistinguishable from one that works.*
|
|
59
|
-
|
|
60
|
-
🔴 **As of 2026-08-26, this file is read by TWO things.** Sixteen checks over it live as
|
|
61
|
-
`@eslint/markdown` rules in `eslint-rules/pipeline-status.mjs` (run:
|
|
62
|
-
`npx eslint <paper-dir>/PIPELINE-STATUS.md`; five of them are `error`), while
|
|
63
|
-
`scripts/pipeline-check.mjs` holds six whose input lies OUTSIDE the file — git, the clock, the
|
|
64
|
-
`reviews/` directory, `process.env`. The classification of all 22 lives in the
|
|
65
|
-
author's private notes (`<papers-root>/research/2026-08-26-klassifikatsiya-pipeline-check.md`).
|
|
66
|
-
|
|
67
|
-
⚠️ The paragraph above lived for a day NOT HERE but directly in `SKILL.md` — i.e. in the
|
|
68
|
-
generated file. The very first `vigiles compile` (27.08) ate it, and it was not a human who
|
|
69
|
-
noticed but an agent whose compile had just erased someone else's edit. **An edit to `SKILL.md`
|
|
70
|
-
without `.spec.ts` is an edit with an expiration date: the next compile.**
|
|
71
47
|
|
|
72
48
|
## 🗺️ Where every check actually runs — and where it can be walked around
|
|
73
49
|
|
|
@@ -133,9 +109,7 @@ Prior art is named in the file header (`adewale/skill-eval-harness` does this to
|
|
|
133
109
|
|
|
134
110
|
🔴 **Still manual, and no mechanism has been found for it:** the **cold read** — a reader with no
|
|
135
111
|
context restating each sentence — is the only check that catches a sentence that is short, true,
|
|
136
|
-
threshold-passing and meaningless. It needs a fresh subagent, so no hook can run it.
|
|
137
|
-
mechanised is noticing that it is *overdue*: `pipeline-check.mjs` reports `stale-cold-read` when the
|
|
138
|
-
prose changed after the last one.
|
|
112
|
+
threshold-passing and meaningless. It needs a fresh subagent, so no hook can run it.
|
|
139
113
|
|
|
140
114
|
Install the git hook once per clone: `git config core.hooksPath .githooks`.
|
|
141
115
|
|
|
@@ -61,30 +61,6 @@ their grade/result, what's open,* and a one-line **submit-ready verdict**. Rules
|
|
|
61
61
|
- **"Is paper X ready / what's checked?"** = read this file (verdict + any \`☐\`/\`◐\`/\`⚠\` rows), don't
|
|
62
62
|
reconstruct from chat.
|
|
63
63
|
- Distinct from \`SUBMIT-CHECKLIST.md\` (venue-format compliance); both must be green before upload.
|
|
64
|
-
- 🔴 **Enforcement leg (prose-isn't-policy), and it is a script, not a paragraph.**
|
|
65
|
-
\`scripts/pipeline-check.mjs\` reads this file on every paper edit and reports the failures that
|
|
66
|
-
actually happened on real papers: a CONTINUOUS check whose last run predates the current text, a GATE
|
|
67
|
-
that ran without its required input, **a \`Requires\` cell that omits an edge the pipeline declares**
|
|
68
|
-
(the canonical set is \`scripts/pipeline-edges.mjs\`, with the admitting sentence per edge), a study
|
|
69
|
-
that ran with no stated claim, the \`access\` row not green inside the moderation window, and a verdict
|
|
70
|
-
line that is just an accept probability. Run it directly
|
|
71
|
-
with \`node .claude/skills/paper-pipeline/scripts/pipeline-check.mjs <paper-dir>\`; it is wired into
|
|
72
|
-
\`.claude/hooks/paper-status-gates.sh\` and asserted in \`.claude/hooks/hooks.harness.mjs\`.
|
|
73
|
-
**The grading itself stays judgment** (that is the skills' job) — only the mechanically checkable
|
|
74
|
-
parts are compiled. *Added 2026-08-03, the day three hooks in this repo were found to have been dead
|
|
75
|
-
for weeks: an advisory that is never exercised is indistinguishable from one that works.*
|
|
76
|
-
|
|
77
|
-
🔴 **As of 2026-08-26, this file is read by TWO things.** Sixteen checks over it live as
|
|
78
|
-
\`@eslint/markdown\` rules in \`eslint-rules/pipeline-status.mjs\` (run:
|
|
79
|
-
\`npx eslint <paper-dir>/PIPELINE-STATUS.md\`; five of them are \`error\`), while
|
|
80
|
-
\`scripts/pipeline-check.mjs\` holds six whose input lies OUTSIDE the file — git, the clock, the
|
|
81
|
-
\`reviews/\` directory, \`process.env\`. The classification of all 22 lives in the
|
|
82
|
-
author's private notes (\`<papers-root>/research/2026-08-26-klassifikatsiya-pipeline-check.md\`).
|
|
83
|
-
|
|
84
|
-
⚠️ The paragraph above lived for a day NOT HERE but directly in \`SKILL.md\` — i.e. in the
|
|
85
|
-
generated file. The very first \`vigiles compile\` (27.08) ate it, and it was not a human who
|
|
86
|
-
noticed but an agent whose compile had just erased someone else's edit. **An edit to \`SKILL.md\`
|
|
87
|
-
without \`.spec.ts\` is an edit with an expiration date: the next compile.**
|
|
88
64
|
|
|
89
65
|
## 🗺️ Where every check actually runs — and where it can be walked around
|
|
90
66
|
|
|
@@ -150,9 +126,7 @@ Prior art is named in the file header (\`adewale/skill-eval-harness\` does this
|
|
|
150
126
|
|
|
151
127
|
🔴 **Still manual, and no mechanism has been found for it:** the **cold read** — a reader with no
|
|
152
128
|
context restating each sentence — is the only check that catches a sentence that is short, true,
|
|
153
|
-
threshold-passing and meaningless. It needs a fresh subagent, so no hook can run it.
|
|
154
|
-
mechanised is noticing that it is *overdue*: \`pipeline-check.mjs\` reports \`stale-cold-read\` when the
|
|
155
|
-
prose changed after the last one.
|
|
129
|
+
threshold-passing and meaningless. It needs a fresh subagent, so no hook can run it.
|
|
156
130
|
|
|
157
131
|
Install the git hook once per clone: \`git config core.hooksPath .githooks\`.
|
|
158
132
|
|
|
@@ -226,7 +226,7 @@
|
|
|
226
226
|
*
|
|
227
227
|
* ⚠️ 2026-08-09: A0 IS TWO TOKENS OFF THE TEXT MEASURED BELOW. The scorecard row ids were
|
|
228
228
|
* renamed from two-letter codes to words (`Hn` → `claims`) because the two-letter space had
|
|
229
|
-
* collided
|
|
229
|
+
* collided. The target's description carried one such
|
|
230
230
|
* reference, so "…mandates the Hn claim-preservation diff." became "…mandates the
|
|
231
231
|
* claims-preservation diff (row `claims`)." A0 is still read from disk and every guard still
|
|
232
232
|
* passes; the numbers below were measured on the pre-rename bytes and are left as recorded.
|
|
@@ -10,16 +10,14 @@
|
|
|
10
10
|
* -> catches a skill renamed or removed while the conductor still
|
|
11
11
|
* points at the old name. The agent reads a route to nowhere.
|
|
12
12
|
*
|
|
13
|
-
* backward every
|
|
13
|
+
* backward every skill this package ships is named by the conductor
|
|
14
14
|
* -> catches the far more common one: a stage skill added and never
|
|
15
15
|
* wired into the map, so the orchestrated run silently skips it.
|
|
16
16
|
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
* that stopped being wired, or one that HAS since been routed, fails — so the
|
|
22
|
-
* debt cannot quietly become permanent.
|
|
17
|
+
* The skills the map does not name are held in an explicit list (NOT_IN_MAP), each
|
|
18
|
+
* with its reason, and the list is checked for rot in both directions: an entry
|
|
19
|
+
* naming a skill that no longer ships, or one the map HAS since named, fails — so
|
|
20
|
+
* an exception cannot quietly outlive its reason.
|
|
23
21
|
*
|
|
24
22
|
* ⚠️ COVERAGE NOTE. Before this file, `paper-pipeline` counted as covered because
|
|
25
23
|
* five older eval files sit in its directory — and every one of them measures
|
|
@@ -37,13 +35,8 @@ const HERE = dirname(fileURLToPath(import.meta.url));
|
|
|
37
35
|
const SKILLS_DIR = join(HERE, "..");
|
|
38
36
|
const SELF = "paper-pipeline";
|
|
39
37
|
|
|
40
|
-
/** Same contract `skill-checks.mjs` derives membership from: a skill announces ITSELF. */
|
|
41
|
-
const PIPELINE_MARKER =
|
|
42
|
-
/^\s*node\s+\.claude\/skills\/paper-pipeline\/scripts\/announce\.mjs\s+([a-z0-9-]+)/m;
|
|
43
|
-
|
|
44
38
|
const dirs = installedSkills(SKILLS_DIR);
|
|
45
39
|
const read = (d) => readFileSync(join(SKILLS_DIR, d, "SKILL.md"), "utf-8");
|
|
46
|
-
const wired = dirs.filter((d) => PIPELINE_MARKER.test(read(d)));
|
|
47
40
|
|
|
48
41
|
const src = read(SELF);
|
|
49
42
|
|
|
@@ -82,62 +75,54 @@ for (const name of new Set(asserted)) {
|
|
|
82
75
|
recordCheck();
|
|
83
76
|
}
|
|
84
77
|
|
|
85
|
-
// ── backward: every
|
|
86
|
-
/**
|
|
87
|
-
|
|
88
|
-
* Dated, because an undated allowance is indistinguishable from an oversight —
|
|
89
|
-
* the same argument `skill-checks.mjs` makes about its own EXCLUDED map.
|
|
90
|
-
*/
|
|
91
|
-
const MISSING = new Map([
|
|
78
|
+
// ── backward: every shipped skill is named somewhere in the map ──
|
|
79
|
+
/** Shipped skills the conductor does NOT name, each with why. */
|
|
80
|
+
const NOT_IN_MAP = new Map([
|
|
92
81
|
[
|
|
93
82
|
"cold-read-diff",
|
|
94
|
-
"
|
|
83
|
+
"reached through `grade-paper-writing`, which routes to it; missing only from the map",
|
|
95
84
|
],
|
|
96
85
|
[
|
|
97
86
|
"sweep-design-space",
|
|
98
|
-
"
|
|
87
|
+
"reached through `argument-arc`; missing only from the map",
|
|
99
88
|
],
|
|
100
89
|
[
|
|
101
90
|
"paper-status",
|
|
102
91
|
"reports ON the pipeline rather than being a stage in it — the conductor has nothing to route to it",
|
|
103
92
|
],
|
|
93
|
+
[
|
|
94
|
+
"osf-artifact-upload",
|
|
95
|
+
"a helper that uploads an artifact file, not a stage of writing a paper",
|
|
96
|
+
],
|
|
104
97
|
]);
|
|
105
98
|
|
|
106
|
-
for (const name of
|
|
99
|
+
for (const name of dirs) {
|
|
107
100
|
if (name === SELF) continue;
|
|
108
|
-
if (
|
|
101
|
+
if (NOT_IN_MAP.has(name)) continue;
|
|
109
102
|
assert.ok(
|
|
110
103
|
routed.has(name),
|
|
111
|
-
`${name}
|
|
112
|
-
`
|
|
113
|
-
`(measured 2026-08-11: both known-absent skills WERE reachable via a sibling, and the ` +
|
|
114
|
-
`first version of this message claimed otherwise). What it always costs is discoverability: ` +
|
|
115
|
-
`a reader of the map does not learn the stage exists.`,
|
|
104
|
+
`${name} ships with this package and paper-pipeline never names it. A reader of the map ` +
|
|
105
|
+
`does not learn the stage exists; name it in the map, or add it to NOT_IN_MAP with a reason.`,
|
|
116
106
|
);
|
|
117
107
|
recordCheck();
|
|
118
108
|
}
|
|
119
109
|
|
|
120
|
-
// ── the
|
|
121
|
-
for (const [name, reason] of
|
|
110
|
+
// ── the exception list must not rot, in BOTH directions ──
|
|
111
|
+
for (const [name, reason] of NOT_IN_MAP) {
|
|
122
112
|
assert.ok(
|
|
123
113
|
dirs.includes(name),
|
|
124
|
-
`
|
|
125
|
-
);
|
|
126
|
-
assert.ok(
|
|
127
|
-
wired.includes(name),
|
|
128
|
-
`MISSING names "${name}", which is no longer a wired pipeline skill, so the allowance covers ` +
|
|
129
|
-
`nothing. Recorded reason: "${reason}"`,
|
|
114
|
+
`NOT_IN_MAP names "${name}" and no such skill ships — delete the entry. Recorded reason: "${reason}"`,
|
|
130
115
|
);
|
|
131
116
|
assert.ok(
|
|
132
117
|
!routed.has(name),
|
|
133
|
-
`
|
|
134
|
-
`
|
|
118
|
+
`NOT_IN_MAP still names "${name}", but paper-pipeline DOES name it now — delete the entry, ` +
|
|
119
|
+
`so the assertion above starts protecting this skill.`,
|
|
135
120
|
);
|
|
136
121
|
recordCheck();
|
|
137
122
|
}
|
|
138
123
|
|
|
139
124
|
console.log(
|
|
140
125
|
`✓ paper-pipeline routing: ${String(new Set(asserted).size)} routes resolve · ` +
|
|
141
|
-
`${String(
|
|
142
|
-
`${String(
|
|
126
|
+
`${String(dirs.length - NOT_IN_MAP.size - 1)} skills named · ` +
|
|
127
|
+
`${String(NOT_IN_MAP.size)} not in the map (${[...NOT_IN_MAP.keys()].join(", ")})`,
|
|
143
128
|
);
|
|
@@ -250,15 +250,13 @@ program is what you can write only when the question is Type A.
|
|
|
250
250
|
|
|
251
251
|
| unit | question | rung |
|
|
252
252
|
| ---------------------------------------------------- | ---------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- |
|
|
253
|
-
| `ledger.mjs` / `status.mjs` | did the gate run, against which bytes, and has it ever said no | A (3) |
|
|
254
|
-
| `run-mechanical.mjs` | run every script gate; exit on the worst FACT gate | A (3), wrapping A |
|
|
255
253
|
| `repro/report-submission.py` | body pages, overfull boxes, unresolved refs, dropped characters | A (3) |
|
|
256
254
|
| `repro/check-anon.sh`, `check-figure.sh` | deanonymising strings; does the figure fit the column | A (3) |
|
|
257
255
|
| `structure.mjs`, `prose-lint.mjs` | section weights, unjustified blocks, thresholds with published baselines | A (3) — _measuring_ a B question, which is legitimate and is not the same as answering it |
|
|
258
256
|
| `check-provenance.mjs` | untraced number; arm word in the path vs condition word in the sentence | A (3) |
|
|
259
257
|
| `population-map.mjs`, `artifact-coverage.mjs` | which set does this number count; does the bundle hold data for what the paper points at | A (3) |
|
|
260
258
|
| rules `refs/*` (facts by `extract-ref-facts.mjs`) | does the registry have this record | A (3), **external adjudicator** |
|
|
261
|
-
| `
|
|
259
|
+
| `paper-lint.mjs` | appendix ratio, shaved passages | A (3) |
|
|
262
260
|
| `repro/arm_permutation.py`, `repro/delivered_pdf.py` | is the quantity bound to its arm; did it survive typesetting | A (3), metamorphic |
|
|
263
261
|
| **`repro/paper_numbers.py` + `numbers.tsv`** | — | **rung 1: no PDF exists in which the number is wrong** |
|
|
264
262
|
| `paper-edit-guard.hook.ts` | writing to a paper from Bash | rung 2 — **leaky**, an interpreter reading its program from stdin still gets through (`papers/CLAUDE.md`, 2026-08-06) |
|
|
@@ -320,9 +318,6 @@ questions into programs.
|
|
|
320
318
|
## See also
|
|
321
319
|
|
|
322
320
|
- `review-ratchet.md` — what a caught overclaim costs, and the pass that pays it back.
|
|
323
|
-
- `eslint-rules/pipeline-status.mjs` (rule `pipeline/judge-recorded`; until 2026-08-26 in
|
|
324
|
-
`../scripts/pipeline-check.mjs`) — `single-family-jury` and `unattributed-verdict`, the mechanical
|
|
325
|
-
leg of this document.
|
|
326
321
|
- `../scripts/round-diff.mjs` — the per-round edit gate: a driving pass may only change what it
|
|
327
322
|
declared, and the whole document's growth is measured every round.
|
|
328
323
|
- the papers tree's own `CLAUDE.md` — the four-rung ladder, and the rule that a rule written in prose is
|
|
@@ -5,11 +5,9 @@
|
|
|
5
5
|
"did everything run?" is a checked fact, not a memory. Chat evaporates; this file rides with the paper
|
|
6
6
|
to camera-ready.
|
|
7
7
|
|
|
8
|
-
🔴 **It is also machine-read.**
|
|
9
|
-
|
|
10
|
-
the
|
|
11
|
-
times in one day. Run `node .claude/skills/paper-pipeline/scripts/pipeline-check.mjs <paper-dir>`
|
|
12
|
-
after editing to confirm it still parses.
|
|
8
|
+
🔴 **It is also machine-read.** The status hook prints the `**Readiness verdict:**` line and every
|
|
9
|
+
`☐` gate row each time a paper source is edited, and the rules read the front matter below. Keep
|
|
10
|
+
the verdict line's wording and the `☐`/`☑` marks as they are, or the hook goes quiet.
|
|
13
11
|
|
|
14
12
|
## The front matter
|
|
15
13
|
|
|
@@ -41,7 +39,7 @@ match, and the finding will quote exactly what it looked for.
|
|
|
41
39
|
## The row ids, and what each one runs
|
|
42
40
|
|
|
43
41
|
The `id` cell is the **join key** — the same string appears in this template, in every paper's
|
|
44
|
-
scorecard, in `Requires` cells
|
|
42
|
+
scorecard, in `Requires` cells and in the skills' own prose. So
|
|
45
43
|
the scorecard explains itself where it lives:
|
|
46
44
|
|
|
47
45
|
| id | section | what it is | run by |
|
|
@@ -79,27 +77,6 @@ two rows, merged by every consumer — and `Id` (research-ideate) was the header
|
|
|
79
77
|
parser's header-row filter silently ate that row on **every** scorecard for as long as the template
|
|
80
78
|
existed. Neither is expressible now. Keep new ids lowercase, one word, and say what the row is.
|
|
81
79
|
|
|
82
|
-
### How `pipeline-check.mjs` reads this file (rewritten 2026-08-09 to parse markdown, not match it)
|
|
83
|
-
|
|
84
|
-
Both defects above, plus a third — two rows sharing an id merging in silence — had one cause: a
|
|
85
|
-
regular expression guessing at document structure. The parser is now an AST walk (`markdown-it`),
|
|
86
|
-
and two rules decide what it reads. They are stated here because the checker's findings point at
|
|
87
|
-
them:
|
|
88
|
-
|
|
89
|
-
- **A heading names a section iff its FIRST Latin-script word is `SETUP` / `LOOP` / `CONTINUOUS` /
|
|
90
|
-
`GATES` / `AFTER`.** Anything after that word is free: `### GATES (re-run 06.08)` is GATES. A
|
|
91
|
-
heading with a different first word — or none, like `### Гейты, прогнанные 06.08` — names no
|
|
92
|
-
section and CLOSES the previous one. Headings are **not** translated or fuzzy-matched: guessing
|
|
93
|
-
what a heading means is the defect, not the fix. Rows in such a region are reported
|
|
94
|
-
(`unattributed-row`), never dropped.
|
|
95
|
-
- **A table is part of the scorecard iff its header row's first cell is `id`** (also `код`, `code`).
|
|
96
|
-
The header comes from the table's real `thead`, so there is nothing to guess and a data row
|
|
97
|
-
reading `| Id |` is a row. Prose tables in a scorecard — the panel must-fix table, a ceiling
|
|
98
|
-
classification — have no id column and are correctly ignored. The pre-2026-08 single-table format
|
|
99
|
-
keys its first column `#`, a row number; it does not parse, and the checker says so by name.
|
|
100
|
-
|
|
101
|
-
**A row is never dropped in silence.** Unattributable, unreadable and duplicate ids are findings.
|
|
102
|
-
|
|
103
80
|
## Rules
|
|
104
81
|
|
|
105
82
|
- **One row per unit of work; update the row in the SAME commit as the work.** Status + ISO date +
|
|
@@ -108,14 +85,10 @@ them:
|
|
|
108
85
|
stage 7"). SETUP is done-or-not. LOOP iterates. **CONTINUOUS is never done** — its date is compared
|
|
109
86
|
against the paper's own mtime, and a `☑` older than the text is a _stale pass_, which reads as
|
|
110
87
|
green and is not. GATES are blocked on named inputs.
|
|
111
|
-
- 🔴 **The `Requires` cells above are not free-form — do not thin them.** The
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
was retyped by hand for every paper until 2026-08-08, and `compile-rules-2026` had lost four of
|
|
116
|
-
them — including `arc`, which argument-arc's SKILL.md says must precede `tighten-paper`. A dropped
|
|
117
|
-
edge is invisible: `gate-missing-input` can only enforce what the cell says. Adding an input the
|
|
118
|
-
table does not know about is fine and reports nothing.
|
|
88
|
+
- 🔴 **The `Requires` cells above are not free-form — do not thin them.** The cell was retyped by
|
|
89
|
+
hand for every paper until 2026-08-08, and `compile-rules-2026` had lost four of them — including
|
|
90
|
+
`arc`, which argument-arc's SKILL.md says must precede `tighten-paper`. A dropped edge is
|
|
91
|
+
invisible. Adding an input the table does not know about is fine.
|
|
119
92
|
- 🔴 **Row `access` is the one that is not about the paper, and it is the one that bites.** _Can you
|
|
120
93
|
physically upload?_ — account exists, profile is **ACTIVE** rather than "pending moderation", the
|
|
121
94
|
portal is reachable, you know the form's fields and its artifact-hosting requirement. On
|