PUN-013
Context default
layer: phrase
Hyphenate ambiguity-prone compound modifiers
IF multiple words jointly modify a following noun AND grouping is not immediately clear, THEN hyphenate the compound ELSE omit unnecessary hyphens.
Why the rule exists
Hyphens can show which words operate as one modifier.
Condition
The rule fires when this evaluates true. Paths marked below must be present in the fact base; the engine reports the rest rather than guessing them.
- ALL
- modifier.position eq "before_noun"
- modifier.word_count gte 2
- modifier.grouping_ambiguous eq true
Facts this rule reads
| Path | Source |
|---|---|
modifier.position |
You supply it |
modifier.word_count |
You supply it |
modifier.grouping_ambiguous |
You supply it |
Then
- insert — target
modifier.internal_separator, value"-"
Else
- delete — target
modifier.unnecessary_hyphen
LAKA
- Smallest sufficient intervention
- Yes
- Primary axes
Sources
-
Garner's Modern English Usage — Bryan A. Garner
Modern American usage and editorial judgment. -
The Copyeditor's Handbook — Amy Einsohn; Marilyn Schwartz
Professional copyediting practice, grammar, and editorial process. -
The Chicago Manual of Style — The University of Chicago Press Editorial Staff
Comprehensive editorial style, grammar, documentation, and publishing.
The raw rule record
Verbatim from 08-punctuation-rules.json. Also available at /v1/rules/PUN-013.
{
"id": "PUN-013",
"name": "Hyphenate ambiguity-prone compound modifiers",
"domain": "punctuation",
"layer": "phrase",
"strength": "context_default",
"human_logic": "IF multiple words jointly modify a following noun AND grouping is not immediately clear, THEN hyphenate the compound ELSE omit unnecessary hyphens.",
"when": {
"all": [
{
"path": "modifier.position",
"operator": "eq",
"value": "before_noun"
},
{
"path": "modifier.word_count",
"operator": "gte",
"value": 2
},
{
"path": "modifier.grouping_ambiguous",
"operator": "eq",
"value": true
}
]
},
"then": [
{
"action": "insert",
"target": "modifier.internal_separator",
"value": "-"
}
],
"else": [
{
"action": "delete",
"target": "modifier.unnecessary_hyphen",
"when": "standard_open_or_adverb_ly_pattern"
}
],
"unless": [],
"because": "Hyphens can show which words operate as one modifier.",
"diagnostics": [],
"examples": {},
"source_ids": [
"BK-003",
"BK-007",
"BK-039"
],
"laka": {
"smallest_sufficient_intervention": true,
"primary_axes": [
"scope",
"depth",
"magnitude",
"reversibility"
]
}
}
Other punctuation rules
- PUN-001 Terminate complete sentences IF a prose sentence is complete, THEN end it with a mark matching statement, direct question, or strong exclamation ELSE keep it joined to its governing structure. Hard constraint
- PUN-002 No comma splice IF two independent clauses are joined only by a comma, THEN add a coordinator, use a semicolon, or make two sentences ELSE retain. Hard constraint
- PUN-003 Comma before coordinating conjunction IF a coordinating conjunction joins two independent clauses, THEN place a comma before it unless the clauses are very short and unambiguous ELSE retain. Context default
- PUN-004 Comma after introductory material IF introductory material is long, clausal, or potentially misread, THEN add a comma before the main clause ELSE use the lightest mark that preserves clarity. Context default
- PUN-005 Set off nonrestrictive material IF a modifier adds nonessential information rather than identifying the referent, THEN set it off with paired punctuation ELSE do not set it off. Hard constraint
- PUN-006 Do not isolate restrictive material IF a modifier identifies which person or thing is meant, THEN remove punctuation that falsely marks it as optional ELSE evaluate as nonrestrictive. Hard constraint
- PUN-007 Serial comma follows declared style IF a series contains three or more coordinated items, THEN apply the selected serial-comma policy consistently AND add a comma when omission causes ambiguity ELSE retain. Context default
- PUN-008 Semicolon joins related independent clauses IF two independent clauses are closely related AND no coordinator is used, THEN a semicolon is available ELSE choose another boundary. Context default