```ts
export function runReservoir(capacity: number, start: number, ticks: number[][]): { level: number; spilled: number; shortfall: number; served: number } {
  if (!Number.isInteger(capacity) || capacity <= 0) {
    throw new Error("Capacity must be a positive integer.");
  }
  if (!Number.isInteger(start) || start < 0 || start > capacity) {
    throw new Error("Starting level must be an integer from 0 to the capacity.");
  }

  let level = start;
  let spilled = 0;
  let shortfall = 0;
  let served = 0;

  for (const [inflow, demand] of ticks) {
    if (!Number.isInteger(inflow) || !Number.isInteger(demand)) {
      throw new Error("Inflow and demand must be non-negative integers.");
    }

    level += inflow;
    spilled += Math.max(0, level - capacity);
    level = Math.min(level, capacity);

    const servedThisTick = Math.min(demand, level);
    shortfall += Math.max(0, demand - servedThisTick);
    level -= servedThisTick;
    served += servedThisTick;
  }

  return { level, spilled, shortfall, served };
}
```