```ts
export function debounceLevels(samples: unknown, hold: unknown): number[] {
  if (!Array.isArray(samples) || samples.length === 0) {
    throw new Error('Input must be a non-empty list of samples');
  }
  if (typeof hold !== 'number' || hold <= 0 || !Number.isInteger(hold)) {
    throw new Error('Hold must be a positive whole number');
  }

  const result: number[] = [];
  let tally = 0;
  let settledLevel = samples[0];

  for (const sample of samples) {
    if (sample !== 0 && sample !== 1) {
      throw new Error('Each sample must be 0 or 1');
    }
    if (sample === settledLevel) {
      tally = 0;
    } else {
      tally++;
      if (tally >= hold) {
        settledLevel = sample;
        tally = 0;
      }
    }
    result.push(settledLevel);
  }

  return result;
}
```