```python
import json
import math
from collections import defaultdict


def summarize(lines):
    # Collect valid records per service
    service_data = defaultdict(list)  # service -> list of latencies
    service_errors = defaultdict(int)  # service -> error count

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

        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 = obj.get("latency_ms")
        if isinstance(latency, bool):
            continue
        if not isinstance(latency, (int, float)):
            continue
        if latency < 0:
            continue

        # Valid record
        service_data[service].append(latency)
        if status >= 500:
            service_errors[service] += 1

    # Build result
    result = []
    for service in sorted(service_data.keys()):
        latencies = service_data[service]
        n = len(latencies)
        if n == 0:
            continue

        # p95 using nearest-rank: sort, then take ceil(0.95 * n)th item (1-indexed)
        sorted_latencies = sorted(latencies)
        rank = math.ceil(0.95 * n)
        p95 = sorted_latencies[rank - 1]

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

    return result
```