defmodule Musubi do
@moduledoc """
Server-authoritative, page-scoped runtime for Elixir/Phoenix with a
framework-agnostic JavaScript client.
## The name
`Musubi` (Japanese 結び) means *knot*, *bond*, or *connector* — the act
of tying threads together at a point. In this runtime, every store is
a musubi: a node that binds parent assigns to child renders, holds its
own state, and lets reactive changes propagate through the bonds.
## What it does
One BEAM process per connected page owns a tree of composable
**stores**. Each store renders a piece of resolved state. When state
changes, the runtime computes a structural diff against the previous
wire output and pushes an RFC 6902 JSON Patch to the client over a
`Phoenix.Channel`. The client materializes the patch into an
immutable snapshot tree without prescribing a UI framework.
Change tracking mirrors `Phoenix.LiveView`: per-key `__changed__`
flags drive per-store memoization, so unchanged subtrees are reused
verbatim and never re-rendered, re-serialized, or re-diffed.
## Core building blocks
* `Musubi.Store` — define a store with `state do`, command
handlers, optional async, and a `render/1` callback.
* `Musubi.State` / `Musubi.Input` — typed state and command-input
schemas.
* `Musubi.Socket` — per-store state carrier with LV-aligned
`assigns.__changed__` dirty tracking.
* `Musubi.Page.Server` — the per-page runtime process.
* `Musubi.Resolver` / `Musubi.Reconciler` — tree resolution and
mount/update/reuse decisions.
* `Musubi.Diff` — RFC 6902 add/remove/replace patch generator.
* `Musubi.Wire` — protocol turning resolved Elixir terms into wire
form.
* `Musubi.Async` — `assign_async/3,4`, `start_async/3,4`,
`cancel_async/2,3`, `stream_async/3,4`.
* `Musubi.Stream` — LV-aligned streams with stable wire markers.
* `Musubi.Testing` — test harness for stores.
See `docs/PRD.md` and `spec/decisions/` for the design rationale.
"""
end