slopless 0.2.7 → 0.2.9

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 (205) hide show
  1. package/README.md +19 -3
  2. package/dist/adapters/textlint/report.js +1 -4
  3. package/dist/adapters/textlint/report.js.map +1 -1
  4. package/dist/adapters/textlint/rule.js +21 -0
  5. package/dist/adapters/textlint/rule.js.map +1 -0
  6. package/dist/adapters/textlint/units.js +149 -1
  7. package/dist/adapters/textlint/units.js.map +1 -1
  8. package/dist/cli.js +18 -7
  9. package/dist/cli.js.map +1 -1
  10. package/dist/presets/everything.js +8 -0
  11. package/dist/presets/everything.js.map +1 -1
  12. package/dist/registries/narrative-slop.js +2 -0
  13. package/dist/registries/narrative-slop.js.map +1 -1
  14. package/dist/registries/orthography.js +4 -0
  15. package/dist/registries/orthography.js.map +1 -1
  16. package/dist/registries/syntactic-patterns/authority.js +3 -1
  17. package/dist/registries/syntactic-patterns/authority.js.map +1 -1
  18. package/dist/registries/syntactic-patterns/lead-ins.js +2 -0
  19. package/dist/registries/syntactic-patterns/lead-ins.js.map +1 -1
  20. package/dist/registries/syntactic-patterns/repetition.js +4 -0
  21. package/dist/registries/syntactic-patterns/repetition.js.map +1 -1
  22. package/dist/registries/words.js +2 -0
  23. package/dist/registries/words.js.map +1 -1
  24. package/dist/reporting/reports.js +50 -0
  25. package/dist/reporting/reports.js.map +1 -1
  26. package/dist/rules/academic-slop/tortured-phrases.js +13 -23
  27. package/dist/rules/academic-slop/tortured-phrases.js.map +1 -1
  28. package/dist/rules/metrics/avg-sentence-length.js +29 -21
  29. package/dist/rules/metrics/avg-sentence-length.js.map +1 -1
  30. package/dist/rules/metrics/coleman-liau.js +23 -23
  31. package/dist/rules/metrics/coleman-liau.js.map +1 -1
  32. package/dist/rules/metrics/flesch-kincaid.js +23 -23
  33. package/dist/rules/metrics/flesch-kincaid.js.map +1 -1
  34. package/dist/rules/metrics/gunning-fog.js +23 -23
  35. package/dist/rules/metrics/gunning-fog.js.map +1 -1
  36. package/dist/rules/metrics/paragraph-length.js +19 -20
  37. package/dist/rules/metrics/paragraph-length.js.map +1 -1
  38. package/dist/rules/metrics/word-repetition.js +20 -21
  39. package/dist/rules/metrics/word-repetition.js.map +1 -1
  40. package/dist/rules/narrative-slop/body-action-density.js +104 -24
  41. package/dist/rules/narrative-slop/body-action-density.js.map +1 -1
  42. package/dist/rules/narrative-slop/data/narrative-cliches.json +76 -0
  43. package/dist/rules/narrative-slop/flat-action-cadence.js +117 -172
  44. package/dist/rules/narrative-slop/flat-action-cadence.js.map +1 -1
  45. package/dist/rules/narrative-slop/low-information-beat-density.js +79 -0
  46. package/dist/rules/narrative-slop/low-information-beat-density.js.map +1 -0
  47. package/dist/rules/narrative-slop/narrative-cliches.js +35 -33
  48. package/dist/rules/narrative-slop/narrative-cliches.js.map +1 -1
  49. package/dist/rules/narrative-slop/perception-verb-density.js +47 -24
  50. package/dist/rules/narrative-slop/perception-verb-density.js.map +1 -1
  51. package/dist/rules/orthography/artifact-placeholders.js +110 -0
  52. package/dist/rules/orthography/artifact-placeholders.js.map +1 -0
  53. package/dist/rules/orthography/colon-dramatic.js +24 -32
  54. package/dist/rules/orthography/colon-dramatic.js.map +1 -1
  55. package/dist/rules/orthography/em-dashes.js +19 -33
  56. package/dist/rules/orthography/em-dashes.js.map +1 -1
  57. package/dist/rules/orthography/exclamation-density.js +20 -34
  58. package/dist/rules/orthography/exclamation-density.js.map +1 -1
  59. package/dist/rules/orthography/fake-timestamps.js +12 -32
  60. package/dist/rules/orthography/fake-timestamps.js.map +1 -1
  61. package/dist/rules/orthography/hidden-unicode-controls.js +51 -0
  62. package/dist/rules/orthography/hidden-unicode-controls.js.map +1 -0
  63. package/dist/rules/orthography/sentence-case.js +26 -32
  64. package/dist/rules/orthography/sentence-case.js.map +1 -1
  65. package/dist/rules/orthography/smart-quotes.js +12 -32
  66. package/dist/rules/orthography/smart-quotes.js.map +1 -1
  67. package/dist/rules/phrases/cliches.js +16 -27
  68. package/dist/rules/phrases/cliches.js.map +1 -1
  69. package/dist/rules/phrases/corporate-speak.js +16 -27
  70. package/dist/rules/phrases/corporate-speak.js.map +1 -1
  71. package/dist/rules/phrases/data/llm-disclaimer-expansions.json +9 -2
  72. package/dist/rules/phrases/data/redundancy-patterns.json +7 -0
  73. package/dist/rules/phrases/data/wordiness-patterns.json +2 -0
  74. package/dist/rules/phrases/humble-bragger.js +12 -22
  75. package/dist/rules/phrases/humble-bragger.js.map +1 -1
  76. package/dist/rules/phrases/jargon-faker.js +14 -25
  77. package/dist/rules/phrases/jargon-faker.js.map +1 -1
  78. package/dist/rules/phrases/llm-disclaimer.js +19 -23
  79. package/dist/rules/phrases/llm-disclaimer.js.map +1 -1
  80. package/dist/rules/phrases/prohibited-phrases.js +13 -23
  81. package/dist/rules/phrases/prohibited-phrases.js.map +1 -1
  82. package/dist/rules/phrases/redundancy.js +13 -23
  83. package/dist/rules/phrases/redundancy.js.map +1 -1
  84. package/dist/rules/phrases/skunked-terms.js +13 -23
  85. package/dist/rules/phrases/skunked-terms.js.map +1 -1
  86. package/dist/rules/phrases/uncomparables.js +15 -26
  87. package/dist/rules/phrases/uncomparables.js.map +1 -1
  88. package/dist/rules/phrases/wordiness.js +13 -23
  89. package/dist/rules/phrases/wordiness.js.map +1 -1
  90. package/dist/rules/private/textlint-rule-builders.js +48 -0
  91. package/dist/rules/private/textlint-rule-builders.js.map +1 -0
  92. package/dist/rules/semantic-thinness/patterns/abstract-metaphor-claim.json +91 -2
  93. package/dist/rules/semantic-thinness/patterns/abstract-personification-line.json +34 -3
  94. package/dist/rules/semantic-thinness/patterns/body-emotion-shorthand.json +23 -0
  95. package/dist/rules/semantic-thinness/patterns/deictic-summary.json +118 -6
  96. package/dist/rules/semantic-thinness/patterns/different-job-summary.json +30 -0
  97. package/dist/rules/semantic-thinness/patterns/emotion-as-substance.json +14 -4
  98. package/dist/rules/semantic-thinness/patterns/empty-atmosphere-shift.json +2 -0
  99. package/dist/rules/semantic-thinness/patterns/empty-scene-state.json +1 -0
  100. package/dist/rules/semantic-thinness/patterns/empty-scene-transition.json +1 -0
  101. package/dist/rules/semantic-thinness/patterns/gaze-choreography.json +2 -0
  102. package/dist/rules/semantic-thinness/patterns/generic-pressure-or-stakes.json +1 -0
  103. package/dist/rules/semantic-thinness/patterns/generic-realization.json +1 -0
  104. package/dist/rules/semantic-thinness/patterns/hollow-significance.json +94 -2
  105. package/dist/rules/semantic-thinness/patterns/missing-conversation-plan.json +44 -0
  106. package/dist/rules/semantic-thinness/patterns/puffery-evaluative-claim.json +122 -0
  107. package/dist/rules/semantic-thinness/patterns/real-work-begins.json +3 -1
  108. package/dist/rules/semantic-thinness/patterns/silence-as-actor.json +4 -0
  109. package/dist/rules/semantic-thinness/patterns/solution-boring-frame.json +72 -0
  110. package/dist/rules/semantic-thinness/patterns/truth-answer-moves.json +2 -0
  111. package/dist/rules/semantic-thinness/patterns/vague-connective-payoff.json +31 -4
  112. package/dist/rules/semantic-thinness/patterns/vague-summary-cost.json +34 -0
  113. package/dist/rules/semantic-thinness/patterns/vague-threshold-change.json +40 -4
  114. package/dist/rules/semantic-thinness/private/concrete-guards.js +119 -0
  115. package/dist/rules/semantic-thinness/private/concrete-guards.js.map +1 -0
  116. package/dist/rules/semantic-thinness/private/pattern-data-b.js +6 -0
  117. package/dist/rules/semantic-thinness/private/pattern-data-b.js.map +1 -1
  118. package/dist/rules/semantic-thinness/private/pattern-data-d.js +4 -0
  119. package/dist/rules/semantic-thinness/private/pattern-data-d.js.map +1 -1
  120. package/dist/rules/semantic-thinness/private/pattern-matcher.js +26 -14
  121. package/dist/rules/semantic-thinness/private/pattern-matcher.js.map +1 -1
  122. package/dist/rules/semantic-thinness/semantic-thinness.js +27 -23
  123. package/dist/rules/semantic-thinness/semantic-thinness.js.map +1 -1
  124. package/dist/rules/syntactic-patterns/authority/authority-padding.js +94 -30
  125. package/dist/rules/syntactic-patterns/authority/authority-padding.js.map +1 -1
  126. package/dist/rules/syntactic-patterns/authority/uncited-authority.js +124 -0
  127. package/dist/rules/syntactic-patterns/authority/uncited-authority.js.map +1 -0
  128. package/dist/rules/syntactic-patterns/closers/affirmation-closers.js +56 -44
  129. package/dist/rules/syntactic-patterns/closers/affirmation-closers.js.map +1 -1
  130. package/dist/rules/syntactic-patterns/closers/boilerplate-conclusion.js +76 -26
  131. package/dist/rules/syntactic-patterns/closers/boilerplate-conclusion.js.map +1 -1
  132. package/dist/rules/syntactic-patterns/closers/false-question.js +20 -24
  133. package/dist/rules/syntactic-patterns/closers/false-question.js.map +1 -1
  134. package/dist/rules/syntactic-patterns/closers/summative-closer.js +69 -25
  135. package/dist/rules/syntactic-patterns/closers/summative-closer.js.map +1 -1
  136. package/dist/rules/syntactic-patterns/contrast/blame-reframe.js +19 -23
  137. package/dist/rules/syntactic-patterns/contrast/blame-reframe.js.map +1 -1
  138. package/dist/rules/syntactic-patterns/contrast/contrastive-aphorism.js +102 -31
  139. package/dist/rules/syntactic-patterns/contrast/contrastive-aphorism.js.map +1 -1
  140. package/dist/rules/syntactic-patterns/contrast/negation-reframe.js +30 -22
  141. package/dist/rules/syntactic-patterns/contrast/negation-reframe.js.map +1 -1
  142. package/dist/rules/syntactic-patterns/contrast/private/abstract-pair-gates.js +63 -0
  143. package/dist/rules/syntactic-patterns/contrast/private/abstract-pair-gates.js.map +1 -0
  144. package/dist/rules/syntactic-patterns/contrast/private/block-negation-reframe.js +194 -0
  145. package/dist/rules/syntactic-patterns/contrast/private/block-negation-reframe.js.map +1 -0
  146. package/dist/rules/syntactic-patterns/contrast/private/meaning-reframe.js +42 -0
  147. package/dist/rules/syntactic-patterns/contrast/private/meaning-reframe.js.map +1 -0
  148. package/dist/rules/syntactic-patterns/contrast/private/negation-reframe-matcher.js +34 -41
  149. package/dist/rules/syntactic-patterns/contrast/private/negation-reframe-matcher.js.map +1 -1
  150. package/dist/rules/syntactic-patterns/contrast/private/negation-reframe-parts.js +4 -2
  151. package/dist/rules/syntactic-patterns/contrast/private/negation-reframe-parts.js.map +1 -1
  152. package/dist/rules/syntactic-patterns/contrast/private/negative-slop-frames.js +39 -2
  153. package/dist/rules/syntactic-patterns/contrast/private/negative-slop-frames.js.map +1 -1
  154. package/dist/rules/syntactic-patterns/contrast/private/same-sentence-contrast.js +47 -0
  155. package/dist/rules/syntactic-patterns/contrast/private/same-sentence-contrast.js.map +1 -0
  156. package/dist/rules/syntactic-patterns/generalization/softening-language.js +19 -23
  157. package/dist/rules/syntactic-patterns/generalization/softening-language.js.map +1 -1
  158. package/dist/rules/syntactic-patterns/generalization/universalizing-claims.js +103 -24
  159. package/dist/rules/syntactic-patterns/generalization/universalizing-claims.js.map +1 -1
  160. package/dist/rules/syntactic-patterns/lead-ins/boilerplate-framing.js +12 -22
  161. package/dist/rules/syntactic-patterns/lead-ins/boilerplate-framing.js.map +1 -1
  162. package/dist/rules/syntactic-patterns/lead-ins/formal-transition-density.js +92 -0
  163. package/dist/rules/syntactic-patterns/lead-ins/formal-transition-density.js.map +1 -0
  164. package/dist/rules/syntactic-patterns/lead-ins/generic-signposting.js +72 -26
  165. package/dist/rules/syntactic-patterns/lead-ins/generic-signposting.js.map +1 -1
  166. package/dist/rules/syntactic-patterns/lead-ins/lesson-framing.js +28 -23
  167. package/dist/rules/syntactic-patterns/lead-ins/lesson-framing.js.map +1 -1
  168. package/dist/rules/syntactic-patterns/lead-ins/llm-openers.js +63 -25
  169. package/dist/rules/syntactic-patterns/lead-ins/llm-openers.js.map +1 -1
  170. package/dist/rules/syntactic-patterns/lead-ins/observer-guidance.js +36 -23
  171. package/dist/rules/syntactic-patterns/lead-ins/observer-guidance.js.map +1 -1
  172. package/dist/rules/syntactic-patterns/lead-ins/private/discourse-evaluation.js +91 -0
  173. package/dist/rules/syntactic-patterns/lead-ins/private/discourse-evaluation.js.map +1 -0
  174. package/dist/rules/syntactic-patterns/llm-artifacts/data/response-wrapper-patterns.json +6 -0
  175. package/dist/rules/syntactic-patterns/llm-artifacts/response-wrapper.js +21 -26
  176. package/dist/rules/syntactic-patterns/llm-artifacts/response-wrapper.js.map +1 -1
  177. package/dist/rules/syntactic-patterns/repetition/demonstrative-emphasis.js +32 -51
  178. package/dist/rules/syntactic-patterns/repetition/demonstrative-emphasis.js.map +1 -1
  179. package/dist/rules/syntactic-patterns/repetition/empty-emphasis.js +19 -23
  180. package/dist/rules/syntactic-patterns/repetition/empty-emphasis.js.map +1 -1
  181. package/dist/rules/syntactic-patterns/repetition/fragment-stacking.js +16 -33
  182. package/dist/rules/syntactic-patterns/repetition/fragment-stacking.js.map +1 -1
  183. package/dist/rules/syntactic-patterns/repetition/repeated-predicate-end.js +110 -0
  184. package/dist/rules/syntactic-patterns/repetition/repeated-predicate-end.js.map +1 -0
  185. package/dist/rules/syntactic-patterns/repetition/repeated-sentence-starts.js +91 -0
  186. package/dist/rules/syntactic-patterns/repetition/repeated-sentence-starts.js.map +1 -0
  187. package/dist/rules/syntactic-patterns/repetition/triple-repeat.js +21 -39
  188. package/dist/rules/syntactic-patterns/repetition/triple-repeat.js.map +1 -1
  189. package/dist/rules/term-policy/recommended-terms.js +27 -25
  190. package/dist/rules/term-policy/recommended-terms.js.map +1 -1
  191. package/dist/rules/term-policy/required-terms.js +21 -25
  192. package/dist/rules/term-policy/required-terms.js.map +1 -1
  193. package/dist/rules/words/hedge-stacking.js +19 -23
  194. package/dist/rules/words/hedge-stacking.js.map +1 -1
  195. package/dist/rules/words/llm-vocabulary-density.js +78 -0
  196. package/dist/rules/words/llm-vocabulary-density.js.map +1 -0
  197. package/dist/rules/words/llm-vocabulary.js +14 -20
  198. package/dist/rules/words/llm-vocabulary.js.map +1 -1
  199. package/dist/rules/words/prohibited-words.js +12 -17
  200. package/dist/rules/words/prohibited-words.js.map +1 -1
  201. package/dist/rules/words/simplicity.js +20 -25
  202. package/dist/rules/words/simplicity.js.map +1 -1
  203. package/dist/shared/matchers/concrete-evidence.js +161 -0
  204. package/dist/shared/matchers/concrete-evidence.js.map +1 -0
  205. package/package.json +12 -4
@@ -2,8 +2,11 @@
2
2
  "id": "body-emotion-shorthand",
3
3
  "class": "body-emotion",
4
4
  "purpose": "Catch stock body-feeling lines that translate emotion into generic chest, breath, heart, or limb sensations without naming the thought, choice, or concrete pressure.",
5
+ "matchMode": "contains",
5
6
  "templates": [
6
7
  "{bodySubject} {feltVerb} {bodySensation}.",
8
+ "{bodySubject} {bodyReactionVerb}.",
9
+ "{bodySubject} {bodyReactionVerb} {bodyReactionModifier}.",
7
10
  "{bodySubject} {feltVerb} like {weightImage}.",
8
11
  "{objectSubject} {feltVerb} like {weightImage}.",
9
12
  "{breathSubject} caught in {throatTarget}."
@@ -15,6 +18,16 @@
15
18
  "my chest",
16
19
  "their chest",
17
20
  "cassia's chest",
21
+ "her stomach",
22
+ "his stomach",
23
+ "cassia's stomach",
24
+ "cassia's throat",
25
+ "her shoulders",
26
+ "his shoulders",
27
+ "her throat",
28
+ "his throat",
29
+ "her ribs",
30
+ "his ribs",
18
31
  "her paws",
19
32
  "his paws",
20
33
  "my paws",
@@ -23,6 +36,16 @@
23
36
  "my heart"
24
37
  ],
