slopless 0.2.8 → 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 (126) hide show
  1. package/dist/adapters/textlint/report.js +1 -4
  2. package/dist/adapters/textlint/report.js.map +1 -1
  3. package/dist/adapters/textlint/rule.js +1 -1
  4. package/dist/adapters/textlint/rule.js.map +1 -1
  5. package/dist/adapters/textlint/units.js +16 -0
  6. package/dist/adapters/textlint/units.js.map +1 -1
  7. package/dist/cli.js +17 -6
  8. package/dist/cli.js.map +1 -1
  9. package/dist/presets/everything.js +6 -0
  10. package/dist/presets/everything.js.map +1 -1
  11. package/dist/registries/narrative-slop.js +2 -0
  12. package/dist/registries/narrative-slop.js.map +1 -1
  13. package/dist/registries/syntactic-patterns/authority.js +3 -1
  14. package/dist/registries/syntactic-patterns/authority.js.map +1 -1
  15. package/dist/registries/syntactic-patterns/lead-ins.js +2 -0
  16. package/dist/registries/syntactic-patterns/lead-ins.js.map +1 -1
  17. package/dist/registries/syntactic-patterns/repetition.js +4 -0
  18. package/dist/registries/syntactic-patterns/repetition.js.map +1 -1
  19. package/dist/registries/words.js +2 -0
  20. package/dist/registries/words.js.map +1 -1
  21. package/dist/rules/metrics/avg-sentence-length.js +6 -0
  22. package/dist/rules/metrics/avg-sentence-length.js.map +1 -1
  23. package/dist/rules/narrative-slop/body-action-density.js +44 -1
  24. package/dist/rules/narrative-slop/body-action-density.js.map +1 -1
  25. package/dist/rules/narrative-slop/data/narrative-cliches.json +49 -0
  26. package/dist/rules/narrative-slop/flat-action-cadence.js +97 -149
  27. package/dist/rules/narrative-slop/flat-action-cadence.js.map +1 -1
  28. package/dist/rules/narrative-slop/low-information-beat-density.js +79 -0
  29. package/dist/rules/narrative-slop/low-information-beat-density.js.map +1 -0
  30. package/dist/rules/narrative-slop/perception-verb-density.js +25 -1
  31. package/dist/rules/narrative-slop/perception-verb-density.js.map +1 -1
  32. package/dist/rules/orthography/em-dashes.js.map +1 -1
  33. package/dist/rules/orthography/hidden-unicode-controls.js.map +1 -1
  34. package/dist/rules/orthography/sentence-case.js +4 -2
  35. package/dist/rules/orthography/sentence-case.js.map +1 -1
  36. package/dist/rules/private/textlint-rule-builders.js +3 -1
  37. package/dist/rules/private/textlint-rule-builders.js.map +1 -1
  38. package/dist/rules/semantic-thinness/patterns/abstract-metaphor-claim.json +91 -2
  39. package/dist/rules/semantic-thinness/patterns/abstract-personification-line.json +34 -3
  40. package/dist/rules/semantic-thinness/patterns/body-emotion-shorthand.json +23 -0
  41. package/dist/rules/semantic-thinness/patterns/deictic-summary.json +118 -6
  42. package/dist/rules/semantic-thinness/patterns/different-job-summary.json +30 -0
  43. package/dist/rules/semantic-thinness/patterns/emotion-as-substance.json +14 -4
  44. package/dist/rules/semantic-thinness/patterns/empty-atmosphere-shift.json +2 -0
  45. package/dist/rules/semantic-thinness/patterns/empty-scene-state.json +1 -0
  46. package/dist/rules/semantic-thinness/patterns/empty-scene-transition.json +1 -0
  47. package/dist/rules/semantic-thinness/patterns/gaze-choreography.json +2 -0
  48. package/dist/rules/semantic-thinness/patterns/generic-pressure-or-stakes.json +1 -0
  49. package/dist/rules/semantic-thinness/patterns/generic-realization.json +1 -0
  50. package/dist/rules/semantic-thinness/patterns/hollow-significance.json +94 -2
  51. package/dist/rules/semantic-thinness/patterns/missing-conversation-plan.json +44 -0
  52. package/dist/rules/semantic-thinness/patterns/puffery-evaluative-claim.json +70 -4
  53. package/dist/rules/semantic-thinness/patterns/real-work-begins.json +3 -1
  54. package/dist/rules/semantic-thinness/patterns/silence-as-actor.json +4 -0
  55. package/dist/rules/semantic-thinness/patterns/solution-boring-frame.json +72 -0
  56. package/dist/rules/semantic-thinness/patterns/truth-answer-moves.json +2 -0
  57. package/dist/rules/semantic-thinness/patterns/vague-connective-payoff.json +31 -4
  58. package/dist/rules/semantic-thinness/patterns/vague-summary-cost.json +34 -0
  59. package/dist/rules/semantic-thinness/patterns/vague-threshold-change.json +40 -4
  60. package/dist/rules/semantic-thinness/private/concrete-guards.js +119 -0
  61. package/dist/rules/semantic-thinness/private/concrete-guards.js.map +1 -0
  62. package/dist/rules/semantic-thinness/private/pattern-data-b.js +6 -0
  63. package/dist/rules/semantic-thinness/private/pattern-data-b.js.map +1 -1
  64. package/dist/rules/semantic-thinness/private/pattern-data-d.js +2 -0
  65. package/dist/rules/semantic-thinness/private/pattern-data-d.js.map +1 -1
  66. package/dist/rules/semantic-thinness/private/pattern-matcher.js +26 -14
  67. package/dist/rules/semantic-thinness/private/pattern-matcher.js.map +1 -1
  68. package/dist/rules/syntactic-patterns/authority/authority-padding.js +75 -7
  69. package/dist/rules/syntactic-patterns/authority/authority-padding.js.map +1 -1
  70. package/dist/rules/syntactic-patterns/authority/uncited-authority.js +124 -0
  71. package/dist/rules/syntactic-patterns/authority/uncited-authority.js.map +1 -0
  72. package/dist/rules/syntactic-patterns/closers/affirmation-closers.js +11 -1
  73. package/dist/rules/syntactic-patterns/closers/affirmation-closers.js.map +1 -1
  74. package/dist/rules/syntactic-patterns/closers/boilerplate-conclusion.js +51 -4
  75. package/dist/rules/syntactic-patterns/closers/boilerplate-conclusion.js.map +1 -1
  76. package/dist/rules/syntactic-patterns/closers/summative-closer.js +52 -4
  77. package/dist/rules/syntactic-patterns/closers/summative-closer.js.map +1 -1
  78. package/dist/rules/syntactic-patterns/contrast/contrastive-aphorism.js +68 -5
  79. package/dist/rules/syntactic-patterns/contrast/contrastive-aphorism.js.map +1 -1
  80. package/dist/rules/syntactic-patterns/contrast/negation-reframe.js +26 -9
  81. package/dist/rules/syntactic-patterns/contrast/negation-reframe.js.map +1 -1
  82. package/dist/rules/syntactic-patterns/contrast/private/abstract-pair-gates.js +63 -0
  83. package/dist/rules/syntactic-patterns/contrast/private/abstract-pair-gates.js.map +1 -0
  84. package/dist/rules/syntactic-patterns/contrast/private/block-negation-reframe.js +194 -0
  85. package/dist/rules/syntactic-patterns/contrast/private/block-negation-reframe.js.map +1 -0
  86. package/dist/rules/syntactic-patterns/contrast/private/meaning-reframe.js +42 -0
  87. package/dist/rules/syntactic-patterns/contrast/private/meaning-reframe.js.map +1 -0
  88. package/dist/rules/syntactic-patterns/contrast/private/negation-reframe-matcher.js +34 -41
  89. package/dist/rules/syntactic-patterns/contrast/private/negation-reframe-matcher.js.map +1 -1
  90. package/dist/rules/syntactic-patterns/contrast/private/negative-slop-frames.js +6 -0
  91. package/dist/rules/syntactic-patterns/contrast/private/negative-slop-frames.js.map +1 -1
  92. package/dist/rules/syntactic-patterns/contrast/private/same-sentence-contrast.js +47 -0
  93. package/dist/rules/syntactic-patterns/contrast/private/same-sentence-contrast.js.map +1 -0
  94. package/dist/rules/syntactic-patterns/generalization/universalizing-claims.js +84 -1
  95. package/dist/rules/syntactic-patterns/generalization/universalizing-claims.js.map +1 -1
  96. package/dist/rules/syntactic-patterns/lead-ins/formal-transition-density.js +92 -0
  97. package/dist/rules/syntactic-patterns/lead-ins/formal-transition-density.js.map +1 -0
  98. package/dist/rules/syntactic-patterns/lead-ins/generic-signposting.js +53 -3
  99. package/dist/rules/syntactic-patterns/lead-ins/generic-signposting.js.map +1 -1
  100. package/dist/rules/syntactic-patterns/lead-ins/lesson-framing.js +9 -0
  101. package/dist/rules/syntactic-patterns/lead-ins/lesson-framing.js.map +1 -1
  102. package/dist/rules/syntactic-patterns/lead-ins/llm-openers.js +38 -3
  103. package/dist/rules/syntactic-patterns/lead-ins/llm-openers.js.map +1 -1
  104. package/dist/rules/syntactic-patterns/lead-ins/observer-guidance.js +17 -0
  105. package/dist/rules/syntactic-patterns/lead-ins/observer-guidance.js.map +1 -1
  106. package/dist/rules/syntactic-patterns/lead-ins/private/discourse-evaluation.js +91 -0
  107. package/dist/rules/syntactic-patterns/lead-ins/private/discourse-evaluation.js.map +1 -0
  108. package/dist/rules/syntactic-patterns/repetition/demonstrative-emphasis.js +4 -0
  109. package/dist/rules/syntactic-patterns/repetition/demonstrative-emphasis.js.map +1 -1
  110. package/dist/rules/syntactic-patterns/repetition/fragment-stacking.js +4 -1
  111. package/dist/rules/syntactic-patterns/repetition/fragment-stacking.js.map +1 -1
  112. package/dist/rules/syntactic-patterns/repetition/repeated-predicate-end.js +110 -0
  113. package/dist/rules/syntactic-patterns/repetition/repeated-predicate-end.js.map +1 -0
  114. package/dist/rules/syntactic-patterns/repetition/repeated-sentence-starts.js +91 -0
  115. package/dist/rules/syntactic-patterns/repetition/repeated-sentence-starts.js.map +1 -0
  116. package/dist/rules/syntactic-patterns/repetition/triple-repeat.js +6 -1
  117. package/dist/rules/syntactic-patterns/repetition/triple-repeat.js.map +1 -1
  118. package/dist/rules/term-policy/recommended-terms.js +3 -3
  119. package/dist/rules/term-policy/recommended-terms.js.map +1 -1
  120. package/dist/rules/term-policy/required-terms.js +1 -1
  121. package/dist/rules/term-policy/required-terms.js.map +1 -1
  122. package/dist/rules/words/llm-vocabulary-density.js +78 -0
  123. package/dist/rules/words/llm-vocabulary-density.js.map +1 -0
  124. package/dist/shared/matchers/concrete-evidence.js +161 -0
  125. package/dist/shared/matchers/concrete-evidence.js.map +1 -0
  126. package/package.json +10 -4
