```ts
export function backoffSchedule(base: number, factor: number, cap: number, attempts: number): number[] {
  if (!Number.isInteger(base) || base < 1) throw new Error('base must be a whole number of one or more');
  if (!Number.isInteger(factor) || factor < 1) throw new Error('factor must be a whole number of one or more');
  if (!Number.isInteger(cap) || cap < base) throw new Error('cap must be a whole number not smaller than base');
  if (!Number.isInteger(attempts) || attempts < 1) throw new Error('attempts must be a whole number of one or more');

  const schedule: number[] = [0];
  let nextIdle = base;

  for (let i = 1; i < attempts; i++) {
    nextIdle = Math.min(nextIdle * factor, cap);
    schedule.push(schedule[i - 1] + nextIdle);
  }

  return schedule;
}
```