# `MishkaCmsCore.Activity.Sources.EditorHistory`
[🔗](https://github.com/mishka-group/mishka_cms_core/blob/v0.0.1/lib/mishka_cms_core/activity/sources/editor_history.ex#L5)

Activity source for the visual editor's own record — every change somebody made to a page, layout,
component or error page in the page builder, tagged `badge_label: "EDITOR"`.

## Why it needs a source of its own

No other adapter can see these. `MishkaCmsCore.Runtime.PageBuilderEvent` is not AshPaperTrail
versioned, is not an AshEvents log and is not an Oban job — it is a lean append-only table the
editor writes as somebody works, which is exactly why the timeline in the editor is fast. That
makes it invisible to the global feed unless something goes and reads it, which is this.

One store, two surfaces: the sheet inside the editor answers "what happened to THIS document",
and the feed answers "what happened across the site". Neither is a copy of the other.

## History only, and deliberately

The resource broadcasts nothing — `pub_sub` is off on it, because a row is written on every
settled change and re-reading a table for everybody on every keystroke is the noise the whole
design avoids. So `topics/1` is empty and `handles?/1` is always false: this contributes to the
merged history read and never to the live tail. A change appears in the feed on the next read,
which for a record of what happened is the right trade.

Two actions, in the feed's own vocabulary: **publish** for a publish, **update** for every other
change — because the feed has one shared set of action words that every source reports in, and
widening it for this one would change how the others render. Which change it was is in the message
beside it, in the same words the editor's own timeline uses: "Set gap (base) — <nav>".

See `MishkaCmsCore.Activity.Behaviours.Source` and `MishkaCmsCore.Activity.Query` (the DB-merge
branch, which owns the SQL).

# `entry_from_row`

```elixir
@spec entry_from_row(map()) :: map()
```

Turns one merged row into a feed entry.

Called by `MishkaCmsCore.Activity.Query` for rows its `editor` branch produced.

# `scopes`

```elixir
@spec scopes() :: %{required(String.t()) =&gt; String.t()}
```

The resources whose feeds this source contributes to.

---

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