@@ -2,15 +2,29 @@
2
2
  "id": "abstract-metaphor-claim",
3
3
  "class": "abstract-metaphor",
4
4
  "purpose": "Catch slogan-like abstract metaphors where an abstract subject performs a physical or spatial action with no concrete referent.",
5
+ "matchMode": "contains",
6
+ "maxTokens": 42,
5
7
  "templates": [
6
8
  "{abstractSubject} {metaphorVerb} in {abstractObject}.",
9
+ "{abstractSubject} {metaphorVerb} mostly in {abstractObject}.",
7
10
  "{abstractSubject} {metaphorVerb} inside {abstractObject}.",
8
11
  "{abstractSubject} {metaphorVerb} after {abstractObject}.",
9
12
  "{abstractSubject} {metaphorVerb} with {abstractObject}.",
10
- "{abstractSubject} {linkingVerb} {abstractComplement}."
13
+ "{abstractSubject} {linkingVerb} {abstractComplement}.",
14
+ "{artifactSubject} {metaphorVerb} its {answerNoun} to {abstractDestination}.",
15
+ "{artifactSubject} {linkingVerb} wearing a {surfaceNoun} over an {emptyNoun}.",
16
+ "{artifactSubject} {metaphorVerb} like a {humanRole} after a {vagueEvent}.",
17
+ "{abstractSubject} {linkingVerb} {infrastructureNoun} with {abstractObject}.",
18
+ "{abstractSubject} behaves like a {filterNoun}.",
19
+ "{artifactSubject} adds another {layerNoun} to {diagnosisObject}.",
20
+ "{artifactSubject} add another {layerNoun} to {diagnosisObject}."
11
21
  ],
