mitai-jinkendo/backend/version.py
Lars 132a364a3a
All checks were successful
Deploy Development / deploy (push) Successful in 1m6s
Build Test / pytest-backend (push) Successful in 5s
Build Test / lint-backend (push) Successful in 0s
Build Test / build-frontend (push) Successful in 29s
feat: Zuordnen ohne Freeze und zuerst die letzten Wochen
Katalogsuche und Bestätigen blockieren die UI nicht mehr; offene Namen starten bei den aktuellen Tagebucheinträgen, alter Ballast bleibt unter Alle.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-12 16:14:24 +02:00

210 lines
10 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
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.9v"
BUILD_DATE = "2026-09-12"
DB_SCHEMA_VERSION = "20260912" # 064 mapping units
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.1", # Legacy CSV import: activity_entries feature enforcement
"nutrition": "1.2.5", # unmapped since_days: last weeks first
"bls": "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.17.1", # history_overview_viz: Bereichs-Kacheln einzeln per show_section_*
"csv_import": "0.4.0", # Mapping validation on copy/import; validate endpoint; error_details UI
"admin_csv_templates": "0.3.1", # Format check includes import_row_processing parity
}
CHANGELOG = [
{
"version": "0.9v",
"date": "2026-09-12",
"changes": [
"BLS 4.0 Stammdaten (dynamische Attribute, Upsert über bls_code)",
"Lernendes FDDB-Mapping ohne KI, änder- und löschbar",
"Optionale nutrition_items, Import-Policy, Fasten-/Lücken-Marken",
"BLS-Import als Hintergrundjob (kein Proxy-504)",
"Zuordnen: Katalog-Suche nach Name (Popup), nicht nach BLS-Code",
"FDDB-Listen/Rezepte importieren und Tagebuchzeilen in Zutaten auflösen",
"Zuordnungen und Listen als JSON exportieren/importieren (Dev → Prod)",
"Zuordnen: Mapping unabhängig vom Nährwert-Rebuild; eigener Katalogeintrag; Mengeneinheiten",
"Inline-Vorschläge (Haferflocken → Hafer Flocken), Bestätigen in der Zeile, Neu anlegen",
"Zuordnen: Suche und Bestätigen ohne Browser-Freeze (Index-Cache, Batch-Vorschläge, kein Seiten-Reload)",
"Zuordnen: Zeitraum 14 Tage / 4 Wochen / 90 Tage / Alle — zuerst aktuelle Tagebuchnamen",
],
},
{
"version": "0.9u",
"date": "2026-07-24",
"changes": [
"Gitea #37: Activity legacy CSV import — activity_entries feature enforcement + UsageBadge UI",
"Gitea #38: Nutrition FDDB import — UsageBadge + deaktivierte Import-Zone bei Limit",
"Gitea #71: Universal CSV — Dry-Run/Format-Check Parität import_row_processing; Mapping-Validierung bei Copy/Import; strukturierte error_details in Nutzer-UI",
],
},
{
"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",
]
},
]