```python
"""Select fictional campaign proposals by descending priority."""


def plan(rows, budget_cents, excluded_channels=()):
    """Select affordable, eligible first occurrences in stable priority order."""
    if isinstance(budget_cents, bool) or not isinstance(budget_cents, int):
        raise ValueError("budget_cents must be a nonnegative integer")
    if budget_cents < 0:
        raise ValueError("budget_cents must be a nonnegative integer")

    normalized_exclusions = {
        channel.strip().casefold() for channel in excluded_channels
    }
    seen_ids = set()
    eligible_rows = []

    for row in rows:
        proposal_id = row["id"]
        if proposal_id in seen_ids:
            continue
        seen_ids.add(proposal_id)

        if row.get("archived", False):
            continue

        channel = row.get("channel", "").strip().casefold()
        if channel in normalized_exclusions:
            continue

        eligible_rows.append(row)

    eligible_rows.sort(key=lambda row: row.get("priority", 0), reverse=True)

    selected_ids = []
    remaining_cents = budget_cents

    for row in eligible_rows:
        cost_cents = row["cost_cents"]
        if cost_cents <= remaining_cents:
            selected_ids.append(row["id"])
            remaining_cents -= cost_cents

    return {
        "selected_ids": selected_ids,
        "spent_cents": budget_cents - remaining_cents,
        "remaining_cents": remaining_cents,
    }
```