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.
- package/README.md +19 -3
- package/dist/adapters/textlint/report.js +1 -4
- package/dist/adapters/textlint/report.js.map +1 -1
- package/dist/adapters/textlint/rule.js +21 -0
- package/dist/adapters/textlint/rule.js.map +1 -0
- package/dist/adapters/textlint/units.js +149 -1
- package/dist/adapters/textlint/units.js.map +1 -1
- package/dist/cli.js +18 -7
- package/dist/cli.js.map +1 -1
- package/dist/presets/everything.js +8 -0
- package/dist/presets/everything.js.map +1 -1
- package/dist/registries/narrative-slop.js +2 -0
- package/dist/registries/narrative-slop.js.map +1 -1
- package/dist/registries/orthography.js +4 -0
- package/dist/registries/orthography.js.map +1 -1
- package/dist/registries/syntactic-patterns/authority.js +3 -1
- package/dist/registries/syntactic-patterns/authority.js.map +1 -1
- package/dist/registries/syntactic-patterns/lead-ins.js +2 -0
- package/dist/registries/syntactic-patterns/lead-ins.js.map +1 -1
- package/dist/registries/syntactic-patterns/repetition.js +4 -0
- package/dist/registries/syntactic-patterns/repetition.js.map +1 -1
- package/dist/registries/words.js +2 -0
- package/dist/registries/words.js.map +1 -1
- package/dist/reporting/reports.js +50 -0
- package/dist/reporting/reports.js.map +1 -1
- package/dist/rules/academic-slop/tortured-phrases.js +13 -23
- package/dist/rules/academic-slop/tortured-phrases.js.map +1 -1
- package/dist/rules/metrics/avg-sentence-length.js +29 -21
- package/dist/rules/metrics/avg-sentence-length.js.map +1 -1
- package/dist/rules/metrics/coleman-liau.js +23 -23
- package/dist/rules/metrics/coleman-liau.js.map +1 -1
- package/dist/rules/metrics/flesch-kincaid.js +23 -23
- package/dist/rules/metrics/flesch-kincaid.js.map +1 -1
- package/dist/rules/metrics/gunning-fog.js +23 -23
- package/dist/rules/metrics/gunning-fog.js.map +1 -1
- package/dist/rules/metrics/paragraph-length.js +19 -20
- package/dist/rules/metrics/paragraph-length.js.map +1 -1
- package/dist/rules/metrics/word-repetition.js +20 -21
- package/dist/rules/metrics/word-repetition.js.map +1 -1
- package/dist/rules/narrative-slop/body-action-density.js +104 -24
- package/dist/rules/narrative-slop/body-action-density.js.map +1 -1
- package/dist/rules/narrative-slop/data/narrative-cliches.json +76 -0
- package/dist/rules/narrative-slop/flat-action-cadence.js +117 -172
- package/dist/rules/narrative-slop/flat-action-cadence.js.map +1 -1
- package/dist/rules/narrative-slop/low-information-beat-density.js +79 -0
- package/dist/rules/narrative-slop/low-information-beat-density.js.map +1 -0
- package/dist/rules/narrative-slop/narrative-cliches.js +35 -33
- package/dist/rules/narrative-slop/narrative-cliches.js.map +1 -1
- package/dist/rules/narrative-slop/perception-verb-density.js +47 -24
- package/dist/rules/narrative-slop/perception-verb-density.js.map +1 -1
- package/dist/rules/orthography/artifact-placeholders.js +110 -0
- package/dist/rules/orthography/artifact-placeholders.js.map +1 -0
- package/dist/rules/orthography/colon-dramatic.js +24 -32
- package/dist/rules/orthography/colon-dramatic.js.map +1 -1
- package/dist/rules/orthography/em-dashes.js +19 -33
- package/dist/rules/orthography/em-dashes.js.map +1 -1
- package/dist/rules/orthography/exclamation-density.js +20 -34
- package/dist/rules/orthography/exclamation-density.js.map +1 -1
- package/dist/rules/orthography/fake-timestamps.js +12 -32
- package/dist/rules/orthography/fake-timestamps.js.map +1 -1
- package/dist/rules/orthography/hidden-unicode-controls.js +51 -0
- package/dist/rules/orthography/hidden-unicode-controls.js.map +1 -0
- package/dist/rules/orthography/sentence-case.js +26 -32
- package/dist/rules/orthography/sentence-case.js.map +1 -1
- package/dist/rules/orthography/smart-quotes.js +12 -32
- package/dist/rules/orthography/smart-quotes.js.map +1 -1
- package/dist/rules/phrases/cliches.js +16 -27
- package/dist/rules/phrases/cliches.js.map +1 -1
- package/dist/rules/phrases/corporate-speak.js +16 -27
- package/dist/rules/phrases/corporate-speak.js.map +1 -1
- package/dist/rules/phrases/data/llm-disclaimer-expansions.json +9 -2
- package/dist/rules/phrases/data/redundancy-patterns.json +7 -0
- package/dist/rules/phrases/data/wordiness-patterns.json +2 -0
- package/dist/rules/phrases/humble-bragger.js +12 -22
- package/dist/rules/phrases/humble-bragger.js.map +1 -1
- package/dist/rules/phrases/jargon-faker.js +14 -25
- package/dist/rules/phrases/jargon-faker.js.map +1 -1
- package/dist/rules/phrases/llm-disclaimer.js +19 -23
- package/dist/rules/phrases/llm-disclaimer.js.map +1 -1
- package/dist/rules/phrases/prohibited-phrases.js +13 -23
- package/dist/rules/phrases/prohibited-phrases.js.map +1 -1
- package/dist/rules/phrases/redundancy.js +13 -23
- package/dist/rules/phrases/redundancy.js.map +1 -1
- package/dist/rules/phrases/skunked-terms.js +13 -23
- package/dist/rules/phrases/skunked-terms.js.map +1 -1
- package/dist/rules/phrases/uncomparables.js +15 -26
- package/dist/rules/phrases/uncomparables.js.map +1 -1
- package/dist/rules/phrases/wordiness.js +13 -23
- package/dist/rules/phrases/wordiness.js.map +1 -1
- package/dist/rules/private/textlint-rule-builders.js +48 -0
- package/dist/rules/private/textlint-rule-builders.js.map +1 -0
- package/dist/rules/semantic-thinness/patterns/abstract-metaphor-claim.json +91 -2
- package/dist/rules/semantic-thinness/patterns/abstract-personification-line.json +34 -3
- package/dist/rules/semantic-thinness/patterns/body-emotion-shorthand.json +23 -0
- package/dist/rules/semantic-thinness/patterns/deictic-summary.json +118 -6
- package/dist/rules/semantic-thinness/patterns/different-job-summary.json +30 -0
- package/dist/rules/semantic-thinness/patterns/emotion-as-substance.json +14 -4
- package/dist/rules/semantic-thinness/patterns/empty-atmosphere-shift.json +2 -0
- package/dist/rules/semantic-thinness/patterns/empty-scene-state.json +1 -0
- package/dist/rules/semantic-thinness/patterns/empty-scene-transition.json +1 -0
- package/dist/rules/semantic-thinness/patterns/gaze-choreography.json +2 -0
- package/dist/rules/semantic-thinness/patterns/generic-pressure-or-stakes.json +1 -0
- package/dist/rules/semantic-thinness/patterns/generic-realization.json +1 -0
- package/dist/rules/semantic-thinness/patterns/hollow-significance.json +94 -2
- package/dist/rules/semantic-thinness/patterns/missing-conversation-plan.json +44 -0
- package/dist/rules/semantic-thinness/patterns/puffery-evaluative-claim.json +122 -0
- package/dist/rules/semantic-thinness/patterns/real-work-begins.json +3 -1
- package/dist/rules/semantic-thinness/patterns/silence-as-actor.json +4 -0
- package/dist/rules/semantic-thinness/patterns/solution-boring-frame.json +72 -0
- package/dist/rules/semantic-thinness/patterns/truth-answer-moves.json +2 -0
- package/dist/rules/semantic-thinness/patterns/vague-connective-payoff.json +31 -4
- package/dist/rules/semantic-thinness/patterns/vague-summary-cost.json +34 -0
- package/dist/rules/semantic-thinness/patterns/vague-threshold-change.json +40 -4
- package/dist/rules/semantic-thinness/private/concrete-guards.js +119 -0
- package/dist/rules/semantic-thinness/private/concrete-guards.js.map +1 -0
- package/dist/rules/semantic-thinness/private/pattern-data-b.js +6 -0
- package/dist/rules/semantic-thinness/private/pattern-data-b.js.map +1 -1
- package/dist/rules/semantic-thinness/private/pattern-data-d.js +4 -0
- package/dist/rules/semantic-thinness/private/pattern-data-d.js.map +1 -1
- package/dist/rules/semantic-thinness/private/pattern-matcher.js +26 -14
- package/dist/rules/semantic-thinness/private/pattern-matcher.js.map +1 -1
- package/dist/rules/semantic-thinness/semantic-thinness.js +27 -23
- package/dist/rules/semantic-thinness/semantic-thinness.js.map +1 -1
- package/dist/rules/syntactic-patterns/authority/authority-padding.js +94 -30
- package/dist/rules/syntactic-patterns/authority/authority-padding.js.map +1 -1
- package/dist/rules/syntactic-patterns/authority/uncited-authority.js +124 -0
- package/dist/rules/syntactic-patterns/authority/uncited-authority.js.map +1 -0
- package/dist/rules/syntactic-patterns/closers/affirmation-closers.js +56 -44
- package/dist/rules/syntactic-patterns/closers/affirmation-closers.js.map +1 -1
- package/dist/rules/syntactic-patterns/closers/boilerplate-conclusion.js +76 -26
- package/dist/rules/syntactic-patterns/closers/boilerplate-conclusion.js.map +1 -1
- package/dist/rules/syntactic-patterns/closers/false-question.js +20 -24
- package/dist/rules/syntactic-patterns/closers/false-question.js.map +1 -1
- package/dist/rules/syntactic-patterns/closers/summative-closer.js +69 -25
- package/dist/rules/syntactic-patterns/closers/summative-closer.js.map +1 -1
- package/dist/rules/syntactic-patterns/contrast/blame-reframe.js +19 -23
- package/dist/rules/syntactic-patterns/contrast/blame-reframe.js.map +1 -1
- package/dist/rules/syntactic-patterns/contrast/contrastive-aphorism.js +102 -31
- package/dist/rules/syntactic-patterns/contrast/contrastive-aphorism.js.map +1 -1
- package/dist/rules/syntactic-patterns/contrast/negation-reframe.js +30 -22
- package/dist/rules/syntactic-patterns/contrast/negation-reframe.js.map +1 -1
- package/dist/rules/syntactic-patterns/contrast/private/abstract-pair-gates.js +63 -0
- package/dist/rules/syntactic-patterns/contrast/private/abstract-pair-gates.js.map +1 -0
- package/dist/rules/syntactic-patterns/contrast/private/block-negation-reframe.js +194 -0
- package/dist/rules/syntactic-patterns/contrast/private/block-negation-reframe.js.map +1 -0
- package/dist/rules/syntactic-patterns/contrast/private/meaning-reframe.js +42 -0
- package/dist/rules/syntactic-patterns/contrast/private/meaning-reframe.js.map +1 -0
- package/dist/rules/syntactic-patterns/contrast/private/negation-reframe-matcher.js +34 -41
- package/dist/rules/syntactic-patterns/contrast/private/negation-reframe-matcher.js.map +1 -1
- package/dist/rules/syntactic-patterns/contrast/private/negation-reframe-parts.js +4 -2
- package/dist/rules/syntactic-patterns/contrast/private/negation-reframe-parts.js.map +1 -1
- package/dist/rules/syntactic-patterns/contrast/private/negative-slop-frames.js +39 -2
- package/dist/rules/syntactic-patterns/contrast/private/negative-slop-frames.js.map +1 -1
- package/dist/rules/syntactic-patterns/contrast/private/same-sentence-contrast.js +47 -0
- package/dist/rules/syntactic-patterns/contrast/private/same-sentence-contrast.js.map +1 -0
- package/dist/rules/syntactic-patterns/generalization/softening-language.js +19 -23
- package/dist/rules/syntactic-patterns/generalization/softening-language.js.map +1 -1
- package/dist/rules/syntactic-patterns/generalization/universalizing-claims.js +103 -24
- package/dist/rules/syntactic-patterns/generalization/universalizing-claims.js.map +1 -1
- package/dist/rules/syntactic-patterns/lead-ins/boilerplate-framing.js +12 -22
- package/dist/rules/syntactic-patterns/lead-ins/boilerplate-framing.js.map +1 -1
- package/dist/rules/syntactic-patterns/lead-ins/formal-transition-density.js +92 -0
- package/dist/rules/syntactic-patterns/lead-ins/formal-transition-density.js.map +1 -0
- package/dist/rules/syntactic-patterns/lead-ins/generic-signposting.js +72 -26
- package/dist/rules/syntactic-patterns/lead-ins/generic-signposting.js.map +1 -1
- package/dist/rules/syntactic-patterns/lead-ins/lesson-framing.js +28 -23
- package/dist/rules/syntactic-patterns/lead-ins/lesson-framing.js.map +1 -1
- package/dist/rules/syntactic-patterns/lead-ins/llm-openers.js +63 -25
- package/dist/rules/syntactic-patterns/lead-ins/llm-openers.js.map +1 -1
- package/dist/rules/syntactic-patterns/lead-ins/observer-guidance.js +36 -23
- package/dist/rules/syntactic-patterns/lead-ins/observer-guidance.js.map +1 -1
- package/dist/rules/syntactic-patterns/lead-ins/private/discourse-evaluation.js +91 -0
- package/dist/rules/syntactic-patterns/lead-ins/private/discourse-evaluation.js.map +1 -0
- package/dist/rules/syntactic-patterns/llm-artifacts/data/response-wrapper-patterns.json +6 -0
- package/dist/rules/syntactic-patterns/llm-artifacts/response-wrapper.js +21 -26
- package/dist/rules/syntactic-patterns/llm-artifacts/response-wrapper.js.map +1 -1
- package/dist/rules/syntactic-patterns/repetition/demonstrative-emphasis.js +32 -51
- package/dist/rules/syntactic-patterns/repetition/demonstrative-emphasis.js.map +1 -1
- package/dist/rules/syntactic-patterns/repetition/empty-emphasis.js +19 -23
- package/dist/rules/syntactic-patterns/repetition/empty-emphasis.js.map +1 -1
- package/dist/rules/syntactic-patterns/repetition/fragment-stacking.js +16 -33
- package/dist/rules/syntactic-patterns/repetition/fragment-stacking.js.map +1 -1
- package/dist/rules/syntactic-patterns/repetition/repeated-predicate-end.js +110 -0
- package/dist/rules/syntactic-patterns/repetition/repeated-predicate-end.js.map +1 -0
- package/dist/rules/syntactic-patterns/repetition/repeated-sentence-starts.js +91 -0
- package/dist/rules/syntactic-patterns/repetition/repeated-sentence-starts.js.map +1 -0
- package/dist/rules/syntactic-patterns/repetition/triple-repeat.js +21 -39
- package/dist/rules/syntactic-patterns/repetition/triple-repeat.js.map +1 -1
- package/dist/rules/term-policy/recommended-terms.js +27 -25
- package/dist/rules/term-policy/recommended-terms.js.map +1 -1
- package/dist/rules/term-policy/required-terms.js +21 -25
- package/dist/rules/term-policy/required-terms.js.map +1 -1
- package/dist/rules/words/hedge-stacking.js +19 -23
- package/dist/rules/words/hedge-stacking.js.map +1 -1
- package/dist/rules/words/llm-vocabulary-density.js +78 -0
- package/dist/rules/words/llm-vocabulary-density.js.map +1 -0
- package/dist/rules/words/llm-vocabulary.js +14 -20
- package/dist/rules/words/llm-vocabulary.js.map +1 -1
- package/dist/rules/words/prohibited-words.js +12 -17
- package/dist/rules/words/prohibited-words.js.map +1 -1
- package/dist/rules/words/simplicity.js +20 -25
- package/dist/rules/words/simplicity.js.map +1 -1
- package/dist/shared/matchers/concrete-evidence.js +161 -0
- package/dist/shared/matchers/concrete-evidence.js.map +1 -0
- package/package.json +12 -4
|
@@ -7,6 +7,8 @@
|
|
|
7
7
|
"templates": [
|
|
8
8
|
"{silenceSubject} {linkingVerb} not {thinState}.",
|
|
9
9
|
"{silenceSubject} {linkingVerb} {thinState}.",
|
|
10
|
+
"{silenceSubject} became {thinState}.",
|
|
11
|
+
"{silenceSubject} turned {thinState}.",
|
|
10
12
|
"{deicticSubject} only made {silenceSubject} feel {thinState}.",
|
|
11
13
|
"{placeSubject} had gone quiet in {mannerFrame}.",
|
|
12
14
|
"{humanSubject} could make {silenceSubject} feel {thinState}."
|
|
@@ -51,6 +53,8 @@
|
|
|
51
53
|
"positiveExamples": [
|
|
52
54
|
"The silence was not empty.",
|
|
53
55
|
"The silence felt arranged.",
|
|
56
|
+
"The silence became heavy.",
|
|
57
|
+
"The silence turned strange.",
|
|
54
58
|
"This only made the silence feel deliberate.",
|
|
55
59
|
"The office had gone quiet in the way offices do.",
|
|
56
60
|
"She could make silence feel crowded.",
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "solution-boring-frame",
|
|
3
|
+
"class": "solution-boring",
|
|
4
|
+
"purpose": "Catch solution-like nouns framed as boring, a consultant or LLM wrapper that praises unglamorous obviousness without adding substance.",
|
|
5
|
+
"matchMode": "contains",
|
|
6
|
+
"maxTokens": 40,
|
|
7
|
+
"templates": [
|
|
8
|
+
"the {solutionNoun} {linkingVerb} boring.",
|
|
9
|
+
"the {solutionNoun} {linkingVerb} boring:",
|
|
10
|
+
"this {solutionNoun} {linkingVerb} boring.",
|
|
11
|
+
"this {solutionNoun} {linkingVerb} boring:",
|
|
12
|
+
"the {solutionQualifier} {solutionNoun} {linkingVerb} boring.",
|
|
13
|
+
"this {solutionQualifier} {solutionNoun} {linkingVerb} boring.",
|
|
14
|
+
"the {solutionQualifier} {solutionNoun} {linkingVerb} boring:"
|
|
15
|
+
],
|
|
16
|
+
"slots": {
|
|
17
|
+
"solutionQualifier": [
|
|
18
|
+
"right",
|
|
19
|
+
"correct",
|
|
20
|
+
"good",
|
|
21
|
+
"better",
|
|
22
|
+
"best",
|
|
23
|
+
"practical",
|
|
24
|
+
"obvious",
|
|
25
|
+
"simple",
|
|
26
|
+
"real",
|
|
27
|
+
"actual"
|
|
28
|
+
],
|
|
29
|
+
"solutionNoun": [
|
|
30
|
+
"answer",
|
|
31
|
+
"approach",
|
|
32
|
+
"check",
|
|
33
|
+
"choice",
|
|
34
|
+
"fix",
|
|
35
|
+
"method",
|
|
36
|
+
"option",
|
|
37
|
+
"plan",
|
|
38
|
+
"remedy",
|
|
39
|
+
"response",
|
|
40
|
+
"solution",
|
|
41
|
+
"strategy",
|
|
42
|
+
"tactic"
|
|
43
|
+
],
|
|
44
|
+
"linkingVerb": ["is", "was", "becomes", "became", "remains", "stays"]
|
|
45
|
+
},
|
|
46
|
+
"rejectIf": [
|
|
47
|
+
"subject is a concrete entertainment, event, object, person, or venue noun",
|
|
48
|
+
"sentence uses boring as a normal literal evaluation of experience",
|
|
49
|
+
"sentence names a concrete process noun such as audit or report rather than a solution-like noun"
|
|
50
|
+
],
|
|
51
|
+
"positiveExamples": [
|
|
52
|
+
"The solution is boring.",
|
|
53
|
+
"The solution is boring: move copy into raw HTML.",
|
|
54
|
+
"This check is boring, fast, and easy to prove in five minutes.",
|
|
55
|
+
"This check is boring, fast, and easy to prove in less than five minutes.",
|
|
56
|
+
"The right solution is boring.",
|
|
57
|
+
"The correct answer is boring.",
|
|
58
|
+
"The practical plan is boring: remove the redirect chain."
|
|
59
|
+
],
|
|
60
|
+
"negativeExamples": [
|
|
61
|
+
"The movie is boring.",
|
|
62
|
+
"The party is boring.",
|
|
63
|
+
"The audit is boring.",
|
|
64
|
+
"The report is boring.",
|
|
65
|
+
"The smoke detector check is boring but required."
|
|
66
|
+
],
|
|
67
|
+
"notes": [
|
|
68
|
+
"This intentionally excludes audit and report because those are process or document nouns, not solution-like nouns.",
|
|
69
|
+
"This intentionally excludes path, route, and way because they commonly name literal travel or movement.",
|
|
70
|
+
"Concrete details after the colon should not suppress this pattern because the slop is the wrapper itself."
|
|
71
|
+
]
|
|
72
|
+
}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
"maxTokens": 80,
|
|
7
7
|
"templates": [
|
|
8
8
|
"{truthSubject} {emergenceVerb}.",
|
|
9
|
+
"{truthSubject} had {emergenceVerb}.",
|
|
9
10
|
"{truthSubject} starts {motionVerb}.",
|
|
10
11
|
"{truthSubject} began to {motionVerb}.",
|
|
11
12
|
"{truthSubject} {arrivalVerb} as {abstractForm}.",
|
|
@@ -57,6 +58,7 @@
|
|
|
57
58
|
"positiveExamples": [
|
|
58
59
|
"Eventually the truth surfaces.",
|
|
59
60
|
"The answer arrives as a body sensation.",
|
|
61
|
+
"The answer had arrived as a small signal.",
|
|
60
62
|
"The meaning arrives later.",
|
|
61
63
|
"The truth starts moving around.",
|
|
62
64
|
"The answer began to take shape.",
|
|
@@ -6,9 +6,20 @@
|
|
|
6
6
|
"{payoffOpener} {payoffComplement}.",
|
|
7
7
|
"{payoffOpener} where {genericWork} {startVerb}.",
|
|
8
8
|
"{payoffOpener} why {genericSubject} {importanceVerb}.",
|
|
9
|
-
"{payoffOpener} how {genericChange} {startVerb}."
|
|
9
|
+
"{payoffOpener} how {genericChange} {startVerb}.",
|
|
10
|
+
"{plainOpener} why {genericSubject} {importanceVerb}.",
|
|
11
|
+
"{plainOpener} where {genericWork} {startVerb}.",
|
|
12
|
+
"{plainOpener} how {genericChange} {startVerb}.",
|
|
13
|
+
"{plainOpener} the reason {genericSubject} {importanceVerb}."
|
|
10
14
|
],
|
|
11
15
|
"slots": {
|
|
16
|
+
"plainOpener": [
|
|
17
|
+
"and that is",
|
|
18
|
+
"and this is",
|
|
19
|
+
"that is",
|
|
20
|
+
"this is",
|
|
21
|
+
"which is"
|
|
22
|
+
],
|
|
12
23
|
"payoffOpener": [
|
|
13
24
|
"and that is",
|
|
14
25
|
"and this is",
|
|
@@ -33,7 +44,9 @@
|
|
|
33
44
|
"how the work begins",
|
|
34
45
|
"the point",
|
|
35
46
|
"the part that matters",
|
|
36
|
-
"the real work"
|
|
47
|
+
"the real work",
|
|
48
|
+
"the reason",
|
|
49
|
+
"the takeaway"
|
|
37
50
|
],
|
|
38
51
|
"genericWork": [
|
|
39
52
|
"the work",
|
|
@@ -52,9 +65,23 @@
|
|
|
52
65
|
"the work",
|
|
53
66
|
"the lesson",
|
|
54
67
|
"the process",
|
|
55
|
-
"the change"
|
|
68
|
+
"the change",
|
|
69
|
+
"the answer",
|
|
70
|
+
"the focus",
|
|
71
|
+
"the plan",
|
|
72
|
+
"the problem",
|
|
73
|
+
"the report",
|
|
74
|
+
"the signal"
|
|
75
|
+
],
|
|
76
|
+
"importanceVerb": [
|
|
77
|
+
"matters",
|
|
78
|
+
"works",
|
|
79
|
+
"sticks",
|
|
80
|
+
"lasts",
|
|
81
|
+
"counts",
|
|
82
|
+
"changes",
|
|
83
|
+
"changes things"
|
|
56
84
|
],
|
|
57
|
-
"importanceVerb": ["matters", "works", "sticks", "lasts", "changes things"],
|
|
58
85
|
"genericChange": [
|
|
59
86
|
"change",
|
|
60
87
|
"repair",
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "vague-summary-cost",
|
|
3
|
+
"class": "vague-summary-cost",
|
|
4
|
+
"purpose": "Catch vague all-of-that cost claims that summarize several actions as expensive or wasteful without naming the concrete waste.",
|
|
5
|
+
"matchMode": "contains",
|
|
6
|
+
"maxTokens": 28,
|
|
7
|
+
"templates": [
|
|
8
|
+
"{summarySubject} gets {costAdjective} when {ignoranceSubject} {knowledgeVerb} which {problemNoun} they are {workVerb}.",
|
|
9
|
+
"{summarySubject} gets {costAdjective} when {ignoranceSubject} {knowledgeVerb} what {problemNoun} they are {workVerb}."
|
|
10
|
+
],
|
|
11
|
+
"slots": {
|
|
12
|
+
"summarySubject": ["all of that", "all this", "all that"],
|
|
13
|
+
"costAdjective": ["expensive", "costly", "wasteful", "slow"],
|
|
14
|
+
"ignoranceSubject": ["nobody", "no one"],
|
|
15
|
+
"knowledgeVerb": ["knows", "understands"],
|
|
16
|
+
"problemNoun": ["problem", "issue", "question"],
|
|
17
|
+
"workVerb": ["solving", "answering", "fixing"]
|
|
18
|
+
},
|
|
19
|
+
"rejectIf": [
|
|
20
|
+
"sentence names the concrete cost, budget, invoice, time loss, or team affected",
|
|
21
|
+
"summary subject points to a specific preceding line item rather than a vague pile of activity"
|
|
22
|
+
],
|
|
23
|
+
"positiveExamples": [
|
|
24
|
+
"All of that gets expensive when nobody knows which problem they are solving.",
|
|
25
|
+
"All this gets wasteful when no one knows what question they are answering."
|
|
26
|
+
],
|
|
27
|
+
"negativeExamples": [
|
|
28
|
+
"The migration got expensive when the API vendor raised the monthly bill.",
|
|
29
|
+
"All of that cost 14 hours because the crawler retried broken URLs."
|
|
30
|
+
],
|
|
31
|
+
"notes": [
|
|
32
|
+
"This pattern intentionally allows a when-clause because the slop frame is the vague summary subject plus abstract ignorance claim."
|
|
33
|
+
]
|
|
34
|
+
}
|
|
@@ -23,7 +23,23 @@
|
|
|
23
23
|
"the day",
|
|
24
24
|
"the moment",
|
|
25
25
|
"the path",
|
|
26
|
-
"the choice"
|
|
26
|
+
"the choice",
|
|
27
|
+
"the problem",
|
|
28
|
+
"the fix",
|
|
29
|
+
"the report",
|
|
30
|
+
"the spreadsheet",
|
|
31
|
+
"the decision",
|
|
32
|
+
"the decisions",
|
|
33
|
+
"the audit",
|
|
34
|
+
"the strategy",
|
|
35
|
+
"the plan",
|
|
36
|
+
"the content",
|
|
37
|
+
"the page",
|
|
38
|
+
"the post",
|
|
39
|
+
"the source",
|
|
40
|
+
"the signal",
|
|
41
|
+
"the surface",
|
|
42
|
+
"the question"
|
|
27
43
|
],
|
|
28
44
|
"thresholdVerb": [
|
|
29
45
|
"got",
|
|
@@ -32,9 +48,20 @@
|
|
|
32
48
|
"turned",
|
|
33
49
|
"seemed",
|
|
34
50
|
"stayed",
|
|
35
|
-
"remained"
|
|
51
|
+
"remained",
|
|
52
|
+
"get",
|
|
53
|
+
"gets"
|
|
54
|
+
],
|
|
55
|
+
"feelingVerb": [
|
|
56
|
+
"feels",
|
|
57
|
+
"felt",
|
|
58
|
+
"looks",
|
|
59
|
+
"looked",
|
|
60
|
+
"sounds",
|
|
61
|
+
"sounded",
|
|
62
|
+
"seems",
|
|
63
|
+
"seemed"
|
|
36
64
|
],
|
|
37
|
-
"feelingVerb": ["felt", "looked", "sounded", "seemed"],
|
|
38
65
|
"evaluativeComplement": [
|
|
39
66
|
"different",
|
|
40
67
|
"better",
|
|
@@ -49,7 +76,16 @@
|
|
|
49
76
|
"simpler",
|
|
50
77
|
"complicated",
|
|
51
78
|
"possible",
|
|
52
|
-
"real"
|
|
79
|
+
"real",
|
|
80
|
+
"precise",
|
|
81
|
+
"thin",
|
|
82
|
+
"useful",
|
|
83
|
+
"useless",
|
|
84
|
+
"weak",
|
|
85
|
+
"strong",
|
|
86
|
+
"expensive",
|
|
87
|
+
"generic",
|
|
88
|
+
"specific"
|
|
53
89
|
],
|
|
54
90
|
"comparativeComplement": [
|
|
55
91
|
"more real",
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
const CONCRETE_EXPLANATION_TOKENS = new Set([
|
|
2
|
+
"api",
|
|
3
|
+
"archive",
|
|
4
|
+
"auditor",
|
|
5
|
+
"billing",
|
|
6
|
+
"crew",
|
|
7
|
+
"decibels",
|
|
8
|
+
"dns",
|
|
9
|
+
"doctor",
|
|
10
|
+
"email",
|
|
11
|
+
"endpoint",
|
|
12
|
+
"facilities",
|
|
13
|
+
"export",
|
|
14
|
+
"generator",
|
|
15
|
+
"html",
|
|
16
|
+
"hydration",
|
|
17
|
+
"hinge",
|
|
18
|
+
"invoice",
|
|
19
|
+
"key",
|
|
20
|
+
"ledger",
|
|
21
|
+
"masonry",
|
|
22
|
+
"mark",
|
|
23
|
+
"named",
|
|
24
|
+
"offset",
|
|
25
|
+
"parser",
|
|
26
|
+
"qualified",
|
|
27
|
+
"raw",
|
|
28
|
+
"rebate",
|
|
29
|
+
"removed",
|
|
30
|
+
"repayment",
|
|
31
|
+
"recording",
|
|
32
|
+
"router",
|
|
33
|
+
"screening",
|
|
34
|
+
"seam",
|
|
35
|
+
"server",
|
|
36
|
+
"signed",
|
|
37
|
+
"signatures",
|
|
38
|
+
"signal",
|
|
39
|
+
"service",
|
|
40
|
+
"socket",
|
|
41
|
+
"split",
|
|
42
|
+
"tax",
|
|
43
|
+
"token",
|
|
44
|
+
"trial",
|
|
45
|
+
"volume",
|
|
46
|
+
"wall"
|
|
47
|
+
]);
|
|
48
|
+
const NUMERIC_EVIDENCE_TOKENS = new Set([
|
|
49
|
+
"date",
|
|
50
|
+
"day",
|
|
51
|
+
"days",
|
|
52
|
+
"dollar",
|
|
53
|
+
"dollars",
|
|
54
|
+
"failed",
|
|
55
|
+
"percent",
|
|
56
|
+
"percentage",
|
|
57
|
+
"quarterly",
|
|
58
|
+
"score",
|
|
59
|
+
"year",
|
|
60
|
+
"years"
|
|
61
|
+
]);
|
|
62
|
+
function tokenHasDigit(text) {
|
|
63
|
+
for (const character of text) {
|
|
64
|
+
if (character >= "0" && character <= "9") {
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
function isAsciiUppercase(character) {
|
|
71
|
+
return character >= "A" && character <= "Z";
|
|
72
|
+
}
|
|
73
|
+
function isAsciiLowercase(character) {
|
|
74
|
+
return character >= "a" && character <= "z";
|
|
75
|
+
}
|
|
76
|
+
function hasTicketLikeMarker(text) {
|
|
77
|
+
for (let index = 0; index < text.length - 3; index += 1) {
|
|
78
|
+
if (isAsciiUppercase(text[index] ?? "") &&
|
|
79
|
+
isAsciiUppercase(text[index + 1] ?? "") &&
|
|
80
|
+
text[index + 2] === "-" &&
|
|
81
|
+
tokenHasDigit(text[index + 3] ?? "")) {
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
function hasDottedIdentifier(text) {
|
|
88
|
+
for (let index = 1; index < text.length - 1; index += 1) {
|
|
89
|
+
if (text[index] === "." &&
|
|
90
|
+
isAsciiLowercase(text[index - 1] ?? "") &&
|
|
91
|
+
isAsciiLowercase(text[index + 1] ?? "")) {
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
function hasConcreteMarker(text) {
|
|
98
|
+
return (text.includes("://") ||
|
|
99
|
+
text.includes("@") ||
|
|
100
|
+
text.includes("`") ||
|
|
101
|
+
hasTicketLikeMarker(text) ||
|
|
102
|
+
hasDottedIdentifier(text));
|
|
103
|
+
}
|
|
104
|
+
function hasNumericEvidence(tokens) {
|
|
105
|
+
return tokens.some((token, index) => {
|
|
106
|
+
if (!tokenHasDigit(token.normalized)) {
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
return (NUMERIC_EVIDENCE_TOKENS.has(tokens[index - 1]?.normalized ?? "") ||
|
|
110
|
+
NUMERIC_EVIDENCE_TOKENS.has(tokens[index + 1]?.normalized ?? ""));
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
export function hasConcreteExplanation(tokens) {
|
|
114
|
+
return tokens.some((token) => CONCRETE_EXPLANATION_TOKENS.has(token.normalized));
|
|
115
|
+
}
|
|
116
|
+
export function shouldRejectConcreteEvidence(text, tokens) {
|
|
117
|
+
return hasConcreteMarker(text) || hasNumericEvidence(tokens);
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=concrete-guards.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"concrete-guards.js","sourceRoot":"","sources":["../../../../src/rules/semantic-thinness/private/concrete-guards.ts"],"names":[],"mappings":"AAEA,MAAM,2BAA2B,GAAG,IAAI,GAAG,CAAC;IAC1C,KAAK;IACL,SAAS;IACT,SAAS;IACT,SAAS;IACT,MAAM;IACN,UAAU;IACV,KAAK;IACL,QAAQ;IACR,OAAO;IACP,UAAU;IACV,YAAY;IACZ,QAAQ;IACR,WAAW;IACX,MAAM;IACN,WAAW;IACX,OAAO;IACP,SAAS;IACT,KAAK;IACL,QAAQ;IACR,SAAS;IACT,MAAM;IACN,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,WAAW;IACX,KAAK;IACL,QAAQ;IACR,SAAS;IACT,WAAW;IACX,WAAW;IACX,QAAQ;IACR,WAAW;IACX,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,YAAY;IACZ,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,OAAO;IACP,KAAK;IACL,OAAO;IACP,OAAO;IACP,QAAQ;IACR,MAAM;CACP,CAAC,CAAC;AACH,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAC;IACtC,MAAM;IACN,KAAK;IACL,MAAM;IACN,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,SAAS;IACT,YAAY;IACZ,WAAW;IACX,OAAO;IACP,MAAM;IACN,OAAO;CACR,CAAC,CAAC;AAEH,SAAS,aAAa,CAAC,IAAY;IACjC,KAAK,MAAM,SAAS,IAAI,IAAI,EAAE,CAAC;QAC7B,IAAI,SAAS,IAAI,GAAG,IAAI,SAAS,IAAI,GAAG,EAAE,CAAC;YACzC,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,gBAAgB,CAAC,SAAiB;IACzC,OAAO,SAAS,IAAI,GAAG,IAAI,SAAS,IAAI,GAAG,CAAC;AAC9C,CAAC;AAED,SAAS,gBAAgB,CAAC,SAAiB;IACzC,OAAO,SAAS,IAAI,GAAG,IAAI,SAAS,IAAI,GAAG,CAAC;AAC9C,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAY;IACvC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACxD,IACE,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YACnC,gBAAgB,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YACvC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG;YACvB,aAAa,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EACpC,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAY;IACvC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACxD,IACE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG;YACnB,gBAAgB,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YACvC,gBAAgB,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EACvC,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY;IACrC,OAAO,CACL,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QACpB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAClB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAClB,mBAAmB,CAAC,IAAI,CAAC;QACzB,mBAAmB,CAAC,IAAI,CAAC,CAC1B,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAwB;IAClD,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QAClC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;YACrC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,CACL,uBAAuB,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,UAAU,IAAI,EAAE,CAAC;YAChE,uBAAuB,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,UAAU,IAAI,EAAE,CAAC,CACjE,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,MAAwB;IAC7D,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAC3B,2BAA2B,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAClD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,IAAY,EACZ,MAAwB;IAExB,OAAO,iBAAiB,CAAC,IAAI,CAAC,IAAI,kBAAkB,CAAC,MAAM,CAAC,CAAC;AAC/D,CAAC"}
|
|
@@ -1,15 +1,21 @@
|
|
|
1
|
+
import differentJobSummary from "../patterns/different-job-summary.json" with { type: "json" };
|
|
1
2
|
import genericPressureOrStakes from "../patterns/generic-pressure-or-stakes.json" with { type: "json" };
|
|
2
3
|
import genericRealization from "../patterns/generic-realization.json" with { type: "json" };
|
|
3
4
|
import hollowSignificance from "../patterns/hollow-significance.json" with { type: "json" };
|
|
4
5
|
import lowInformationPhysicalBlocking from "../patterns/low-information-physical-blocking.json" with { type: "json" };
|
|
6
|
+
import missingConversationPlan from "../patterns/missing-conversation-plan.json" with { type: "json" };
|
|
5
7
|
import vagueConnectivePayoff from "../patterns/vague-connective-payoff.json" with { type: "json" };
|
|
8
|
+
import vagueSummaryCost from "../patterns/vague-summary-cost.json" with { type: "json" };
|
|
6
9
|
import vagueThresholdChange from "../patterns/vague-threshold-change.json" with { type: "json" };
|
|
7
10
|
export const semanticThinnessPatternSetB = [
|
|
11
|
+
differentJobSummary,
|
|
8
12
|
genericPressureOrStakes,
|
|
9
13
|
genericRealization,
|
|
10
14
|
hollowSignificance,
|
|
11
15
|
lowInformationPhysicalBlocking,
|
|
16
|
+
missingConversationPlan,
|
|
12
17
|
vagueConnectivePayoff,
|
|
18
|
+
vagueSummaryCost,
|
|
13
19
|
vagueThresholdChange
|
|
14
20
|
];
|
|
15
21
|
//# sourceMappingURL=pattern-data-b.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pattern-data-b.js","sourceRoot":"","sources":["../../../../src/rules/semantic-thinness/private/pattern-data-b.ts"],"names":[],"mappings":"AAAA,OAAO,uBAAuB,MAAM,6CAA6C,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACxG,OAAO,kBAAkB,MAAM,sCAAsC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAC5F,OAAO,kBAAkB,MAAM,sCAAsC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAC5F,OAAO,8BAA8B,MAAM,oDAAoD,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACtH,OAAO,qBAAqB,MAAM,0CAA0C,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACnG,OAAO,oBAAoB,MAAM,yCAAyC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAGjG,MAAM,CAAC,MAAM,2BAA2B,GAAuC;IAC7E,uBAAuB;IACvB,kBAAkB;IAClB,kBAAkB;IAClB,8BAA8B;IAC9B,qBAAqB;IACrB,oBAAoB;CACrB,CAAC"}
|
|
1
|
+
{"version":3,"file":"pattern-data-b.js","sourceRoot":"","sources":["../../../../src/rules/semantic-thinness/private/pattern-data-b.ts"],"names":[],"mappings":"AAAA,OAAO,mBAAmB,MAAM,wCAAwC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAC/F,OAAO,uBAAuB,MAAM,6CAA6C,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACxG,OAAO,kBAAkB,MAAM,sCAAsC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAC5F,OAAO,kBAAkB,MAAM,sCAAsC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAC5F,OAAO,8BAA8B,MAAM,oDAAoD,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACtH,OAAO,uBAAuB,MAAM,4CAA4C,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACvG,OAAO,qBAAqB,MAAM,0CAA0C,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACnG,OAAO,gBAAgB,MAAM,qCAAqC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACzF,OAAO,oBAAoB,MAAM,yCAAyC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAGjG,MAAM,CAAC,MAAM,2BAA2B,GAAuC;IAC7E,mBAAmB;IACnB,uBAAuB;IACvB,kBAAkB;IAClB,kBAAkB;IAClB,8BAA8B;IAC9B,uBAAuB;IACvB,qBAAqB;IACrB,gBAAgB;IAChB,oBAAoB;CACrB,CAAC"}
|
|
@@ -1,16 +1,20 @@
|
|
|
1
1
|
import bodyKnows from "../patterns/body-knows.json" with { type: "json" };
|
|
2
2
|
import deicticSummary from "../patterns/deictic-summary.json" with { type: "json" };
|
|
3
3
|
import pointIsFrame from "../patterns/point-is-frame.json" with { type: "json" };
|
|
4
|
+
import pufferyEvaluativeClaim from "../patterns/puffery-evaluative-claim.json" with { type: "json" };
|
|
4
5
|
import realWorkBegins from "../patterns/real-work-begins.json" with { type: "json" };
|
|
5
6
|
import silenceAsActor from "../patterns/silence-as-actor.json" with { type: "json" };
|
|
7
|
+
import solutionBoringFrame from "../patterns/solution-boring-frame.json" with { type: "json" };
|
|
6
8
|
import somethingShifted from "../patterns/something-shifted.json" with { type: "json" };
|
|
7
9
|
import truthAnswerMoves from "../patterns/truth-answer-moves.json" with { type: "json" };
|
|
8
10
|
export const semanticThinnessPatternSetD = [
|
|
9
11
|
bodyKnows,
|
|
10
12
|
deicticSummary,
|
|
11
13
|
pointIsFrame,
|
|
14
|
+
pufferyEvaluativeClaim,
|
|
12
15
|
realWorkBegins,
|
|
13
16
|
silenceAsActor,
|
|
17
|
+
solutionBoringFrame,
|
|
14
18
|
somethingShifted,
|
|
15
19
|
truthAnswerMoves
|
|
16
20
|
];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pattern-data-d.js","sourceRoot":"","sources":["../../../../src/rules/semantic-thinness/private/pattern-data-d.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,6BAA6B,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAC1E,OAAO,cAAc,MAAM,kCAAkC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACpF,OAAO,YAAY,MAAM,iCAAiC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACjF,OAAO,cAAc,MAAM,mCAAmC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACrF,OAAO,cAAc,MAAM,mCAAmC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACrF,OAAO,gBAAgB,MAAM,oCAAoC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACxF,OAAO,gBAAgB,MAAM,qCAAqC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAGzF,MAAM,CAAC,MAAM,2BAA2B,GAAuC;IAC7E,SAAS;IACT,cAAc;IACd,YAAY;IACZ,cAAc;IACd,cAAc;IACd,gBAAgB;IAChB,gBAAgB;CACjB,CAAC"}
|
|
1
|
+
{"version":3,"file":"pattern-data-d.js","sourceRoot":"","sources":["../../../../src/rules/semantic-thinness/private/pattern-data-d.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,6BAA6B,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAC1E,OAAO,cAAc,MAAM,kCAAkC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACpF,OAAO,YAAY,MAAM,iCAAiC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACjF,OAAO,sBAAsB,MAAM,2CAA2C,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACrG,OAAO,cAAc,MAAM,mCAAmC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACrF,OAAO,cAAc,MAAM,mCAAmC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACrF,OAAO,mBAAmB,MAAM,wCAAwC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAC/F,OAAO,gBAAgB,MAAM,oCAAoC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACxF,OAAO,gBAAgB,MAAM,qCAAqC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAGzF,MAAM,CAAC,MAAM,2BAA2B,GAAuC;IAC7E,SAAS;IACT,cAAc;IACd,YAAY;IACZ,sBAAsB;IACtB,cAAc;IACd,cAAc;IACd,mBAAmB;IACnB,gBAAgB;IAChB,gBAAgB;CACjB,CAAC"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { cleanSentence } from "../../../shared/matchers/prose-patterns.js";
|
|
2
|
+
import { hasConcreteCausalSummary } from "../../../shared/matchers/concrete-evidence.js";
|
|
2
3
|
import { wordTokens } from "../../../shared/text/tokens.js";
|
|
4
|
+
import { hasConcreteExplanation, shouldRejectConcreteEvidence } from "./concrete-guards.js";
|
|
3
5
|
const CONTAINS_MAX_TOKENS = 80;
|
|
4
6
|
const FULL_MAX_TOKENS = 12;
|
|
5
7
|
const REJECT_TOKENS = new Set([
|
|
@@ -12,6 +14,22 @@ const REJECT_TOKENS = new Set([
|
|
|
12
14
|
"which",
|
|
13
15
|
"while"
|
|
14
16
|
]);
|
|
17
|
+
const BROAD_PATTERN_IDS = new Set([
|
|
18
|
+
"abstract-personification-line",
|
|
19
|
+
"body-emotion-shorthand",
|
|
20
|
+
"deictic-summary",
|
|
21
|
+
"empty-scene-state",
|
|
22
|
+
"empty-scene-transition",
|
|
23
|
+
"gaze-choreography",
|
|
24
|
+
"generic-pressure-or-stakes",
|
|
25
|
+
"generic-realization",
|
|
26
|
+
"hollow-significance",
|
|
27
|
+
"puffery-evaluative-claim",
|
|
28
|
+
"real-work-begins",
|
|
29
|
+
"truth-answer-moves",
|
|
30
|
+
"vague-threshold-change"
|
|
31
|
+
]);
|
|
32
|
+
const CONNECTOR_ALLOWED_PATTERN_IDS = new Set(["vague-summary-cost"]);
|
|
15
33
|
function normalizedTokens(text) {
|
|
16
34
|
return wordTokens(text).map((token) => token.normalized);
|
|
17
35
|
}
|
|
@@ -76,23 +94,16 @@ export function compileSemanticThinnessPatterns(patterns) {
|
|
|
76
94
|
templates: pattern.templates.map((template) => compileTemplate(template))
|
|
77
95
|
}));
|
|
78
96
|
}
|
|
79
|
-
function hasDigit(text) {
|
|
80
|
-
for (const character of text) {
|
|
81
|
-
if (character >= "0" && character <= "9") {
|
|
82
|
-
return true;
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
return false;
|
|
86
|
-
}
|
|
87
97
|
function shouldRejectCommon(text, tokens) {
|
|
88
|
-
return tokens.length === 0 ||
|
|
98
|
+
return tokens.length === 0 || shouldRejectConcreteEvidence(text, tokens);
|
|
89
99
|
}
|
|
90
100
|
function shouldRejectForPattern(pattern, tokens) {
|
|
91
101
|
if (tokens.length > pattern.maxTokens) {
|
|
92
102
|
return true;
|
|
93
103
|
}
|
|
94
|
-
return (pattern.
|
|
95
|
-
tokens.some((token) => REJECT_TOKENS.has(token.normalized)))
|
|
104
|
+
return ((!CONNECTOR_ALLOWED_PATTERN_IDS.has(pattern.id) &&
|
|
105
|
+
tokens.some((token) => REJECT_TOKENS.has(token.normalized))) ||
|
|
106
|
+
(BROAD_PATTERN_IDS.has(pattern.id) && hasConcreteExplanation(tokens)));
|
|
96
107
|
}
|
|
97
108
|
function tokensMatchAt(source, expected, start) {
|
|
98
109
|
if (start + expected.length > source.length) {
|
|
@@ -139,8 +150,9 @@ function templateMatchesPattern(source, pattern, template) {
|
|
|
139
150
|
}
|
|
140
151
|
return false;
|
|
141
152
|
}
|
|
142
|
-
function matchCompiledPattern(tokens, pattern) {
|
|
143
|
-
if (shouldRejectForPattern(pattern, tokens)
|
|
153
|
+
function matchCompiledPattern(tokens, pattern, text) {
|
|
154
|
+
if (shouldRejectForPattern(pattern, tokens) ||
|
|
155
|
+
(BROAD_PATTERN_IDS.has(pattern.id) && hasConcreteCausalSummary(text))) {
|
|
144
156
|
return undefined;
|
|
145
157
|
}
|
|
146
158
|
for (const template of pattern.templates) {
|
|
@@ -162,7 +174,7 @@ export function findSemanticThinnessMatch(text, patterns) {
|
|
|
162
174
|
return undefined;
|
|
163
175
|
}
|
|
164
176
|
for (const pattern of patterns) {
|
|
165
|
-
const match = matchCompiledPattern(tokens, pattern);
|
|
177
|
+
const match = matchCompiledPattern(tokens, pattern, cleaned);
|
|
166
178
|
if (match !== undefined) {
|
|
167
179
|
return match;
|
|
168
180
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pattern-matcher.js","sourceRoot":"","sources":["../../../../src/rules/semantic-thinness/private/pattern-matcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,4CAA4C,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAc,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"pattern-matcher.js","sourceRoot":"","sources":["../../../../src/rules/semantic-thinness/private/pattern-matcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,29 +1,33 @@
|
|
|
1
|
-
import { allParagraphSentences } from "../../shared/text/sections.js";
|
|
2
1
|
import { semanticThinnessPatterns } from "./private/pattern-data.js";
|
|
3
|
-
import { emitTextlintFinding } from "../../adapters/textlint/report.js";
|
|
4
2
|
import { compileSemanticThinnessPatterns, findSemanticThinnessMatch } from "./private/pattern-matcher.js";
|
|
3
|
+
import { oneToOneRule } from "../private/textlint-rule-builders.js";
|
|
5
4
|
const COMPILED_PATTERNS = compileSemanticThinnessPatterns(semanticThinnessPatterns);
|
|
6
|
-
const rule = (
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
const match = findSemanticThinnessMatch(item.sentence.text, COMPILED_PATTERNS);
|
|
12
|
-
if (match === undefined) {
|
|
13
|
-
continue;
|
|
14
|
-
}
|
|
15
|
-
emitTextlintFinding(context, {
|
|
16
|
-
node: item.paragraph,
|
|
17
|
-
ruleId: "semantic-thinness:semantic-thinness",
|
|
18
|
-
message: `Semantic thinness (${match.patternId}): ${match.purpose} Matched template: ${match.signal}`,
|
|
19
|
-
range: {
|
|
20
|
-
start: item.source.originalStartFor(item.sentence.start),
|
|
21
|
-
end: item.source.originalEndFor(item.sentence.end)
|
|
22
|
-
}
|
|
23
|
-
});
|
|
24
|
-
}
|
|
5
|
+
const rule = oneToOneRule({
|
|
6
|
+
detect: (unit) => {
|
|
7
|
+
const match = findSemanticThinnessMatch(unit.text, COMPILED_PATTERNS);
|
|
8
|
+
if (match === undefined) {
|
|
9
|
+
return [];
|
|
25
10
|
}
|
|
26
|
-
|
|
27
|
-
|
|
11
|
+
return [
|
|
12
|
+
{
|
|
13
|
+
data: {
|
|
14
|
+
patternId: match.patternId,
|
|
15
|
+
purpose: match.purpose,
|
|
16
|
+
signal: match.signal
|
|
17
|
+
},
|
|
18
|
+
evidence: unit.text,
|
|
19
|
+
label: match.patternId,
|
|
20
|
+
range: { start: 0, end: unit.text.length }
|
|
21
|
+
}
|
|
22
|
+
];
|
|
23
|
+
},
|
|
24
|
+
family: "semantic-thinness",
|
|
25
|
+
formatMessage: (report) => {
|
|
26
|
+
const data = report.detections[0]?.data;
|
|
27
|
+
return `Semantic thinness (${data?.["patternId"]}): ${data?.["purpose"]} Matched template: ${data?.["signal"]}`;
|
|
28
|
+
},
|
|
29
|
+
ruleId: "semantic-thinness:semantic-thinness",
|
|
30
|
+
unitKind: "sentence"
|
|
31
|
+
});
|
|
28
32
|
export default rule;
|
|
29
33
|
//# sourceMappingURL=semantic-thinness.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"semantic-thinness.js","sourceRoot":"","sources":["../../../src/rules/semantic-thinness/semantic-thinness.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"semantic-thinness.js","sourceRoot":"","sources":["../../../src/rules/semantic-thinness/semantic-thinness.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EACL,+BAA+B,EAC/B,yBAAyB,EAC1B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AAEpE,MAAM,iBAAiB,GAAG,+BAA+B,CACvD,wBAAwB,CACzB,CAAC;AAEF,MAAM,IAAI,GAAG,YAAY,CAAC;IACxB,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QACf,MAAM,KAAK,GAAG,yBAAyB,CAAC,IAAI,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;QACtE,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO;YACL;gBACE,IAAI,EAAE;oBACJ,SAAS,EAAE,KAAK,CAAC,SAAS;oBAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,MAAM,EAAE,KAAK,CAAC,MAAM;iBACrB;gBACD,QAAQ,EAAE,IAAI,CAAC,IAAI;gBACnB,KAAK,EAAE,KAAK,CAAC,SAAS;gBACtB,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;aAC3C;SACF,CAAC;IACJ,CAAC;IACD,MAAM,EAAE,mBAAmB;IAC3B,aAAa,EAAE,CAAC,MAAM,EAAE,EAAE;QACxB,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;QACxC,OAAO,sBAAsB,IAAI,EAAE,CAAC,WAAW,CAAC,MAAM,IAAI,EAAE,CAAC,SAAS,CAAC,sBAAsB,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;IAClH,CAAC;IACD,MAAM,EAAE,qCAAqC;IAC7C,QAAQ,EAAE,UAAU;CACrB,CAAC,CAAC;AAEH,eAAe,IAAI,CAAC"}
|