```typescript
export function cheapestPassPlan(tripDays: number[], passes: { span: number; cost: number }[]): { total: number; purchases: number[][] } {
    if (!tripDays || tripDays.length === 0) return { total: 0, purchases: [] };
    
    if (passes.some(pass => pass.span <= 0 || pass.cost < 0)) throw new Error("Invalid pass spans or costs");

    const daysSet = new Set(tripDays);
    const sortedTrips = [...daysSet].sort((a, b) => a - b);

    let totalCost = 0;
    let purchases: number[][] = [];
    
    for (const day of sortedTrips) {
        if (!daysSet.has(day)) throw new Error("Trip days must be strictly increasing");

        const validPurchases = passes.filter(pass => pass.span > 1 && day >= pass.span);
        const cheapestPurchase = validPurchases.reduce((min, curr) => 
            curr.cost < min[0] ? [curr.cost, [curr.span]] : min
        );

        totalCost += cheapestPurchase[0];
        purchases.push(cheapestPurchase[1]);
    }

    return { total: totalCost, purchases };
}
```