- .gitignore: .claude/docs, rules, commands tracken; settings.local weiter ignorieren - DOCUMENTATION.md: verbindliche Ablage functional/technical/working/issues - .claude/README.md: Agent-Einstieg; GITEA_ISSUES_INDEX aus MCP (Stand 2026-04-08) - Arbeitspapiere von docs/ nach .claude/docs/working/ verschoben - docs/MEMBERSHIP_SYSTEM.md als Stub; kanonisch technical/MEMBERSHIP_SYSTEM.md - CLAUDE.md Pflichtlektüre und Links angepasst; docs/README.md vereinfacht Made-with: Cursor
29 KiB
Priorisierter Maßnahmenplan: Placeholder-Remediation
Audit-Datum: 29. März 2026 Basis: Gap-Cluster-Analyse, 111 Platzhalter Ziel: Normkonformität auf 60-70% steigern (aktuell 7%)
ROADMAP-ÜBERSICHT
| Phase | Fokus | Dauer | Aufwand | Ziel-Compliance |
|---|---|---|---|---|
| P0 | Blocking Issues | Week 1 | 11-17h | 25-30% |
| P1 | High Priority Gaps | Week 2-3 | 44-58h | 50-60% |
| P2 | Medium Priority | Week 4-5 | 8-12h | 65-70% |
| P3 | Nice-to-Have | Later | 0.5h | 70%+ |
| TOTAL | 4-6 Wochen | 63.5-87.5h | 70%+ |
P0: BLOCKING ISSUES (Week 1)
Ziel: Kritische Inkonsistenzen und Pflichtfelder beheben Aufwand: 11-17 Stunden Team: 1-2 Entwickler Dependencies: Keine - sofort startbar
P0.1: Code-Dokumentations-Konflikte (SOFORT)
Gap-Cluster: 11 Betroffene Platzhalter: 3 (weight_trend, activity_summary, activity_detail) Severity: 🔴 CRITICAL Aufwand: 1 Stunde
Maßnahmen:
-
weight_trend Fix
# PLACEHOLDER_CATALOG_EXTENDED.json { "key": "weight_trend", - "description": "Gewichtstrend (7d/30d)", + "description": "Gewichtstrend 28d (lineare Regression)", - "semantic_contract": "Gewichtstrend (7d/30d)", + "semantic_contract": "Lineare Regression über 28 Tage, Richtung + Delta in kg", - "time_window": "unknown", + "time_window": "28d", } -
activity_summary Fix
{ "key": "activity_summary", - "description": "Aktivitäts-Zusammenfassung (7d)", + "description": "Aktivitäts-Zusammenfassung 14d", - "semantic_contract": "Aktivitäts-Zusammenfassung (7d)", + "semantic_contract": "Aggregierte Aktivitäts-Metriken über 14 Tage", - "time_window": "unknown", + "time_window": "14d", } -
activity_detail Fix
{ "key": "activity_detail", - "description": "No description available", + "description": "Detaillierte Aktivitäts-Liste 14d (max 20 Einträge)", - "semantic_contract": "No description available", + "semantic_contract": "Sortierte Liste letzter 20 Aktivitäten aus 14-Tage-Fenster, DESC nach Datum", - "time_window": "unknown", + "time_window": "14d", }
Validation:
- Code-Review: Zeitfenster im Code bestätigen
- Prompt-Review: Alle 10+2+4 betroffenen Prompts/Pipelines prüfen
Owner: Backend Lead Blocker: Keine Output: 3 Fixed Platzhalter, Updated Catalog
P0.2: Zeitfenster Name-Pattern (AUTOMATISCH)
Gap-Cluster: 4.1 Betroffene Platzhalter: 15 (zeitraum_, sleep__7d, training_frequency_7d, etc.) Severity: 🔴 CRITICAL Aufwand: 1 Stunde (automatisches Skript)
Maßnahmen:
Skript: fix_time_window_from_name.py
import json
import re
# Regex-Pattern für Zeitfenster im Namen
patterns = {
r'_7d$|_7d_': '7d',
r'_14d$|_14d_': '14d',
r'_28d$|_28d_': '28d',
r'_30d$|_30d_': '30d',
r'_90d$|_90d_': '90d',
}
catalog = load_catalog()
fixes = []
for placeholder in catalog['placeholders'].values():
key = placeholder['key']
# Überspringe bereits definierte
if placeholder['time_window'] != 'unknown':
continue
# Pattern-Match
for pattern, window in patterns.items():
if re.search(pattern, key):
placeholder['time_window'] = window
fixes.append(f"{key}: unknown → {window}")
break
print(f"Fixed {len(fixes)} placeholders")
save_catalog(catalog)
Erwartete Fixes:
zeitraum_7d: unknown → 7dzeitraum_30d: unknown → 30dzeitraum_90d: unknown → 90dsleep_avg_duration_7d: unknown → 7dsleep_quality_7d: unknown → 7dtraining_frequency_7d: unknown → 7dproxy_internal_load_7d: unknown → 7denergy_balance_7d: unknown → 7dprotein_adequacy_28d: unknown → 28d- ... (insgesamt ~15)
Validation:
- Manuelle Review der Auto-Fixes
- Diff-Check vor Commit
Owner: DevOps / Automation Blocker: Keine Output: 15 Fixed Platzhalter
P0.3: Zeitfenster Code-Parameter (SEMI-AUTOMATISCH)
Gap-Cluster: 4.2 Betroffene Platzhalter: ~20 (activity_summary, sleep_avg_duration, rest_days_count, etc.) Severity: 🔴 CRITICAL Aufwand: 2-3 Stunden
Maßnahmen:
-
Code-Parameter-Extraktion
- Suche in
placeholder_resolver.pynachdays=XParametern - Greppen in
data_layer/*.pynach Default-Werten
# Beispiel-Grep grep -n "def get_.*_data.*days=" backend/data_layer/*.py grep -n "lambda.*days=" backend/placeholder_resolver.py - Suche in
-
Manuelle Zuordnung
- Für jeden Treffer: Placeholder Key identifizieren
- Default-Wert → time_window setzen
Erwartete Fixes:
sleep_avg_duration: Codedays=7→ time_window: 7drest_days_count: Codedays=30→ time_window: 30dnutrition_days: Codedays=30→ time_window: 30d- ... (~20 total)
Validation:
- Code-Review der Mappings
- Stichproben-Tests
Owner: Backend Developer Blocker: P0.2 abgeschlossen Output: 20 Fixed Platzhalter
P0.4: Semantic Contract Bulk-Update
Gap-Cluster: 1.1 Betroffene Platzhalter: 49 ("No description available") Severity: 🔴 CRITICAL Aufwand: 4-6 Stunden
Maßnahmen:
Input: Semantic-Contract-Agent-Report (bereits vorhanden) Prozess:
- Für jeden der 49 Platzhalter:
descriptionaus Agent-Report übernehmensemantic_contractaus Agent-Report übernehmencategoryaus Agent-Report setzen (statt "Unknown")
- Bulk-Update via JSON-Merge-Skript
- Manuelle Review der Top-10 kritischsten (nach Usage)
Beispiel-Update (ability_balance_coordination):
{
"key": "ability_balance_coordination",
- "category": "Unknown",
+ "category": "Training",
- "description": "No description available",
+ "description": "Koordinationsfähigkeit-Balance-Anteil (%)",
- "semantic_contract": "No description available",
+ "semantic_contract": "Gewichteter Anteil der Trainings-Last für Koordinations-Fähigkeit über 28-Tage-Fenster",
- "time_window": "unknown",
+ "time_window": "28d",
}
Prioritäts-Reihenfolge (nach Usage):
- Goals & Focus (16) - 7 produktkritisch
- Correlations (5) - experimentell, aber wichtig
- Body Deltas (5) - Körper-Tracking
- Nutrition (6) - Ernährungs-Metriken
- Training (8) - Ability Balance, Load
- Summaries (3) - circ_summary, caliper_summary
- Meta (2) - zeitraum_90d
- Plateau (1) - plateau_detected
- Top Drivers (1) - top_drivers
Validation:
- Review der Top-10 produktkritischsten Platzhalter manuell
- Stichprobe 10% der restlichen
- Automated Consistency Check (keine "No description" mehr)
Owner: Backend Lead + Product (für fachliche Review) Blocker: Keine Output: 49 Fixed Platzhalter, alle mit Kategorie + Description
P0.5: Zeitfenster Fach-Entscheidung
Gap-Cluster: 4.3 Betroffene Platzhalter: ~39 (Scores, Ability Balance, Correlations, Goals, Snapshots) Severity: 🔴 CRITICAL Aufwand: 4-6 Stunden (Meeting + Dokumentation)
Maßnahmen:
Phase 1: Kategorisierung (2h)
- Product + Tech Meeting
- Entscheidung pro Kategorie:
| Kategorie | Platzhalter | Vorschlag | Rationale |
|---|---|---|---|
| Scores (6) | activity_score, nutrition_score, recovery_score, body_progress_score, goal_progress_score, data_quality_score | custom oder mixed |
Kombinieren verschiedene Zeitfenster |
| Ability Balance (5) | coordination, endurance, mental, mobility, strength | 28d |
Rolling-Window über 28 Tage |
| Correlations (5) | energy_weight_lag, load_hrv, load_rhr, protein_lbm, sleep_recovery | 28d |
Min-Daten für Reliability |
| Goals & Focus (16) | active_goals_json, focus_areas_, top_goal_, top_3_goals_, focus_cat_ | latest (Snapshot) oder custom |
Je nach Progress-Berechnung |
| Snapshots (7) | bmi, goal_weight, goal_bf_pct, waist_hip_ratio, recomposition_quadrant, plateau_detected, top_drivers | latest oder custom |
Momentaufnahme vs. Berechnet |
Phase 2: Dokumentation (2h)
- Entscheidungen in Decision-Log festhalten
- time_window-Werte in Catalog setzen
- Semantic Contracts anpassen (Zeit-Bezug aufnehmen)
Phase 3: Validation (1h)
- Review mit Stakeholdern
- Prompt-Autoren informieren (Breaking Change bei "custom" → spezifisches Fenster)
Owner: Product Manager + Tech Lead Blocker: P0.4 Semantic Contract abgeschlossen Output: Decision-Log, 39 Fixed Platzhalter
P0 SUMMARY
Gesamt-Aufwand: 11-17 Stunden Deliverables:
- 3 Code-Docs-Konflikte gelöst
- 74 time_window: unknown → definierte Werte
- 49 description/category: Unknown/No description → vollständig
- Total Fixed: 77 Platzhalter (15+20+39+3 unique)
Impact:
- Compliance: 7% → 25-30%
- Blocked Gaps: time_window, description, category, code-conflicts
Next: P1 kann starten (Confidence, Data Layer, Source Tables)
P1: HIGH PRIORITY (Week 2-3)
Ziel: Technische Tiefe hinzufügen (Confidence, Data Layer, Source Tables) Aufwand: 44-58 Stunden Team: 2-3 Entwickler Dependencies: P0 abgeschlossen
P1.1: Confidence-Logik für Trend-Platzhalter
Gap-Cluster: 5.1 Betroffene Platzhalter: 11 (weight_*_slope, *_28d_delta, vo2max_trend_28d) Severity: 🟡 HIGH Aufwand: 12-16 Stunden
Maßnahmen:
Pattern:
# In data_layer/body_metrics.py
def calculate_weight_28d_slope(profile_id: int, conn):
"""Gewichtstrend über 28 Tage mit Confidence."""
# 1. Daten holen
rows = fetch_weight_data(profile_id, days=28, conn=conn)
# 2. Confidence berechnen
confidence = calculate_confidence(
data_points=len(rows),
time_window_days=28,
metric_type='trend'
)
if confidence == 'insufficient':
return {
'slope': None,
'confidence': 'insufficient',
'data_points': len(rows),
'min_required': 8 # 28% coverage
}
# 3. Slope berechnen (nur wenn sufficient)
slope = linear_regression_slope(rows)
return {
'slope': slope,
'confidence': confidence, # high/medium/low
'data_points': len(rows),
'r_squared': calculate_r_squared(rows, slope)
}
Thresholds (trend-specific):
def calculate_confidence(data_points, time_window_days, metric_type):
coverage = data_points / time_window_days
if metric_type == 'trend':
# Strengere Thresholds für Trends
if coverage >= 0.70: # >= 70%
return 'high'
elif coverage >= 0.50: # >= 50%
return 'medium'
elif coverage >= 0.30: # >= 30%
return 'low'
else:
return 'insufficient'
# ... andere Typen
Zu implementieren für:
weight_28d_slope(28d, min 8, ideal 20)weight_90d_slope(90d, min 27, ideal 63)weight_7d_median(7d, min 3, ideal 5)fm_28d_change(28d, min 2, ideal 18)lbm_28d_change(28d, min 2, ideal 18)waist_28d_delta(28d, min 2, ideal 18)hip_28d_delta(28d, min 2, ideal 18)chest_28d_delta(28d, min 2, ideal 18)arm_28d_delta(28d, min 2, ideal 18)thigh_28d_delta(28d, min 2, ideal 18)vo2max_trend_28d(28d, min 4, ideal 18)
Testing:
- Unit-Tests für calculate_confidence() mit verschiedenen Coverages
- Integration-Tests mit real data (0%, 30%, 50%, 70%, 100% coverage)
- Regression-Tests (alte Werte ohne Confidence bleiben gleich)
Owner: Backend Developer (Senior) Blocker: P0 time_window abgeschlossen Output: 11 Platzhalter mit Confidence-Logik
P1.2: Confidence-Logik für Score-Platzhalter
Gap-Cluster: 5.2 Betroffene Platzhalter: 6 (activity_score, nutrition_score, recovery_score, etc.) Severity: 🟡 HIGH Aufwand: 8-10 Stunden
Maßnahmen:
Composite-Confidence-Pattern:
def calculate_nutrition_score(profile_id: int, conn):
"""Nutrition Score mit Composite Confidence."""
# 1. Sub-Scores berechnen (mit eigenen Confidences)
energy_balance = calculate_energy_balance_7d(profile_id, conn)
protein_adequacy = calculate_protein_adequacy_28d(profile_id, conn)
macro_consistency = calculate_macro_consistency_score(profile_id, conn)
# 2. Composite Confidence = MIN(sub-confidences)
confidence_levels = ['high', 'medium', 'low', 'insufficient']
confidences = [
energy_balance['confidence'],
protein_adequacy['confidence'],
macro_consistency['confidence']
]
# Min-Confidence
min_confidence = min(confidences, key=lambda c: confidence_levels.index(c))
if min_confidence == 'insufficient':
return {
'score': None,
'confidence': 'insufficient',
'sub_scores': {...},
'note': 'Mindestens eine Komponente hat insufficient data'
}
# 3. Score berechnen (gewichtet)
score = (
energy_balance['score'] * 0.4 +
protein_adequacy['score'] * 0.4 +
macro_consistency['score'] * 0.2
)
return {
'score': round(score),
'confidence': min_confidence,
'sub_scores': {
'energy_balance': energy_balance,
'protein_adequacy': protein_adequacy,
'macro_consistency': macro_consistency
}
}
Zu implementieren für:
activity_score(training_volume + frequency + quality)nutrition_score(energy_balance + protein_adequacy + macro_consistency)recovery_score(sleep_duration + sleep_quality + hrv + rhr)body_progress_score(weight_trend + bf_change + lbm_change)goal_progress_score(weighted goals progress)data_quality_score(data availability per domain)
Testing:
- Scenario-Tests: alle Sub-Scores high → Composite high
- Scenario-Tests: eine Sub-Score insufficient → Composite insufficient
- Edge-Cases: missing Sub-Components
Owner: Backend Developer (Mid/Senior) Blocker: P1.1 Trend-Confidence abgeschlossen (Pattern etabliert) Output: 6 Platzhalter mit Composite Confidence
P1.3: Confidence-Logik für Korrelations-Platzhalter
Gap-Cluster: 5.3 Betroffene Platzhalter: 5 (correlation_*) Severity: 🟡 HIGH Aufwand: 4-6 Stunden
Maßnahmen:
Correlation-Confidence-Pattern:
def calculate_lag_correlation(profile_id, metric_a, metric_b, lag_days=[0,3,7,14], conn):
"""Lag-Korrelation mit Pair-basiertem Confidence."""
results = []
for lag in lag_days:
pairs = fetch_paired_data(profile_id, metric_a, metric_b, lag, conn)
n_pairs = len(pairs)
# Confidence basierend auf Anzahl Paare
if n_pairs >= 28:
confidence = 'high'
elif n_pairs >= 21:
confidence = 'medium'
elif n_pairs >= 14:
confidence = 'low'
else:
confidence = 'insufficient'
if confidence == 'insufficient':
correlation = None
else:
correlation = pearson_correlation(pairs)
results.append({
'lag_days': lag,
'correlation': correlation,
'n_pairs': n_pairs,
'confidence': confidence,
'note': 'explorativ, nicht kausal'
})
return {
'correlations': results,
'overall_confidence': min([r['confidence'] for r in results])
}
Zu implementieren für:
correlation_energy_weight_lag(min 21 Paare)correlation_load_hrv(min 21 Paare)correlation_load_rhr(min 21 Paare)correlation_protein_lbm(min 28 Paare, Training moderiert)correlation_sleep_recovery(min 21 Paare)
Testing:
- Synthetic Data: 10, 14, 21, 28, 35 Paare → Confidence-Check
- Real Data: Validate gegen tatsächliche Daten-Dichte
Owner: Backend Developer (Senior, Statistik-Know-how) Blocker: P1.1 Confidence-Pattern etabliert Output: 5 Platzhalter mit Correlation-Confidence
P1.4: Data-Layer-Module dokumentieren
Gap-Cluster: 2 Betroffene Platzhalter: 100 (data_layer_module: null) Severity: 🔴 CRITICAL Aufwand: 6-8 Stunden
Maßnahmen:
Input: Code-Evidence-Agent-Report (technische Herkunft für alle 111)
Prozess:
-
Mapping-Extraktion:
- Für jede
_safe_*-Funktion: Gerufene Data-Layer-Funktion identifizieren - Mapping: Placeholder Key → Data-Layer-Module
- Für jede
-
Bulk-Update-Skript:
# Mapping aus Code-Evidence-Report data_layer_mapping = { 'goal_progress_score': 'data_layer.scores', 'body_progress_score': 'data_layer.body_metrics', 'nutrition_score': 'data_layer.nutrition_metrics', 'activity_score': 'data_layer.activity_metrics', 'recovery_score': 'data_layer.recovery_metrics', # ... 95 more } # Catalog Update for key, module in data_layer_mapping.items(): catalog['placeholders'][key]['source']['data_layer_module'] = module -
Validation:
- Automated Check: Alle 111 haben data_layer_module gesetzt
- Stichprobe 10%: Manuell im Code validieren
Owner: DevOps / Backend Lead Blocker: Code-Evidence-Agent-Report finalisiert (✓) Output: 100 Fixed Platzhalter
P1.5: Source-Tables dokumentieren
Gap-Cluster: 3 Betroffene Platzhalter: 90 (source_tables: []) Severity: 🔴 CRITICAL Aufwand: 6-8 Stunden
Maßnahmen:
Identisch zu P1.4:
- Mapping aus Code-Evidence-Report übernehmen
- Bulk-Update-Skript
- Validation
Mapping-Beispiel:
source_tables_mapping = {
'weight_aktuell': ['weight_log'],
'weight_trend': ['weight_log'],
'kf_aktuell': ['caliper_log'],
'bmi': ['weight_log', 'profiles'],
'nutrition_score': ['nutrition_log'],
'activity_score': ['activity_log'],
'recovery_score': ['sleep_log', 'vitals_baseline', 'rest_days'],
# ... 83 more
}
Owner: DevOps / Backend Lead Blocker: Code-Evidence-Agent-Report finalisiert (✓) Output: 90 Fixed Platzhalter
P1.6: Strukturierte Missing-Value-Policy
Gap-Cluster: 6 Betroffene Platzhalter: 110 (nur legacy_display) Severity: 🟡 MEDIUM Aufwand: 8-10 Stunden
Maßnahmen:
Dual-Mode-Ansatz:
# Alte Resolver-Return (Backward-Compatible)
def get_weight_trend(profile_id, days=28, conn=None):
data = get_weight_trend_data(profile_id, days, conn)
if data['confidence'] == 'insufficient':
# Legacy: String-Return
return "nicht verfügbar"
return f"{data['direction']} {data['delta']} kg"
# Neue Structured-Return (Parallel)
def get_weight_trend_structured(profile_id, days=28, conn=None):
data = get_weight_trend_data(profile_id, days, conn)
if data['confidence'] == 'insufficient':
return {
'available': False,
'value_raw': None,
'value_display': "nicht verfügbar",
'missing_reason': 'insufficient_data',
'missing_value_policy': {
'legacy_display': "nicht verfügbar",
'structured_null': True,
'reason_codes': ['no_data', 'insufficient_data', 'resolver_error']
},
'metadata': {
'data_points': data['data_points'],
'min_required': data['min_required'],
'time_window': '28d'
}
}
return {
'available': True,
'value_raw': data['slope'],
'value_display': f"{data['direction']} {data['delta']} kg",
'confidence': data['confidence'],
'metadata': {
'data_points': data['data_points'],
'r_squared': data['r_squared'],
'time_window': '28d'
}
}
Migration-Strategie:
- Phase 1: Neue
*_structured()-Funktionen neben alten (Parallel) - Phase 2: Extended Export nutzt structured
- Phase 3: Legacy-Export bleibt unverändert (Backward-Compat)
- Phase 4 (Later): Deprecate alte Funktionen nach 6-12 Monaten
Zu implementieren für:
- Alle 110 Platzhalter (außer weight_aktuell, der bereits structured ist)
Testing:
- Legacy-Tests: Alte Funktionen bleiben unverändert
- Structured-Tests: Neue Funktionen returnieren korrekte Struktur
- Export-Tests: Extended Export nutzt structured
Owner: Backend Team (2 Entwickler) Blocker: P1.1-P1.3 Confidence abgeschlossen Output: 110 Platzhalter mit Dual-Mode-Support
P1 SUMMARY
Gesamt-Aufwand: 44-58 Stunden Deliverables:
- 11 Trend-Platzhalter mit Confidence
- 6 Score-Platzhalter mit Composite Confidence
- 5 Correlation-Platzhalter mit Pair-Confidence
- 100 Platzhalter mit data_layer_module
- 90 Platzhalter mit source_tables
- 110 Platzhalter mit Structured Missing-Value-Policy
- Total Fixed: 103 unique Platzhalter (alle außer 8 bereits conforme)
Impact:
- Compliance: 25-30% → 50-60%
- Blocked Gaps: Confidence, Data Layer, Source Tables, Missing-Value-Policy
Next: P2 Production-Ready + Deprecation
P2: MEDIUM PRIORITY (Week 4-5)
Ziel: Production-Status und Deprecation-Strategie Aufwand: 8-12 Stunden Team: Product + Tech Lead Dependencies: P1 abgeschlossen
P2.1: Schema-Status auf Production (Top 20)
Gap-Cluster: 8 Betroffene Platzhalter: 20-30 Kandidaten Severity: 🟡 MEDIUM Aufwand: 4-6 Stunden
Maßnahmen:
Kriterien für schema_status: production:
metadata_completeness_score >= 80used_by.prompts.length >= 1 OR used_by.pipelines.length >= 1time_window != 'unknown'category != 'Unknown'description != 'No description available'confidence_logic != null OR (type == 'atomic' AND time_window == 'latest')known_issues.length == 0
Prozess:
-
Automated Eligibility-Check:
def is_production_ready(placeholder): checks = [ placeholder['metadata_completeness_score'] >= 80, len(placeholder['used_by']['prompts']) >= 1 or len(placeholder['used_by']['pipelines']) >= 1, placeholder['time_window'] != 'unknown', placeholder['category'] != 'Unknown', placeholder['description'] != 'No description available', placeholder['confidence_logic'] is not None or (placeholder['type'] == 'atomic' and placeholder['time_window'] == 'latest'), len(placeholder['known_issues']) == 0 ] return all(checks) -
Kandidaten-Liste generieren
-
Manuelle Review (Product + Tech Lead)
- Sind diese wirklich production-ready?
- Fehlt noch etwas?
-
Schema-Status-Update
Erwartete Kandidaten (12-15):
- Nutrition Averages (4): protein_avg, kcal_avg, fat_avg, carb_avg
- Body Metrics (3): weight_aktuell, weight_trend, kf_aktuell
- Profil (4): name, age, height, geschlecht
- Summaries (2): caliper_summary, circ_summary
- Goals (2-3): goal_weight, goal_bf_pct, top_goal_name
Owner: Tech Lead + Product Manager
Blocker: P1 abgeschlossen (Confidence, Data Layer)
Output: 12-15 Platzhalter mit schema_status: production
P2.2: Ungenutzte Platzhalter - Integration planen
Gap-Cluster: 9 (REINTERPRETIERT: Nicht Deprecation, sondern Integration) Betroffene Platzhalter: 67 (ungenutzt) Severity: 🟡 MEDIUM (Prompt-Bibliothek Vollständigkeit) Aufwand: 4-6 Stunden
Maßnahmen:
Neue Klassifizierung (siehe USAGE_ROLE_CLASSIFICATION.md):
-
unused_but_planned (30) - Explizit in Roadmap Phase 0c/1/2
- Scores (6), Correlations (5), Ability Balance (5), Goals Details (11), etc.
- Action: Timeline bestätigen, Prototyping-Prompts erstellen
-
unused_but_plausible (37) - Fachlich sinnvoll, noch nicht in Prompts
- Body Deltas, Nutrition Details, Training Quality, Focus Category, Meta
- Action: Prompt-Use-Cases identifizieren, Templates für Quick Wins
-
redundant_or_duplicate (0) - Keine!
- Alle 67 haben fachliche Berechtigung
Prozess:
- Meeting (2h): Product + Tech Review aller 67
- Gruppe A (30 geplant): Timeline bestätigen (Phase 0c/1/2)
- Gruppe B (37 plausibel): Prompt-Use-Cases identifizieren (10-15 Quick Wins)
- Dokumentation (1h): Integration-Roadmap, Prompt-Kandidaten-Liste
- Implementation (1-2h): Prompt-Templates erstellen (5-10 Quick Wins)
- Communication (1h): Prompt-Autoren: "Neue Platzhalter verfügbar"
Integration-Beispiel (statt Deprecation):
{
"key": "arm_28d_delta",
"usage_role": "unused_but_plausible",
"integration_priority": "medium",
"prompt_use_cases": [
"Fortschritts-Analyse spezifischer Körperteile",
"Asymmetrie-Erkennung (linker vs. rechter Arm)",
"Trainingsplan-Effektivität (Armtraining Tracking)"
],
"example_prompt_template": "Deine Armumfänge haben sich in den letzten 28 Tagen um {{arm_28d_delta}}cm verändert. Analyse: ..."
}
Owner: Product Manager + Tech Lead Blocker: P1 abgeschlossen Output: Integration-Roadmap, Prompt-Templates (5-10), Nutzungsrate +10-20%
P2 SUMMARY
Gesamt-Aufwand: 8-12 Stunden Deliverables:
- 12-15 Production-Ready Platzhalter
- Integration-Roadmap für 30 geplante Platzhalter (Phase 0c/1/2)
- Prompt-Templates für 5-10 Quick Wins (ungenutzte Platzhalter aktivieren)
Impact:
- Compliance: 50-60% → 65-70%
- Governance: Production-Pipeline etabliert, Placeholder-Integration vorangetrieben
- Nutzungsrate: 40% → 50-60% (organisch durch Integration)
Next: P3 (Nice-to-Have)
P3: NICE-TO-HAVE (Later)
Ziel: Dokumentations-Feinschliff Aufwand: 0.5 Stunden Team: Tech Writer / DevOps Dependencies: P2 abgeschlossen
P3.1: Export-Inkonsistenzen Dokumentation
Gap-Cluster: 10 Betroffene: Dokumentation Severity: 🟢 INFO Aufwand: 0.5 Stunden
Maßnahmen:
Export Spec Update:
# PLACEHOLDER_EXPORT_SPEC.md
- **Total Placeholders:** 116
+ **User Placeholders:** 111
+ **Meta Fields:** 5 (schema_version, generated_at, normative_standard, total_placeholders, metadata.summary)
+ **Total Export Entries:** 116
Owner: Tech Writer Blocker: Keine Output: Updated Export Spec
ERFOLGS-METRIKEN
Nach P0 (Week 1)
- ✅ Compliance: 7% → 25-30%
- ✅ time_window: unknown: 74 → 0
- ✅ category: Unknown: 49 → 0
- ✅ description: No description: 49 → 0
- ✅ Code-Docs-Konflikte: 3 → 0
Nach P1 (Week 3)
- ✅ Compliance: 25-30% → 50-60%
- ✅ Confidence-Logik: 8 → 28 (Trend + Score + Correlation)
- ✅ data_layer_module: 11 → 111
- ✅ source_tables: 21 → 111
- ✅ Structured Missing-Value: 1 → 111
Nach P2 (Week 5)
- ✅ Compliance: 50-60% → 65-70%
- ✅ schema_status: production: 0 → 12-15
- ✅ deprecated: 0 → 15-20
- ✅ Technical Debt: Reduziert
Nach P3
- ✅ Compliance: 65-70% → 70%+
- ✅ Dokumentation: Vollständig konsistent
RISIKEN & MITIGATION
| Risiko | Wahrscheinlichkeit | Impact | Mitigation |
|---|---|---|---|
| P0 Zeitfenster-Fach-Entscheidung dauert länger | MEDIUM | MEDIUM | Vorbereitete Kategorisierung, klare Optionen, Decision-Meeting zeitig ansetzen |
| P1 Confidence-Implementierung komplexer als geschätzt | MEDIUM | HIGH | Pattern aus nutrition_avg wiederverwenden, Senior Dev assignen |
| Breaking Changes durch Zeitfenster-Fixes | LOW | HIGH | Code ist autoritativ, Docs passen sich an → kein Breaking Change |
| Prompt-Autoren akzeptieren Deprecations nicht | LOW | MEDIUM | Klare Communication, Replacement-Guides, Grace Period (3 Monate) |
KOMMUNIKATIONS-PLAN
Week 1 (P0 Kickoff)
- Email: Alle Stakeholder über Audit-Ergebnisse informieren
- Meeting: P0-Prioritäten mit Tech Lead abstimmen
- Kickoff: Development Team P0-Tasks zuweisen
Week 2 (P1 Kickoff)
- Standup: Daily Updates zu Confidence-Implementierung
- Review: Mid-Sprint Review nach P1.1-P1.3
Week 3 (P1 Abschluss)
- Demo: P1-Ergebnisse dem Team zeigen
- Docs: Updated Catalog veröffentlichen
Week 4-5 (P2)
- Meeting: Production-Readiness-Review
- Communication: Deprecation-Plan an Prompt-Autoren
Week 6 (Abschluss)
- Retrospektive: Lessons Learned
- Documentation: Finale Compliance-Metrics veröffentlichen
TOOLING & AUTOMATION
Skripte (entwickeln während P0-P1)
fix_time_window_from_name.py- Automatische Name-Pattern-Fixesextract_code_parameters.py- Code-Parameter → time_windowbulk_update_catalog.py- JSON-Merge für Bulk-Updatesvalidate_compliance.py- Automatische Compliance-Checkscheck_production_ready.py- Production-Eligibility-Check
CI/CD-Integration (P2-P3)
- Pre-Commit-Hook: Validate neue Platzhalter gegen Normative Spec
- CI: Consistency-Checks (Code ↔ Catalog)
- CD: Automated Catalog-Deployment
ABSCHLUSS-KRITERIEN
P0 erfolgreich wenn:
- Alle 3 Code-Docs-Konflikte gelöst
- Alle 74 time_window: unknown → definiert
- Alle 49 No description → vollständig
- Automated Tests grün
P1 erfolgreich wenn:
- Mindestens 20 Platzhalter mit Confidence-Logik
- Alle 100 data_layer_module gesetzt
- Alle 90 source_tables gesetzt
- Structured Missing-Value für alle 110 (Dual-Mode)
P2 erfolgreich wenn:
- Mindestens 12 Platzhalter
schema_status: production - Mindestens 15 Platzhalter
deprecated: true - Decision-Log veröffentlicht
Gesamt-Projekt erfolgreich wenn:
- Compliance >= 65%
- 0 Code-Docs-Konflikte
- 0 time_window: unknown
- 12+ Production-Ready Platzhalter
Maßnahmenplan erstellt von: Claude Code (Lead Audit Agent) Basis: Gap-Cluster-Analyse, 4-Agent-Evidence Genehmigung: Pending (Review mit Tech Lead + Product Manager)