25
38
  "feltVerb": ["felt", "went"],
39
+ "bodyReactionVerb": [
40
+ "tightened",
41
+ "dropped",
42
+ "sank",
43
+ "closed",
44
+ "clenched",
45
+ "knotted",
46
+ "went tight"
47
+ ],
48
+ "bodyReactionModifier": ["hard", "again", "at once", "all at once"],
26
49
  "bodySensation": [
27
50
  "a sudden heavy thump",
28
51
  "a heavy thump",
@@ -9,8 +9,25 @@
9
9
  "{deicticSubject} {linkingVerb} the {evaluativeAdjective} {summaryNoun}.",
10
10
  "{deicticSubject} {linkingVerb} the {summaryNoun} that {thinPredicate}.",
11
11
  "{deicticSubject} {linkingVerb} the {summaryNoun} {genericAudience} {reactionVerb}.",
12
+ "{deicticSubject} {summaryVerb} the {summaryNoun}.",
13
+ "{deicticSubject} {summaryVerb} the {evaluativeAdjective} {summaryNoun}.",
14
+ "{deicticSubject} {meaningVerb} {summaryNoun}.",
15
+ "{deicticSubject} {explanationVerb} {summaryNoun}.",
16
+ "{deicticSubject} {explanationVerb} the {summaryNoun}.",
17
+ "{deicticSubject} {meaningVerb} {abstractSubject} {linkingVerb} {weakJudgment}.",
18
+ "{deicticSubject} {explanationVerb} why {abstractSubject} {abstractVerb}.",
19
+ "{deicticSubject} {explanationVerb} how {abstractSubject} {abstractVerb}.",
20
+ "{deicticSubject} means the {artifactNoun} has to {thinObligation}.",
21
+ "{deicticSubject} means the {artifactNoun} has to contain {abstractObject} worth {abstractGerund}.",
22
+ "{deicticSubject} {linkingVerb} the kind of {summaryNoun}.",
23
+ "{deicticSubject} {linkingVerb} the type of {summaryNoun}.",
24
+ "{deicticSubject} fits the {abstractSituation}.",
25
+ "{deicticSubject} {changeVerb} the {changeObject}.",
12
26
  "{deicticSubject} {linkingVerb} where {abstractSubject} {abstractVerb}.",
13
- "{deicticSubject} {linkingVerb} how {abstractSubject} {abstractVerb}."
27
+ "{deicticSubject} {linkingVerb} how {abstractSubject} {abstractVerb}.",
28
+ "{deicticSubject} {linkingVerb} why {abstractSubject} {importanceVerb}.",
29
+ "{deicticSubject} {linkingVerb} where {abstractSubject} {startVerb}.",
30
+ "{deicticSubject} {linkingVerb} the reason {abstractSubject} {importanceVerb}."
14
31
  ],
