///|
/// Admit a batch atomically. Validate on a detached slot table, then publish
/// only after every identity and duplicate check succeeds. Frames are already
/// parsed; use add_bytes for CRC validation of external serialized frames.
pub fn FrameCatalog::add_many(
  self : FrameCatalog,
  frames : Array[ShardEnvelope],
  max_frames? : Int = 4096,
) -> Int raise ErasureError {
  if max_frames < 0 || frames.length() > max_frames {
    raise ResourceLimit("catalog batch frame count")
  }
  if frames.is_empty() {
    return 0
  }
  let staged : FrameCatalog = {
    manifest: self.manifest,
    slots: self.slots.copy(),
    stored_count: self.stored_count,
  }
  for frame in frames {
    staged.add(frame)
  }
  for index, slot in staged.slots {
    self.slots[index] = slot
  }
  self.stored_count = staged.stored_count
  frames.length()
}