Presenter contract semantics amendment: stateful event coalescing + telemetry demotion #12
Closed
opened 2026-05-23 15:11:11 -07:00 by vh
·
1 comment
No Branch/Tag Specified
main
diag/r30-gap-injection-harness
diag/r30-phi0-step-response
diag/r29-pad-series
graphify-tooling
v0.22.3
v0.22.2
v0.22.1
v0.22.0
v0.21.20
v0.21.19
v0.21.18
v0.21.17
v0.21.16
v0.21.15
v0.21.14
v0.21.13
v0.21.12
v0.21.11
v0.21.10
v0.21.9
v0.21.8
v0.21.7
v0.21.6
v0.21.5
v0.21.4
v0.21.3
v0.21.2
v0.21.1
v0.21.0
v0.20.17
v0.20.16
v0.20.15
v0.20.14
v0.20.13
v0.20.12
v0.20.11
v0.20.10
v0.20.9
v0.20.8
v0.20.7
v0.20.6
v0.20.5
v0.20.4
v0.20.3
v0.20.2
v0.20.1
v0.20.0
v0.19.9
v0.19.8
v0.19.7
v0.19.6
v0.19.5
v0.19.4
v0.19.3
v0.19.2
v0.19.1
v0.19.0
v0.18.11
v0.18.10
v0.18.9
v0.18.8
v0.18.7
v0.18.6
v0.18.5
v0.18.4
v0.18.3
v0.18.2
v0.18.1
v0.18.0
v0.17.17
v0.17.16
v0.17.15
v0.17.14
v0.17.13
v0.17.12
v0.17.11
v0.17.10
v0.17.9
v0.17.8
v0.17.7
v0.17.6
v0.17.5
v0.17.4
v0.17.3
v0.17.2
v0.17.1
v0.17.0
v0.16.1
v0.16.0
v0.15.1
v0.15.0
v0.14.2
v0.14.1
v0.14.0
v0.13.0
v0.12.0
v0.11.0
v0.10.0
v0.9.0
v0.8.2
v0.8.1
v0.8.0
v0.7.1
v0.7.0
v0.6.5
v0.6.4
v0.6.3
v0.6.2
v0.6.1
v0.6.0
v0.5.1
v0.5.0
v0.4.1
v0.4.0
v0.3.0
v0.2.1
v0.2.0
v0.1.0
Labels
Clear labels
blocked-needs-contract
blocked-needs-dependency
bug
cli
documentation
duplicate
enhancement
invalid
needs-architect-decision
needs-info
needs-triage
observability
ready-for-agent
sse-client
task
tui
wontfix
Sleipnir refuses dispatch — issue-scoped contract missing
Sleipnir holds dispatch — INV-029 dependency-aware gate
Something is not working
Command-line surface (--send, --new, --session, etc.)
Docs / contract / spec work
Duplicate of another issue
New feature or improvement
Not a real issue
Escalated for a design call
More info required from reporter
Newly filed, not yet sorted
Log-pane / debug-surface work (persona, admin events, Bifrost, tools)
Gates AFK dispatch via Sleipnir (applied by /sleipnir-preflight)
SSE consumer module (src/ratatoskr/sse_client.py)
Implementation task
Textual app shell + presenters
Accepted as not-fixing
Milestone
No items
No Milestone
Projects
Clear projects
No projects
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: vh/ratatoskr#12
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Context
A 2026-05-23 mimir smoke against personal Worldtree (post-issues #5 + #6 commit
804c2df/ v0.1.0) exposed multiple presenter UX issues that materially degrade the observability surface ratatoskr is supposed to provide.Headline problem: thinking tokens render one-per-line. Worldtree streams thinking as token-deltas (just like text), but the current renderers (
cli._render_eventandtui._render_event_to_log) write[thinking] '<token>'\nper delta. A 50-token thinking phase = 50 lines of[thinking]spam.Broader scope: every demoted-telemetry event renders with the same visual weight as actual model output, drowning the load-bearing signal. Specific issues:
duration_ms=5467,usage={'prompt_tokens': ..., ...})Mission constraint
Per persistent-memory: "the product IS the observability surface; chat is the input mechanism." Suppressing events is the wrong direction. The right direction is rendering them cleanly, with editorial judgment about what's load-bearing transcript (Text / Done / Error / Cancelled) vs demoted telemetry (WorkerPhase / Thinking / TextBoundary / ToolStart / ToolResult).
A refined mission lens emerged from this smoke: "the observability surface presented at the right zoom level for the operator's task." Per-event raw streaming is the wrong zoom for normal debugging; coalesced thinking + demoted telemetry is the right zoom.
Scope
--send+ Textual TUI).Static(id="thinking-current")widget for live thinking state (chronological-in-RichLog + always-visible-in-widget = two views same data).Out of scope
--quiet,--verbose,--debug). Decision: ship flag-less; revisit if a real pipe-to-jq use case appears.Design pass
Sent the design questions to eitri-smithy-dev for a cross-frontier-model technical pass before contract authoring. Thread
01KSBE52YZR5E3SPTKA672JE43. Tactical calls (closure trigger, formatting, edge cases) will be applied directly to the contract; architectural-shape calls (mission refinement, widget yes/no, flag policy, editorial promotion line) will route through the operator.Acceptance
·prefix in cli, dim style in tui).5.5s/347ms/1.2m.Static(id="thinking-current")widget shows current thinking state, mirrors content into RichLog as chronological dimmed entries.uv run pytest tests/.uv run ruff check src/ tests/clean.Version posture
v0.1.0 → v0.2.0 (minor). Output shape changes; scripts grepping
[thinking] '<token>'would break. Pre-v1.x means breaking changes are minor.Presenter rendering polish: thinking-coalesce + telemetry demotion + formattingto Presenter contract semantics amendment: stateful event coalescing + telemetry demotionClosed — shipped. Presenter contract semantics amendment (stateful coalescing + telemetry demotion) implemented via TDD (commit
3b9c610, v0.2.0). CliPresenterState + TuiPresenterState; thinking deltas coalesce to one growing line.