- Added new updates for Phase A and Phase B in `CLAUDE.md`, detailing the completion of Phase A and the introduction of enriched session metrics in the API response for `GET /api/activity`. - Enhanced the README to include references to new documentation files for scalar canon and composite metrics implementation. - Updated `ACTIVITY_PRODUCTION_ARCHITECTURE_AND_PHASES.md` to reflect the current status of phases and added navigation rules for data access. - Improved `ACTIVITY_SESSION_METRICS_EAV_AGENT_GUIDE.md` with links to new implementation concepts for composite metrics. - Refactored the activity router to integrate enriched session metrics into the activity list responses, ensuring a more comprehensive data presentation.
4.9 KiB
Aktivität: Skalar-Kanon (eine Semantik → eine Quelle)
Stand: 2026-04-16
Normativer Code: backend/data_layer/activity_data_canon.py
Kontext: ACTIVITY_PRODUCTION_ARCHITECTURE_AND_PHASES.md (Phase A abgeschlossen)
1. Spine & Identität (activity_log, nicht EAV)
Diese Felder sind keine training_parameters-Skalare. Sie gehören zur Session-Zeile.
| Semantik | DB / API | Kanonische Quelle | Lesefallback | Sync Spalte↔EAV |
|---|---|---|---|---|
| Primärschlüssel | activity_log.id |
activity_log |
— | — |
| Profil | profile_id |
activity_log |
— | — |
| Kalendertag | date |
activity_log |
— | — |
| Start / Ende (Zeit) | start_time, end_time, started_at, ended_at |
activity_log |
— | — |
| Trainingsart (Freitext/Legacy) | activity_type |
activity_log |
— | — |
| Referenz Trainingstyp | training_type_id, training_category, … |
activity_log (+ training_types) |
— | — |
| Notiz | notes |
activity_log |
— | — |
| Quelle / Import | source, created, … |
activity_log |
— | — |
| Session-Auswertung | evaluation, quality_label, overall_score, … |
activity_log (Blob/Ergebnis) |
— | Kein EAV-Raster |
2. Kernfelder CSV-Modul activity (= „heiße“ Skalare)
Abgeleitet aus csv_parser.module_registry.MODULE_DEFINITIONS["activity"].fields — maschinenlesbar über ACTIVITY_MODULE_REGISTRY_FIELD_KEYS in activity_data_canon.py.
| Semantik | Key (Registry/API) | Kanonische Quelle | Lesefallback | Bemerkung |
|---|---|---|---|---|
| Dauer | duration_min |
activity_log |
— | Aggregates, Listen |
| Aktive Energie | kcal_active |
activity_log |
— | |
| Ruhe-Energie | kcal_resting |
activity_log |
— | |
| Distanz | distance_km |
activity_log |
— | |
| Ø HF | hr_avg (Parameter oft avg_hr in EAV-Schema) |
activity_log |
EAV nur wenn source_field / Profil-Schema |
merge_column_backed_and_eav_metrics: Spalte schlägt EAV |
| Max-HF | hr_max |
activity_log |
analog | |
| RPE | rpe |
activity_log |
analog |
Schreibpfad: Universal-CSV und API sollen diese Keys auf activity_log mappen, sofern nicht ausdrücklich ein EAV-primärer Parameter (§3) gewählt ist.
3. EAV-primäre Parameter (erweiterte Skalare)
ACTIVITY_EAV_PRIMARY_PARAMETER_KEYS in activity_data_canon.py. training_parameters.source_field = NULL (nach Kanon / Migration 057): kanonischer Speicher ist activity_session_metrics.
Parameter-Key (training_parameters.key) |
Legacy-Spalte activity_log (nur Lesefallback) |
Kanonische Quelle | Lesefallback |
|---|---|---|---|
min_hr |
hr_min |
EAV | Spalte, wenn EAV leer |
pace_min_per_km |
pace_min_per_km |
EAV | Spalte, wenn EAV leer |
cadence |
cadence |
EAV | Spalte, wenn EAV leer |
avg_power |
avg_power |
EAV | Spalte, wenn EAV leer |
elevation_gain |
elevation_gain |
EAV | Spalte, wenn EAV leer |
temperature_celsius |
temperature_celsius |
EAV | Spalte, wenn EAV leer |
humidity_percent |
humidity_percent |
EAV | Spalte, wenn EAV leer |
avg_hr_percent |
avg_hr_percent |
EAV | Spalte, wenn EAV leer |
kcal_per_km |
kcal_per_km |
EAV | Spalte, wenn EAV leer |
Merge-Implementierung: merge_column_backed_and_eav_metrics in activity_session_metrics.py.
4. Profil-/Typ-dynamische Skalare (EAV, nicht in Registry-Kernliste)
| Semantik | Kanonische Quelle | Lesefallback |
|---|---|---|
| Admin-definierte Parameter (Attributprofil Kategorie/Typ) | activity_session_metrics + training_parameters |
— |
Parameter mit source_field → Spalte |
activity_log (Spalte) |
EAV ergänzend; Leseregel: Spalte bevorzugt (kein veraltetes EAV) |
5. Composites (Zielbild, noch nicht Kanon-Zeile pro Slot)
| Semantik | Kanonische Quelle (Ziel) |
|---|---|
| Strukturierte Composite-Dokumente (z. B. Zonen/Bänder) | EAV ein Dokument pro Parameter/Session (siehe ACTIVITY_COMPOSITE_METRICS_IMPLEMENTATION_CONCEPT.md) |
Kein dauerhaftes Spiegeln derselben Semantik in activity_log-Spalten.
6. Sync & Übergang
- Kein automatischer Dauer-Sync „Spalte → EAV“ für dieselbe Semantik; Lesepfad vereinheitlicht die Sicht (
merge_column_backed_and_eav_metrics). - Optionale Backfill-Migration/Skript (idempotent) nur nach fachlicher Freigabe — siehe EAV-Agent-Guide §6.
7. Referenzen
ACTIVITY_PRODUCTION_ARCHITECTURE_AND_PHASES.md— Phasen A–FACTIVITY_SESSION_METRICS_EAV_AGENT_GUIDE.md— APIs, Testsactivity_data_canon.py—ACTIVITY_LOG_PATCHABLE_COLUMNS, Legacy-Map