# 天璇 v4 修复计划 ## TL;DR (For humans) 7个问题,24个todo。核心改动:IP子网实体聚合、多列实体、地球手动缩放、异步聚类修复、列类型值优先检测。 --- ## Problem & Approach Intent: **CLEAR** — 用户列出7个具体问题,方案可从前端/后端代码推导。无需高精度审查。 ### Issue 1 — 聚类选非数值列报错 **根因**: `_run_analysis_worker` (views.py:502) 默认取前10非_开头的列;手动向导步骤2未过滤非数值列。`_handle_run_clustering` (tool_registry.py:787-791) 虽有数值过滤,但无列给用户时返回"无可用维度"且不提示哪些可用。 **方案**: - manual.html 步骤2特征列只展示数值列(标注dtype) - `_handle_run_clustering` 报错时返回可用数值列名清单 - views.py 默认特征列选择排除实体列自身 ### Issue 2 — 地球问题 (4个子问题) **根因**: - TLS流不显示 → globe_view 只用GeoIP,未用数据列经纬度 - 经纬线 → Three.js未画辅助线 - 滚轮缩放 → 无wheel事件处理 - 复选框状态丢失 → GET表单→刷新页面→选中状态丢失 **方案**: - globe_view 优先用数据列`src_latitude/src_longitude/dst_latitude/dst_longitude`,回退GeoIP - 增强现有手动拖拽JS + 添加滚轮事件(不引入OrbitControls——three.min.js是UMD构建,OrbitControls需要ESM,不兼容) - 用 LineLoop 绘10度间隔经纬线 - 模板端将 `?runs=1,2` 参数回填到checkbox checked属性 ### Issue 3 — Django异步聚类失败 **根因**: `_run_analysis_worker` (views.py:503) 在线程中调 `asyncio.run()`。`_handle_run_clustering` 本质是同步代码(polars/numpy/sklearn,无await),`_handle_extract_features` 内有 `sync_to_async` 用于ORM。 **方案**: - `_handle_run_clustering` 提取同步核心函数 `_cluster_sync()`,worker直接调同步版 - `_handle_extract_features` 用 `asgiref.sync.async_to_sync` 包装 ### Issue 4 — 列类型靠列名而非数值 **根因**: `type_classifier.py` 优先级: config→名称匹配→值检测。名称匹配(如 _ip→IPv4)过于宽泛。 **方案**: 改为 config→值检测→名称匹配(仅值检测返回STRING时作为二次提示)。增加MAC地址、端口值模式。 ### Issue 5 — 数据列初步分析 **方案**: `scripts/column_survey.py`——standalone脚本,输出每列名称/dtype/唯一值数/空值率/前5非空样本。 ### Issue 6 — src_ip和dst_ip都作为实体 **根因**: `entity_detector.py` 只返回单 `recommended`。`_background_process` (views.py:367) 只用单列。 **实际状态**: manual.html line 46 `