```ts
/**
 * Which rule an already loaded deck breaks first.
 */
export function auditDeckLoad(rows: any[], deck: any): any {
  if (!Array.isArray(rows)) throw new Error("rows must be a list");
  if (typeof deck !== "object" || deck === null) throw new Error("deck must be a record");

  const weights: Record<string, number> = {};
  const met: string[] = [];
  let weight = 0;

  for (const row of rows) {
    if (typeof row !== "object" || row === null) throw new Error("each row must be a record");
    if (typeof row.crate !== "string" || row.crate.trim() === "") throw new Error("crate must be a non-empty string");
    if (weights[row.bay] === undefined) {
      weights[row.bay] = 0;
      met.push(row.bay);
    }
    if (typeof row.weight !== "number" || row.weight <= 0 || !Number.isInteger(row.weight)) throw new Error("weight must be a whole number above nought");
    weights[row.bay] += row.weight;
    weight += row.weight;
  }

  const bayNames = new Set<string>();
  for (const bay of deck.bays) {
    if (typeof bay !== "object" || bay === null) throw new Error("each bay must be a record");
    if (typeof bay.bay !== "string" || bay.bay.trim() === "") throw new Error("bay name must be a non-empty string");
    if (bayNames.has(bay.bay)) throw new Error("two bays cannot answer to the same name");
    bayNames.add(bay.bay);
    if (typeof bay.hold !== "number" || bay.hold <= 0 || !Number.isInteger(bay.hold)) throw new Error("hold must be a whole number above nought");
    if (typeof bay.pull !== "number" || bay.pull <= 0 || !Number.isInteger(bay.pull)) throw new Error("pull must be a whole number above nought");
    if (typeof bay.lever !== "number" || !Number.isInteger(bay.lever)) throw new Error("lever must be a whole number");
  }

  if (typeof deck.total !== "number" || deck.total <= 0 || !Number.isInteger(deck.total)) throw new Error("total must be a whole number above nought");

  let swing = 0;
  for (const bay of deck.bays) {
    swing += (weights[bay.bay] ?? 0) * bay.lever;
  }

  if (weight > deck.total) {
    return { verdict: "broken", bay: "", limit: "total", weight, swing };
  }

  for (const name of met) {
    const bay = deck.bays.find((entry: any) => entry.bay === name);
    if (weights[name] > bay.hold) {
      return { verdict: "broken", bay: name, limit: "hold", weight, swing };
    }
    if (Math.abs(weights[name]) > bay.pull) {
      return { verdict: "broken", bay: name, limit: "pull", weight, swing };
    }
  }

  return { verdict: "clear", bay: "", limit: "", weight, swing };
}
```