|
@@ -91,7 +91,7 @@ Because the host is the only computation site, finished values reach clients ove
|
|
|
|
|
|
|
|
The framework emits it whenever a unit's state reference changes (`Object.is` gate above); `seq` is the unit's watermark at emission. This is live push state, never logged — the same posture as the tool-view `view` slot: replay recomputes on the host.
|
|
The framework emits it whenever a unit's state reference changes (`Object.is` gate above); `seq` is the unit's watermark at emission. This is live push state, never logged — the same posture as the tool-view `view` slot: replay recomputes on the host.
|
|
|
|
|
|
|
|
-The client object layer keeps one **generic value store** per session: `key → { value, seq }`. Partial list hints and whole-value frames use higher-sequence-wins. A successful follow opening snapshot exactly replaces tentative rows at its durable cut. During initial open, resync, or carrier reconnection, the Session retains the latest captured replacement baseline and only its subsequent frames; the baseline replaces the opening value only when its cut is not older, and subsequent frames must advance the selected complete cut. No `fromEvent`, no per-domain cell registration, no client-side domain folding — a domain ships projection support with **zero client code** (the `SessionProjectionMap` merge serves both sides through the `/types` outlet). The bespoke `session/title` frame and the manager's title-snapshot map retire into this generic pair.
|
|
|
|
|
|
|
+The client object layer keeps one **generic value store** per session. Partial list hints, exact opening baselines, and whole-value frames follow the [implemented Client merge rules](../../implemented/architecture/2026-08-25-session-observations-and-projection-owned-client-state.md); tentative or stale inputs cannot override an authoritative complete cut. A domain still ships projection support with **zero client code**: there is no `fromEvent`, per-domain cell registration, or client-side domain folding, and the `SessionProjectionMap` merge shares values through the `/types` outlet. The bespoke `session/title` frame and the manager's title-snapshot map retire into this generic pair.
|
|
|
|
|
|
|
|
### Plan through the standard command channel (worked example)
|
|
### Plan through the standard command channel (worked example)
|
|
|
|
|
|
|
@@ -177,7 +177,7 @@ Infrastructure first; the three in-flight PRs are left untouched and re-target a
|
|
|
|
|
|
|
|
- A domain plugin ships per-session log-derived state to React by writing only: its durable event declaration, one deterministic host unit with `init(header)`, `apply`, and a complete `wire.view`, its `SessionProjectionMap` merge, and inject callbacks — zero client-side folding code, no edits to the client `Session` class, `ConversationSnapshot`, api-proxy, or the wire schema files. Live and detached folds receive the same immutable header that supplied their events, with the normalized seed boundary centrally validated.
|
|
- A domain plugin ships per-session log-derived state to React by writing only: its durable event declaration, one deterministic host unit with `init(header)`, `apply`, and a complete `wire.view`, its `SessionProjectionMap` merge, and inject callbacks — zero client-side folding code, no edits to the client `Session` class, `ConversationSnapshot`, api-proxy, or the wire schema files. Live and detached folds receive the same immutable header that supplied their events, with the normalized seed boundary centrally validated.
|
|
|
- The history tail page carries `projections` with `asOfSeq` equal to the window tail seq; loadOlder pages never carry it; a deployment without the registry serves histories without the block and clients treat every key as absent.
|
|
- The history tail page carries `projections` with `asOfSeq` equal to the window tail seq; loadOlder pages never carry it; a deployment without the registry serves histories without the block and clients treat every key as absent.
|
|
|
-- A follow opening baseline exactly replaces tentative cache rows. During opening or reconnection, the client retains only the latest captured replacement baseline and the frames that follow it; the newer complete cut wins, and only frames above that selected cut replay. Outside that replacement boundary, stale or replayed frames cannot regress the value store.
|
|
|
|
|
|
|
+- Client reconciliation treats list hints as tentative, successful opening baselines as authoritative complete cuts, and live frames as whole-key updates under the [implemented Client merge rules](../../implemented/architecture/2026-08-25-session-observations-and-projection-owned-client-state.md). Stale inputs cannot regress resident state.
|
|
|
- A slash command executed on one tab renders a durable node in the flow on refresh, on a second tab, and after resume; unregistered commands render the generic card; the composer notice path for command outcomes is gone.
|
|
- A slash command executed on one tab renders a durable node in the flow on refresh, on a second tab, and after resume; unregistered commands render the generic card; the composer notice path for command outcomes is gone.
|
|
|
- `useProjection` reaches components through the standard props kit; no hook crosses an inject contract (including `useSelection`).
|
|
- `useProjection` reaches components through the standard props kit; no hook crosses an inject contract (including `useSelection`).
|
|
|
- Session titles ride the generic pair (baseline block + projection frame); the bespoke `session/title` frame and the client title-snapshot map are gone.
|
|
- Session titles ride the generic pair (baseline block + projection frame); the bespoke `session/title` frame and the client title-snapshot map are gone.
|