Skip to content

feat(14-4): vocabulary slider — UI#39

Merged
slabgorb merged 1 commit intodevelopfrom
feat/14-4-vocabulary-level-slider
Mar 31, 2026
Merged

feat(14-4): vocabulary slider — UI#39
slabgorb merged 1 commit intodevelopfrom
feat/14-4-vocabulary-level-slider

Conversation

@slabgorb
Copy link
Copy Markdown
Owner

Summary

  • VocabularySlider component: accessible radio group (accessible/literary/epic)
  • NarratorVocabulary type in protocol types

Test plan

  • 7 component tests
  • All existing tests pass

🤖 Generated with Claude Code

Accessible radio group with three labeled positions (accessible/literary/epic).
NarratorVocabulary type alias in protocol types.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@slabgorb slabgorb merged commit 9596520 into develop Mar 31, 2026
@slabgorb slabgorb deleted the feat/14-4-vocabulary-level-slider branch March 31, 2026 06:12
slabgorb added a commit that referenced this pull request Apr 24, 2026
#158)

Two OTEL dashboard bugs from the 2026-04-24 playtest
(sq-playtest-pingpong lines 582, 598).

Bug 1 — Turns counter stuck at 0, Timeline / Timing / Prompt / Lore
empty. Root cause: the aggregator only counted the semantic
`turn_complete` event, which stopped reaching the stream in live
traffic. OTEL span closes (`orchestrator.process_action`,
`turn.agent_llm.inference`, `narrator.canonical_leak_audit`) kept
flowing — Console + Subsystems tabs filled while every per-turn tab
stayed empty.

Fix: treat `agent_span_close { name: "orchestrator.process_action" }`
as the canonical turn boundary. Accumulate `turn_id` / `player_id` /
genre / world from `narrator.canonical_leak_audit` (carries
`turn_id=<genre>:<world>:<player>:<N>`) and inference duration from
`turn.agent_llm.inference`, then synthesize a `turn_complete`
WatcherEvent on the `orchestrator.process_action` close. Dedupe by
`turn_id` so a late semantic `turn_complete` replaces the synthesized
entry rather than double-counting.

Bug 2 — State tab reads the first session from /api/debug/state,
which with multiple saves was usually the OLDEST save instead of the
active one. StateTab now picks the session with the largest
`last_activity_ts` (new field on `SessionStateView`; server-side sort
is handled in the paired server PR).

Wiring tests:
- increments Turns counter when orchestrator.process_action closes
  (feeds the exact 3-event sequence seen in playtest console logs)
- does not double-count when a real turn_complete follows a
  synthesized one for the same turn_id
- State tab picks the most-recently-touched session by last_activity_ts
- State tab falls back to first entry when last_activity_ts absent
  (back-compat with un-deployed servers)

Paired with sidequest-server PR #39 for the server-side sort +
`?session_key=` filter, plus the local_dm JSON extraction fix.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant