```ts
export function cheapestPassPlan(tripDays: number[], passes: { span: number; cost: number }[]): { total: number; purchases: number[][] } {
  if (tripDays.length === 0) return { total: 0, purchases: [] };

  for (const day of tripDays) {
    if (!Number.isInteger(day) || day <= 0) throw new Error('Trip days must be positive integers');
  }

  if (!Array.isArray(tripDays) || !tripDays.every((day, i, arr) => i === 0 || day > arr[i - 1])) {
    throw new Error('Trip days must be a strictly increasing list of positive integers');
  }

  if (passes.length === 0) throw new Error('Passes list cannot be empty');

  for (const pass of passes) {
    if (!Number.isInteger(pass.span) || pass.span <= 0) throw new Error('Pass span must be a positive integer');
    if (!Number.isInteger(pass.cost) || pass.cost < 0) throw new Error('Pass cost must be a non-negative integer');
  }

  const n = tripDays.length;
  const dp: number[] = Array(n + 1).fill(Infinity);
  dp[0] = 0;

  for (let i = 1; i <= n; i++) {
    for (const pass of passes) {
      if (i >= pass.span) {
        dp[i] = Math.min(dp[i], dp[i - pass.span] + pass.cost);
      }
    }
  }

  if (dp[n] === Infinity) throw new Error('No valid pass plan found');

  const purchases: number[][] = [];
  let i = n;
  while (i > 0) {
    for (const pass of passes) {
      if (i >= pass.span && dp[i - pass.span] + pass.cost === dp[i]) {
        purchases.unshift([tripDays[i - pass.span], pass.span]);
        i -= pass.span;
        break;
      }
    }
  }

  return { total: dp[n], purchases };
}
```