12
22
  "slots": {
13
23
  "abstractSubject": [
24
+ "ai visibility",
25
+ "ai assistants",
26
+ "average rank",
27
+ "crawler access",
14
28
  "prevention",
15
29
  "problem-solving",
16
30
  "trust",
@@ -31,6 +45,8 @@
31
45
  "consistency",
32
46
  "daily life",
33
47
  "the answer",
48
+ "the brand",
49
+ "the page",
34
50
  "the work",
35
51
  "the lesson",
36
52
  "the process",
@@ -47,6 +63,11 @@
47
63
  "moves",
48
64
  "breathes",
49
65
  "travels",
66
+ "vanishes",
67
+ "disappears",
68
+ "outsources",
69
+ "cannot outsource",
70
+ "can't outsource",
50
71
  "arrives",
51
72
  "settles",
52
73
  "grows",
@@ -54,7 +75,21 @@
54
75
  "takes root",
55
76
  "holds"
56
77
  ],
78
+ "artifactSubject": [
79
+ "ai overviews",
80
+ "content",
81
+ "structured data",
82
+ "the answer",
83
+ "the brand",
84
+ "the business",
85
+ "the page",
86
+ "the post",
87
+ "the report",
88
+ "visibility"
89
+ ],
57
90
  "abstractObject": [
91
+ "consequences",
92
+ "diagnosis",
58
93
  "rehearsal",
59
94
  "repair",
60
95
  "practice",
@@ -71,7 +106,8 @@
71
106
  "the conversation",
72
107
  "the storm",
73
108
  "the quiet",
74
- "the rhythm"
109
+ "the rhythm",
110
+ "metadata"
75
111
  ],
76
112
  "linkingVerb": ["is", "was", "becomes", "became", "remains"],
77
113
  "abstractComplement": [
@@ -83,6 +119,59 @@
83
119
  "a daily practice",
84
120
  "the real curriculum",
85
121
  "the actual work"
122
+ ],
123
+ "answerNoun": [
124
+ "answer",
125
+ "explanation",
126
+ "job",
127
+ "meaning",
128
+ "proof",
129
+ "substance"
130
+ ],
131
+ "abstractDestination": [
132
+ "metadata",
133
+ "schema",
134
+ "the plugin panel",
135
+ "the spreadsheet",
136
+ "the dashboard",
137
+ "the tool"
138
+ ],
139
+ "surfaceNoun": [
140
+ "clean jacket",
141
+ "fancy jacket",
142
+ "nice jacket",
143
+ "sharp jacket",
144
+ "polished jacket"
145
+ ],
146
+ "emptyNoun": [
147
+ "empty shirt",
148
+ "empty body",
149
+ "empty page",
150
+ "empty shell",
151
+ "hollow shell"
152
+ ],
153
+ "humanRole": ["contractor", "consultant", "vendor", "agency", "freelancer"],
154
+ "vagueEvent": [
155
+ "vague scope call",
156
+ "vague kickoff",
157
+ "bad kickoff",
158
+ "loose briefing",
159
+ "messy handoff"
160
+ ],
161
+ "infrastructureNoun": ["plumbing", "machinery", "scaffolding"],
162
+ "filterNoun": [
163
+ "trust filter",
164
+ "qualification filter",
165
+ "credibility filter",
166
+ "source filter"
167
+ ],
168
+ "layerNoun": ["layer", "dimension", "surface"],
169
+ "diagnosisObject": [
170
+ "the diagnosis",
171
+ "the report",
172
+ "the audit",
173
+ "the decision",
174
+ "the analysis"
86
175
  ]
87
176
  },
