| name | persona-detection |
| description | Intelligent project persona identification using priority chain detection with LLM and heuristic fallback |
| tier | core |
| applyTo | **/*persona*,**/*detection*,**/*project-type* |
Persona Detection Skill
Inheritance: heir:vscode
Purpose
Detect the most appropriate user persona for a workspace to personalize the Alex experience — sidebar branding, skill suggestions, and working memory P5-P7 configuration.
Priority Chain (Highest to Lowest)
| Priority | Source | Signal | Confidence |
|---|
| 1 | Focus | Active Pomodoro session topic | 0.95 |
| 2 | Goal | Stated session objective from goals.json | 0.85 |
| 3 | Phase | Current ROADMAP phase keywords | 0.75 |
| 4 | Project Goals | Learning goals from user-profile.json | 0.70 |
| 5 | Copilot Instructions | Persona: field in copilot-instructions.md Active Context | 0.85 |
| 6 | Profile Cache | Saved projectPersona (< 7 days old) | cached |
| 7 | Profile + Workspace | Tech stack, expertise, file structure scoring | variable |
| 8 | Default | Developer fallback | 0.50 |
Detection stops at the first confident match. Lower priorities only run if higher ones return null.
Available Personas (as of v5.7.1)
developer, academic, researcher, technical-writer, architect, data-engineer, devops, content-creator, fiction-writer, game-developer, project-manager, security, student, job-seeker, presenter, power-user
Workspace Scoring (Priority 6 Heuristics)
Three pattern types with distinct matching logic:
| Pattern Type | Example | Match Method |
|---|
Path (contains /) | src/, .github/workflows/ | fs.pathExists() — directory must actually exist |
Extension (starts with .) | .tex, .fountain | endsWith() on workspace entries |
| Filename | Dockerfile, package.json | Exact case-insensitive Set lookup |
Critical rule: Never use bidirectional substring matching for workspace patterns. It causes false positives (e.g., .github/workflows/ matching any .github/ entry).
LLM Detection Path
When detectAndUpdateProjectPersona() is called (initialize/upgrade):
- Detect technologies from file structure
- Gather project context (directory tree, README, package.json, copilot-instructions.md)
- Send structured prompt to LLM (prefers GPT-4o > Claude Sonnet > any)
- Parse JSON response → match to existing persona or create dynamic one
- Save to
user-profile.json as projectPersona
- Update Active Context persona field via
updatePersona()
Active Context Integration
Persona detection updates the Active Context section in copilot-instructions.md:
## Active Context
Persona: Developer (90% confidence)
Objective: v5.7.1 — Avatar UI Enhanced + Architecture Validation Complete
Focus Trifectas: release-management, quality-assurance, documentation-quality-assurance
Principles: KISS, DRY, Quality-First
Last Assessed: 2026-02-15 — v5.7.1
What gets updated:
- Persona: Name + confidence (e.g., "Developer (90% confidence)")
- Focus Trifectas: NOT auto-assigned during persona detection — managed independently via
updateFocusTrifectas()
Why separate?
- Persona = WHO the user is (developer, writer, researcher)
- Focus Trifectas = WHAT I'm working on NOW (3 skills for current task)
- Focus changes frequently (per-session), persona changes rarely (per-project)
The welcome view displays the persona with confidence % and detection source (profile vs. project detection).
Adding New Personas
- Add to
PERSONAS array in personaDetection.ts with: id, name, bannerNoun, hook, skill, icon, accentColor, keywords, techStack, projectPatterns
- Add persona ID to the LLM prompt's
personaId enum
- Add skill to
skillNameMap in welcomeView.ts
- Ensure matching skill exists in
.github/skills/
Note: Focus Trifectas are NOT defined per-persona. They're managed independently based on current work context.
Known Pitfalls
| Issue | Root Cause | Fix |
|---|
| Every Alex project shows DevOps | .github/ matched via substring | Use fs.pathExists() for path patterns (v5.7.1) |
.github/ triggers power-user | Noise signal in every project | Removed from power-user patterns (v5.7.1) |
| Wrong persona cached | projectPersona in user-profile.json stale | 7-day expiry + re-detect on upgrade |