""" Application Version Information Semantic Versioning: MAJOR.MINOR.PATCH - MAJOR: Breaking Change, DB-Migration inkompatibel - MINOR: Neues Feature, neues Modul - PATCH: Bugfix, kleine Änderung, Refactor """ APP_VERSION = "0.9t" BUILD_DATE = "2026-04-20" DB_SCHEMA_VERSION = "20260409c" # 048/049 vitals_baseline.source csv + SAVEPOINT Import MODULE_VERSIONS = { "auth": "1.2.0", "profiles": "1.1.0", "reference_values": "1.3.0", "admin_reference_value_types": "1.0.0", "weight": "1.0.3", "circumference": "1.0.1", "caliper": "1.0.1", "activity": "1.2.0", # GET /activity: optional days= window + limit "nutrition": "1.0.2", "photos": "1.0.0", "insights": "1.3.0", "prompts": "1.1.0", "admin": "1.4.1", # Produkt-Dashboard-Standard GET/DELETE: merge_missing_catalog_widgets "stats": "1.0.1", "exportdata": "1.1.0", "importdata": "1.0.0", "membership": "2.1.0", "workflow": "0.7.0", # Part 3: Inline Prompts (reference + inline mode) "app_dashboard": "1.12.1", # GET layout: merge_missing_catalog_widgets (neue Katalog-IDs sichtbar) "csv_import": "0.3.2", # Import-Fehler: enrich_row_error / freundlichere 500-Hinweise "admin_csv_templates": "0.3.0", # POST /validate + Speichern nur bei valid (422 + warnings in Response) } CHANGELOG = [ { "version": "0.9t", "date": "2026-04-20", "changes": [ "Phase C: data_layer/nutrition_chart_payloads (E1/E2/E4) — gemeinsam mit /api/charts/*", "nutrition-history-viz: chart_payloads + chart_payloads_days; Verlauf NutritionCharts ohne 3 Extra-HTTP-Calls", ], }, { "version": "0.9s", "date": "2026-04-20", "changes": [ "Phase B: body-history-viz weight.trend_kpi (Gewichtstrend-Urteil im data_layer/body_viz)", "History Körper-KPIs: keine Client-Schwellen für WHR/WHtR; KF%-Farbe über Interpretations-Status", "Kcal vs. Gewicht: kein Frontend-TDEE-Fallback; Hinweis bei <5 gemeinsamen Tagen", ], }, { "version": "0.9r", "date": "2026-04-20", "changes": [ "History Phase A: GET /api/charts/activity-last-updated (data_layer fitness_viz, gleiche Quelle wie last_updated im Fitness-Bundle)", "History: entfernt toten Initial-Load listWeight/listCaliper/listCirc/listNutrition/listActivity(25k); Profil/Insights/Prompts + Activity-Datum", ], }, { "version": "0.9q", "date": "2026-04-11", "changes": [ "Workflow Engine Part 3: Inline Prompts", "Frontend: Radio Buttons (Reference/Inline), InlineTemplateEditor Component", "Frontend: Placeholder Picker für Inline-Templates, Cursor-Position Tracking", "Backend: load_prompt_template() unterstützt inline_template", "Backend: WorkflowNode.inline_template Feld hinzugefügt", "Serialization: inline_template speichern/laden in graph_data", "Validation: Prüft dass entweder prompt_slug ODER inline_template gesetzt", ], }, { "version": "0.9p", "date": "2026-04-09", "changes": [ "Issue #21 Phase 1: Migration 042/043 (csv_field_mappings, csv_import_log, Seeds)", "csv_parser: core (Decode/Delimiter/Sample), module_registry, type_converter, permissions", "API /api/csv: modules, limits, mappings, analyze, copy", "API /api/admin/csv-templates: CRUD System-Templates, import-limits (system_config)", "Issue #21: POST /api/csv/import + executor (nutrition Aggregat/Tag, weight, Blutdruck); activity 501", "Issue #21: GET-Analyse über alle Vorlagen; Import nur mapping_id; GUI ohne Modul-Dropdown", "v9c_cleanup_features.sql: FK-sichere csv_import→data_import Reihenfolge", ], }, { "version": "0.9n", "date": "2026-04-06", "changes": [ "Admin: Widgets × Features (Migration 041, AND-Gates, Hybrid mit widget_catalog)", "Admin: Produkt-Dashboard-Systemstandard (Migration 040 system_config, API, UI)", "Phase 4: End Node Template Engine", "workflow_models.py: EndNodeOutputMode enum (AUTO, TEMPLATE)", "workflow_executor.py: execute_end_node() with Jinja2 template rendering", "Template Context: {{node_id.analysis_core}}, {{node_id.decision_signals.key}}", "Conditional Rendering: {% if node_id %} for optional paths", "AUTO Mode: Backward compatible concatenation of all analyses", "TEMPLATE Mode: Custom Jinja2 templates with placeholder support", ] }, { "version": "0.9m", "date": "2026-04-04", "changes": [ "Phase 4: Join Nodes and Path Consolidation", "join_evaluator.py: Join-Strategie-Evaluator (wait_all, wait_any, best_effort)", "Path Status Collection: Sammelt incoming paths, prüft Ausführungsstatus", "Result Consolidation: Merged analysis_cores + combined signals (mit node_id Präfix)", "Skip-Handling: IGNORE_SKIPPED, USE_PLACEHOLDER, REQUIRE_MINIMUM", "Partial Execution: Korrekte Behandlung von SKIPPED/FAILED Pfaden", "workflow_executor.py: execute_join_node() Implementation", "NodeExecutionState: List[NormalizedSignal] korrekt konvertiert zu Dict", "Unit-Tests Phase 4: 18 Tests für Join Nodes (alle passing)", "Phase 2/3 Backward Compatibility: 31 Tests (alle passing)", ] }, { "version": "0.9l", "date": "2026-04-04", "changes": [ "Phase 3: Logic Nodes + Conditional Branching", "logic_evaluator.py: Deterministischer Logic Evaluator (EQ, NEQ, IN, GT, LT, CONTAINS, AND, OR, NOT)", "workflow_executor.py: Conditional Branching via BFS-Traversierung mit Edge-Activation", "execute_logic_node(): Bedingungen evaluieren, then/else Pfade aktivieren", "Fallback-Strategien: CONSERVATIVE_SKIP, DEFAULT_PATH, UNCERTAINTY_PATH, DOCUMENT_ONLY", "workflow_models.py: CONTAINS Operator hinzugefügt", "Unit-Tests Phase 3: 20 Tests für Logic Evaluator (alle passing)", "Phase 2 Backward Compatibility: 11 Tests aktualisiert (alle passing)", ] }, { "version": "0.9k", "date": "2026-04-03", "changes": [ "Phase 2: Normalisierung + Workflow Executor", "normalization_engine.py: Synonym-Mapping, 5 Statuswerte (valid, normalized, unclear, invalid, not_decidable)", "workflow_executor.py: Sequenzielle Workflow-Ausführung, Node-State-Tracking, Ergebnis-Aggregation", "Integration in prompt_executor.py: Dispatcher für type='workflow'", "API-Router workflows.py: POST /workflows/{id}/execute, GET /workflows/executions/{id}", "Unit-Tests Phase 2: 27 Tests (normalization_engine + workflow_executor)", "Erweitert: workflow_models.py (NormalizedSignal, NodeExecutionState, ExecutionResult)", ] }, { "version": "0.9j", "date": "2026-04-03", "changes": [ "Phase 1: Fragenergänzung + Strukturierter Container", "question_augmenter.py: Hybrid-Modell (Knotengebundene Fragen überschreiben Prompt-Defaults)", "result_container_parser.py: Markdown-Sektionen (Analysekern, Entscheidungsanteil, Begründungsanker)", "Integration in execute_base_prompt(): Fragenergänzung vor LLM-Call, Parsing nach LLM-Response", "API-Router workflow_questions.py: CRUD für workflow_question_catalog", "Unit-Tests Phase 1: 25 Tests (question_augmenter + result_container_parser)", ] }, { "version": "0.9i", "date": "2026-04-03", "changes": [ "Phase 0: Workflow Engine Foundation", "DB-Migration 034: workflow_definitions, workflow_question_catalog, workflow_executions", "Pydantic-Modelle für Workflow-Graph (WorkflowGraph, Node, Edge, Condition)", "Graph-Parsing, Topologische Sortierung, DAG-Validierung", "Dispatcher-Erweiterung: type='workflow' (Stub-Implementierung)", "Unit-Tests für Phase 0 (Graph-Parsing, Zyklen-Erkennung, Erreichbarkeit)", ] }, { "version": "0.9h+", "date": "2026-03-28", "changes": [ "Phase 0c: Multi-Layer Data Architecture Complete", "Data Layer Migration (97 Funktionen in 6 Modulen)", "20 neue Chart Endpoints (E1-E5, A1-A8, R1-R5, C1-C4)", "Single Source of Truth für Datenberechnungen", ] }, ]