paperlint 9.0.1 โ†’ 10.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (150) hide show
  1. package/README.md +68 -128
  2. package/dist/build.d.ts +1 -1
  3. package/dist/build.js +1 -1
  4. package/dist/cli.d.ts +5 -1
  5. package/dist/cli.d.ts.map +1 -1
  6. package/dist/cli.js +52 -6
  7. package/dist/cli.js.map +1 -1
  8. package/dist/domain/layout-tree.d.ts +19 -0
  9. package/dist/domain/layout-tree.d.ts.map +1 -0
  10. package/dist/domain/layout-tree.js +32 -0
  11. package/dist/domain/layout-tree.js.map +1 -0
  12. package/dist/domain/lookup-cache.d.ts +2 -2
  13. package/dist/domain/lookup-cache.js +2 -2
  14. package/dist/domain/paper-layout.d.ts +81 -0
  15. package/dist/domain/paper-layout.d.ts.map +1 -0
  16. package/dist/domain/paper-layout.js +259 -0
  17. package/dist/domain/paper-layout.js.map +1 -0
  18. package/dist/domain/repro-layout.d.ts +80 -0
  19. package/dist/domain/repro-layout.d.ts.map +1 -0
  20. package/dist/domain/repro-layout.js +247 -0
  21. package/dist/domain/repro-layout.js.map +1 -0
  22. package/dist/domain/scaffold-layout.d.ts +28 -0
  23. package/dist/domain/scaffold-layout.d.ts.map +1 -0
  24. package/dist/domain/scaffold-layout.js +81 -0
  25. package/dist/domain/scaffold-layout.js.map +1 -0
  26. package/dist/eslint-rules/prereg-coverage.d.ts +98 -0
  27. package/dist/eslint-rules/prereg-coverage.d.ts.map +1 -0
  28. package/dist/eslint-rules/prereg-coverage.js +274 -0
  29. package/dist/eslint-rules/prereg-coverage.js.map +1 -0
  30. package/dist/folder-layout-hook.d.ts +21 -0
  31. package/dist/folder-layout-hook.d.ts.map +1 -0
  32. package/dist/folder-layout-hook.js +117 -0
  33. package/dist/folder-layout-hook.js.map +1 -0
  34. package/dist/folder-layout-rule.d.ts +22 -0
  35. package/dist/folder-layout-rule.d.ts.map +1 -0
  36. package/dist/folder-layout-rule.js +107 -0
  37. package/dist/folder-layout-rule.js.map +1 -0
  38. package/dist/init.js +1 -1
  39. package/dist/init.js.map +1 -1
  40. package/dist/new-paper.d.ts +4 -1
  41. package/dist/new-paper.d.ts.map +1 -1
  42. package/dist/new-paper.js +40 -6
  43. package/dist/new-paper.js.map +1 -1
  44. package/dist/references.d.ts +1 -1
  45. package/dist/references.d.ts.map +1 -1
  46. package/dist/references.js +2 -2
  47. package/dist/references.js.map +1 -1
  48. package/dist/repro-layout-rule.d.ts +16 -0
  49. package/dist/repro-layout-rule.d.ts.map +1 -0
  50. package/dist/repro-layout-rule.js +81 -0
  51. package/dist/repro-layout-rule.js.map +1 -0
  52. package/docs/ci.md +60 -0
  53. package/docs/configuration.md +2 -0
  54. package/docs/e2e.md +2 -2
  55. package/docs/install.md +20 -16
  56. package/docs/layout.md +154 -0
  57. package/docs/optional-rules.md +5 -4
  58. package/docs/references.md +5 -2
  59. package/docs/rules/paper/allowed-files-only.md +192 -0
  60. package/docs/rules/repro/allowed-files-only.md +128 -0
  61. package/docs/rules/study/declare-sample.md +146 -0
  62. package/docs/rules.md +53 -50
  63. package/docs/skills.md +6 -3
  64. package/docs/venues.md +94 -0
  65. package/eslint-rules/prereg-coverage.test.ts +448 -0
  66. package/eslint-rules/prereg-coverage.ts +419 -0
  67. package/lib/skill-trigger-cases.harness.mjs +51 -5
  68. package/lib/skill-trigger-cases.mjs +53 -15
  69. package/package.json +1 -1
  70. package/plugin/hooks/hooks.json +9 -0
  71. package/skills/analyze-sibling-paper/SKILL.md +2 -2
  72. package/skills/analyze-sibling-paper/SKILL.md.spec.ts +1 -1
  73. package/skills/build-benchmark/SKILL.md +14 -1
  74. package/skills/build-benchmark/SKILL.md.spec.ts +13 -0
  75. package/skills/build-label-page/SKILL.md +118 -0
  76. package/skills/build-label-page/SKILL.md.spec.ts +129 -0
  77. package/skills/build-label-page/build-label-page.eval.mjs +15 -0
  78. package/skills/build-label-page/build-label-page.test.ts +959 -0
  79. package/skills/build-label-page/references/checklist.md +148 -0
  80. package/skills/build-label-page/references/example-generator.py +803 -0
  81. package/skills/find-venue/SKILL.md +5 -3
  82. package/skills/find-venue/SKILL.md.spec.ts +4 -2
  83. package/skills/grade-paper-writing/SKILL.md +7 -7
  84. package/skills/grade-paper-writing/SKILL.md.spec.ts +6 -6
  85. package/skills/map-prior-work/SKILL.md +2 -2
  86. package/skills/map-prior-work/SKILL.md.spec.ts +1 -1
  87. package/skills/paper-pipeline/SKILL.md +8 -6
  88. package/skills/paper-pipeline/SKILL.md.spec.ts +7 -5
  89. package/skills/paper-pipeline/grade-paper-writing-ablation.eval.mjs +19 -9
  90. package/skills/paper-pipeline/references/acceptance-gate.md +19 -19
  91. package/skills/paper-pipeline/references/artifact-checklist.md +5 -0
  92. package/skills/paper-pipeline/references/pipeline-status-template.md +30 -1
  93. package/skills/paper-pipeline/repro/2026-08-07-fork-check.log +1 -1
  94. package/skills/paper-pipeline/repro/2026-08-07-fork-check2.log +1 -1
  95. package/skills/paper-pipeline/repro/2026-08-07-language-eval-pilot.log +1 -1
  96. package/skills/paper-pipeline/repro/2026-08-07-language-eval-raw.log +1 -1
  97. package/skills/paper-pipeline/repro/2026-08-08-framing-vs-vocabulary-oracle.log +48 -48
  98. package/skills/paper-pipeline/repro/2026-08-08-grade-paper-writing-ablation-A6-oracle.log +8 -8
  99. package/skills/paper-pipeline/repro/2026-08-08-grade-paper-writing-ablation-oracle.log +48 -48
  100. package/skills/paper-pipeline/repro/2026-08-08-parent-replication-gpw.log +2 -2
  101. package/skills/paper-pipeline/repro/2026-08-08-parent-replication.mjs +3 -3
  102. package/skills/paper-pipeline/repro/2026-10-13-grade-paper-writing-ablation-preflight-after.log +81 -0
  103. package/skills/paper-pipeline/repro/2026-10-13-grade-paper-writing-ablation-preflight-before.log +81 -0
  104. package/skills/paper-pipeline/repro/2026-10-13-grade-paper-writing-ablation-setupdiff.log +59 -0
  105. package/skills/paper-pipeline/repro/2026-10-13-grade-paper-writing-trigger.jsonl +1 -0
  106. package/skills/paper-pipeline/repro/2026-10-13-grade-paper-writing-trigger.log +22 -0
  107. package/skills/paper-pipeline/repro/README.md +4 -0
  108. package/skills/paper-pipeline/scripts/extract-ref-facts.harness.mjs +2 -2
  109. package/skills/paper-pipeline/scripts/extract-ref-facts.mjs +2 -2
  110. package/skills/paper-pipeline/scripts/extract-ref-facts.test.mjs +4 -2
  111. package/skills/paper-pipeline/scripts/generated-code.harness.mjs +7 -2
  112. package/skills/paper-pipeline/scripts/generated-code.mjs +8 -4
  113. package/skills/paper-pipeline/scripts/generated-code.test.ts +15 -1
  114. package/skills/paper-status/SKILL.md +2 -2
  115. package/skills/paper-status/SKILL.md.spec.ts +1 -1
  116. package/skills/study-accepted-papers/SKILL.md +163 -161
  117. package/skills/study-accepted-papers/SKILL.md.spec.ts +167 -165
  118. package/skills/study-accepted-papers/references/base-rates.md +69 -0
  119. package/skills/study-accepted-papers/references/mechanisms.md +181 -0
  120. package/skills/verify-citations/SKILL.md +2 -2
  121. package/skills/verify-citations/SKILL.md.spec.ts +1 -1
  122. package/src/build.ts +1 -1
  123. package/src/cli.harness.mjs +42 -0
  124. package/src/cli.test.ts +90 -6
  125. package/src/cli.ts +78 -5
  126. package/src/domain/layout-tree.test.ts +32 -0
  127. package/src/domain/layout-tree.ts +47 -0
  128. package/src/domain/lookup-cache.ts +2 -2
  129. package/src/domain/paper-layout.test.ts +264 -0
  130. package/src/domain/paper-layout.ts +336 -0
  131. package/src/domain/repro-layout.test.ts +222 -0
  132. package/src/domain/repro-layout.ts +311 -0
  133. package/src/domain/scaffold-layout.ts +104 -0
  134. package/src/folder-layout-hook.test.ts +214 -0
  135. package/src/folder-layout-hook.ts +141 -0
  136. package/src/folder-layout-rule.test.ts +235 -0
  137. package/src/folder-layout-rule.ts +151 -0
  138. package/src/hooks-settings.harness.ts +9 -8
  139. package/src/init.ts +1 -1
  140. package/src/layout-docs.test.ts +52 -0
  141. package/src/new-paper.harness.mjs +23 -1
  142. package/src/new-paper.test.ts +299 -6
  143. package/src/new-paper.ts +51 -5
  144. package/src/paper-files.test.ts +9 -6
  145. package/src/references.test.ts +5 -5
  146. package/src/references.ts +2 -2
  147. package/src/repro-layout-rule.test.ts +114 -0
  148. package/src/repro-layout-rule.ts +121 -0
  149. package/src/rule-cases.test.ts +98 -0
  150. package/templates/paper/PIPELINE-STATUS.md +41 -7
