docs: design activity log and CTE layout fixes
This commit is contained in:
@@ -0,0 +1,152 @@
|
||||
# Complete Activity Log and CTE Plan Layout Design
|
||||
|
||||
## Goal
|
||||
|
||||
Restore the left Model activity panel as a complete chronological log for the current live turn,
|
||||
starting with the user's prompt in Phase 1, while keeping tool details sanitized. Improve the
|
||||
Phase 6 CTE plan form so every CTE has reliable internal padding, clear hierarchy, responsive
|
||||
wrapping, and a dense but readable review layout.
|
||||
|
||||
## Confirmed Root Causes
|
||||
|
||||
### Empty activity panel
|
||||
|
||||
Commit `c7474f3` changed `ModelActivityPanel` from the assistant transcript to the dedicated
|
||||
`activity` array populated only by Pi `thinking_delta` events. That made reasoning distinct from
|
||||
final assistant text, but it also made the panel empty for models that do not emit reasoning.
|
||||
The live local Qwen model declares `reasoning: false`, so no `thinking_delta` is expected.
|
||||
|
||||
### Missing CTE padding
|
||||
|
||||
The project uses Tailwind CSS 3.4, while the shared `Card` primitive uses Tailwind 4 syntax such as
|
||||
`px-(--card-spacing)` and `--spacing(4)`. The build emits an unusable custom-property value and no
|
||||
working horizontal or vertical padding declarations for `CardHeader` and `CardContent`. The CTE
|
||||
viewer's valid child gaps remain, but its sections sit against the outer card edges.
|
||||
|
||||
## Activity Timeline Contract
|
||||
|
||||
The frontend store owns one in-memory chronological activity timeline for the current live
|
||||
session. It is not persisted and is cleared by the existing session reset behavior.
|
||||
|
||||
Each timeline entry has a stable semantic kind and display-safe fields:
|
||||
|
||||
- `prompt`: user question, gate choice, or steering text recorded locally;
|
||||
- `thinking`: model reasoning chunks when the provider emits them;
|
||||
- `assistant`: visible assistant text chunks;
|
||||
- `tool`: sanitized tool lifecycle with tool name, correlation id, and
|
||||
`running | completed | failed` status;
|
||||
- `gate`: reviewer request and phase metadata;
|
||||
- `status`: backend informational, warning, or sanitized error text;
|
||||
- `lifecycle`: model turn start/end markers.
|
||||
|
||||
The current phase is captured on each entry when known. The new-question submit path sets Phase 1
|
||||
and records the question before awaiting session creation, so the first timeline row is always
|
||||
attributable to F1. Gate choices and steering text are recorded only after their requests succeed,
|
||||
preserving the existing retry semantics. Resume starts a fresh timeline at the resume action
|
||||
because historical chat/activity is not persisted.
|
||||
|
||||
Streaming `thinking` and `assistant` chunks coalesce only with the immediately preceding entry of
|
||||
the same kind. Tool completion updates the matching running entry by correlation id instead of
|
||||
creating a disconnected duplicate. All other events append in arrival order.
|
||||
|
||||
## Backend Event Mapping and Sanitization
|
||||
|
||||
`SessionBridge` continues to map reasoning and assistant text separately. It additionally maps Pi
|
||||
`tool_execution_start` and `tool_execution_end` to a dedicated client activity event containing
|
||||
only:
|
||||
|
||||
- tool call id;
|
||||
- tool name;
|
||||
- lifecycle status.
|
||||
|
||||
Tool arguments, partial results, final results, command output, request bodies, credentials, paths
|
||||
derived from results, and raw exception text must never be forwarded. Existing sanitized provider
|
||||
error behavior remains unchanged. Tool update events are ignored because their payload is raw
|
||||
partial output and the running row already communicates progress.
|
||||
|
||||
The existing `ui_request`, `info`, `agent_start`, and `agent_end` events remain authoritative and
|
||||
are also projected into timeline rows by the frontend store.
|
||||
|
||||
## Model Activity Panel
|
||||
|
||||
The panel renders the full timeline rather than a reasoning-only tail. Opening or closing it does
|
||||
not alter store state. It uses the existing scrollable panel and automatically follows the newest
|
||||
entry while the user remains near the bottom; manual upward scrolling is not overridden.
|
||||
|
||||
Rows use restrained product-UI styling:
|
||||
|
||||
- phase and kind labels form the compact metadata layer;
|
||||
- prompt and assistant rows use normal body text;
|
||||
- thinking text remains visually secondary;
|
||||
- tool rows expose name and status without expandable raw details;
|
||||
- warnings and errors use existing semantic colors.
|
||||
|
||||
The central status component keeps its compact assistant-text tail and is not replaced by the full
|
||||
timeline.
|
||||
|
||||
## CTE Plan Layout
|
||||
|
||||
### Card primitive compatibility
|
||||
|
||||
Replace the Tailwind 4-only spacing syntax in the shared `Card` primitive with Tailwind 3-compatible
|
||||
utilities. Default cards use the existing 4-point scale at 16 px; the small variant uses 12 px.
|
||||
Header, content, footer, parent gap, and vertical padding must all compile to concrete declarations.
|
||||
The CTE viewer is currently the only consumer, limiting regression scope.
|
||||
|
||||
### Information hierarchy
|
||||
|
||||
Question, strategy, and execution order form one compact overview group. Labels identify their
|
||||
roles without decorative color. The overview uses tight 8–12 px internal spacing and a 24 px gap
|
||||
before the ordered CTE sequence.
|
||||
|
||||
Each CTE remains one ordered outer container because the boundary has semantic value. It uses a
|
||||
border without an additional decorative shadow inside the already elevated gate. The ordinal badge
|
||||
and CTE name lead the header; the name is a semantic heading. Purpose remains subordinate.
|
||||
|
||||
### Internal rhythm
|
||||
|
||||
- Card edge padding: 16 px by default, 20 px when the available width permits it.
|
||||
- Related labels, values, and chips: 4–8 px.
|
||||
- Rows and closely related blocks: 12–16 px.
|
||||
- Major body groups: 20–24 px.
|
||||
|
||||
Tables and filters render as padded rows separated by dividers within one boundary, not as nested
|
||||
shadowed cards. Rationale becomes a final plain section separated with a top divider; the prohibited
|
||||
colored side stripe is removed. Primary color remains reserved for state/order emphasis.
|
||||
|
||||
Long CTE names, table names, columns, filter values, and chips wrap within their containers. Filter
|
||||
metadata becomes multi-column only at a width where all fields remain readable; otherwise it stays
|
||||
stacked. Shared gate buttons, artifact contracts, colors, and non-CTE viewers are out of scope.
|
||||
|
||||
## Accessibility and Responsive Behavior
|
||||
|
||||
- The CTE name uses heading semantics in document order.
|
||||
- Timeline rows include readable text labels and never rely on color alone for status.
|
||||
- Tool status changes remain understandable without animation.
|
||||
- The panel and CTE form preserve keyboard scrolling and existing focus behavior.
|
||||
- No new interactive control is introduced by the CTE viewer.
|
||||
|
||||
## Testing and Verification
|
||||
|
||||
Tests are written before production changes and must prove:
|
||||
|
||||
- the F1 prompt is the first timeline entry before session creation completes;
|
||||
- non-reasoning models still produce prompt, assistant, tool, gate, and lifecycle rows;
|
||||
- thinking/assistant chunks coalesce without losing chronological ordering;
|
||||
- tool start/end update one sanitized entry and raw args/results never cross the bridge;
|
||||
- opening and closing the panel preserves the timeline;
|
||||
- automatic following stops while the user has scrolled away from the bottom;
|
||||
- CTE cards compile/use explicit padding classes and preserve wrapping/section structure;
|
||||
- filter rows, rationale divider, semantic heading, and responsive grouping render as designed.
|
||||
|
||||
Run focused backend/frontend tests, full suites, TypeScript gates, production builds, the Impeccable
|
||||
layout detector, and `git diff --check`. Build and force-recreate `core` and `frontend`, then verify
|
||||
core health, the frontend asset update, and a live session whose Phase 1 panel shows prompt plus
|
||||
subsequent sanitized activity.
|
||||
|
||||
## Out of Scope
|
||||
|
||||
- Persisting or replaying historical chat/activity across processes or browser reloads.
|
||||
- Showing raw tool arguments, results, partial output, commands, or exception details.
|
||||
- Changing model thinking configuration or provider definitions.
|
||||
- Redesigning shared reviewer controls or non-CTE artifact viewers.
|
||||
Reference in New Issue
Block a user