```python
from typing import List, Dict

def section_report(rows: List[List[str]]) -> Dict[str, List[List[str]]]:
    if not isinstance(rows, list):
        raise ValueError("rows must be a list")
    
    lines = []
    sections = []
    current_section = ""
    subtotal = 0
    count = 0
    grand = 0
    
    for row in rows:
        if len(row) != 3:
            raise ValueError("each row must be a three-item list")
        
        section, label, amount = row
        
        if not isinstance(section, str) or not isinstance(label, str) or not isinstance(amount, int):
            raise ValueError("section, label, and amount must be non-empty strings and integers")
        
        if current_section != "" and section != current_section:
            lines.append(["section", current_section, "", subtotal])
            sections.append([current_section, count, subtotal])
            count = 0
            subtotal = 0
        
        current_section = section
        lines.append(["item", section, label, amount])
        subtotal += amount
        count += 1
        grand += amount
    
    if current_section != "":
        lines.append(["section", current_section, "", subtotal])
        sections.append([current_section, count, subtotal])
    
    lines.append(["grand", "", "", grand])
    
    sections.sort(key=lambda entry: (-entry[2], entry[0]))
    
    return {
        "lines": lines,
        "sections": sections,
        "grand": grand
    }
```