```ts
export function serpentinePickOrder(picks: unknown): string[] {
  if (!Array.isArray(picks)) throw new Error("Input must be an array");

  const validPicks = picks.filter((pick: any) => {
    if (typeof pick !== "object" || pick === null) return false;
    if (typeof pick.sku !== "string" || pick.sku.trim() === "") return false;
    if (typeof pick.aisle !== "number" || pick.aisle <= 0 || !Number.isInteger(pick.aisle)) return false;
    if (typeof pick.bay !== "number" || pick.bay <= 0 || !Number.isInteger(pick.bay)) return false;
    return true;
  });

  const skuSet = new Set<string>();
  for (const pick of validPicks) {
    if (skuSet.has(pick.sku)) throw new Error("Duplicate SKU found");
    skuSet.add(pick.sku);
  }

  const orderedPicks: { [key: string]: { [key: number]: number[] } } = {};
  for (const pick of validPicks) {
    if (!orderedPicks[pick.aisle]) orderedPicks[pick.aisle] = {};
    if (!orderedPicks[pick.aisle][pick.bay]) orderedPicks[pick.aisle][pick.bay] = [];
    orderedPicks[pick.aisle][pick.bay].push(validPicks.indexOf(pick));
  }

  const result: string[] = [];
  for (const aisle in orderedPicks) {
    const bayOrder = parseInt(aisle) % 2 === 0 ? -1 : 1;
    for (const bay in orderedPicks[aisle]) {
      const pickIndices = orderedPicks[aisle][bay].sort((a, b) => a - b);
      for (const index of pickIndices) {
        result.push(validPicks[index].sku);
      }
    }
  }

  return result;
}
```