```python
def replay_buffer(ops: list, capacity: int) -> dict:
    if not isinstance(capacity, int) or capacity <= 0:
        raise ValueError("capacity must be a positive integer")

    held = []
    taken = []

    for op in ops:
        if op.startswith("add:"):
            if len(held) >= capacity:
                raise ValueError("buffer is full")
            held.append(op[4:])
        elif op == "take":
            if not held:
                raise ValueError("cannot take from an empty buffer")
            taken.append(held.pop(0))
        else:
            raise ValueError(f"invalid operation: {op}")

    return {"held": held, "taken": taken}
```