PMFlow/docs/architecture/DATAFLOW.md

34 lines
1.8 KiB
Markdown

# 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.