```ts
export function issueCostTotal(moves: Array<Record<string, unknown>>): number {
  if (!Array.isArray(moves)) {
    throw new Error("Argument 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("Movement record must not be null or undefined");
    }

    if (!move.kind || typeof move.kind !== "string") {
      throw new Error("Movement must have a kind field");
    }

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

    if (move.kind === "in") {
      if (!move.cents || typeof move.cents !== "number" || move.cents < 0) {
        throw new Error("In movement must have non-negative cents field");
      }
      bin.push([move.units, move.cents]);
    } else if (move.kind === "out") {
      let remainingUnits = move.units;
      while (remainingUnits > 0 && bin.length > 0) {
        const consignment = bin[bin.length - 1];
        const usedUnits = Math.min(consignment[0], remainingUnits);
        charged += usedUnits * consignment[1];
        consignment[0] -= usedUnits;
        remainingUnits -= usedUnits;

        if (consignment[0] <= 0) {
          bin.pop();
        }
      }

      if (remainingUnits > 0) {
        throw new Error("Issue size exceeds the total available parts in the bin");
      }
    } else {
      throw new Error("Invalid kind: must be 'in' or 'out'");
    }
  }

  return charged;
}
```