```python
def drain_frames(chunks: list, marker: str) -> dict:
    if not isinstance(marker, str) or len(marker) != 1:
        raise ValueError("marker must be a single character")
    buffer = "".join(chunks)
    # TODO: scan the buffer once, folding a doubled marker into one literal
    # marker, ending a frame at a lone marker, and keeping what follows the
    # last ended frame — a dangling marker included — as the pending text.
    pending = buffer
    frames = []
    i = 0
    while i < len(pending):
        if pending[i] == marker:
            if i + 1 < len(pending) and pending[i + 1] == marker:
                pending = pending[:i] + marker + pending[i + 2:]
                frames.append(pending[i:i + 2])
            else:
                pending = pending[:i] + marker
        i += 1
    return {"frames": frames, "pending": pending}
```