15
32
  "slots": {
16
33
  "deicticSubject": ["that", "this", "it"],
@@ -24,7 +41,13 @@
24
41
  "simple",
25
42
  "honest",
26
43
  "actual",
27
- "central"
44
+ "central",
45
+ "boring",
46
+ "useful",
47
+ "missing",
48
+ "whole",
49
+ "right",
50
+ "wrong"
28
51
  ],
29
52
  "summaryNoun": [
30
53
  "part",
@@ -36,8 +59,81 @@
36
59
  "nature",
37
60
  "invitation",
38
61
  "shift",
39
- "work"
62
+ "work",
63
+ "report",
64
+ "decision",
65
+ "decisions",
66
+ "fix",
67
+ "problem",
68
+ "question",
69
+ "audit question",
70
+ "strategy",
71
+ "plan",
72
+ "surface",
73
+ "layer",
74
+ "source material",
75
+ "issue",
76
+ "signal",
77
+ "reason",
78
+ "takeaway"
40
79
  ],
80
+ "summaryVerb": ["changes", "changed", "shifts", "shifted"],
81
+ "changeVerb": ["changes", "changed", "reshapes", "reframes"],
82
+ "changeObject": [
83
+ "brief",
84
+ "page brief",
85
+ "report",
86
+ "plan",
87
+ "strategy",
88
+ "conversation",
89
+ "decision"
90
+ ],
91
+ "abstractSituation": [
92
+ "world",
93
+ "world we are in",
94
+ "moment",
95
+ "reality",
96
+ "new reality",
97
+ "search reality",
98
+ "context"
99
+ ],
100
+ "meaningVerb": ["means", "meant", "does not mean", "doesn't mean"],
101
+ "explanationVerb": ["shows", "showed", "explains", "explained", "proves"],
102
+ "weakJudgment": [
103
+ "useless",
104
+ "useful",
105
+ "simple",
106
+ "enough",
107
+ "wrong",
108
+ "right",
109
+ "dead",
110
+ "alive"
111
+ ],
112
+ "artifactNoun": [
113
+ "article",
114
+ "content",
115
+ "draft",
116
+ "page",
117
+ "post",
118
+ "report",
119
+ "source"
120
+ ],
121
+ "thinObligation": [
122
+ "be useful",
123
+ "stand alone",
124
+ "carry the answer",
125
+ "contain the signal",
126
+ "contain the useful part"
127
+ ],
128
+ "abstractObject": [
129
+ "source material",
130
+ "evidence",
131
+ "detail",
132
+ "context",
133
+ "substance",
134
+ "signal"
135
+ ],
136
+ "abstractGerund": ["retrieving", "citing", "sharing", "remembering"],
41
137
  "genericAudience": [
42
138
  "nobody",
43
139
  "people",
@@ -69,10 +165,21 @@
69
165
  "progress",
70
166
  "trust",
71
167
  "clarity",
168
+ "content",
169
+ "engagement",
170
+ "source material",
72
171
  "the work",
73
172
  "the shift",
74
173
  "the lesson",
75
- "the story"
174
+ "the story",
175
+ "the answer",
176
+ "the focus",
177
+ "the strategy",
178
+ "the plan",
179
+ "the problem",
180
+ "the solution",
181
+ "the report",
182
+ "the decision"
76
183
  ],
