Files
nextcraft/.ciagent/PERSONAS.md
T
CIAgent 88a1dab810 docs(milestone): complete v0.2-ai-tutor-architecture
---ci---
phase: 7
milestone: v0.2
status: complete
requirements:
  covered: [REQ-2-001, REQ-2-002, REQ-2-003, REQ-2-004, REQ-2-005, REQ-2-006, REQ-2-007, REQ-2-008, REQ-2-009, REQ-2-010, REQ-2-011, REQ-2-012]
  partial: []
---/ci---

Milestone v0.2 (ai-tutor-architecture) merged to main.

Escalation record (audit remediation, durable): P1 executor
delegation failed twice (empty subagent results, zero files
created); auto-resolved at full autonomy to inline execution with
identical plan fidelity (commit 3271373, reflog-only after phase
branch squash-delete).
2026-09-11 17:34:50 +00:00

169 lines
5.3 KiB
Markdown

# Nextcraft — PERSONAS.md
## Persona Roster
### lead-developer
```yaml
active: true
phase_specific: false
reason: Coordinates task decomposition across web, AI service, and data territories; resolves conflicts between frontend, backend, and AI personas
domain: coordination
frameworks:
- next.js
- turborepo
- pnpm
- fastapi
constraints:
- pragmatic
- battle-tested defaults
- monorepo-architecture
territory:
- "**/package.json"
- "**/turbo.json"
- "**/pnpm-workspace.yaml"
- "**/tsconfig.json"
- "apps/ai-service/pyproject.toml"
```
### frontend-engineer
```yaml
active: true
phase_specific: false
reason: Phase 6 learner-surface integration — useChatStream hook, agent switcher, streaming/error/loading states, Lab/Assessor/Proctor output panels. Owns all page components, layouts, and surface-specific UI.
domain: frontend
frameworks:
- react
- next.js
- tailwindcss
- lucide-react
- recharts
- react-flow
constraints:
- component-first
- server-components-default
- minimal-client-js
- sse-client-buffering (buffer bytes, split frames on \n\n, join data: lines)
- abortcontroller-cleanup (idempotent abort in effect cleanup)
- responsive-all-breakpoints
- dark-mode-support
territory:
- "apps/web/**"
- "packages/ui/**"
- "packages/mock-data/**"
- "packages/types/**"
```
### data-engineer
```yaml
active: true
phase_specific: false
reason: Owns TS mock data layer schema and typed definitions. Does NOT own the Python corpus (that is ai-engineer territory) — the two are aligned by documented convention (D-021).
domain: data
frameworks:
- typescript
constraints:
- schema-first
- type-safe
- migration-ready
- mock-data-only
territory:
- "packages/types/**"
- "packages/mock-data/**"
```
### backend-engineer
```yaml
active: true
phase_specific: false
reason: Reactivated for v0.2 — owns apps/ai-service infrastructure: FastAPI app, settings, SSE plumbing, endpoints, monorepo/turbo integration, test harness.
domain: backend
frameworks:
- fastapi
- uvicorn
- pydantic
- httpx
- pytest
constraints:
- provider-agnostic-boundaries (llm/ imports nothing from agents/ or api/)
- streaming-first
- no-database-v0.2
- secrets-via-env-only
- mock-provider-in-tests
territory:
- "apps/ai-service/ai_service/main.py"
- "apps/ai-service/ai_service/config.py"
- "apps/ai-service/ai_service/api/**"
- "apps/ai-service/scripts/**"
- "apps/ai-service/package.json"
- "apps/ai-service/tests/api/**"
- "turbo.json"
```
### ai-engineer
```yaml
active: true
phase_specific: false
reason: Custom persona for v0.2 — owns the LLM provider layer, agent framework, prompt library, structured outputs, and mock corpora for the six tutor agents.
domain: ai
frameworks:
- pydantic
- httpx
- pytest
constraints:
- provider-agnostic-protocol
- prompts-are-code
- json-defensive-parsing
- never-call-cloud-in-tests
- delta-passthrough
territory:
- "apps/ai-service/ai_service/llm/**"
- "apps/ai-service/ai_service/agents/**"
- "apps/ai-service/ai_service/prompts/**"
- "apps/ai-service/ai_service/corpus/**"
- "apps/ai-service/tests/llm/**"
- "apps/ai-service/tests/agents/**"
```
### design-system-engineer
```yaml
active: true
phase_specific: false
reason: Owns the shared component library, design tokens, and visual consistency. Light duty in v0.2: Phase 6 may need new primitives (agent-switcher control, stream-status indicator, error toast variant).
domain: frontend
frameworks:
- tailwindcss
- storybook
- lucide-react
constraints:
- design-token-driven
- wcag-aa-contrast
- dark-mode-required
- consistent-across-surfaces
territory:
- "packages/ui/**"
```
### security-auditor
```yaml
active: false
phase_specific: false
reason: No auth in v0.2 (A-008); CORS is localhost-only; no real user data. Security review handled by verifier's STRIDE analysis layer plus a Phase 7 checklist item: secrets hygiene (key absent from code/logs/commits/errors), localhost-only CORS, no PII in prompts.
domain: security
frameworks: []
constraints: []
territory: []
```
## Phase-Specific Personas
None for v0.2. All active personas span the entire milestone. data-engineer and design-system-engineer are light-touch after Phase 1.
## Territory Conflict Resolution
| Conflict | Resolution |
|----------|------------|
| frontend-engineer vs data-engineer (packages/types, packages/mock-data) | data-engineer owns type definitions and mock data schema; frontend-engineer consumes them. If changes needed, data-engineer updates types first. |
| frontend-engineer vs design-system-engineer (packages/ui) | design-system-engineer owns design tokens and primitive components; frontend-engineer owns composite components and page-level UI. |
| ai-engineer vs data-engineer (mock data duplication) | ai-engineer owns `ai_service/corpus/` (Python); data-engineer owns `packages/mock-data` (TS). Shared entity IDs and shapes kept aligned by documented convention (D-021): cross-referencing file headers, identical `comp-*` ID strings. |
| backend-engineer vs ai-engineer (apps/ai-service) | backend-engineer owns app shell, config, API endpoints, scripts, and test harness; ai-engineer owns llm/, agents/, prompts/, corpus/. Boundary: `ai_service/api/` (backend) composes `ai_service/agents/` (AI) via DI — agents never import api/. |
| lead-developer vs any | lead-developer coordinates only, does not directly modify code files. |