# Praxis — Persona Assessment > **Generated:** Phase 0 RESEARCH stage > **Project:** Praxis (v0.1 foundation) > **Source:** Research findings (`.ciagent/RESEARCH.md`) + config.json personas ## Persona Roster ### Active personas (4) ```yaml --- name: lead-developer active: true phase_specific: false reason: Coordinates task decomposition across the voice-loop pipeline; resolves conflicts between backend/frontend/data personas. Required for every milestone. domain: coordination frameworks: [pipecat, react] constraints: [pragmatic, latency-budget-aware (<600ms), voice-first-architecture] territory: [] --- ``` ```yaml --- name: backend-engineer active: true phase_specific: false reason: Owns the Pipecat server, Ollama Cloud direct API integration, Deepgram ASR service, guardrail layer, and scenario runtime (Pipecat Flows + YAML→Pydantic). Core of the v0.1 voice loop. domain: backend frameworks: [pipecat, pydantic, ollama, deepgram, cartesia, piper, sqlite] constraints: [api-first, type-safe, latency-budget-aware, streaming-first, pluggable-interfaces-for-swap] territory: - "**/server/**" - "**/pipecat/**" - "**/services/**" - "**/scenarios/**" - "**/guardrails/**" - "**/db/**" - "**/llm/**" - "**/asr/**" - "**/tts/**" --- ``` ```yaml --- name: frontend-engineer active: true phase_specific: false reason: Owns the React + WebRTC client via Pipecat client SDK — audio capture/playback, interruptibility UI, session display, debrief rendering. Voice-first UI constraints differ from typical web frontend. domain: frontend frameworks: [react, pipecat-client-sdk, webrtc] constraints: [component-first, voice-first-ui, minimal-client-javascript, webRTC-audio-pipeline] territory: - "**/client/**" - "**/ui/**" - "**/components/**" - "**/web/**" --- ``` ```yaml --- name: data-engineer active: true phase_specific: false reason: Owns SQLite schema (praxis.db), session-log migrations, scenario YAML→Pydantic schema definitions, and learner-state access layer. v0.1 data surface is small but schema-first discipline is still required. domain: data frameworks: [sqlite, pydantic, pydantic-ai] constraints: [schema-first, type-safe, migration-driven, single-learner-no-auth] territory: - "**/migrations/**" - "**/schema/**" - "**/models/**" - "**/db/**" - "**/scenarios/*.yaml" --- ``` ### Deactivated personas (0) No default personas are deactivated for v0.1. All four default personas have relevant territory. ### Custom personas (proposed for later milestones — NOT v0.1) ```yaml --- name: voice-engineer active: false phase_specific: false reason: PROPOSED for v0.2+ when latency tuning, accent modeling, and multi-voice personas become central. v0.1 uses Pipecat's built-in voice pipeline (Silero VAD + Deepgram + Cartesia/Piper), so a dedicated voice-engineer is not warranted yet. domain: voice frameworks: [webrtc, silero-vad, audio-codecs] constraints: [sub-600ms-latency, accent-robustness, audio-quality-vs-latency-tradeoff] territory: [] --- ``` ```yaml --- name: ml-engineer active: false phase_specific: false reason: PROPOSED for v0.3+ when fine-tuning Ollama models on Canadian English / role-play data becomes relevant. v0.1 uses off-the-shelf cloud models — no ML training in scope. domain: ml frameworks: [ollama, pytorch, axolotl] constraints: [open-weights, cost-bounded-fine-tuning] territory: [] --- ``` ## Framework Alignment (overrides from config.json defaults) The default config.json personas had empty `frameworks[]`. Research identified the actual v0.1 stack, so frameworks are now populated above: | Persona | Frameworks (research-aligned) | |---------|-------------------------------| | lead-developer | pipecat, react | | backend-engineer | pipecat, pydantic, ollama, deepgram, cartesia, piper, sqlite | | frontend-engineer | react, pipecat-client-sdk, webrtc | | data-engineer | sqlite, pydantic, pydantic-ai | ## Territory Alignment Default config.json territory globs were generic (`**/server/**`, `**/client/**`, etc.). Research refined them to match the v0.1 Pipecat-based architecture — see `territory:` fields above. Notable additions: - backend-engineer now owns `**/pipecat/**`, `**/scenarios/**`, `**/guardrails/**`, `**/llm/**`, `**/asr/**`, `**/tts/**` (voice-loop service boundaries) - data-engineer now owns `**/scenarios/*.yaml` (scenario schema authorship) ## Constraint Alignment Default config.json constraints were generic. Research added project-specific constraints: - All personas: `latency-budget-aware (<600ms)` — the binding v0.1 NFR - backend-engineer: `streaming-first`, `pluggable-interfaces-for-swap` (D-014/D-019/D-020 require swappable TTS/LLM/guardrail layers) - frontend-engineer: `voice-first-ui`, `webRTC-audio-pipeline`, `minimal-client-javascript` - data-engineer: `single-learner-no-auth` (D-007) ## Phase-Specific Personas None for v0.1. No personas are created for a specific phase and removed after — the four active personas span the whole milestone. The proposed `voice-engineer` and `ml-engineer` are for later milestones, not phase-specific. ## Notes for EXECUTE stage - Territory enforcement mode: `warn` (per config.json `personas.territory_enforcement`) - The backend-engineer owns the majority of v0.1 task surface (Pipecat server + all service integrations) - The frontend-engineer's surface is smaller but has the R2/R4 latency risk (WebRTC audio pipeline + TTS playback) - The data-engineer's surface is the smallest (one SQLite schema + one YAML scenario) but is on the critical path (scenario definition blocks scenario runtime)