STR-015
Heuristic
layer: section
Choose table only for cross-comparison
IF readers must compare repeated fields across three or more items, THEN use a table; IF order or action matters, use a list ELSE use prose.
Why the rule exists
Tables reveal repeated-field comparisons but impede linear reading when comparison is not the task.
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
- content.entity_count gte 3
- content.repeated_field_count gte 2
- content.comparison_task eq true
Facts this rule reads
| Path | Source |
|---|---|
content.entity_count |
You supply it |
content.repeated_field_count |
You supply it |
content.comparison_task |
You supply it |
Then
- convert — target
content.structure
Else
- select — target
content.structure
LAKA
- Smallest sufficient intervention
- Yes
- Primary axes
Sources
-
Handbook of Technical Writing — Gerald J. Alred; Charles T. Brusaw; Walter E. Oliu
Grammar, mechanics, formats, and workplace documents. -
Technical Communication — Mike Markel; Stuart A. Selber
Audience, design, ethics, research, and technical genres. -
Writing for Web Accessibility — W3C Web Accessibility Initiative
link
Clear structure, descriptive labels, alternatives, and understandable content.
The raw rule record
Verbatim from 10-paragraph-document-rules.json. Also available at /v1/rules/STR-015.
{
"id": "STR-015",
"name": "Choose table only for cross-comparison",
"domain": "structure",
"layer": "section",
"strength": "heuristic",
"human_logic": "IF readers must compare repeated fields across three or more items, THEN use a table; IF order or action matters, use a list ELSE use prose.",
"when": {
"all": [
{
"path": "content.entity_count",
"operator": "gte",
"value": 3
},
{
"path": "content.repeated_field_count",
"operator": "gte",
"value": 2
},
{
"path": "content.comparison_task",
"operator": "eq",
"value": true
}
]
},
"then": [
{
"action": "convert",
"target": "content.structure",
"to": "table"
}
],
"else": [
{
"action": "select",
"target": "content.structure",
"by": "reader_task",
"map": {
"sequence": "numbered_list",
"simple_set": "bullets",
"explanation": "prose"
}
}
],
"unless": [],
"because": "Tables reveal repeated-field comparisons but impede linear reading when comparison is not the task.",
"diagnostics": [],
"examples": {},
"source_ids": [
"BK-025",
"BK-026",
"WEB-005"
],
"laka": {
"smallest_sufficient_intervention": true,
"primary_axes": [
"scope",
"depth",
"magnitude",
"reversibility"
]
}
}
Other structure rules
- STR-001 One controlling move per paragraph IF a paragraph performs more than one unrelated rhetorical move, THEN split it at the move boundary ELSE retain. Context default
- STR-002 Expose the paragraph point IF the paragraph’s controlling point is absent or recoverable only after rereading, THEN state or move it to a strategic position ELSE retain an intentional delayed reveal. Heuristic
- STR-003 Support consequential claims IF a paragraph makes a consequential factual claim, THEN provide evidence, cite it, qualify it, or remove the claim ELSE retain. Hard constraint
- STR-004 Keep evidence beside the claim IF evidence is separated from the claim it supports by unrelated material, THEN move it closer or label the relation ELSE retain. Context default
- STR-005 Use transitions that name the relation IF adjacent paragraphs have a meaningful but unstated relation, THEN add a transition that expresses that relation ELSE retain. Context default
- STR-006 Delete orphan paragraphs IF a paragraph neither advances the purpose nor supports another necessary move, THEN delete or relocate it ELSE retain. Heuristic
- STR-007 Section answers one reader question IF a section answers multiple unrelated reader questions, THEN split and label them ELSE retain. Context default
- STR-008 Heading predicts content IF a heading does not accurately predict its section, THEN rename the heading or repair the section ELSE retain. Hard constraint