```ts
import { strict as assert } from 'assert';

export function drainLanes(plan: [string, number][], items: [string, string][]): { order: string[]; rounds: number } {
  if (plan.length === 0) {
    throw new Error('Plan is empty');
  }

  const queues = new Map<string, string[]>();
  for (const [lane] of plan) {
    queues.set(lane, []);
  }
  for (const [label, lane] of items) {
    if (!lane || typeof label !== 'string' || !Number.isInteger(quota)) {
      throw new Error('Invalid item or plan entry');
    }
    const queue = queues.get(lane);
    if (queue !== undefined) {
      queue.push(label);
    }
  }

  const order: string[] = [];
  let rounds = 0;
  while (true) {
    rounds += 1;
    for (const [lane, quota] of plan) {
      const queue = queues.get(lane) as string[];
      if (!queue || queue.length === 0) {
        continue;
      }
      let taken = 0;
      while (taken < quota && queue.length > 0) {
        order.push(queue.shift() as string);
        taken += 1;
      }
      if (taken < quota) {
        return { order, rounds };
      }
    }
  }
}
```