Praxis CI d39bd1423a feat(P02): SLICE-09 React cohort dashboard — Router, login, 3 views, sparklines
TASK-09-01: client/package.json — add react-router-dom@^7 (no chart lib).
TASK-09-02: client/src/main.tsx (BrowserRouter wrapper) + App.tsx (Routes
  switch: / → VoiceSession, /operator/login → Login, /operator/dashboard →
  Dashboard, * → VoiceSession fallback). R-DASH-05: voice UI at / unchanged.
  Extracted VoiceSession.tsx from App.tsx to preserve the existing UI.
TASK-09-03: client/src/operator/Login.tsx — login form (POST /api/operator/login,
  navigate to dashboard, 401/429/503 error states, keyboard-accessible).
TASK-09-04: client/src/operator/Dashboard.tsx — auth gate (GET /me on mount,
  redirect to /operator/login on 401), operator name, 3 view tabs, freshness
  indicator, logout button.
TASK-09-05: client/src/operator/Sparkline.tsx — inline SVG sparkline (~50 LOC,
  zero deps, handles empty/single/all-same, stroke=currentColor).
TASK-09-06: 3 view components (PracticeVolume, MasteryProgression,
  FailurePatterns) — fetch /api/operator/<view>, read-only tables + sparklines,
  suppressed cells → '— (<10 learners)', loading/error/no-data states.
TASK-09-07: client/src/operator/__tests__/Dashboard.test.tsx (17 tests via
  vitest + @testing-library/react) — auth gate, login, suppressedLabel,
  sparkline, formatFreshness, no PII in DOM.

vitest.config.ts + test-setup.ts + devDeps (vitest, testing-library, jsdom).
npm run build + typecheck + test all pass.

---ci---
project: praxis
phase: 2
milestone: v0.4
status: execute
persona: frontend-engineer
task: 09-01..09-07
requirements:
  covered: [REQ-DASH-01, REQ-NFR-DASH-01]
---/ci---
2026-08-04 04:26:23 +00:00

Praxis — v0.1 Foundation

Voice-first AI apprenticeship platform. v0.1 is a tech-validation harness (per G-008) for the minimal viable voice loop: a single learner speaks to an AI tutor playing a Customer Service role-play scenario, hears a <600ms-latency response, receives an end-of-session coaching debrief, and has the session logged to SQLite.

Status

Phase 1 (minimal viable voice loop) — code-complete, pending live API keys for runtime verification.

Stack

  • Orchestration: Pipecat (D-017) with Silero VAD + interruptibility
  • ASR: Deepgram Nova-3 streaming (D-013)
  • LLM: Ollama Cloud direct API (D-020) — gemma4:cloud (role-play) + deepseek-v4-flash:cloud no-think (debrief)
  • TTS: Cartesia Sonic (primary, D-014) / Piper (self-hosted, R4 mitigation) — behind an interface
  • Client: React + Vite + WebRTC (Pipecat client SDK, D-015)
  • State: SQLite praxis.db (D-007, single hardcoded learner, no auth)

Layout

server/      Pipecat pipeline, services (TTS/LLM/Guardrail interfaces), scenario runtime, adapters
client/      React + Vite + WebRTC learner surface
scenarios/   YAML scenario definitions (D-018)
db/          SQLite schema, migrations, async store
scripts/     Latency probes (R1-R4), e2e smoke
tests/       Unit + e2e
docs/        Latency report, debrief templates

Quickstart

  1. Copy .env.example.env, fill in DEEPGRAM_API_KEY, CARTESIA_API_KEY, OLLAMA_API_KEY.
  2. Install server deps: pip install -e ".[dev]"
  3. Install client deps: cd client && npm install
  4. Run probes: python scripts/probe_deepgram.py (etc.)
  5. Run server: python -m server
  6. Run client: cd client && npm run dev

See docs/latency-report.md for the R1-R4 spike status and TTS decision.

S
Description
No description provided
Readme 1.7 MiB
2026-08-04 22:36:00 +00:00
Languages
Python 81.4%
Shell 13.8%
TypeScript 4.3%
CSS 0.3%
Dockerfile 0.2%