Files
Curio/docs/theme-map-plan.md
arnaudne 5bf6013460 feat: full feature buildout — streaming, i18n, mastery map, admin, jobs
Progressive lesson streaming via onSegment callback (fixes SSE for non-English
users — locale was shadowed in lesson-reader useEffect). Adds: BullMQ workers,
Redis stream buffer, token budget enforcement, Langfuse tracing, golden-eval
runner, Playwright e2e scaffolding, lesson depth/locale/preferences schema,
mastery map UI, admin panel (blueprints/users/reports/quality/misconceptions),
image queries, source citations, view transitions, reading animations, i18n
(next-intl), PDF export, surprise endpoint, and 402 passing unit tests.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-08 22:08:14 +02:00

71 lines
3.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Theme Map — Implementation Plan
## Goal
A visual theme map that lets users discover and start lessons by topic domain. Entry flow B: clicking a theme pre-fills the home intent input, keeping the intent-driven flow intact.
## Fixed taxonomy (12 themes, stable slugs)
| Slug | Label (FR) | Label (EN) | Emoji |
|---|---|---|---|
| `sciences-naturelles` | Sciences naturelles | Natural sciences | 🔬 |
| `mathematiques` | Mathématiques | Mathematics | ∑ |
| `histoire` | Histoire | History | 📜 |
| `geographie` | Géographie | Geography | 🌍 |
| `langues-litterature` | Langues & littérature | Languages & literature | 📖 |
| `arts-culture` | Arts & culture | Arts & culture | 🎨 |
| `technologie-informatique` | Technologie | Technology | 💻 |
| `philosophie-ethique` | Philosophie & éthique | Philosophy & ethics | 💭 |
| `economie-societe` | Économie & société | Economics & society | 📊 |
| `sante-medecine` | Santé & médecine | Health & medicine | 🏥 |
| `sport-activite` | Sport & activité | Sport & activity | ⚡ |
| `autre` | Autre | Other | ✦ |
## Phases
### Phase 1 — Data model
- `theme` table: `id (uuid pk), slug (unique), label_en, label_fr, emoji`
- `blueprint_theme` join: `blueprint_id → blueprint, theme_id → theme` (composite pk)
- Seed `theme` rows in migration (fixed taxonomy, never regenerated)
- Add `themes: string[]` to `BlueprintContentSchema` Zod schema
- Bump `GENERATE_BLUEPRINT` to v3 — instruct LLM to pick 13 slugs from taxonomy
- Update `generate-blueprint.ts` — after blueprint insert, upsert `blueprint_theme` rows
### Phase 2 — Static cluster view (`/map`)
- New page `/map` — grid of theme cards
- Each card: emoji + label + count of user's blueprints in theme
- Click card → `/?theme=<slug>` (home page with pre-filled context)
- No graph lib needed — pure CSS
### Phase 3 — Home page theme pre-fill
- Read `useSearchParams().get('theme')` on home page
- If present: pre-fill the intent input placeholder and initial value with a localised prompt
e.g. `?theme=sciences-naturelles` → input shows "En savoir plus sur les sciences naturelles…"
- Clear the param after submission
### Phase 4 — Graph view
- Toggle on `/map`: list view ↔ graph view
- SVG-based radial layout — 12 theme nodes arranged in a circle, no physics
- Blueprint sub-nodes orbit each theme (smaller dots)
- Node color = mastery aggregate for that theme (green / amber / grey)
- Click node → `/?theme=<slug>`
- Pure SVG + CSS transitions, no animation library
## Adjacency (hardcoded, for SVG edges)
Related themes share an edge in the graph:
- sciences-naturelles ↔ mathematiques, geographie, sante-medecine, technologie-informatique
- mathematiques ↔ technologie-informatique, economie-societe
- histoire ↔ geographie, philosophie-ethique, arts-culture, langues-litterature
- geographie ↔ economie-societe, sport-activite
- langues-litterature ↔ arts-culture, philosophie-ethique
- arts-culture ↔ philosophie-ethique
- technologie-informatique ↔ economie-societe
- philosophie-ethique ↔ economie-societe
- sante-medecine ↔ sport-activite
## Invariants respected
- No new LLM provider — theme assignment uses same generator model via client.ts
- Theme prompt is versioned in the registry
- Blueprint generation stays synchronous (themes saved in same transaction)
- No animation library — SVG + CSS transitions only
- Mobile responsive — graph falls back to list on small screens