984 lines
29 KiB
Markdown
984 lines
29 KiB
Markdown
|
|
# 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:**
|
||
|
|
|
||
|
|
1. **weight_trend Fix**
|
||
|
|
```diff
|
||
|
|
# 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",
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
2. **activity_summary Fix**
|
||
|
|
```diff
|
||
|
|
{
|
||
|
|
"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",
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
3. **activity_detail Fix**
|
||
|
|
```diff
|
||
|
|
{
|
||
|
|
"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`**
|
||
|
|
```python
|
||
|
|
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 → 7d
|
||
|
|
- `zeitraum_30d`: unknown → 30d
|
||
|
|
- `zeitraum_90d`: unknown → 90d
|
||
|
|
- `sleep_avg_duration_7d`: unknown → 7d
|
||
|
|
- `sleep_quality_7d`: unknown → 7d
|
||
|
|
- `training_frequency_7d`: unknown → 7d
|
||
|
|
- `proxy_internal_load_7d`: unknown → 7d
|
||
|
|
- `energy_balance_7d`: unknown → 7d
|
||
|
|
- `protein_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:**
|
||
|
|
|
||
|
|
1. **Code-Parameter-Extraktion**
|
||
|
|
- Suche in `placeholder_resolver.py` nach `days=X` Parametern
|
||
|
|
- Greppen in `data_layer/*.py` nach Default-Werten
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Beispiel-Grep
|
||
|
|
grep -n "def get_.*_data.*days=" backend/data_layer/*.py
|
||
|
|
grep -n "lambda.*days=" backend/placeholder_resolver.py
|
||
|
|
```
|
||
|
|
|
||
|
|
2. **Manuelle Zuordnung**
|
||
|
|
- Für jeden Treffer: Placeholder Key identifizieren
|
||
|
|
- Default-Wert → time_window setzen
|
||
|
|
|
||
|
|
**Erwartete Fixes:**
|
||
|
|
- `sleep_avg_duration`: Code `days=7` → time_window: 7d
|
||
|
|
- `rest_days_count`: Code `days=30` → time_window: 30d
|
||
|
|
- `nutrition_days`: Code `days=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:**
|
||
|
|
1. Für jeden der 49 Platzhalter:
|
||
|
|
- `description` aus Agent-Report übernehmen
|
||
|
|
- `semantic_contract` aus Agent-Report übernehmen
|
||
|
|
- `category` aus Agent-Report setzen (statt "Unknown")
|
||
|
|
2. Bulk-Update via JSON-Merge-Skript
|
||
|
|
3. Manuelle Review der Top-10 kritischsten (nach Usage)
|
||
|
|
|
||
|
|
**Beispiel-Update (ability_balance_coordination):**
|
||
|
|
```diff
|
||
|
|
{
|
||
|
|
"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):**
|
||
|
|
1. Goals & Focus (16) - 7 produktkritisch
|
||
|
|
2. Correlations (5) - experimentell, aber wichtig
|
||
|
|
3. Body Deltas (5) - Körper-Tracking
|
||
|
|
4. Nutrition (6) - Ernährungs-Metriken
|
||
|
|
5. Training (8) - Ability Balance, Load
|
||
|
|
6. Summaries (3) - circ_summary, caliper_summary
|
||
|
|
7. Meta (2) - zeitraum_90d
|
||
|
|
8. Plateau (1) - plateau_detected
|
||
|
|
9. 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:**
|
||
|
|
```python
|
||
|
|
# 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):**
|
||
|
|
```python
|
||
|
|
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:**
|
||
|
|
1. `weight_28d_slope` (28d, min 8, ideal 20)
|
||
|
|
2. `weight_90d_slope` (90d, min 27, ideal 63)
|
||
|
|
3. `weight_7d_median` (7d, min 3, ideal 5)
|
||
|
|
4. `fm_28d_change` (28d, min 2, ideal 18)
|
||
|
|
5. `lbm_28d_change` (28d, min 2, ideal 18)
|
||
|
|
6. `waist_28d_delta` (28d, min 2, ideal 18)
|
||
|
|
7. `hip_28d_delta` (28d, min 2, ideal 18)
|
||
|
|
8. `chest_28d_delta` (28d, min 2, ideal 18)
|
||
|
|
9. `arm_28d_delta` (28d, min 2, ideal 18)
|
||
|
|
10. `thigh_28d_delta` (28d, min 2, ideal 18)
|
||
|
|
11. `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:**
|
||
|
|
```python
|
||
|
|
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:**
|
||
|
|
1. `activity_score` (training_volume + frequency + quality)
|
||
|
|
2. `nutrition_score` (energy_balance + protein_adequacy + macro_consistency)
|
||
|
|
3. `recovery_score` (sleep_duration + sleep_quality + hrv + rhr)
|
||
|
|
4. `body_progress_score` (weight_trend + bf_change + lbm_change)
|
||
|
|
5. `goal_progress_score` (weighted goals progress)
|
||
|
|
6. `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:**
|
||
|
|
```python
|
||
|
|
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:**
|
||
|
|
1. `correlation_energy_weight_lag` (min 21 Paare)
|
||
|
|
2. `correlation_load_hrv` (min 21 Paare)
|
||
|
|
3. `correlation_load_rhr` (min 21 Paare)
|
||
|
|
4. `correlation_protein_lbm` (min 28 Paare, Training moderiert)
|
||
|
|
5. `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:**
|
||
|
|
1. **Mapping-Extraktion:**
|
||
|
|
- Für jede `_safe_*`-Funktion: Gerufene Data-Layer-Funktion identifizieren
|
||
|
|
- Mapping: Placeholder Key → Data-Layer-Module
|
||
|
|
|
||
|
|
2. **Bulk-Update-Skript:**
|
||
|
|
```python
|
||
|
|
# 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
|
||
|
|
```
|
||
|
|
|
||
|
|
3. **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:**
|
||
|
|
```python
|
||
|
|
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:**
|
||
|
|
```python
|
||
|
|
# 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:**
|
||
|
|
1. **Phase 1:** Neue `*_structured()`-Funktionen neben alten (Parallel)
|
||
|
|
2. **Phase 2:** Extended Export nutzt structured
|
||
|
|
3. **Phase 3:** Legacy-Export bleibt unverändert (Backward-Compat)
|
||
|
|
4. **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`:**
|
||
|
|
1. `metadata_completeness_score >= 80`
|
||
|
|
2. `used_by.prompts.length >= 1 OR used_by.pipelines.length >= 1`
|
||
|
|
3. `time_window != 'unknown'`
|
||
|
|
4. `category != 'Unknown'`
|
||
|
|
5. `description != 'No description available'`
|
||
|
|
6. `confidence_logic != null OR (type == 'atomic' AND time_window == 'latest')`
|
||
|
|
7. `known_issues.length == 0`
|
||
|
|
|
||
|
|
**Prozess:**
|
||
|
|
1. **Automated Eligibility-Check:**
|
||
|
|
```python
|
||
|
|
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)
|
||
|
|
```
|
||
|
|
|
||
|
|
2. **Kandidaten-Liste generieren**
|
||
|
|
3. **Manuelle Review** (Product + Tech Lead)
|
||
|
|
- Sind diese wirklich production-ready?
|
||
|
|
- Fehlt noch etwas?
|
||
|
|
4. **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):**
|
||
|
|
1. **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
|
||
|
|
|
||
|
|
2. **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
|
||
|
|
|
||
|
|
3. **redundant_or_duplicate (0)** - Keine!
|
||
|
|
- Alle 67 haben fachliche Berechtigung
|
||
|
|
|
||
|
|
**Prozess:**
|
||
|
|
1. **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)
|
||
|
|
2. **Dokumentation (1h):** Integration-Roadmap, Prompt-Kandidaten-Liste
|
||
|
|
3. **Implementation (1-2h):** Prompt-Templates erstellen (5-10 Quick Wins)
|
||
|
|
4. **Communication (1h):** Prompt-Autoren: "Neue Platzhalter verfügbar"
|
||
|
|
|
||
|
|
**Integration-Beispiel (statt Deprecation):**
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"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:**
|
||
|
|
```diff
|
||
|
|
# 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)
|
||
|
|
1. `fix_time_window_from_name.py` - Automatische Name-Pattern-Fixes
|
||
|
|
2. `extract_code_parameters.py` - Code-Parameter → time_window
|
||
|
|
3. `bulk_update_catalog.py` - JSON-Merge für Bulk-Updates
|
||
|
|
4. `validate_compliance.py` - Automatische Compliance-Checks
|
||
|
|
5. `check_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)
|