```ts
export function issueCostTotal(moves: Array<Record<string, unknown>>): number {
  if (!Array.isArray(moves)) {
    throw new Error("Invalid argument: moves must be an array");
  }

  const bin: Array<[number, number]> = [];
  let charged = 0;

  for (const move of moves) {
    if (typeof move !== "object" || move === null) {
      throw new Error("Invalid movement record");
    }

    const kind = move.kind as string;
    const units = move.units as unknown;
    const cents = move.cents as unknown;

    if (kind !== "in" && kind !== "out") {
      throw new Error("Invalid movement kind: must be 'in' or 'out'");
    }

    if (
      typeof units !== "number" ||
      !Number.isInteger(units) ||
      units <= 0
    ) {
      throw new Error("Invalid units: must be a positive integer");
    }

    if (kind === "in") {
      if (
        typeof cents !== "number" ||
        !Number.isInteger(cents) ||
        cents < 0
      ) {
        throw new Error("Invalid cents: must be a non-negative integer for 'in' kind");
      }
      bin.push([units, cents]);
    } else if (kind === "out") {
      if (cents !== undefined) {
        throw new Error("Cents should not be present for 'out' kind");
      }

      let remainingUnits = units;
      while (remainingUnits > 0) {
        if (bin.length === 0) {
          throw new Error("Issue larger than everything in the bin");
        }

        const [consignmentUnits, consignmentCents] = bin[0];
        const unitsToCharge = Math.min(remainingUnits, consignmentUnits);
        charged += unitsToCharge * consignmentCents;
        remainingUnits -= unitsToCharge;

        if (unitsToCharge === consignmentUnits) {
          bin.shift();
        } else {
          bin[0][0] -= unitsToCharge;
        }
      }
    }
  }

  return charged;
}
```