```python
"""The cheapest set of travel passes covering every trip day."""

def _validate_plan(trip_days, passes):
    for day in trip_days:
        if isinstance(day, bool) or not isinstance(day, int) or day < 1:
            raise ValueError("trip days must be positive integers")
    for earlier, later in zip(trip_days, trip_days[1:]):
        if later <= earlier:
            raise ValueError("trip days must be strictly increasing")
    if not passes:
        raise ValueError("at least one pass kind is required")
    for cover in passes:
        span = cover["span"]
        cost = cover["cost"]
        if isinstance(span, bool) or not isinstance(span, int) or span < 1:
            raise ValueError("pass span must be a positive integer")
        if isinstance(cost, bool) or not isinstance(cost, int) or cost < 0:
            raise ValueError("pass cost must be a non-negative integer")


def cheapest_pass_plan(trip_days: list, passes: list) -> dict:
    _validate_plan(trip_days, passes)
    
    n = len(trip_days)
    dp = [[float('inf')] * (n + 1) for _ in range(n + 1)]
    dp[0][0] = 0
    
    for i in range(1, n + 1):
        dp[i][0] = dp[i - 1][0]
    
    for i in range(1, n + 1):
        for j in range(1, n + 1):
            if trip_days[j - 1] >= trip_days[i - 1]:
                dp[i][j] = min(dp[i][j], dp[i - 1][j])
                for cover in passes:
                    if trip_days[j - 1] - trip_days[i - 1] + 1 >= cover["span"]:
                        dp[i][j] = min(dp[i][j], dp[i - cover["span"]][i - 1] + cover["cost"])
    
    total_cost = dp[n][n]
    if total_cost == float('inf'):
        raise ValueError("No valid pass plan found")
    
    purchases = []
    i, j = n, n
    while i > 0:
        if dp[i][j] == dp[i - 1][j]:
            i -= 1
        else:
            for cover in passes:
                if trip_days[j - 1] - trip_days[i - 1] + 1 >= cover["span"]:
                    if dp[i][j] == dp[i - cover["span"]][i - 1] + cover["cost"]:
                        purchases.append([trip_days[i - cover["span"]], cover["span"]])
                        i -= cover["span"]
                        j = i
                        break
    
    return {"total": total_cost, "purchases": purchases[::-1]}
```