88
177
  "rejectIf": [
@@ -2,10 +2,41 @@
2
2
  "id": "abstract-personification-line",
3
3
  "class": "abstract-personification",
4
4
  "purpose": "Catch abstract nouns treated as social actors in short payoff lines without concrete action or cause.",
5
- "templates": ["{abstractSubject} had no place in {thinContainer}."],
5
+ "matchMode": "contains",
6
+ "maxTokens": 24,
7
+ "templates": [
8
+ "{abstractSubject} had no place in {thinContainer}.",
9
+ "{abstractSubject} entered {socialPlace}.",
10
+ "{abstractSubject} moved through {socialPlace}.",
11
+ "{abstractSubject} took over {socialPlace}."
12
+ ],
6
13
  "slots": {
7
- "abstractSubject": ["fear"],
8
- "thinContainer": ["her schedule", "his schedule", "their schedule"]
14
+ "abstractSubject": [
15
+ "fear",
16
+ "sadness",
17
+ "doubt",
18
+ "panic",
19
+ "regret",
20
+ "shame",
21
+ "certainty",
22
+ "hope",
23
+ "pressure"
24
+ ],
25
+ "thinContainer": [
26
+ "her schedule",
27
+ "his schedule",
28
+ "their schedule",
29
+ "the plan",
30
+ "the room"
31
+ ],
32
+ "socialPlace": [
33
+ "the room",
34
+ "the conversation",
35
+ "the meeting",
36
+ "the call",
37
+ "the review",
38
+ "the table"
39
+ ]
9
40
  },
10
41
  "rejectIf": [
11
42
  "sentence includes a concrete policy, safety, legal, or logistical reason",
@@ -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",