# `MishkaCmsCore.Runtime.Resources.Validations.StatefulIds`
[🔗](https://github.com/mishka-group/mishka_cms_core/blob/v0.0.1/lib/mishka_cms_core/runtime/resources/__validations/stateful_ids.ex#L5)

Refuses a page that places two live components under one `id`.

## Why this is a rule and not a warning

`Phoenix.LiveView.Diff` raises on it:

    found duplicate ID "…" for component … when rendering template

inside whichever LiveView renders the page, where nothing contains it. An advisory would be the
wrong shape for something that is certain to take the page down rather than merely likely to look
wrong.

## Why the editor's own minting is not enough

`EditorSession.with_id/4` mints one per drop and `PageBuilder.Ids.dedupe/2` renames the arrivals
that collided — but `dedupe/2` is deliberately given the nodes that ARRIVED, and answers nothing
when a whole document arrives at once. That is exactly what the source window does: an author
pastes markup, and a copy-paste of a component tag inside it carries the same id twice with
nothing to call an arrival. A draft restore and a seeded template have the same shape.

So this is asked of the stored markup, at the action boundary, where every writer passes.

## Only live components, and only literal ids

A function component with a duplicate id is a bad idea and not a crash, and the editor already
renames those. `id={@row.id}` is the author binding the id to their data and two of them are not a
collision — the same distinction `PageBuilder.Ids` draws.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
