# Event Taxonomy Events use dot-separated past-tense names and versioned payload schemas. Every tenant event includes organization context set by the server, actor context where relevant, occurred time, correlation ID, and causation ID. ## Authoring - `course.draft_created` - `course.version_published` - `taxonomy.mapping_created` - `taxonomy.mapping_confirmed` ## Learning - `course.opened` - `course.completed` - `lesson.started` - `lesson.progressed` - `lesson.completed` - `block.viewed`, `block.interacted`, and `block.completed` - `video.started`, `video.progressed` (25/50/75 milestone), and `video.completed` - `video.replayed`, `video.skipped`, and `video.exited` - `assessment.started` and `assessment.completed` - `question.answered` - `comment.created`, `bookmark.created`, and `note.created` The ingestion allow-list is `EventTaxonomy::learning()` and its current schema version is `1`. The server owns organization and learner identity. Clients may supply only a stable event UUID, assignment/content identifiers, occurred time, optional session/correlation/causation identifiers, a bounded payload, and allow-listed device context (`platform`, `formFactor`, `online`, `appVersion`). Video telemetry reports media position/duration and discrete milestones; it never sends a derived learner score. ## Intelligence - `assessment.evidence_created` - `skill.evidence_recorded` - `capability.recalculation_requested` - `capability.score_updated` - `capability.snapshot_created` - `coverage.metric_updated` - `skill_gap.detected` Raw events carry stable IDs, not copied taxonomy trees, and are immutable after ingestion. Consumers claim an event using `(learning_event_id, processor, processor_version)`, so retries and late/offline delivery cannot duplicate projections. Derived daily metrics, risks, insights, and attention records stay in separate tables and can be rebuilt from raw events.