77
184
  "abstractVerb": [
78
185
  "lives",
@@ -80,8 +187,13 @@
80
187
  "begins",
81
188
  "happens",
82
189
  "changes",
83
- "settles"
84
- ]
190
+ "settles",
191
+ "works",
192
+ "matters",
193
+ "moves"
194
+ ],
195
+ "importanceVerb": ["matters", "works", "changes", "counts", "sticks"],
196
+ "startVerb": ["starts", "begins", "happens", "shows up", "takes root"]
85
197
  },
86
198
  "rejectIf": [
87
199
  "sentence names the concrete lesson, truth, or decision",
@@ -0,0 +1,30 @@
1
+ {
2
+ "id": "different-job-summary",
3
+ "class": "deictic-summary",
4
+ "purpose": "Catch short deictic lines that label a distinction as a different job, problem, question, or conversation without naming the concrete operational difference.",
5
+ "matchMode": "full",
6
+ "maxTokens": 8,
7
+ "templates": [
8
+ "{deicticSubject} {linkingVerb} a different {genericWorkNoun}."
9
+ ],
10
+ "slots": {
11
+ "deicticSubject": ["that", "this", "it"],
12
+ "linkingVerb": ["is", "was"],
13
+ "genericWorkNoun": ["job", "problem", "question", "conversation"]
14
+ },
15
+ "rejectIf": [
16
+ "sentence names a concrete job ID, queue item, ticket, or assigned role",
17
+ "sentence identifies the actual difference rather than labeling it"
18
+ ],
19
+ "positiveExamples": [
20
+ "That is a different job.",
21
+ "This is a different question."
22
+ ],
23
+ "negativeExamples": [
24
+ "That is a different job ID in the queue.",
25
+ "This is a different question because the API returns 404."
26
+ ],
27
+ "notes": [
28
+ "This is full-mode because contains-mode would flag concrete continuations such as job IDs."
29
+ ]
30
+ }
@@ -2,6 +2,7 @@
2
2
  "id": "emotion-as-substance",
3
3
  "class": "emotion-physicalization",
4
4
  "purpose": "Catch abstract emotion or state treated as a physical substance moving through bodies, voices, rooms, or groups.",
5
+ "matchMode": "contains",
5
6
  "maxTokens": 14,
6
7
  "templates": [
7
8
  "the {abstractEmotion} finally {substanceMotion} out of {bodyContainer}.",
@@ -9,7 +10,9 @@
9
10
  "{abstractEmotion} {substanceMotion} out of {bodyContainer}.",
10
11
  "{abstractEmotion} {substanceMotion} over {personTarget}.",
11
12
  "{abstractEmotion} {substanceMotion} over {placeTarget}.",
12
- "{abstractEmotion} {substanceMotion} in {bodyContainer}."
13
+ "{abstractEmotion} {substanceMotion} in {bodyContainer}.",
14
+ "{abstractEmotion} {substanceMotion} through {placeTarget}.",
15
+ "{abstractEmotion} tightened in {bodyContainer}."
13
16
  ],
14
17
  "slots": {
15
18
  "abstractEmotion": [
@@ -21,7 +24,9 @@
21
24
  "regret",
22
25
  "relief",
23
26
  "shame",
24
- "tension"
27
+ "tension",
28
+ "certainty",
29
+ "confusion"
25
30
  ],
26
31
  "substanceMotion": [
27
32
  "built",
@@ -36,7 +41,10 @@
36
41
  "settled",
37
42
  "rested",
38
43
  "hung",
39
- "washed"
44
+ "washed",
45
+ "tightened",
46
+ "spread",
47
+ "moved"
40
48
  ],
41
49
  "bodyContainer": [
42
50
  "her chest",
@@ -68,7 +76,8 @@
68
76
  "the courtyard",
69
77
  "the alley",
70
78
  "the group",
71
- "the table"
79
+ "the table",
80
+ "the team"
72
81
  ]
73
82
  },
74
83
  "rejectIf": [
@@ -79,6 +88,7 @@
79
88
  "positiveExamples": [
80
89
  "The anger finally melted out of her posture.",
81
90
  "Relief washed over Cassia.",
91
+ "Relief washed over the group.",
82
92
  "Tension settled over the room.",
83
93
  "Panic rose in her chest.",
84
94
  "Regret rested in his voice."
@@ -3,8 +3,10 @@
3
3
  "class": "atmosphere-shift",
4
4
  "purpose": "Catch atmosphere-shift lines that announce mood change in a place without concrete cause, action, or sensory detail.",
5
5
  "templates": [
6
+ "{placeSubject} {feltVerb} {atmosphereState}.",
6
7
  "{placeSubject} {feltVerb} {weakAdverb} {atmosphereState}.",
7
8
  "{placeSubject} {feltVerb} {atmosphereState} {weakModifier}.",
9
+ "{atmosphereSubject} {feltVerb} {atmosphereState}.",
8
10
  "{atmosphereSubject} {feltVerb} {atmosphereState} {weakModifier}.",
9
11
  "{atmosphereSubject} {feltVerb} {weakAdverb} {atmosphereState}."
10
12
  ],
@@ -2,6 +2,7 @@
2
2
  "id": "empty-scene-state",
3
3
  "class": "scene-state",
4
4
  "purpose": "Catch short scene-setting lines that name a place or scene element and assign an empty state without action, cause, or concrete detail.",
5
+ "matchMode": "contains",
5
6
  "templates": [
6
7
  "{placeSubject} {linkingVerb} {thinState}.",
7
8
  "{placeSubject} {linkingVerb} {thinState} {weakModifier}.",
@@ -2,6 +2,7 @@
2
2
  "id": "empty-scene-transition",
3
3
  "class": "transition-change",
4
4
  "purpose": "Catch generic transition lines that declare change, passage, or motion without naming what changed or why.",
5
+ "matchMode": "contains",
5
6
  "templates": [
6
7
  "{genericSubject} {changeVerb}.",
7
8
  "{genericSubject} {changeVerb} {weakModifier}.",
@@ -2,6 +2,7 @@
2
2
  "id": "gaze-choreography",
3
3
  "class": "body-camera",
4
4
  "purpose": "Catch eye and gaze choreography where body-part camera movement stands in for a concrete observation, decision, or reaction.",
5
+ "matchMode": "contains",
5
6
  "templates": [
6
7
  "{gazeSubject} {gazeVerb} {gazeTarget}.",
7
8
  "{gazeSubject} {movementVerb} from {gazeTarget} to {gazeTarget}.",
@@ -35,6 +36,7 @@
35
36
  "the yard",
36
37
  "the room",
37
38
  "the door",
39
+ "the window",
38
40
  "the street",
39
41
  "the shadows",
40
42
  "the rooftops",
@@ -2,6 +2,7 @@
2
2
  "id": "generic-pressure-or-stakes",
3
3
  "class": "stakes",
4
4
  "purpose": "Catch generic pressure, stakes, or weight lines that imply importance without concrete risk or consequence.",
5
+ "matchMode": "contains",
5
6
  "templates": [
6
7
  "{stakesSubject} {linkingVerb} {thinStakesComplement}.",
7
8
  "{stakesSubject} {pressureVerb} {weakPlace}.",
@@ -2,6 +2,7 @@
2
2
  "id": "generic-realization",
3
3
  "class": "realization",
4
4
  "purpose": "Catch realization lines that announce understanding without naming what was learned.",
5
+ "matchMode": "contains",
5
6
  "templates": [
6
7
  "{humanSubject} {realizationVerb} {genericObject}.",
7
8
  "{humanSubject} {realizationVerb} that {genericSubject} {thinPredicate}.",
@@ -2,9 +2,19 @@
2
2
  "id": "hollow-significance",
3
3
  "class": "significance",
4
4
  "purpose": "Catch lines that assert importance, sticking power, or consequence without naming a concrete referent or result.",
5
+ "matchMode": "contains",
6
+ "maxTokens": 36,
5
7
  "templates": [
6
8
  "{deicticSubject} {significanceVerb} {intensifier}.",
7
9
  "{summarySubject} {linkingVerb} {importanceComplement}.",
10
+ "the {thinModifier} {summaryNoun} {linkingVerb} {weakJudgment}.",
11
+ "the {thinModifier} {summaryNoun} {linkingVerb} not {weakJudgment}.",
12
+ "{summarySubject} {linkingVerb} {weakJudgment}.",
13
+ "{summarySubject} {linkingVerb} not {weakJudgment}.",
14
+ "{summarySubject} {feelingVerb} {weakJudgment}.",
15
+ "{summarySubject} {changeVerb} {weakJudgment}.",
16
+ "{abstractSubject} now has {abstractPlural}, and the {abstractPlural} can {weakVerb}.",
17
+ "{abstractSubject} still has work to do.",
8
18
  "{summarySubject} {linkingVerb} the part that {stickVerb}.",
9
19
  "{deicticSubject} {changePhrase}."
10
20
  ],
@@ -35,7 +45,62 @@
35
45
  "the part",
36
46
  "the detail",
37
47
  "the truth",
38
- "the difference"
48
+ "the difference",
49
+ "the problem",
50
+ "the fix",
51
+ "the boring fix",
52
+ "the question",
53
+ "the audit question",
54
+ "the report",
55
+ "the spreadsheet",
56
+ "the decision",
57
+ "the decisions",
58
+ "the layer",
59
+ "the missing layer",
60
+ "the strategy",
61
+ "the plan",
62
+ "the content",
63
+ "the work",
64
+ "the useful work",
65
+ "the glamorous work",
66
+ "the second one",
67
+ "the first one"
68
+ ],
69
+ "abstractSubject": [
70
+ "visibility",
71
+ "search",
72
+ "content",
73
+ "structured data",
74
+ "the page",
75
+ "the strategy"
76
+ ],
77
+ "abstractPlural": ["layers", "parts", "signals", "surfaces", "questions"],
78
+ "weakVerb": ["disagree", "shift", "change", "compete"],
79
+ "thinModifier": [
80
+ "boring",
81
+ "simple",
82
+ "obvious",
83
+ "practical",
84
+ "useful",
85
+ "honest",
86
+ "real",
87
+ "glamorous"
88
+ ],
89
+ "summaryNoun": [
90
+ "answer",
91
+ "audit",
92
+ "change",
93
+ "decision",
94
+ "fix",
95
+ "idea",
96
+ "move",
97
+ "option",
98
+ "plan",
99
+ "question",
100
+ "report",
101
+ "strategy",
102
+ "version",
103
+ "work"
39
104
  ],
40
105
  "significanceVerb": [
41
106
  "mattered",
@@ -57,8 +122,35 @@
57
122
  "the useful part",
58
123
  "the real work",
59
124
  "where it starts",
60
- "where things change"
125
+ "where things change",
126
+ "the right one",
127
+ "the wrong one",
128
+ "the whole report",
129
+ "page judgment",
130
+ "raw material"
131
+ ],
132
+ "weakJudgment": [
133
+ "simple",
134
+ "precise",
135
+ "worse",
136
+ "better",
137
+ "clear",
138
+ "unclear",
139
+ "useful",
140
+ "useless",
141
+ "right",
142
+ "wrong",
143
+ "glamorous",
144
+ "less glamorous",
145
+ "more practical",
146
+ "more useful",
147
+ "more honest",
148
+ "often the right one",
149
+ "the right one",
150
+ "the wrong one"
61
151
  ],
152
+ "feelingVerb": ["feels", "felt", "looks", "looked", "sounds", "sounded"],
153
+ "changeVerb": ["gets", "got", "becomes", "became", "changes", "changed"],
62
154
  "stickVerb": ["sticks", "matters", "lasts", "changes", "helps", "works"],
63
155
  "changePhrase": [
64
156
  "changed everything",
@@ -0,0 +1,44 @@
1
+ {
2
+ "id": "missing-conversation-plan",
3
+ "class": "abstract-plan-metaphor",
4
+ "purpose": "Catch content and strategy plans described through missing-conversation metaphors instead of a concrete missing page, query, or decision.",
5
+ "matchMode": "contains",
6
+ "maxTokens": 28,
7
+ "templates": [
8
+ "the {planNoun} is missing the {abstractObject} after the {triggerNoun}.",
9
+ "the {planNoun} is missing the {abstractObject} beyond the {triggerNoun}.",
10
+ "the {planNoun} lacks the {abstractObject} after the {triggerNoun}."
11
+ ],
12
+ "slots": {
13
+ "planNoun": [
14
+ "content plan",
15
+ "page plan",
16
+ "keyword plan",
17
+ "seo plan",
18
+ "strategy"
19
+ ],
20
+ "abstractObject": [
21
+ "conversation",
22
+ "conversation path",
23
+ "journey",
24
+ "next step",
25
+ "follow-up path"
26
+ ],
27
+ "triggerNoun": ["query", "search", "click", "first question"]
28
+ },
29
+ "rejectIf": [
30
+ "sentence names a concrete missing page, link, or query",
31
+ "sentence describes a literal conversation transcript"
32
+ ],
33
+ "positiveExamples": [
34
+ "The content plan is missing the conversation after the query.",
35
+ "The page plan lacks the follow-up path after the search."
36
+ ],
37
+ "negativeExamples": [
38
+ "The content plan is missing the pricing page after the CRM query.",
39
+ "The transcript is missing the conversation after the moderator left."
40
+ ],
41
+ "notes": [
42
+ "This targets metaphorical planning language, not literal missing assets."
43
+ ]
44
+ }
@@ -0,0 +1,122 @@
1
+ {
2
+ "id": "puffery-evaluative-claim",
3
+ "class": "puffery",
4
+ "purpose": "Catch evaluative praise frames that assert prestige, breakthrough value, or greatness without naming concrete evidence.",
5
+ "matchMode": "full",
6
+ "maxTokens": 12,
7
+ "templates": [
8
+ "the {prestigeRole} {impactVerb} the {genericObject} forever.",
9
+ "the {productSubject} represents an unprecedented {breakthroughNoun}.",
10
+ "the {productSubject} is a masterpiece of {domainNoun}.",
11
+ "the {eventSubject} created the best version of the {workflowNoun}.",
12
+ "the golden standard for {domainNoun} has arrived.",
13
+ "the {eventSubject} marks a very special achievement.",
14
+ "the {actorSubject} delivered excellent infrastructure for every user.",
15
+ "the {documentSubject} clearly demonstrates the {importanceNoun} of the {strategyNoun}.",
16
+ "the {documentSubject} shows the {importanceNoun} of the {strategyNoun}.",
17
+ "the {eventSubject} was a remarkable success.",
18
+ "the {productSubject} is a visionary approach to {domainNoun}.",
19
+ "the {eventSubject} had a devastating impact on the {genericObject}.",
20
+ "the {comparativeSubject} is {comparativeJudgment}.",
21
+ "{abstractPersonifiedSubject} has a poor {businessMetric} in {businessDomain}."
22
+ ],
23
+ "slots": {
24
+ "prestigeRole": [
25
+ "renowned architect",
26
+ "renowned researcher",
27
+ "esteemed researcher",
28
+ "famous founder",
29
+ "famous architect"
30
+ ],
31
+ "impactVerb": ["changed", "transformed", "reshaped", "redefined"],
32
+ "genericObject": ["city", "field", "industry", "workflow", "world"],
33
+ "productSubject": ["product", "platform", "tool", "system", "service"],
34
+ "breakthroughNoun": ["breakthrough", "achievement", "advance", "milestone"],
35
+ "domainNoun": ["automation", "education", "modern design", "operations"],
36
+ "eventSubject": ["launch", "release", "update", "rollout"],
37
+ "workflowNoun": ["workflow", "process", "system", "platform"],
38
+ "actorSubject": ["team", "company", "group", "organization"],
39
+ "documentSubject": ["report", "article", "study", "analysis", "memo"],
40
+ "importanceNoun": [
41
+ "crucial importance",
42
+ "critical importance",
43
+ "vital importance",
44
+ "significant value"
45
+ ],
46
+ "strategyNoun": ["strategy", "approach", "method", "framework", "plan"],
47
+ "comparativeSubject": [
48
+ "first one",
49
+ "second one",
50
+ "first version",
51
+ "second version",
52
+ "first option",
53
+ "second option",
54
+ "first approach",
55
+ "second approach"
56
+ ],
57
+ "comparativeJudgment": [
58
+ "less glamorous",
59
+ "more glamorous",
60
+ "more useful",
61
+ "less useful",
62
+ "more practical",
63
+ "less practical",
64
+ "more honest",
65
+ "less honest"
66
+ ],
67
+ "abstractPersonifiedSubject": [
68
+ "glamour",
69
+ "activity",
70
+ "diagnosis",
71
+ "specificity",
72
+ "engagement",
73
+ "visibility",
74
+ "content",
75
+ "strategy"
76
+ ],
77
+ "businessMetric": [
78
+ "conversion rate",
79
+ "return",
80
+ "payoff",
81
+ "signal",
82
+ "yield"
83
+ ],
84
+ "businessDomain": [
85
+ "technical audits",
86
+ "content strategy",
87
+ "search",
88
+ "seo",
89
+ "ai search",
90
+ "consulting",
91
+ "marketing"
92
+ ]
93
+ },
94
+ "rejectIf": [
95
+ "sentence names a concrete metric, date, source, citation, title, quote, or named person",
96
+ "sentence uses an evaluative term inside a quotation",
97
+ "sentence provides a concrete basis for the evaluation"
98
+ ],
99
+ "positiveExamples": [
100
+ "The renowned architect changed the city forever.",
101
+ "The product represents an unprecedented breakthrough.",
102
+ "The tool is a masterpiece of modern design.",
103
+ "The launch created the best version of the workflow.",
104
+ "The golden standard for automation has arrived.",
105
+ "The team delivered excellent infrastructure for every user.",
106
+ "The report clearly demonstrates the crucial importance of the strategy.",
107
+ "The rollout was a remarkable success.",
108
+ "The platform is a visionary approach to education.",
109
+ "The launch had a devastating impact on the industry."
110
+ ],
111
+ "negativeExamples": [
112
+ "The renowned architect Lina Bo Bardi designed the museum in 1951.",
113
+ "The benchmark reported the best score, 94.1 percent, on the validation set.",
114
+ "The review quoted \"masterpiece\" while disagreeing with the marketing copy.",
115
+ "The 1918 armistice was unprecedented in the regiment's records.",
116
+ "The report demonstrates that revenue rose 14 percent after the strategy changed."
117
+ ],
118
+ "notes": [
119
+ "This uses source-backed puffery terms from the Wikipedia puffery material.",
120
+ "Broad words are intentionally not banned by themselves."
121
+ ]
122
+ }
@@ -8,7 +8,8 @@
8
8
  "{workSubject} {startVerb}.",
9
9
  "{workSubject} {startVerb} when {genericSubject} {abstractAction}.",
10
10
  "{workSubject} {startVerb} after {abstractEvent} {fadesVerb}.",
11
- "where {workSubject} {startVerb}."
11
+ "where {workSubject} {startVerb}.",
12
+ "that was where {workSubject} {pastStartVerb}."
12
13
  ],
13
14
  "slots": {
14
15
  "workSubject": [
@@ -20,6 +21,7 @@
20
21
  "the inner work"
21
22
  ],
22
23
  "startVerb": ["begins", "starts", "happens", "lives"],
24
+ "pastStartVerb": ["began", "started", "happened", "lived"],
23
25
  "genericSubject": ["we", "you", "they", "people", "the team"],
24
26
  "abstractAction": [
25
27
  "start naming what matters",