- Create shared _run_clustering_pipeline() in views.py
- Manual POST, CLI, and LLM flows all call the same function
- Consistent asyncio.run() tool calls throughout (_handle_run_clustering,
_handle_extract_features) - removed _cluster_sync
- Add PCA-2D embedding to manual flow (was CLI-only)
- Fix MultipleObjectsReturned in _handle_extract_features DB save:
pass run_id from pipeline → use get() instead of get_or_create()
- 120/120 tests passing, CLI pipeline clean