# DATAFLOW ## Signal Planner Flow (Post-Commit Async) 1. `AIPMOKernelService` creates signal (`signal.create`) in transaction. 2. Transaction commits. 3. Background task triggers `SignalPlannerService.analyze(signal_id, tenant_id, ...)`. 4. Planner service opens isolated `AsyncSessionLocal` and loads context: - signal content/project context - project members (`user_projects -> users -> user_workloads -> user_skill_bindings -> skill_tags`) 5. Planner calls `llm_service.generate_structured_object(function_name="signal_planner_analyze")` with hard wait timeout (`25s`). 6. Structured success: - `SignalStrategicAnalysisService.merge_and_save(...)` - update `signals.planner_status=completed` - write planner payload into `strategic_analysis.ai_planner` 7. Structured invalid / timeout fallback: - build degraded planner payload (`fallback_mode=true`) - still `merge_and_save(...)` and mark `signals.planner_status=completed` 8. Hard failure (DB write / unexpected exception): - `SignalStrategicAnalysisService.mark_failed(...)` - update `signals.planner_status=failed` - try enqueue compensate reply via `FeishuOutboxService.enqueue(...)` ## Model Routing Flow 1. Frontend `ModelRoutingConfigPage` reads current mapping via `/model-routing/functions/{function_name}`. 2. Manager updates mapping via PUT API. 3. Backend persists override into `integrations(type='model_routing')`. 4. `LLMService` resolves function-level override at runtime before default control-plane rules. ## Task Brief Flow 1. Frontend chooses template / trigger generate. 2. Backend `task_brief_service` stores template and run records in `integrations(type='task_briefs')`. 3. Generation run writes summary + artifact path. 4. `/task-briefs/center` aggregates latest generated cards for sidebar center.