```ts
export function runThermostat(
  start: number,
  low: number,
  high: number,
  power: number,
  drifts: number[],
): { temp: number; heated: number; switches: number; coldest: number } {
  for (const bound of [start, low, high]) {
    if (!Number.isInteger(bound)) {
      throw new Error("temperatures must be integers");
    }
  }
  if (low >= high) {
    throw new Error("low must lie strictly below high");
  }
  if (!Number.isInteger(power) || power <= 0) {
    throw new Error("power must be a positive integer");
  }
  if (!Array.isArray(drifts)) {
    throw new Error("drifts must be a list");
  }

  let temp = start;
  let heated = 0;
  let switches = 0;
  let coldest = start;

  for (const drift of drifts) {
    if (!Number.isInteger(drift)) {
      throw new Error("drifts must contain only integers");
    }

    // Check the temperature condition
    const isBelowLow = temp < low;
    const isAboveHigh = temp > high;

    if (isBelowLow || isAboveHigh) {
      heated++;
      switches++;
    } else {
      coldest = Math.min(coldest, temp);
    }

    // Update the temperature
    temp += drift + power * (heated ? 1 : 0);

    // Track the coldest value seen so far
    coldest = Math.min(coldest, temp);
  }

  return { temp, heated, switches, coldest };
}
```