- Introduced "Pension Scheme & Benefits" detailing secondary employment benefits and pension specifics. - Created "Roles & Accountabilities" outlining the Holacracy role structure and responsibilities within Respellion. - Added "Security" section covering GDPR compliance and workplace safety protocols. - Established "Spending and Contracting" policy detailing expense categories and submission processes. - Documented "Who We Are" to define Respellion's identity, services, and operational model under Holacracy and ISO 9001.
5.6 KiB
5.6 KiB
Handover: Respellion Learning Platform
Purpose of this document
This document captures the design decisions as actually built. The platform diverged substantially from its original design vision (a Next.js multi-service system with Qdrant and OpenAI embeddings). This handover reflects what shipped: a React/Vite SPA on PocketBase with local TF-IDF retrieval.
When sources conflict, trust the code in src/ first, then this document, then
docs/data-model.md (schema), then docs/architecture.md.
What this application does
Employees use the platform to build and maintain knowledge of the company's internal handbook, roles, and processes.
Core mechanics:
- Admins upload source documents → Claude extracts a structured knowledge graph (topics + relations)
- AI generates learning content and micro-learnings per topic
- Each employee follows a 26-week curriculum, starting whenever they enroll
- Each week presents an assigned topic; the employee completes micro-learnings and a test
- After week 26 the cycle restarts at week 1 with the same content
- R42, an AI assistant, answers KB-grounded questions on every screen
- A gamification layer (points, badges, leaderboard) motivates completion
Key decisions as built
Architecture
- Single-page React app, not microservices. All logic runs in the browser
(
src/). PocketBase is the only backend; the Anthropic API is reached through a reverse proxy (Caddy in prod, Vite in dev). The originalapp/Next.js scaffold was abandoned and is not deployed. - PocketBase for everything stateful — auth, structured data, file storage. SQLite is sufficient at this scale.
- No vector database. Retrieval is a dependency-free TF-IDF index over the
knowledge graph (
src/lib/retrieval.js). Qdrant and the embedding service from the original design were never built.
Knowledge base
- Extracted, not hand-authored. Admins upload
.txt/.md(≤5 MB). Claude (standard tier) extracts topics and relations chunk by chunk. - Flat graph, not a Theme→Topic tree. The KB is
topics+relations. A topic'sthemeis a string used for curriculum grouping, not a separate entity. - Relation types:
related_to,depends_on,part_of,executed_by. - Topic relevance (
core/standard/peripheral/exclude) controls what enters learning/curriculum;relevance_lockedprotects admin overrides on re-ingestion.
Learning content
- Long-form content is generated on demand, three types:
article,slides,infographic(thecontentcollection). New types shallow-merge into the cached object. No podcast type. - Micro-learnings, three types:
concept_explainer,scenario_quiz,flashcard_set(themicro_learningscollection). A formerreflection_prompttype was dropped. - Employee chooses the format per topic per session. Completion is not quality-gated; engaging with the full micro-learning counts.
Curriculum
- AI generates, admin confirms. Claude proposes a 26-week schedule from the
themed/weighted topic set; the admin previews and activates it. Versions move
draft → active → superseded; exactly one is active. - Per-user, self-paced start (current behavior). Each employee enrolls on first
login; their week/cycle is derived from
curriculum_started_at. There is no shared calendar week. Week 1 is the first 7 days after they enroll. - Perpetual, repeating cycles. After week 26, the cycle restarts at week 1 with
the same content. Completion history (
micro_learning_completions) is append-only. - Hash fallback. If no curriculum version is active, topic assignment falls back to a deterministic hash of user id + week. Keep this fallback.
R42 chatbot
- KB-grounded via TF-IDF, not vector search. Context = top-K topics + verbatim mentions + filtered relations + limited deep content.
- Conversation persists per user in
localStorage(cap 50 messages; ~12 turns sent to the API). It is not stored server-side. - Can propose graph edits (
propose_graph_delta, ≤3 topics / ≤5 relations). Admins apply immediately; non-admins queue a suggestion for admin approval. - Hidden during quizzes to protect test integrity.
Gamification
- Points: +2 per correct quiz answer, in the
leaderboardcollection. - Badges computed at render time: First Steps (1 test), Veteran (5 tests), Perfectionist (a 100% score).
- Admins are excluded from the public leaderboard.
Auth & infrastructure
- PIN auth against
team_members; the session id lives insessionStorage. Roleadminunlocks the Admin panel. - Claude model tiers:
fast= Haiku 4.5,standard= Sonnet 4.6,reasoning= Opus 4.7. Admins can override per tier from Settings. - Simulation mode (
admin:use_simulation) returns stub LLM output for UI work. - Deploy: Docker image (Caddy serving the built SPA) + PocketBase container;
Ansible playbooks under
infra/for dev and prod.
Notable divergences from the original vision
| Original design (not built) | What shipped |
|---|---|
| Next.js 14 PWA + 6 Fastify services | Single React/Vite SPA, no backend services |
| Qdrant + OpenAI embeddings | Local TF-IDF, no embeddings |
| Theme/Topic entity hierarchy, batch approval | Flat topics + relations graph |
| 10 micro-learning types | 3 micro-learning types |
employee_curriculum_state, badges, milestone_cards, etc. |
team_members fields + leaderboard + render-time badges |
| Shared calendar-week curriculum | Per-user start, self-paced |
The abandoned scaffolding for the original design still exists under /app — it is
not part of the running system.