mitai-jinkendo/docs/GOALS_SYSTEM_UNIFIED_ANALYSIS.md
Lars 337667fc07
All checks were successful
Deploy Development / deploy (push) Successful in 51s
Build Test / lint-backend (push) Successful in 0s
Build Test / build-frontend (push) Successful in 14s
feat: Phase 0a - Minimal Goal System (Strategic + Tactical)
- Strategic Layer: Goal modes (weight_loss, strength, endurance, recomposition, health)
- Tactical Layer: Concrete goal targets with progress tracking
- Training phases (manual + auto-detection framework)
- Fitness tests (standardized performance tracking)

Backend:
- Migration 022: goal_mode in profiles, goals, training_phases, fitness_tests tables
- New router: routers/goals.py with full CRUD for goals, phases, tests
- API endpoints: /api/goals/* (mode, list, create, update, delete)

Frontend:
- GoalsPage: Goal mode selector + goal management UI
- Dashboard: Goals preview card with link
- API integration: goal mode, CRUD operations, progress calculation

Basis for 120+ placeholders and goal-aware analyses (Phase 0b)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-26 16:20:35 +01:00

17 KiB

Zielesystem: Vereinheitlichte Analyse beider Fachkonzepte

Datum: 26. März 2026 Basis:

  • .claude/docs/functional/GOALS_VITALS.md (v9e Spec)
  • .claude/docs/functional/mitai_jinkendo_konzept_diagramme_auswertungen_v2.md

1. Wichtige Erkenntnis: BEIDE Konzepte sind komplementär!

GOALS_VITALS.md definiert:

  • Konkrete Zielwerte (z.B. "82kg bis 30.06.2026")
  • 8 Zieltypen (Gewicht, KF%, VO2Max, etc.)
  • Primär-/Nebenziel-Konzept
  • Trainingsphasen (automatische Erkennung)
  • Aktive Tests (Cooper, Liegestütze, etc.)
  • 13 neue KI-Platzhalter

Konzept v2 definiert:

  • Goal Modes (strategische Ausrichtung: weight_loss, strength, etc.)
  • Score-Gewichtung je Goal Mode
  • Chart-Priorisierung je Goal Mode
  • Regelbasierte Interpretationen

Zusammenspiel:

Goal MODE (v2)      →  "weight_loss" (strategische Ausrichtung)
  ↓
Primary GOAL (v9e)  →  "82kg bis 30.06.2026" (konkretes Ziel)
Secondary GOAL      →  "16% Körperfett"
  ↓
Training PHASE (v9e) →  "Kaloriendefizit" (automatisch erkannt)
  ↓
Score Weights (v2)  →  body_progress: 0.30, nutrition: 0.25, ...
  ↓
Charts (v2)         →  Zeigen gewichtete Scores + Fortschritt zu Zielen

2. Zwei-Ebenen-Architektur

Ebene 1: STRATEGIC (Goal Modes aus v2)

Was: Grundsätzliche Trainingsausrichtung Werte: weight_loss, strength, endurance, recomposition, health Zweck: Bestimmt Score-Gewichtung und Interpretations-Kontext Beispiel: "Ich will Kraft aufbauen" → mode: strength

Ebene 2: TACTICAL (Goal Targets aus v9e)

Was: Konkrete messbare Ziele Werte: "82kg bis 30.06.2026", "VO2Max 55 ml/kg/min", "50 Liegestütze" Zweck: Fortschritts-Tracking, Prognosen, Motivation Beispiel: "Ich will 82kg wiegen" → target: Gewichtsziel

Beide zusammen = Vollständiges Zielesystem


3. Überarbeitetes Datenmodell

Tabelle: profiles (erweitern)

-- Strategic Goal Mode (aus v2)
ALTER TABLE profiles ADD COLUMN goal_mode VARCHAR(50) DEFAULT 'health';

COMMENT ON COLUMN profiles.goal_mode IS
  'Strategic goal mode: weight_loss, strength, endurance, recomposition, health.
   Determines score weights and interpretation context.';

Tabelle: goals (NEU, aus v9e)

CREATE TABLE goals (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  profile_id UUID NOT NULL REFERENCES profiles(id) ON DELETE CASCADE,

  -- Goal Classification
  goal_type VARCHAR(50) NOT NULL,  -- weight, body_fat, lean_mass, vo2max, strength, flexibility, bp, rhr
  is_primary BOOLEAN DEFAULT false,
  status VARCHAR(20) DEFAULT 'active',  -- draft, active, reached, abandoned, expired

  -- Target Values
  target_value DECIMAL(10,2),
  current_value DECIMAL(10,2),
  start_value DECIMAL(10,2),
  unit VARCHAR(20),  -- kg, %, ml/kg/min, bpm, mmHg, cm, reps

  -- Timeline
  start_date DATE DEFAULT CURRENT_DATE,
  target_date DATE,
  reached_date DATE,

  -- Metadata
  name VARCHAR(100),  -- z.B. "Sommerfigur 2026"
  description TEXT,

  -- Progress Tracking
  progress_pct DECIMAL(5,2),  -- Auto-calculated: (current - start) / (target - start) * 100

  -- Timestamps
  created_at TIMESTAMP DEFAULT NOW(),
  updated_at TIMESTAMP DEFAULT NOW(),

  -- Constraints
  CHECK (progress_pct >= 0 AND progress_pct <= 100),
  CHECK (status IN ('draft', 'active', 'reached', 'abandoned', 'expired'))
);

-- Only one primary goal per profile
CREATE UNIQUE INDEX idx_goals_primary ON goals(profile_id, is_primary) WHERE is_primary = true;

-- Index for active goals lookup
CREATE INDEX idx_goals_active ON goals(profile_id, status) WHERE status = 'active';

Tabelle: training_phases (NEU, aus v9e)

CREATE TABLE training_phases (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  profile_id UUID NOT NULL REFERENCES profiles(id) ON DELETE CASCADE,

  -- Phase Type
  phase_type VARCHAR(50) NOT NULL,
  -- Werte: calorie_deficit, calorie_maintenance, calorie_surplus,
  --        conditioning, hiit, max_strength, regeneration, competition_prep

  -- Detection
  detected_automatically BOOLEAN DEFAULT false,
  confidence_score DECIMAL(3,2),  -- 0.00-1.00

  -- Status
  status VARCHAR(20) DEFAULT 'suggested',  -- suggested, confirmed, active, ended

  -- Timeline
  start_date DATE,
  end_date DATE,

  -- Metadata
  detection_reason TEXT,  -- Why was this phase detected?
  user_notes TEXT,

  -- Timestamps
  created_at TIMESTAMP DEFAULT NOW(),
  updated_at TIMESTAMP DEFAULT NOW()
);

-- Only one active phase per profile
CREATE UNIQUE INDEX idx_phases_active ON training_phases(profile_id, status) WHERE status = 'active';

Tabelle: fitness_tests (NEU, aus v9e)

CREATE TABLE fitness_tests (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  profile_id UUID NOT NULL REFERENCES profiles(id) ON DELETE CASCADE,

  -- Test Type
  test_type VARCHAR(50) NOT NULL,
  -- Standard: cooper, step_test, pushups, squats, sit_reach, balance, grip_strength
  -- Custom: user_defined

  -- Result
  result_value DECIMAL(10,2) NOT NULL,
  result_unit VARCHAR(20) NOT NULL,  -- meters, bpm, reps, cm, seconds, kg

  -- Test Date
  test_date DATE NOT NULL,

  -- Evaluation
  norm_category VARCHAR(30),  -- very_good, good, average, needs_improvement
  percentile DECIMAL(5,2),  -- Where user ranks vs. norm (0-100)

  -- Trend
  improvement_vs_last DECIMAL(10,2),  -- % change from previous test

  -- Metadata
  notes TEXT,
  conditions TEXT,  -- e.g., "Nach 3h Schlaf, erkältet"

  -- Next Test Recommendation
  recommended_retest_date DATE,

  created_at TIMESTAMP DEFAULT NOW()
);

CREATE INDEX idx_fitness_tests_profile_type ON fitness_tests(profile_id, test_type, test_date DESC);

4. Vereinheitlichte API-Struktur

Goal Modes (Strategic)

# routers/goals.py

@router.get("/modes")
def get_goal_modes():
    """Get all strategic goal modes with score weights."""
    return GOAL_MODES  # From v2 concept

@router.post("/set-mode")
def set_goal_mode(goal_mode: str, session=Depends(require_auth)):
    """Set user's strategic goal mode."""
    # Updates profiles.goal_mode

Goal Targets (Tactical)

@router.get("/targets")
def get_goal_targets(session=Depends(require_auth)):
    """Get all active goal targets."""
    profile_id = session['profile_id']
    # Returns list from goals table
    # Includes: primary + all secondary goals

@router.post("/targets")
def create_goal_target(goal: GoalCreate, session=Depends(require_auth)):
    """Create a new goal target."""
    # Inserts into goals table
    # Auto-calculates progress_pct

@router.get("/targets/{goal_id}")
def get_goal_detail(goal_id: str, session=Depends(require_auth)):
    """Get detailed goal info with history."""
    # Returns goal + progress history + prognosis

@router.put("/targets/{goal_id}/progress")
def update_goal_progress(goal_id: str, session=Depends(require_auth)):
    """Recalculate goal progress."""
    # Auto-called after new measurements
    # Updates current_value, progress_pct

@router.post("/targets/{goal_id}/reach")
def mark_goal_reached(goal_id: str, session=Depends(require_auth)):
    """Mark goal as reached."""
    # Sets status='reached', reached_date=today

Training Phases

@router.get("/phases/current")
def get_current_phase(session=Depends(require_auth)):
    """Get active training phase."""

@router.get("/phases/detect")
def detect_phase(session=Depends(require_auth)):
    """Run phase detection algorithm."""
    # Analyzes last 14 days
    # Returns suggested phase + confidence + reasoning

@router.post("/phases/confirm")
def confirm_phase(phase_id: str, session=Depends(require_auth)):
    """Confirm detected phase."""
    # Sets status='active'

Fitness Tests

@router.get("/tests/types")
def get_test_types():
    """Get all available fitness tests."""

@router.post("/tests/{test_type}/execute")
def record_test_result(
    test_type: str,
    result_value: float,
    result_unit: str,
    session=Depends(require_auth)
):
    """Record a fitness test result."""
    # Inserts into fitness_tests
    # Auto-calculates norm_category, percentile, improvement

@router.get("/tests/due")
def get_due_tests(session=Depends(require_auth)):
    """Get tests that are due for retesting."""

5. Neue KI-Platzhalter (kombiniert aus beiden Konzepten)

Strategic (aus v2)

{{goal_mode}}                       # "weight_loss"
{{goal_mode_label}}                 # "Gewichtsreduktion"
{{goal_mode_description}}           # "Fettabbau bei Erhalt der Magermasse"

Tactical - Primary Goal (aus v9e)

{{primary_goal_type}}               # "weight"
{{primary_goal_name}}               # "Sommerfigur 2026"
{{primary_goal_target}}             # "82 kg bis 30.06.2026"
{{primary_goal_current}}            # "85.2 kg"
{{primary_goal_start}}              # "86.1 kg"
{{primary_goal_progress_pct}}       # "72%"
{{primary_goal_progress_text}}      # "72% erreicht (4 kg von 5,5 kg)"
{{primary_goal_days_remaining}}     # "45 Tage"
{{primary_goal_prognosis}}          # "Ziel voraussichtlich in 6 Wochen erreicht (3 Wochen früher!)"
{{primary_goal_on_track}}           # "true"

Tactical - Secondary Goals (aus v9e)

{{secondary_goals_count}}           # "2"
{{secondary_goals_list}}            # "16% Körperfett, VO2Max 55 ml/kg/min"
{{secondary_goal_1_type}}           # "body_fat"
{{secondary_goal_1_progress}}       # "45%"

Training Phase (aus v9e)

{{current_phase}}                   # "calorie_deficit"
{{current_phase_label}}             # "Kaloriendefizit"
{{phase_since}}                     # "seit 14 Tagen"
{{phase_confidence}}                # "0.92"
{{phase_recommendation}}            # "Krafttraining erhalten, Cardio moderat, Proteinzufuhr 2g/kg"
{{phase_detected_automatically}}    # "true"

Fitness Tests (aus v9e)

{{test_last_cooper}}                # "2.800m (VO2Max ~52) vor 3 Wochen"
{{test_last_cooper_date}}           # "2026-03-05"
{{test_last_cooper_result}}         # "2800"
{{test_last_cooper_vo2max}}         # "52.3"
{{test_last_cooper_category}}       # "good"
{{test_due_list}}                   # "Sit & Reach (seit 5 Wochen), Liegestütze (seit 4 Wochen)"
{{test_next_recommended}}           # "Cooper-Test (in 2 Wochen fällig)"
{{fitness_score_overall}}           # "72/100"
{{fitness_score_endurance}}         # "good"
{{fitness_score_strength}}          # "average"
{{fitness_score_flexibility}}       # "needs_improvement"

GESAMT: 35+ neue Platzhalter aus v9e

Plus die 84 aus v2 = 120+ neue Platzhalter total


6. Überarbeitete Implementierungs-Roadmap

Phase 0a: Minimal Goal System (3-4h) JETZT

Strategic Layer:

  • DB: goal_mode in profiles
  • Backend: GOAL_MODES aus v2
  • API: GET/SET goal mode
  • UI: Goal Mode Selector (5 Modi)

Tactical Layer:

  • DB: goals table
  • API: CRUD für goal targets
  • UI: Goal Management Page (minimal)
    • Liste aktiver Ziele
    • Fortschrittsbalken
    • "+ Neues Ziel" Button

Aufwand: 3-4h (erweitert wegen Tactical Layer)


Phase 0b: Goal-Aware Placeholders (16-20h)

Strategic Placeholders:

{{goal_mode}}                       # Aus profiles.goal_mode
{{goal_mode_label}}                 # Aus GOAL_MODES mapping

Tactical Placeholders:

{{primary_goal_type}}               # Aus goals WHERE is_primary=true
{{primary_goal_target}}
{{primary_goal_progress_pct}}
{{primary_goal_prognosis}}          # Berechnet aus Trend

Score Calculations (goal-aware):

def get_body_progress_score(profile_id: str) -> str:
    profile = get_profile_data(profile_id)
    goal_mode = profile.get('goal_mode', 'health')

    # Get weights from v2 concept
    weights = GOAL_MODES[goal_mode]['score_weights']

    # Calculate sub-scores
    fm_score = calculate_fm_progress(profile_id)
    lbm_score = calculate_lbm_progress(profile_id)

    # Weight according to goal mode
    if goal_mode == 'weight_loss':
        total = 0.50 * fm_score + 0.30 * weight_score + 0.20 * lbm_score
    elif goal_mode == 'strength':
        total = 0.60 * lbm_score + 0.30 * fm_score + 0.10 * weight_score
    # ...

    return f"{int(total)}/100"

Phase 0c: Training Phases (4-6h) PARALLEL

DB:

  • training_phases table

Detection Algorithm:

def detect_current_phase(profile_id: str) -> dict:
    """Detects training phase from last 14 days of data."""

    # Analyze data
    kcal_balance = get_kcal_balance_14d(profile_id)
    training_dist = get_training_distribution_14d(profile_id)
    weight_trend = get_weight_trend_14d(profile_id)
    hrv_avg = get_hrv_avg_14d(profile_id)
    volume_change = get_volume_change_14d(profile_id)

    # Phase Detection Rules
    if kcal_balance < -300 and weight_trend < 0:
        return {
            'phase': 'calorie_deficit',
            'confidence': 0.85,
            'reason': f'Avg kcal balance {kcal_balance}/day, weight -0.5kg/week'
        }

    if training_dist['endurance'] > 60 and vo2max_trend > 0:
        return {
            'phase': 'conditioning',
            'confidence': 0.78,
            'reason': f'{training_dist["endurance"]}% cardio, VO2max improving'
        }

    if volume_change < -40 and hrv_avg < hrv_baseline * 0.85:
        return {
            'phase': 'regeneration',
            'confidence': 0.92,
            'reason': f'Volume -40%, HRV below baseline, recovery needed'
        }

    # Default
    return {
        'phase': 'maintenance',
        'confidence': 0.50,
        'reason': 'No clear pattern detected'
    }

API:

  • GET /phases/current
  • GET /phases/detect
  • POST /phases/confirm

UI:

  • Dashboard Badge: "📊 Phase: Kaloriendefizit"
  • Phase Detection Banner: "Wir haben erkannt: Kaloriendefizit-Phase. Stimmt das?"

Phase 0d: Fitness Tests (4-6h) SPÄTER

DB:

  • fitness_tests table

Test Definitions:

FITNESS_TESTS = {
    'cooper': {
        'name': 'Cooper-Test',
        'description': '12 Minuten laufen, maximale Distanz',
        'unit': 'meters',
        'interval_weeks': 6,
        'norm_tables': {  # Simplified
            'male_30-39': {'very_good': 2800, 'good': 2500, 'average': 2200},
            'female_30-39': {'very_good': 2500, 'good': 2200, 'average': 1900}
        },
        'calculate_vo2max': lambda distance: (distance - 504.9) / 44.73
    },
    'pushups': {
        'name': 'Liegestütze-Test',
        'description': 'Maximale Anzahl ohne Pause',
        'unit': 'reps',
        'interval_weeks': 4,
        'norm_tables': { ... }
    },
    # ... weitere Tests
}

UI:

  • Tests Page mit Testliste
  • Test Execution Flow (Anleitung → Eingabe → Auswertung)
  • Test History mit Trend-Chart

7. Priorisierte Reihenfolge

SOFORT (3-4h)

Phase 0a: Minimal Goal System (Strategic + Tactical)

  • Basis für alles andere
  • User kann Ziele setzen
  • Score-Berechnungen können goal_mode nutzen

DIESE WOCHE (16-20h)

Phase 0b: Goal-Aware Placeholders

  • 84 Platzhalter aus v2
  • 35+ Platzhalter aus v9e
  • TOTAL: 120+ Platzhalter

PARALLEL (4-6h)

Phase 0c: Training Phases

  • Automatische Erkennung
  • Phase-aware Recommendations

SPÄTER (4-6h)

Phase 0d: Fitness Tests

  • Enhancement, nicht kritisch für Charts

8. Kritische Erkenntnisse

1. GOALS_VITALS.md ist detaillierter

  • Konkrete Implementierungs-Specs
  • DB-Schema-Vorschläge
  • 13 definierte KI-Platzhalter
  • ABER: Fehlt Score-Gewichtung (das hat v2)

2. Konzept v2 ist strategischer

  • Goal Modes mit Score-Gewichtung
  • Chart-Interpretationen
  • Regelbasierte Logik
  • ABER: Fehlt konkrete Ziel-Tracking (das hat v9e)

3. Beide zusammen = Vollständig

  • v2 (Goal Modes) + v9e (Goal Targets) = Komplettes Zielesystem
  • v2 (Scores) + v9e (Tests) = Vollständiges Assessment
  • v2 (Charts) + v9e (Phases) = Kontext-aware Visualisierung

4. Meine ursprüngliche Analyse war incomplete

  • Ich hatte nur v2 betrachtet
  • v9e fügt kritische Details hinzu
  • Neue Gesamt-Schätzung: 120+ Platzhalter (statt 84)

9. Aktualisierte Empfehlung

JA zu Phase 0a (Minimal Goal System), ABER erweitert:

Was Phase 0a umfassen muss (3-4h):

  1. Strategic Layer (aus v2):

    • goal_mode in profiles
    • GOAL_MODES Definition
    • GET/SET endpoints
  2. Tactical Layer (aus v9e):

    • goals Tabelle
    • CRUD für Ziele
    • Fortschritts-Berechnung
  3. UI:

    • Goal Mode Selector (Settings)
    • Goal Management Page (Basic)
    • Dashboard Goal Widget

Was kann warten:

  • Training Phases → Phase 0c (parallel)
  • Fitness Tests → Phase 0d (später)
  • Vollständige Test-Integration → v9f

10. Nächste Schritte

JETZT:

  1. Phase 0a implementieren (3-4h)
    • Strategic + Tactical Goal System
  2. Dann Phase 0b (Goal-Aware Placeholders, 16-20h)
  3. Parallel Phase 0c (Training Phases, 4-6h)

Soll ich mit Phase 0a (erweitert) starten?

  • Beide Goal-Konzepte integriert
  • Ready für 120+ Platzhalter
  • Basis für intelligentes Coach-System

Commit: ae93b9d (muss aktualisiert werden) Neue Analyse: GOALS_SYSTEM_UNIFIED_ANALYSIS.md