@@ -0,0 +1,81 @@
1
+
2
+ 26 skills installed โ†’ 25 competitors per run
3
+
4
+ ARMS โ€” description length, word-set delta vs A0, mean prompt overlap
5
+ arm label chars words โˆ’ + ovAH ovSH
6
+ A0 baseline (verbatim) 1371 103 0 0 0.85 0.78
7
+ A1 short (sentences 1-2 only) 618 51 52 0 0.71 0.78
8
+ A2 no-subordination 1189 94 9 0 0.85 0.78
9
+ A3 no-negation 1141 92 11 0 0.85 0.78
10
+ A4 no-machinery 670 45 58 0 0.44 0.35
11
+ A5 renamed (description identical) 1371 103 0 0 0.85 0.78
12
+ A6 persona-only (A1's mirror) 298 28 75 0 0.23 0.42
13
+
14
+ โš  ovAH/ovSH FALL AS TEXT IS DELETED โ€” caveat 2 in the header, quantified. The deletion arms carry
15
+ a vocabulary handicap against the parent's dominant factor. A rising deletion arm rose DESPITE it;
16
+ a flat one may be a real gain cancelled by it, and this design cannot tell. A5 is the only arm
17
+ with zero handicap (identical word set).
18
+
19
+ WORD-SET DELTAS (stemmed content words removed from A0 โ€” none may be added)
20
+
21
+ A0 baseline (verbatim)
22
+ removed (0): โ€”
23
+ added (0): โ€”
24
+
25
+ A1 short (sentences 1-2 only)
26
+ removed (52): run cold stall pas committ persona non academic engineer per section workshop reviewer skimm introduction conclusion inventory rubric number readability gate skill consume panel review adversarial harden default blind multi grader mandate claim preservation diff row content defect structural cut plan tighten first bloat strength reward study compose call generative counterpart render
27
+ added (0): โ€”
28
+
29
+ A2 no-subordination
30
+ removed (9): inventory rubric number readability gate skill consume harden call
31
+ added (0): โ€”
32
+
33
+ A3 no-negation
34
+ removed (11): content defect structural cut plan tighten first bloat strength reward study
35
+ added (0): โ€”
36
+
37
+ A4 no-machinery
38
+ removed (58): title abstract intro architecture structure prose clarity discipline land point figure economy honesty without hedge stack register distance peyton jone mcenerney gopen swan exemplar trust carlini greshake cold stall pas committ persona non academic engineer per section workshop reviewer skimm introduction conclusion inventory rubric number readability gate skill consume default blind multi grader mandate claim preservation diff row
39
+ added (0): โ€”
40
+
41
+ A5 renamed (description identical)
42
+ removed (0): โ€”
43
+ added (0): โ€”
44
+
45
+ A6 persona-only (A1's mirror)
46
+ removed (75): grade craft ten dimension title intro architecture structure prose clarity discipline land point figure economy honesty without hedge stack register distance target venue best written peyton jone mcenerney gopen swan exemplar trust carlini greshake accept nam offend sentence fix inventory rubric number readability gate skill consume panel review adversarial harden default blind multi grader mandate claim preservation diff row content defect structural cut plan tighten first bloat strength reward study compose call generative counterpart render
47
+ added (0): โ€”
48
+
49
+ RESULTING DESCRIPTIONS
50
+
51
+ โ”€โ”€ A0 (grade-paper-writing, 1371 chars)
52
+ Use when asking "does this paper read well?" / "is the writing any good?" / "it reads like a wall of text and jargon" / "grade the writing" on a draft. Grades WRITING CRAFT only โ€” ten dimensions 1โ€“5 (Title, Abstract, Intro architecture, Structure, Prose clarity, Jargon discipline, Landing-the-point, Figure economy, Honesty-without-hedge-stacking, Register distance to the target venue) against how the best-written papers read (Peyton Jones, McEnerney, Gopen & Swan; exemplars Trusting Trust, Carlini, Greshake) AND against 2โ€“3 accepted papers of the target venue, naming the offending sentence and the fix for each. Runs the cold-read stall pass with TWO committed personas (a non-academic engineer per section, and a workshop reviewer skimming abstract, introduction and conclusion) whose stall inventory โ€” not the rubric number โ€” is the readability gate other skills consume (pc-panel-review, paper-adversarial-review, harden-paper). Defaults to a blind multi-grader panel; after fixes, mandates the claims-preservation diff (row `claims`). NOT a content/defect review (paper-adversarial-review / pc-panel-review), NOT a structural cut plan (tighten-paper โ€” run that first on a bloated draft), NOT content strength against what the venue rewards (study-accepted-papers). Compose with harden-paper (which calls it), draft-paper (generative counterpart), render-paper.
53
+
54
+ โ”€โ”€ A1 (grade-paper-writing, 618 chars)
55
+ Use when asking "does this paper read well?" / "is the writing any good?" / "it reads like a wall of text and jargon" / "grade the writing" on a draft. Grades WRITING CRAFT only โ€” ten dimensions 1โ€“5 (Title, Abstract, Intro architecture, Structure, Prose clarity, Jargon discipline, Landing-the-point, Figure economy, Honesty-without-hedge-stacking, Register distance to the target venue) against how the best-written papers read (Peyton Jones, McEnerney, Gopen & Swan; exemplars Trusting Trust, Carlini, Greshake) AND against 2โ€“3 accepted papers of the target venue, naming the offending sentence and the fix for each.
56
+
57
+ โ”€โ”€ A2 (grade-paper-writing, 1189 chars)
58
+ Use when asking "does this paper read well?" / "is the writing any good?" / "it reads like a wall of text and jargon" / "grade the writing" on a draft. Grades WRITING CRAFT only โ€” ten dimensions 1โ€“5 (Title, Abstract, Intro architecture, Structure, Prose clarity, Jargon discipline, Landing-the-point, Figure economy, Honesty-without-hedge-stacking, Register distance to the target venue) against how the best-written papers read (Peyton Jones, McEnerney, Gopen & Swan; exemplars Trusting Trust, Carlini, Greshake) AND against 2โ€“3 accepted papers of the target venue, naming the offending sentence and the fix for each. Runs the cold-read stall pass with TWO committed personas (a non-academic engineer per section, and a workshop reviewer skimming abstract, introduction and conclusion). Defaults to a blind multi-grader panel; after fixes, mandates the claims-preservation diff (row `claims`). NOT a content/defect review (paper-adversarial-review / pc-panel-review), NOT a structural cut plan (tighten-paper โ€” run that first on a bloated draft), NOT content strength against what the venue rewards (study-accepted-papers). Compose with draft-paper (generative counterpart), render-paper.
59
+
60
+ โ”€โ”€ A3 (grade-paper-writing, 1141 chars)
61
+ Use when asking "does this paper read well?" / "is the writing any good?" / "it reads like a wall of text and jargon" / "grade the writing" on a draft. Grades WRITING CRAFT only โ€” ten dimensions 1โ€“5 (Title, Abstract, Intro architecture, Structure, Prose clarity, Jargon discipline, Landing-the-point, Figure economy, Honesty-without-hedge-stacking, Register distance to the target venue) against how the best-written papers read (Peyton Jones, McEnerney, Gopen & Swan; exemplars Trusting Trust, Carlini, Greshake) AND against 2โ€“3 accepted papers of the target venue, naming the offending sentence and the fix for each. Runs the cold-read stall pass with TWO committed personas (a non-academic engineer per section, and a workshop reviewer skimming abstract, introduction and conclusion) whose stall inventory โ€” not the rubric number โ€” is the readability gate other skills consume (pc-panel-review, paper-adversarial-review, harden-paper). Defaults to a blind multi-grader panel; after fixes, mandates the claims-preservation diff (row `claims`). Compose with harden-paper (which calls it), draft-paper (generative counterpart), render-paper.
62
+
63
+ โ”€โ”€ A4 (grade-paper-writing, 670 chars)
64
+ Use when asking "does this paper read well?" / "is the writing any good?" / "it reads like a wall of text and jargon" / "grade the writing" on a draft. Grades WRITING CRAFT only โ€” ten dimensions 1โ€“5 against how the best-written papers read AND against 2โ€“3 accepted papers of the target venue, naming the offending sentence and the fix for each. NOT a content/defect review (paper-adversarial-review / pc-panel-review), NOT a structural cut plan (tighten-paper โ€” run that first on a bloated draft), NOT content strength against what the venue rewards (study-accepted-papers). Compose with harden-paper (which calls it), draft-paper (generative counterpart), render-paper.
65
+
66
+ โ”€โ”€ A5 (paper-readability-review, 1371 chars)
67
+ Use when asking "does this paper read well?" / "is the writing any good?" / "it reads like a wall of text and jargon" / "grade the writing" on a draft. Grades WRITING CRAFT only โ€” ten dimensions 1โ€“5 (Title, Abstract, Intro architecture, Structure, Prose clarity, Jargon discipline, Landing-the-point, Figure economy, Honesty-without-hedge-stacking, Register distance to the target venue) against how the best-written papers read (Peyton Jones, McEnerney, Gopen & Swan; exemplars Trusting Trust, Carlini, Greshake) AND against 2โ€“3 accepted papers of the target venue, naming the offending sentence and the fix for each. Runs the cold-read stall pass with TWO committed personas (a non-academic engineer per section, and a workshop reviewer skimming abstract, introduction and conclusion) whose stall inventory โ€” not the rubric number โ€” is the readability gate other skills consume (pc-panel-review, paper-adversarial-review, harden-paper). Defaults to a blind multi-grader panel; after fixes, mandates the claims-preservation diff (row `claims`). NOT a content/defect review (paper-adversarial-review / pc-panel-review), NOT a structural cut plan (tighten-paper โ€” run that first on a bloated draft), NOT content strength against what the venue rewards (study-accepted-papers). Compose with harden-paper (which calls it), draft-paper (generative counterpart), render-paper.
68
+
69
+ โ”€โ”€ A6 (grade-paper-writing, 298 chars)
70
+ Use when asking "does this paper read well?" / "is the writing any good?" / "it reads like a wall of text and jargon" on a draft. Runs the cold-read stall pass with TWO committed personas (a non-academic engineer per section, and a workshop reviewer skimming abstract, introduction and conclusion).
71
+
72
+ building each arm's skills dir under <scratch>/gpw-ablation (no real file is written) โ€ฆ
73
+ A0 โ†’ <scratch>/gpw-ablation/arm-A0
74
+ A1 โ†’ <scratch>/gpw-ablation/arm-A1
75
+ A2 โ†’ <scratch>/gpw-ablation/arm-A2
76
+ A3 โ†’ <scratch>/gpw-ablation/arm-A3
77
+ A4 โ†’ <scratch>/gpw-ablation/arm-A4
78
+ A5 โ†’ <scratch>/gpw-ablation/arm-A5
79
+ A6 โ†’ <scratch>/gpw-ablation/arm-A6
80
+
81
+ ALL PREFLIGHT GUARDS PASSED. No tokens spent. Run --mode main next.
@@ -0,0 +1,59 @@
1
+
2
+ 26 skills installed โ†’ 25 competitors per run
3
+
4
+ ARMS โ€” description length, word-set delta vs A0, mean prompt overlap
5
+ arm label chars words โˆ’ + ovAH ovSH
6
+ A0 baseline (verbatim) 1371 103 0 0 0.85 0.78
7
+ A1 short (sentences 1-2 only) 618 51 52 0 0.71 0.78
8
+ A2 no-subordination 1189 94 9 0 0.85 0.78
9
+ A3 no-negation 1141 92 11 0 0.85 0.78
10
+ A4 no-machinery 670 45 58 0 0.44 0.35
11
+ A5 renamed (description identical) 1371 103 0 0 0.85 0.78
12
+ A6 persona-only (A1's mirror) 298 28 75 0 0.23 0.42
13
+
14
+ โš  ovAH/ovSH FALL AS TEXT IS DELETED โ€” caveat 2 in the header, quantified. The deletion arms carry
15
+ a vocabulary handicap against the parent's dominant factor. A rising deletion arm rose DESPITE it;
16
+ a flat one may be a real gain cancelled by it, and this design cannot tell. A5 is the only arm
17
+ with zero handicap (identical word set).
18
+
19
+ HARNESS OPTIONS โ€” this file vs the parent (extracted from both sources)
20
+ option ablation parent
21
+ allowedTools ["Skill" ["Skill"
22
+ trials TRIALS TRIALS
23
+ concurrency 3 3
24
+ spacingSec 2 2
25
+ timeoutMs 180000 180000
26
+ minPrompts 4 4
27
+ fixture /.exec(src)?.[0] ?? "" FIXTURE
28
+ skillsDir dir SKILLS_DIR
29
+
30
+ fixture sha256/16 ablation 89d1b720c4cedde6
31
+ FIXTURE source block identical to the parent's: YES
32
+ fired predicate identical (modulo the id it matches): YES
33
+ firedSkills() helper identical: YES
34
+
35
+ ARM DIR INTEGRITY โ€” sha256/16 of each SKILL.md frontmatter vs the real .claude/skills
36
+ A0 26 skills ยท unintended frontmatter diffs: none
37
+ A1 26 skills ยท unintended frontmatter diffs: none
38
+ A2 26 skills ยท unintended frontmatter diffs: none
39
+ A3 26 skills ยท unintended frontmatter diffs: none
40
+ A4 26 skills ยท unintended frontmatter diffs: none
41
+ A5 26 skills ยท unintended frontmatter diffs: none
42
+ A6 26 skills ยท unintended frontmatter diffs: none
43
+
44
+ ROW BY ROW โ€” parent (8 prompts) vs this file's A0 (8 prompts)
45
+ cell parent A0 ฮ” prompt
46
+ AH 0/3 1/3 +1 grade the writing craft in this draft and name the off
47
+ AH 3/3 3/3 0 run the blind multi-grader panel over the prose clarit
48
+ AH 0/3 3/3 +3 score the title, the abstract and the intro architectu
49
+ AH 0/3 0/3 0 grade how well this reads, hedge stacking included, an
50
+ SH 0/3 0/3 0 the abstract reads like a wall of jargon
51
+ SH 0/3 2/3 +2 the intro architecture is fine but the prose clarity i
52
+ SH 0/3 2/3 +2 there is hedge stacking everywhere and the point never
53
+ SH 2/3 2/3 0 the writing does not read well even though the draft i
54
+ 5/24 13/24 +8 TOTAL
55
+
56
+ 3 of 8 prompts moved by โ‰ฅ2 of 3 trials. Spread across many prompts โ‡’ a global shift
57
+ (session, load, model routing). Concentrated in one or two โ‡’ something prompt-specific.
58
+
59
+ SETUPDIFF COMPLETE. No tokens spent.
@@ -0,0 +1 @@
1
+ {"skill":"grade-paper-writing","model":"sonnet","trials":1,"rate":0.875,"falsePositiveRate":0,"precision":1,"competitors":25,"perPrompt":[{"prompt":"ะพั†ะตะฝะธ ะบะฐะบ ะฝะฐะฟะธัะฐะฝะพ โ€” ั‡ะธั‚ะฐะตั‚ัั ะบะฐะบ ัั‚ะตะฝะฐ ะถะฐั€ะณะพะฝะฐ","rate":1},{"prompt":"is the writing any good or does it read like shit","rate":1},{"prompt":"abstract ะทะฒัƒั‡ะธั‚ ะบั€ะธะฒะพ ั…ะพั‚ั ะฟะพ ัะผั‹ัะปัƒ ะฒัั‘ ะฝะฐ ะผะตัั‚ะต, ะดะฐะน ะพั†ะตะฝะบัƒ ะฟั€ะพะทะต","rate":1},{"prompt":"grade the craft: title, abstract, sentence clarity, hedge stacking","rate":1},{"prompt":"ะฟั€ะพั‡ะธั‚ะฐะน ั‡ะตั€ะฝะพะฒะธะบ ะธ ัะบะฐะถะธ ั‡ะตัั‚ะฝะพ, ะฝะพั€ะผะฐะปัŒะฝะพ ะปะธ ะพะฝ ั‡ะธั‚ะฐะตั‚ัั","rate":0},{"prompt":"the reviewer says our paper reads like a blog post โ€” is he right about the prose","rate":1},{"prompt":"ะบะฐะถะดะพะต ะฟั€ะตะดะปะพะถะตะฝะธะต ะฟะพ ะพั‚ะดะตะปัŒะฝะพัั‚ะธ ะฟะพะฝัั‚ะฝะพ, ะฐ ะฐะฑะทะฐั†ั‹ ะฒัั‘ ั€ะฐะฒะฝะพ ัะปะธะฒะฐัŽั‚ัั ะฒ ัะฟะปะพัˆะฝัƒัŽ ะฟั€ะพัั‚ั‹ะฝัŽ","rate":1},{"prompt":"grade the prose in section 3 and give me the sentences to rewrite","rate":1}]}
@@ -0,0 +1,22 @@
1
+ Spent: 1,807,963 tokens (88 in ยท 12.6k out ยท 1562.4k cache) ยท ~$1.30 API-equivalent
2
+ Billed to: your Claude subscription โ€” $0 metered โœ…
3
+
4
+ grade-paper-writing โ€” prose craft โ€” the sentence is the unit, NOT the section [model: sonnet]
5
+ trigger-rate: 88% (8 runs)
6
+ 1.00 ะพั†ะตะฝะธ ะบะฐะบ ะฝะฐะฟะธัะฐะฝะพ โ€” ั‡ะธั‚ะฐะตั‚ัั ะบะฐะบ ัั‚ะตะฝะฐ ะถะฐั€ะณะพะฝะฐ
7
+ 1.00 is the writing any good or does it read like shit
8
+ 1.00 abstract ะทะฒัƒั‡ะธั‚ ะบั€ะธะฒะพ ั…ะพั‚ั ะฟะพ ัะผั‹ัะปัƒ ะฒัั‘ ะฝะฐ ะผะตัั‚ะต, ะดะฐะน ะพั†ะตะฝะบ
9
+ 1.00 grade the craft: title, abstract, sentence clarity, hedge st
10
+ 0.00 ะฟั€ะพั‡ะธั‚ะฐะน ั‡ะตั€ะฝะพะฒะธะบ ะธ ัะบะฐะถะธ ั‡ะตัั‚ะฝะพ, ะฝะพั€ะผะฐะปัŒะฝะพ ะปะธ ะพะฝ ั‡ะธั‚ะฐะตั‚ัั
11
+ 1.00 the reviewer says our paper reads like a blog post โ€” is he r
12
+ 1.00 ะบะฐะถะดะพะต ะฟั€ะตะดะปะพะถะตะฝะธะต ะฟะพ ะพั‚ะดะตะปัŒะฝะพัั‚ะธ ะฟะพะฝัั‚ะฝะพ, ะฐ ะฐะฑะทะฐั†ั‹ ะฒัั‘ ั€ะฐะฒะฝ
13
+ 1.00 grade the prose in section 3 and give me the sentences to re
14
+ false-positive: 0% precision: 100%
15
+ 0.00 [irrelevant] ัั‚ะฐั‚ัŒั ั€ะฐะทะดัƒะปะฐััŒ, ัะตั€ะตะดะธะฝะฐ ะฟั€ะพะฒะธัะฐะตั‚ โ€” ั‡ั‚ะพ ั€ะตะทะฐั‚
16
+ 0.00 [irrelevant] does the paper actually carry a reader to one co
17
+ 0.00 [irrelevant] ะฟะพะฟั€ะฐะฒะธะป ั„ะพั€ะผัƒะปะธั€ะพะฒะบะธ ะฒ 4.2, ะฟั€ะพะณะพะฝะธ ัะฒะตะถะธะผ ั‡ะธั‚ะฐ
18
+ 0.00 [irrelevant] what is our desk reject risk and where do we ove
19
+ 0.00 [irrelevant] ะบะฐะบะฐั ะฒะตั€ะพัั‚ะฝะพัั‚ัŒ ะฟั€ะธะฝัั‚ะธั ัƒ ัั‚ะพะน ัั‚ะฐั‚ัŒะธ, ะตัะปะธ ั‡
20
+ 0.00 [irrelevant] ัั‚ะฐั‚ัŒั ะณะพั‚ะพะฒะฐ ะบ ัะฐะฑะผะธั‚ัƒ ะธะปะธ ะฝะตั‚
21
+ 0.00 [irrelevant] ะฟะพัะผะพั‚ั€ะธ ั‡ั‚ะพ ะฟั€ะธะฝะธะผะฐะปะธ ะฝะฐ ัั‚ะพะน ะฟะปะพั‰ะฐะดะบะต ะธ ั‡ะตะผ ั‚ะต
22
+ whole-harness: measured against 25 competing skill(s)
@@ -25,6 +25,10 @@ the session.
25
25
  | `2026-08-08-parent-replication.mjs` | the replication driver | Runs `framing-vs-vocabulary.eval.mjs` **itself** with two asserted patches (main loop โ†’ this skill + AH/SH; output path), everything else untouched, against the real `.claude/skills`. Written because the ablation's control contradicted the parent. |
26
26
  | `2026-08-08-parent-replication-gpw.log` | that driver's run | ๐Ÿ”ด **The parent's own code returns AH 9/12 + SH 3/12 = 12/24 (50%)** hours after the same code returned 3/12 + 2/12 = 5/24 (21%). |
27
27
  | `2026-08-08-parent-replication-gpw.json` | per-run rows for the above | The parent's own row schema, so it diffs directly against `2026-08-08-framing-vs-vocabulary.json`. |
28
+ | `2026-10-13-grade-paper-writing-trigger.log` | `grade-paper-writing/grade-paper-writing.eval.mjs`, the rewritten 499-char description (ledger `description_sha` dc41f0994474b368) | 1 trial, sonnet, 25 competing skills. Recall **7/8 (88%)**: the four measured prompts 4/4, the four new ones 3/4 (missed: ยซะฟั€ะพั‡ะธั‚ะฐะน ั‡ะตั€ะฝะพะฒะธะบ ะธ ัะบะฐะถะธ ั‡ะตัั‚ะฝะพ, ะฝะพั€ะผะฐะปัŒะฝะพ ะปะธ ะพะฝ ั‡ะธั‚ะฐะตั‚ััยป). False positives **0/7**, one prompt from each collider. One trial is a smoke run, not a rate. |
29
+ | `2026-10-13-grade-paper-writing-trigger.jsonl` | per-prompt rows for the above | The kit's `VIGILES_RESULTS` row: rate per should-fire prompt. |
30
+ | `2026-10-13-grade-paper-writing-ablation-preflight-before.log`, `โ€ฆ-after.log` | `grade-paper-writing-ablation.eval.mjs --mode preflight`, **free**, before and after its A0 was pinned | Byte-identical: every arm builds from the same text after the live description was rewritten. Scratch paths replaced by `<scratch>`. |
31
+ | `2026-10-13-grade-paper-writing-ablation-setupdiff.log` | the same file's `--mode setupdiff`, **free**, after the pin | Passes; the parent-vs-A0 row-by-row is the recorded 2026-08-08 data, unchanged. |
28
32
 
29
33
  ## How to read these, and the trap in them
30
34
 
@@ -400,7 +400,7 @@ process.on("exit", () => rmSync(TMP, { recursive: true, force: true }));
400
400
  {
401
401
  const { spawnSync } = await import("node:child_process");
402
402
  const dir = join(TMP, "e2e");
403
- mkdirSync(join(dir, "repro"), { recursive: true });
403
+ mkdirSync(join(dir, "repro", "data"), { recursive: true });
404
404
  const paper =
405
405
  "@misc{lovelace2025,\n author={Lovelace, Ada and Hopper, Grace},\n title={A Study},\n" +
406
406
  " note={arXiv:2503.09002},\n year={2025}}\n";
@@ -411,7 +411,7 @@ process.on("exit", () => rmSync(TMP, { recursive: true, force: true }));
411
411
  );
412
412
  built(dir);
413
413
  writeFileSync(
414
- join(dir, "repro", "refs-cache.json"),
414
+ join(dir, "repro", "data", "refs-cache.json"),
415
415
  JSON.stringify({
416
416
  "arxiv:2503.09002": {
417
417
  httpStatus: 200,
@@ -46,7 +46,7 @@
46
46
  * only one that returns a STRUCTURED name; with any other the surname would have to be cut out by
47
47
  * hand, that is, we would be writing ourselves the very half that was broken.
48
48
  *
49
- * ๐Ÿ”ด THE CACHE IS EVIDENCE, NOT A SECOND DECLARATION. `<paper>/repro/refs-cache.json` keeps the RAW
49
+ * ๐Ÿ”ด THE CACHE IS EVIDENCE, NOT A SECOND DECLARATION. `<paper>/repro/data/refs-cache.json` keeps the RAW
50
50
  * BODIES of the registries' responses and is committed (for `<paper-a>` it has been in git since
51
51
  * 16.08). It cannot be made up โ€” only refreshed from the registry. The facts in `_build/` are
52
52
  * derived from it and from the bibliography, which is why `_build/` is in `.gitignore` while the
@@ -450,7 +450,7 @@ async function main(argv) {
450
450
  const { paperDir, texts } = found;
451
451
  const cachePath = opt("cache")
452
452
  ? resolve(opt("cache"))
453
- : join(paperDir, "repro", "refs-cache.json");
453
+ : join(paperDir, "repro", "data", "refs-cache.json");
454
454
  const out = opt("out")
455
455
  ? resolve(opt("out"))
456
456
  : join(paperDir, "_build", "refs.facts.json");
@@ -236,7 +236,9 @@ test("online: hits are fetched and cached, a transport failure is named and stay
236
236
  stdout: r.stdout,
237
237
  stderr: r.stderr,
238
238
  cached: Object.keys(
239
- JSON.parse(readFileSync(join(root, "paper/repro/refs-cache.json"))),
239
+ JSON.parse(
240
+ readFileSync(join(root, "paper/repro/data/refs-cache.json")),
241
+ ),
240
242
  ),
241
243
  },
242
244
  {
@@ -265,7 +267,7 @@ test("the paper file itself as the target, with --cache, --out and --offline", (
265
267
  const r = cli([
266
268
  join(root, "paper/refs.bib"),
267
269
  "--offline",
268
- `--cache=${join(root, "paper/repro/refs-cache.json")}`,
270
+ `--cache=${join(root, "paper/repro/data/refs-cache.json")}`,
269
271
  `--out=${join(root, "out/facts.json")}`,
270
272
  ]);
271
273
  assert.deepEqual(r, {
@@ -79,8 +79,13 @@ function fixture({ scripts = {}, allow = null, bundle = {}, at = "repro" }) {
79
79
  mkdirSync(join(d, at, "artifact-anon", dirname(p)), { recursive: true });
80
80
  writeFileSync(join(d, at, "artifact-anon", p), src);
81
81
  }
82
- if (allow !== null)
83
- writeFileSync(join(d, at, "generated-code-grandfathered.txt"), allow);
82
+ if (allow !== null) {
83
+ mkdirSync(join(d, at, "tools"), { recursive: true });
84
+ writeFileSync(
85
+ join(d, at, "tools", "generated-code-grandfathered.txt"),
86
+ allow,
87
+ );
88
+ }
84
89
  return d;
85
90
  }
86
91
 
@@ -42,7 +42,7 @@
42
42
  * ๐Ÿ”ด AND THE SAME FALSE-POSITIVE DISCIPLINE AS THE REVERSE COVERAGE LEG. `repro/` is mostly not
43
43
  * analysis code, so an ignore set is unavoidable โ€” and an ignore set applied in silence is how a
44
44
  * check becomes a green light. Every structural rule prints the names it swallowed, and
45
- * `repro/generated-code-grandfathered.txt` prints every row and every reason, on every run,
45
+ * `repro/tools/generated-code-grandfathered.txt` prints every row and every reason, on every run,
46
46
  * findings or none. Same reasoning as `check_grandfather` in `repro/paper_numbers.py`.
47
47
  */
48
48
  import { readFileSync, existsSync, readdirSync, statSync } from "node:fs";
@@ -97,8 +97,12 @@ const repro = roots[0];
97
97
  // model synthesised and is the most literal reading of "generated code" there is. Below that are
98
98
  // fixtures, working clones and raw transcripts; going deeper buys tens of thousands of files and no
99
99
  // analysis. This is a SCOPE and therefore a blind spot, and it is printed as one.
100
+ // `repro/tools/` (the paper's shared scripts, by the repro/ layout) is a root of its own: the layout
101
+ // moved `repro/<pkg>/src/โ€ฆ` to `repro/tools/<pkg>/src/โ€ฆ`, and counting tools/ as a level would have
102
+ // dropped that code out of the scan.
100
103
  const EXT = /\.(py|mjs|cjs|js)$/;
101
104
  const MAX_DEPTH = 3;
105
+ const TOOLS_DIR = "tools";
102
106
  const swallowed = new Map([
103
107
  [
104
108
  "the released bundle โ€” `check-anon.sh` cat. 5 owns it, and it asks a different question there " +
@@ -155,13 +159,13 @@ const files = [];
155
159
  swallowed.get(RULE[2]).push(relative(repro, p));
156
160
  continue;
157
161
  }
158
- walk(p, depth + 1);
162
+ walk(p, abs === repro && name === TOOLS_DIR ? depth : depth + 1);
159
163
  } else if (EXT.test(name)) files.push(p);
160
164
  }
161
165
  })(repro, 1);
162
166
 
163
167
  // โ”€โ”€ the allow file โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
164
- const allowPath = join(repro, "generated-code-grandfathered.txt");
168
+ const allowPath = join(repro, TOOLS_DIR, "generated-code-grandfathered.txt");
165
169
  const allowed = new Map();
166
170
  if (existsSync(allowPath)) {
167
171
  for (const line of readFileSync(allowPath, "utf8").split("\n")) {
@@ -305,7 +309,7 @@ for (const [rule, names] of swallowed) {
305
309
  );
306
310
  }
307
311
  ledger.push(
308
- ` โ€ข ${ignored.length} row(s) in repro/generated-code-grandfathered.txt โ€” every row, every reason:`,
312
+ ` โ€ข ${ignored.length} row(s) in repro/tools/generated-code-grandfathered.txt โ€” every row, every reason:`,
309
313
  );
310
314
  for (const [key, reason] of ignored) ledger.push(` ${key} โ†’ ${reason}`);
311
315
  if (!ignored.length) ledger.push(" (nothing is being waved through)");
@@ -46,7 +46,7 @@ test("repro/: a dangling link is passed over; skipped trees are named, more than
46
46
  "repro/__pycache__/x.py": "",
47
47
  // Draws randomness unseeded: a NO_SEED finding, which the reasonless row below waves through.
48
48
  "repro/exp/run.py": "import random\nprint(random.random())\n",
49
- "repro/generated-code-grandfathered.txt": "exp/run.py\t*\n",
49
+ "repro/tools/generated-code-grandfathered.txt": "exp/run.py\t*\n",
50
50
  });
51
51
  symlinkSync(join(root, "gone"), join(dir, "repro", "dangling.py"));
52
52
  const out = run(dir).stdout;
@@ -60,3 +60,17 @@ test("repro/: a dangling link is passed over; skipped trees are named, more than
60
60
  );
61
61
  assert.match(out, / {7}exp\/run\.py ยท NO_SEED {2}โ†’ {2}\(NO REASON GIVEN\)/);
62
62
  });
63
+
64
+ test("๐Ÿ”ด shared code under repro/tools/ is scanned as deep as a study's: tools/ is a root of its own, not a level of the scan", () => {
65
+ const dir = writeTree(join(root, "paper-tools"), {
66
+ // `repro/<pkg>/src/check.py` was scanned before the layout moved shared code under tools/.
67
+ "repro/tools/pkg/src/check.py": "import random\nprint(random.random())\n",
68
+ "repro/tools/pkg/src/deeper/x.py": "print(1)\n",
69
+ });
70
+ const out = run(dir).stdout;
71
+ assert.match(out, /NO_SEED {3}repro\/tools\/pkg\/src\/check\.py โ€” /);
72
+ assert.match(
73
+ out,
74
+ /โ€ข 1 tree\(s\) not entered โ€” nested deeper than 3 levels[^\n]*\n {7}tools\/pkg\/src\/deeper/,
75
+ );
76
+ });
@@ -4,7 +4,7 @@ description: Answer "what's the status of the paper?" in one pass โ€” MEASURE wh
4
4
  allowed-tools: [Bash, Read, Grep, Glob]
5
5
  ---
6
6
 
7
- <!-- vigiles:sha256:c90bd362b565fa22 compiled from skills/paper-status/SKILL.md.spec.ts -->
7
+ <!-- vigiles:sha256:c28cf2904fc2aaeb compiled from skills/paper-status/SKILL.md.spec.ts -->
8
8
 
9
9
  # paper-status โ€” state, measured before it is narrated
10
10
 
@@ -51,7 +51,7 @@ status; the status is what that measurement makes possible next.
51
51
 
52
52
  ```bash
53
53
  cd <paper-dir>
54
- bash repro/build-submission.sh 2>&1 | grep -Ei 'body pages|VERDICT|Overfull|undefined|anonymity'
54
+ bash repro/tools/build-submission.sh 2>&1 | grep -Ei 'body pages|VERDICT|Overfull|undefined|anonymity'
55
55
  git status --porcelain # uncommitted work
56
56
  git log --oneline @{u}..HEAD # unpushed commits
57
57
  ```
@@ -57,7 +57,7 @@ status; the status is what that measurement makes possible next.
57
57
 
58
58
  \`\`\`bash
59
59
  cd <paper-dir>
60
- bash repro/build-submission.sh 2>&1 | grep -Ei 'body pages|VERDICT|Overfull|undefined|anonymity'
60
+ bash repro/tools/build-submission.sh 2>&1 | grep -Ei 'body pages|VERDICT|Overfull|undefined|anonymity'
61
61
  git status --porcelain # uncommitted work
62
62
  git log --oneline @{u}..HEAD # unpushed commits
63
63
  \`\`\`