docs(rfc): reconcile Live-to-Final assistant-reply contracts with shipped behavior (#6144) (#6147)

Docs-only reconciliation of the Stable Assistant Turn Anchors / Live-to-Final
RFCs + CONTRACTS.md + Phase 0 inventory from proposed/scaffold to
accepted/implemented framing. No runtime/CI change; one comment-header fix in
static/assistant_turn_anchors.js. Remaining hardening tracked under #3400.

Co-authored-by: nesquena-hermes <agent@nesquena-hermes>
Co-authored-by: franksong2702 <franksong2702@users.noreply.github.com>
This commit is contained in:
authored and GitHub committed 2026-07-16 08:19:43 -07:00
1 parent 6ed474ca54
commit df0c204d73
9 files changed
+156 -31

No files matched your search

+4
View File
@@ -3,6 +3,10 @@
## [Unreleased] ## [Unreleased]
### Changed
- **Docs: reconciled the assistant-reply lifecycle RFCs/contracts with shipped behavior.** The Stable Assistant Turn Anchors and Live-to-Final RFCs, `docs/CONTRACTS.md`, and the Phase 0 architecture inventory were updated from "proposed/scaffold" framing to "accepted/implemented" to match what actually ships (single assistant-turn owner projecting one `activity_scene_v1` into Compact Worklog / Transparent Stream / Final answer). Documentation-only — no runtime behavior or CI-gate change; the one code touch is a corrected comment header in `static/assistant_turn_anchors.js`. Remaining hardening stays tracked under #3400. Thanks @franksong2702. (#6144)
### Fixed ### Fixed
- **Models selected from a list-shaped custom-provider allowlist now route to the right provider.** A `custom_providers[].models` allowlist can be written as either a mapping or a list, and the model picker accepted both — but runtime routing only read mapping keys, so a model chosen from a *list*-shaped allowlist could silently stay on the active/default provider instead of its own. The supported-model-ID extraction is now centralized in one helper used by both catalog construction and routing, so the picker and runtime can no longer drift. Existing mapping-shaped and list-of-strings configs are unaffected. Thanks @franksong2702. (#6127, #6121) - **Models selected from a list-shaped custom-provider allowlist now route to the right provider.** A `custom_providers[].models` allowlist can be written as either a mapping or a list, and the model picker accepted both — but runtime routing only read mapping keys, so a model chosen from a *list*-shaped allowlist could silently stay on the active/default provider instead of its own. The supported-model-ID extraction is now centralized in one helper used by both catalog construction and routing, so the picker and runtime can no longer drift. Existing mapping-shaped and list-of-strings configs are unaffected. Thanks @franksong2702. (#6127, #6121)
+10 -4
View File
@@ -29,13 +29,19 @@ contributor guidance; it does not change runtime behavior or CI gates.
repairs. Start here for narrow fixes that keep the existing WebUI execution repairs. Start here for narrow fixes that keep the existing WebUI execution
path. path.
- [`docs/rfcs/live-to-final-assistant-replies.md`](rfcs/live-to-final-assistant-replies.md): - [`docs/rfcs/live-to-final-assistant-replies.md`](rfcs/live-to-final-assistant-replies.md):
proposed product model for long-running assistant replies, live process text, accepted product model for long-running assistant replies, live process text,
tool activity, recovery, terminal outcomes, and final-answer boundaries. Start tool activity, recovery, terminal outcomes, and final-answer boundaries. Start
here for UI/UX changes to running-session assistant reply rendering. here for UI/UX changes to running-session assistant reply rendering.
- [`docs/rfcs/stable-assistant-turn-anchors.md`](rfcs/stable-assistant-turn-anchors.md):
implemented presentation/reconciliation model that attaches live, settled,
replayed, and recovered activity to one assistant-turn owner and projects one
`activity_scene_v1` into Compact Worklog, Transparent Stream, or Final answer
only. Remaining hardening stays tracked under #3400.
- [`docs/architecture/stable-assistant-turn-anchor-phase0.md`](architecture/stable-assistant-turn-anchor-phase0.md): - [`docs/architecture/stable-assistant-turn-anchor-phase0.md`](architecture/stable-assistant-turn-anchor-phase0.md):
current Phase 0 inventory for the Stable Assistant Turn Anchors work under cumulative implementation inventory for the Stable Assistant Turn Anchors
#3926. Use this before wiring anchor helpers into live SSE, replay, work under #3926. Use it to distinguish shipped wiring from historical slice
settlement, `INFLIGHT`, or `renderMessages()` paths. boundaries before changing live SSE, replay, settlement, `INFLIGHT`, or
`renderMessages()` paths.
- [`docs/rfcs/canonical-session-resolution.md`](rfcs/canonical-session-resolution.md): - [`docs/rfcs/canonical-session-resolution.md`](rfcs/canonical-session-resolution.md):
proposed contract for resolving URL routes, query parameters, localStorage, proposed contract for resolving URL routes, query parameters, localStorage,
sidebar rows, and compression-lineage IDs to one canonical visible session sidebar rows, and compression-lineage IDs to one canonical visible session
@@ -1,12 +1,16 @@
# Stable Assistant Turn Anchors Phase 0 Inventory # Stable Assistant Turn Anchors Phase 0 Inventory
This inventory implements the first non-visual slice of This inventory began as the first non-visual slice of
[`stable-assistant-turn-anchors.md`](../rfcs/stable-assistant-turn-anchors.md). [`stable-assistant-turn-anchors.md`](../rfcs/stable-assistant-turn-anchors.md) and
It documents the current per-turn state layers and the event-shape contract that now records the shipped phase progression. Current `master` wires Anchor-owned
future anchor phases must consume. It does not claim that anchors are wired into `activity_scene_v1` data into live and settled Compact Worklog, Transparent
streaming or rendering yet. Stream, journal hydration, session re-entry, and transcript-backed persistence.
## RFC Phase Progress The slice-by-slice sections below are retained as implementation history.
Present-tense statements such as “unwired” or “future phase” describe the point
when that slice landed; they do not override the current coverage summary above.
## Shipped RFC Phase Progress
- The #3962 Phase 0 scaffold shipped through #3977 / v0.51.359: inventory the - The #3962 Phase 0 scaffold shipped through #3977 / v0.51.359: inventory the
current state layers, encode the owner seed, and pin the source classification current state layers, encode the owner seed, and pin the source classification
+9 -8
View File
@@ -47,16 +47,17 @@ First-time contributor RFCs should be discussed in an issue before opening a PR.
replay, compression, and session metadata coherent during active and recovered replay, compression, and session metadata coherent during active and recovered
WebUI runs. WebUI runs.
- [`live-to-final-assistant-replies.md`](live-to-final-assistant-replies.md) - [`live-to-final-assistant-replies.md`](live-to-final-assistant-replies.md)
— #3400 product model for long-running assistant replies, live process prose, — #3400 accepted product model for long-running assistant replies, live
tool activity, recovery, terminal outcomes, and the final-answer boundary. process prose, tool activity, recovery, terminal outcomes, display
projections, and the final-answer boundary.
- [`transparent-stream-activity-mode.md`](transparent-stream-activity-mode.md) - [`transparent-stream-activity-mode.md`](transparent-stream-activity-mode.md)
— #3820 opt-in display mode for power users who need a transparent, — #3820 implemented opt-in display mode for power users who need a
chronological Thinking / progress / tool-call stream alongside the default transparent, chronological Thinking / progress / tool-call stream alongside
Compact Worklog model. the default Compact Worklog and opt-in Final answer only projections.
- [`stable-assistant-turn-anchors.md`](stable-assistant-turn-anchors.md) — #3926 - [`stable-assistant-turn-anchors.md`](stable-assistant-turn-anchors.md) — #3926
proposed frontend presentation/reconciliation model for anchoring live implemented frontend presentation/reconciliation model for anchoring live
assistant activity, settled final answers, replay, and Compact/Transparent assistant activity, settled final answers, replay, and all activity display
render modes to one assistant turn. modes to one assistant turn; remaining hardening is tracked under #3400.
- [`canonical-session-resolution.md`](canonical-session-resolution.md) — #2361 - [`canonical-session-resolution.md`](canonical-session-resolution.md) — #2361
focused contract for resolving URL, query parameter, localStorage, sidebar, focused contract for resolving URL, query parameter, localStorage, sidebar,
and compression-lineage session IDs to one canonical visible chat target. and compression-lineage session IDs to one canonical visible chat target.
+41 -1
View File
@@ -3,6 +3,7 @@
- **Status:** Accepted (parent contract; implementation tracked in [#3400](https://github.com/nesquena/hermes-webui/issues/3400)) - **Status:** Accepted (parent contract; implementation tracked in [#3400](https://github.com/nesquena/hermes-webui/issues/3400))
- **Author:** @franksong2702 - **Author:** @franksong2702
- **Created:** 2026-06-03 - **Created:** 2026-06-03
- **Updated:** 2026-07-16
- **Tracking issue:** [#3400](https://github.com/nesquena/hermes-webui/issues/3400) - **Tracking issue:** [#3400](https://github.com/nesquena/hermes-webui/issues/3400)
## Background: Long-Running Sessions Are The Anchor ## Background: Long-Running Sessions Are The Anchor
@@ -204,6 +205,43 @@ Requirements:
- Very long final answers remain complete and readable. They should not be - Very long final answers remain complete and readable. They should not be
hidden inside the activity summary or replaced by a progress/status artifact. hidden inside the activity summary or replaced by a progress/status artifact.
### Activity display and disclosure addenda
The accepted lifecycle now has three presentation strategies over the same
assistant-turn activity data:
- **Compact Worklog** remains the default. Its top-level Worklog is expanded
while live so progress remains visible, and the user may collapse or reopen it.
Nested tool/reasoning detail remains progressively disclosed.
- **Transparent Stream** is opt-in and renders the same ordered activity as
chronological rows. It does not create a second live or settled owner.
- **Final answer only** is opt-in (`hide_all_activity` in persisted settings).
It suppresses activity rows without deleting the persisted Anchor scene or
changing the final-answer owner.
For normal completed turns, the settled Compact Worklog remains collapsed by
default. When a terminal error-family turn has actual Worklog content, the
Worklog defaults open so readable partial work is not hidden behind the error
outcome. The current disclosure error family is `error`, `no_response`,
`degraded`, `connection_lost`, `tool_limit_reached`, and
`compression_exhausted`; cancelled turns and the parent `interrupted` terminal
outcome keep their separate semantics. An explicit user disclosure choice wins
over these defaults and may be restored across a render rebuild.
`degraded` and `connection_lost` are Anchor-level reconstruction/transport
outcomes defined in
[`stable-assistant-turn-anchors.md`](stable-assistant-turn-anchors.md), not
additional canonical product states in the table below. In this parent
contract, `connection_lost` is the transport-specific Anchor form of an
interruption, while `degraded` is the explicit recovery-state counterpart to the
restoring/degraded path. They use error-family disclosure only because they can
leave readable partial Worklog content without a normal final answer.
These are presentation and disclosure rules only. They do not change reply
ownership, terminal classification, durable transcript truth, or the requirement
that all three strategies converge across live, settle, reload, session switch,
and reconnect.
### Recovery and replay ### Recovery and replay
Refresh, reconnect, session switching, and replay should preserve the same Refresh, reconnect, session switching, and replay should preserve the same
@@ -473,7 +511,9 @@ for current open/merged/superseded status.
| Track | Scope | Current vehicle | | Track | Scope | Current vehicle |
| --- | --- | --- | | --- | --- | --- |
| Parent product RFC | Define the long-running live-to-final assistant reply lifecycle and review checklist. | This RFC; tracking issue [#3400](https://github.com/nesquena/hermes-webui/issues/3400). | | Parent product RFC | Define the long-running live-to-final assistant reply lifecycle and review checklist. | This RFC; tracking issue [#3400](https://github.com/nesquena/hermes-webui/issues/3400). |
| First reply lifecycle implementation | Live process prose, quiet tool activity, settled activity summary above final answer, replay/reattach consistency, live-only compression status, supporting stream ownership fixes. | [#3401](https://github.com/nesquena/hermes-webui/pull/3401). | | First reply lifecycle implementation | Live process prose, quiet tool activity, settled activity summary above final answer, replay/reattach consistency, live-only compression status, supporting stream ownership fixes. | [#3401](https://github.com/nesquena/hermes-webui/pull/3401), absorbed through [#3741](https://github.com/nesquena/hermes-webui/pull/3741). |
| Activity display projections | Compact Worklog by default, opt-in Transparent Stream, and opt-in Final answer only over the same assistant-turn data. | [#3820](https://github.com/nesquena/hermes-webui/issues/3820), [`transparent-stream-activity-mode.md`](transparent-stream-activity-mode.md), tracking issue [#3400](https://github.com/nesquena/hermes-webui/issues/3400). |
| Assistant-turn presentation ownership | Normalize live, settled, replayed, and recovered activity into one Anchor / `activity_scene_v1`, with legacy rendering limited to historical or non-anchor compatibility. | [#3926](https://github.com/nesquena/hermes-webui/issues/3926), [`stable-assistant-turn-anchors.md`](stable-assistant-turn-anchors.md); core implementation shipped through the #4411/#4564 and #5242/#5243 capstones. |
| Terminal/no-final stabilization | Compression exhausted, tool-tail/no-final transcript shape, context-compaction marker suppression, terminal error routing. | [#3315](https://github.com/nesquena/hermes-webui/issues/3315), [#3316](https://github.com/nesquena/hermes-webui/pull/3316). | | Terminal/no-final stabilization | Compression exhausted, tool-tail/no-final transcript shape, context-compaction marker suppression, terminal error routing. | [#3315](https://github.com/nesquena/hermes-webui/issues/3315), [#3316](https://github.com/nesquena/hermes-webui/pull/3316). |
| Cancel ownership hardening | Frontend cancel should close its own SSE source and clear only its own busy state. | [#3344](https://github.com/nesquena/hermes-webui/issues/3344), [#3345](https://github.com/nesquena/hermes-webui/pull/3345). | | Cancel ownership hardening | Frontend cancel should close its own SSE source and clear only its own busy state. | [#3344](https://github.com/nesquena/hermes-webui/issues/3344), [#3345](https://github.com/nesquena/hermes-webui/pull/3345). |
| Early-cancel startup race | Backend cancel should still interrupt the worker when the SSE registry detached before startup fully settled. | [#3475](https://github.com/nesquena/hermes-webui/issues/3475), [#3476](https://github.com/nesquena/hermes-webui/pull/3476). | | Early-cancel startup race | Backend cancel should still interrupt the worker when the SSE registry detached before startup fully settled. | [#3475](https://github.com/nesquena/hermes-webui/issues/3475), [#3476](https://github.com/nesquena/hermes-webui/pull/3476). |
+34 -1
View File
@@ -1,12 +1,35 @@
# Stable Assistant Turn Anchors for Live-to-Final Rendering # Stable Assistant Turn Anchors for Live-to-Final Rendering
- **Status:** Proposed - **Status:** Implemented
- **Author:** @franksong2702 - **Author:** @franksong2702
- **Created:** 2026-06-10 - **Created:** 2026-06-10
- **Updated:** 2026-07-16
- **Tracking issue:** [#3926](https://github.com/nesquena/hermes-webui/issues/3926) - **Tracking issue:** [#3926](https://github.com/nesquena/hermes-webui/issues/3926)
- **Parent contract:** [Live-to-Final Assistant Replies](./live-to-final-assistant-replies.md) ([#3400](https://github.com/nesquena/hermes-webui/issues/3400)) - **Parent contract:** [Live-to-Final Assistant Replies](./live-to-final-assistant-replies.md) ([#3400](https://github.com/nesquena/hermes-webui/issues/3400))
- **Related RFCs:** [Transparent Stream](./transparent-stream-activity-mode.md), [Hermes Run Adapter Contract](./hermes-run-adapter-contract.md), [WebUI Run State Consistency Contract](./webui-run-state-consistency-contract.md), [Turn Journal](./turn-journal.md), [Pending Intent Controls](./webui-pending-intent-controls.md) - **Related RFCs:** [Transparent Stream](./transparent-stream-activity-mode.md), [Hermes Run Adapter Contract](./hermes-run-adapter-contract.md), [WebUI Run State Consistency Contract](./webui-run-state-consistency-contract.md), [Turn Journal](./turn-journal.md), [Pending Intent Controls](./webui-pending-intent-controls.md)
## Implementation Status
The RFC's core presentation/reconciliation path is implemented. Current
`master` includes the event normalizer and registry, settled final-answer
projection, ordered `activity_scene_v1`, live Compact Worklog rendering,
Transparent Stream rendering, run-journal hydration, session re-entry,
transcript-backed scene persistence, and explicit fallback ownership for
historical or non-anchor transcripts.
`Implemented` does not mean every adjacent hardening item is complete. The
remaining work is tracked under [#3400](https://github.com/nesquena/hermes-webui/issues/3400)
and should land as separate slices:
- replace presentation-layer text/prefix de-echo heuristics with provenance or
event identity without deleting legitimate repeated model output;
- make newer journal/replay evidence explicitly outrank stale `INFLIGHT`
first-paint state;
- finish stable `run_id` versus transport `stream_id` separation;
- complete the Phase 6 Artifact/side-effect ownership path;
- remove each legacy fallback only after its historical transcript shape can
hydrate an Anchor reliably.
## Problem ## Problem
The Live-to-Final redesign made the user-facing product model clearer: The Live-to-Final redesign made the user-facing product model clearer:
@@ -763,6 +786,11 @@ Implementation PRs may combine adjacent low-risk phases when they preserve
behavior and include coverage. Settlement, reconstruction, and display-mode behavior and include coverage. Settlement, reconstruction, and display-mode
changes should remain independently reviewable. changes should remain independently reviewable.
Implementation reconciliation (2026-07-16): the core Phase 0-5 path has shipped.
Phase 6 and the hardening items listed in **Implementation Status** remain
follow-up work; the phase descriptions below are retained as the rollout
contract that produced the current implementation.
### Phase 0: RFC and inventory ### Phase 0: RFC and inventory
- Land this RFC as design guidance. - Land this RFC as design guidance.
@@ -902,6 +930,11 @@ Any implementation PR against this RFC should answer:
## Open Questions ## Open Questions
The first-slice and Transparent Stream sequencing questions below are retained
as historical implementation rationale. Current open hardening questions are
identity fallback depth, Artifact/side-effect ownership, and how far active-turn
DOM rebuilds can be reduced without weakening recovery compatibility.
### First implementation slice size ### First implementation slice size
Should the first implementation PR stop at hidden anchor scaffolding, or should Should the first implementation PR stop at hidden anchor scaffolding, or should
+26 -5
View File
@@ -1,12 +1,31 @@
# Transparent Stream — A Chronological Activity Display Mode # Transparent Stream — A Chronological Activity Display Mode
- **Status:** Accepted (direction confirmed by @nesquena; RFC merged via [#3862](https://github.com/nesquena/hermes-webui/pull/3862)) - **Status:** Implemented (opt-in display mode; follow-up hardening tracked in [#3400](https://github.com/nesquena/hermes-webui/issues/3400))
- **Author:** @franksong2702 - **Author:** @franksong2702
- **Created:** 2026-06-09 - **Created:** 2026-06-09
- **Updated:** 2026-06-09 - **Updated:** 2026-07-16
- **Tracking issue:** [#3820](https://github.com/nesquena/hermes-webui/issues/3820) - **Tracking issue:** [#3820](https://github.com/nesquena/hermes-webui/issues/3820)
- **Parent contract:** [Live-to-Final Assistant Replies](./live-to-final-assistant-replies.md) ([#3400](https://github.com/nesquena/hermes-webui/issues/3400) / #3401 / #3741) - **Parent contract:** [Live-to-Final Assistant Replies](./live-to-final-assistant-replies.md) ([#3400](https://github.com/nesquena/hermes-webui/issues/3400) / #3401 / #3741)
## Current projection family
The shipped `chat_activity_display_mode` setting now has three explicit values:
- `compact_worklog` — default, results-first presentation;
- `transparent_stream` — opt-in chronological activity rows;
- `hide_all_activity` — opt-in **Final answer only** presentation.
All three are render strategies over the same Assistant Turn Anchor and
`activity_scene_v1`; they do not create separate activity ownership or change
the final-answer boundary. Final answer only suppresses activity presentation
while preserving the persisted scene so another mode, settle, or reload can
reconstruct the same turn.
The original proposal and rollout notes below are retained as design history.
Statements describing a missing selector, missing settled branch, or unwired
live/replay renderer describe the tree when this RFC was written, not current
`master`.
## Problem ## Problem
After the live-to-final redesign (#3401/#3741), the execution trace of a turn After the live-to-final redesign (#3401/#3741), the execution trace of a turn
@@ -104,21 +123,22 @@ Plus two boundaries:
- **Not full transcript virtualization.** Performance hardening for very long - **Not full transcript virtualization.** Performance hardening for very long
transparent transcripts (#3714) is acknowledged but scoped to a later slice. transparent transcripts (#3714) is acknowledged but scoped to a later slice.
## Proposal ## Implemented proposal
### 1. A new, dedicated preference ### 1. A new, dedicated preference
A new preference, independent of `simplified_tool_calling`: The shipped preference is independent of `simplified_tool_calling`:
```python ```python
# api/config.py preferences # api/config.py preferences
"chat_activity_display_mode": "compact_worklog", # | "transparent_stream" "chat_activity_display_mode": "compact_worklog", # | "transparent_stream" | "hide_all_activity"
``` ```
- Default `compact_worklog` — existing users see no change. - Default `compact_worklog` — existing users see no change.
- Surfaced in Settings as an explicit **segmented choice** (not a checkbox): - Surfaced in Settings as an explicit **segmented choice** (not a checkbox):
- **Compact Worklog** — default; results-first, supporting activity quiet. - **Compact Worklog** — default; results-first, supporting activity quiet.
- **Transparent Stream** — advanced; every step shown chronologically. - **Transparent Stream** — advanced; every step shown chronologically.
- **Final answer only** — activity hidden; final answer remains visible.
- The legacy `Compact tool activity` checkbox is marked deprecated. It is not - The legacy `Compact tool activity` checkbox is marked deprecated. It is not
the seam for this feature. the seam for this feature.
@@ -128,6 +148,7 @@ predicate used everywhere:
```js ```js
function chatActivityMode(){ return window._chatActivityDisplayMode || 'compact_worklog'; } function chatActivityMode(){ return window._chatActivityDisplayMode || 'compact_worklog'; }
function isTransparentStream(){ return chatActivityMode() === 'transparent_stream'; } function isTransparentStream(){ return chatActivityMode() === 'transparent_stream'; }
function isFinalAnswerOnlyMode(){ return chatActivityMode() === 'hide_all_activity'; }
``` ```
### 2. Decouple "event sequence" from "grouping strategy" ### 2. Decouple "event sequence" from "grouping strategy"
@@ -3,8 +3,9 @@
- **Status:** Proposed - **Status:** Proposed
- **Author:** @franksong2702 - **Author:** @franksong2702
- **Created:** 2026-05-16 - **Created:** 2026-05-16
- **Updated:** 2026-07-16
- **Tracking issue:** [#2361](https://github.com/nesquena/hermes-webui/issues/2361) - **Tracking issue:** [#2361](https://github.com/nesquena/hermes-webui/issues/2361)
- **Related architecture:** [#1925](https://github.com/nesquena/hermes-webui/issues/1925), [`hermes-run-adapter-contract.md`](hermes-run-adapter-contract.md) - **Related architecture:** [#1925](https://github.com/nesquena/hermes-webui/issues/1925), [`hermes-run-adapter-contract.md`](hermes-run-adapter-contract.md), [`stable-assistant-turn-anchors.md`](stable-assistant-turn-anchors.md)
## Problem ## Problem
@@ -46,6 +47,21 @@ while WebUI still has multiple overlapping state stores.
- Do not reopen already-fixed narrow bugs. - Do not reopen already-fixed narrow bugs.
- Do not make this a catch-all for unrelated UI polish. - Do not make this a catch-all for unrelated UI polish.
## Current implementation relationship
Stable Assistant Turn Anchors now implement the presentation/reconciliation
portion of this contract for one assistant turn. The run journal and settled
transcript provide durable observations; the Anchor registry and
`activity_scene_v1` reconcile those observations into Compact Worklog,
Transparent Stream, or Final answer only; `S.messages`, `INFLIGHT`, renderer
caches, and DOM remain projections or recovery caches rather than independent
semantic owners.
This RFC remains `Proposed` because its broader cross-layer contract also covers
model-context reconstruction, compression handoff, session metadata, and future
runtime-adapter migration. Shipped Anchor coverage strengthens invariants 2, 3,
and 5; it does not mark every run-state boundary implemented.
## State Layers ## State Layers
| Layer | Purpose | Source-of-truth expectation | Must not do | | Layer | Purpose | Source-of-truth expectation | Must not do |
+5 -5
View File
@@ -1,9 +1,9 @@
// Stable Assistant Turn Anchors scaffold (#3926). // Stable Assistant Turn Anchors implementation (#3926 / #3400).
// //
// This file defines the current ownership inventory, event classifications, and // This file defines the ownership inventory, event normalization, registry, and
// small owner helpers. It does not register anchors globally. The only renderer // activity-scene projection consumed by current live, settled, replay-hydration,
// wiring in this slice is settled assistant final-answer projection; live // and session-reentry paths. Runtime execution and transport remain outside the
// streaming, replay hydration, tools, and DOM ownership remain unwired. // Anchor's presentation/reconciliation ownership boundary.
(function(){ (function(){
const ROOT=(typeof window!=='undefined')?window:globalThis; const ROOT=(typeof window!=='undefined')?window:globalThis;