Praxis CI de2020eee1 feat(P02): SLICE-10 P2 integration — SPA fallback, router mount, e2e tests
TASK-10-01 (G-041 binding): server/__main__.py — SpaStaticFiles custom
  subclass that returns index.html for non-file paths (NOT a catch-all
  route). G-041 OVERRIDES the plan's catch-all approach — a catch-all
  before StaticFiles would shadow asset serving. The subclass serves
  assets normally + falls back to index.html for client-side routes.
  Mounted at / AFTER all API routes so they take precedence.
TASK-10-02: server/__main__.py — mount operator API routers (cohort,
  mastery, failure_patterns, credentials) before SPA fallback. Start
  NightlyScheduler in lifespan (03:00 CT), cancel on shutdown.
TASK-10-03: tests/test_p2_aggregation_integration.py — e2e aggregation→
  endpoint (12 learners non-suppressed, 5 suppressed), nightly reconcile
  refreshes last_updated, freshness ≤ 24h. G-038 differencing-attack at
  API layer. Requires Postgres (skips if no DSN).
TASK-10-04: tests/test_p2_spa_fallback.py — 9 assertions: / → voice UI,
  /operator/* → index.html, API routes → JSON, /assets/* → StaticFiles.
  R-DASH-03/05 verified. Deviation: GET to POST-only /pipecat/webrtc
  falls through to SPA fallback (not 405) — acceptable, the POST route
  is the real entrypoint; a GET is a client-side navigation attempt.
TASK-10-05: .ciagent/VERIFY-P2.md — REQ-ID → test mapping for all 4 P2
  REQ-IDs + G-038 + G-041 + R-DASH-05.

---ci---
project: praxis
phase: 2
milestone: v0.4
status: execute
persona: backend-engineer
task: 10-01..10-05
requirements:
  covered: [REQ-DASH-01, REQ-NFR-DASH-01, REQ-NFR-DASH-02, REQ-MT-02]
---/ci---
2026-08-04 04:35:29 +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%