```python
import math
import json


def summarize(lines):
    """
    Summarize JSONL lines.

    Args:
        lines: An iterable of JSONL strings.

    Returns:
        A list of dicts sorted by service name, each containing:
        - service: str
        - count: int
        - errors: int (status >= 500)
        - p95_ms: float or int (nearest-rank p95)
    """
    # Collect valid records grouped by service
    services = {}

    for line in lines:
        # Skip empty lines
        if not line or not line.strip():
            continue

        # Try to parse JSON
        try:
            obj = json.loads(line)
        except (json.JSONDecodeError, ValueError):
            continue

        # Must be a dict (object)
        if not isinstance(obj, dict):
            continue

        # Check service: non-empty string
        service = obj.get("service")
        if not isinstance(service, str) or not service:
            continue

        # Check status: integer, not bool, 100-599
        status = obj.get("status")
        if isinstance(status, bool):
            continue
        if not isinstance(status, int):
            continue
        if status < 100 or status > 599:
            continue

        # Check latency_ms: non-negative int or float, not bool
        latency_ms = obj.get("latency_ms")
        if isinstance(latency_ms, bool):
            continue
        if not isinstance(latency_ms, (int, float)):
            continue
        if latency_ms < 0:
            continue

        # Valid record
        if service not in services:
            services[service] = {
                "count": 0,
                "errors": 0,
                "latencies": []
            }

        services[service]["count"] += 1
        if status >= 500:
            services[service]["errors"] += 1
        services[service]["latencies"].append(latency_ms)

    # Build result sorted by service name
    result = []
    for service in sorted(services.keys()):
        data = services[service]
        n = data["count"]
        latencies = sorted(data["latencies"])

        # p95 using nearest-rank: ceil(0.95 * n)
        rank = math.ceil(0.95 * n)
        p95 = latencies[rank - 1]

        result.append({
            "service": service,
            "count": n,
            "errors": data["errors"],
            "p95_ms": p95
        })

    return result
```