feat(anchor): project activity scene rows

This commit is contained in:
Frank Song committed 2026-06-13 13:23:27 +08:00
1 parent b990bd09dd
commit 59c2ccd9cf
4 files changed
+506 -12

No files matched your search

@@ -23,10 +23,13 @@ streaming or rendering yet.
pinned by tests before visible wiring begins.
- Slice 4 starts RFC Phase 3 by routing settled assistant final prose through the
anchor owner before `renderMessages()` renders the final assistant body.
- The next independently reviewable boundary is activity/render-scene projection
for reasoning, tool rows, and transparent-stream/worklog metadata. `S.messages`,
`INFLIGHT`, stream-local state, and DOM nodes remain projection/cache layers
outside the settled final-prose path.
- Slice 5 starts RFC Phase 5 by projecting anchor-owned activity events into a
renderer-neutral activity scene that Compact Worklog and Transparent Stream
can later consume from the same ordered rows.
- The next independently reviewable boundary is wiring one current renderer to
the activity scene. `S.messages`, `INFLIGHT`, stream-local state, and DOM nodes
remain projection/cache layers outside the settled final-prose path and the
inert activity-scene projection.
## State Layers
@@ -136,6 +139,22 @@ This is intentionally narrower than render-scene ownership: live stream tokens,
replay hydration, worklog rows, transparent-stream rows, tool cards, `INFLIGHT`,
and DOM continuity are still not consumed by the anchor registry in this slice.
## Slice 5 Activity Scene Projection
`HermesAssistantTurnAnchors.projectAssistantTurnAnchorActivityScene()` projects
an anchor or registry into `activity_scene_v1`: identity, lifecycle,
`final_answer`, `final_message_ref`, terminal state, and an ordered
`activity_rows` list.
The rows are renderer-neutral. Compact Worklog receives display hints such as
`main_prose`, `collapsed_thinking`, `tool_row`, and `terminal_status_row`.
Transparent Stream receives the same row IDs, order, kinds, roles, text, tool
IDs, and sanitized payloads with a chronological display hint. This pins the
shared input shape before either renderer is rewired.
This slice is still inert. No current UI module consumes the activity scene.
`renderMessages()` and the live streaming hot path are unchanged by this slice.
## Source Event Classification
Phase 0 classifies current sources before changing render behavior: