```python
def plan_batches(units: int, capacity: int) -> dict:
    """Plan parcel loads by recursively splitting consignments that exceed capacity."""
    if not isinstance(units, int) or units <= 0:
        raise ValueError("units must be a positive integer")
    if not isinstance(capacity, int) or capacity <= 0:
        raise ValueError("capacity must be a positive integer")

    loads: list[int] = []
    total_splits: int = 0
    max_rounds: int = 0

    def _plan(current_units: int) -> int:
        nonlocal total_splits, max_rounds
        if current_units <= capacity:
            loads.append(current_units)
            return 0
        else:
            total_splits += 1
            half_up = (current_units + 1) // 2
            half_down = current_units // 2
            left_rounds = _plan(half_up)
            right_rounds = _plan(half_down)
            current_rounds = 1 + max(left_rounds, right_rounds)
            if current_rounds > max_rounds:
                max_rounds = current_rounds
            return current_rounds

    _plan(units)

    return {
        "loads": loads,
        "splits": total_splits,
        "rounds": max_rounds
    }
```