# 架构演进 Backlog(长远) > 创建日期:2026-05-06 > 状态:**backlog,等优先级排期**(不在当前 F1-6 范围) > 记录人:Neo + Claude(F1-6 Sprint 2 #3 调研触发) ## 一、核心方向 **DWD 层孤立 + Core 做连接器中间件,Core 之上的全部上游(DWS / 指数 / RLS 视图等)在所有连接器之间统一规范。** ## 二、目标 1. 后期可能接入多个连接器(与 `feiqiu` 平行的其他平台,不同字段/不同设计) 2. **DWD 层归属于各连接器自身**(字段/口径可异),保留为各连接器原始数据落地层 3. **Core 层作为中间件**: - 下游对接各连接器的 DWD 层(吸收差异) - 上游输出**统一规范**的字段/语义 4. **Core 之上的所有层**(DWS、指数计算、RLS 视图、ETL 任务输出表等)结构、字段、设计、设置在所有连接器之间**完全一致** 5. 后端 / 小程序 / admin-web / tenant-admin 仅依赖 Core 之上的统一层,不感知具体连接器 ## 三、牵连(待逐一决断) 记录所有触发的牵连项,推进时逐一对齐: | # | 牵连项 | 说明 | 当前状态 | |---|------|------|---------| | 1 | 库结构重组(连接器粒度) | 当前每店铺一个 ETL 库(`etl_feiqiu` / `test_etl_feiqiu`),Neo 指示**至少每连接器一个库**,Core 后的全部上游应统一到一个共享库集中管理 | 待设计 | | 2 | DWS 字段名 vs 实算口径不一致 | F1-6 Sprint 2 #3 调研发现 `dws_member_consumption_summary.total_visit_count` 字段名"累计到店次数",实算是 `COUNT(settle_type IN (1,3))` 即结算单数(含商城订单);BD manual / dws_tasks.md 描述误导 | 待修订(随 #3 推到 Sprint 3) | | 3 | F1-6 #3 累计交易笔数 | 按 Neo 业务语义"开台次数"(不含 settle_type=3 商城订单),需 ETL 在 DWS 新增 `total_open_table_count = COUNT(settle_type=1)` 字段 | 推迟 Sprint 3(ETL 配合) | | 4 | DWD 不可被后端 / 应用层直读 | F1-6 Sprint 2 #3 调研发现 `app7_customer` AI prompt 当前直接读 `app.v_dwd_settlement_head` COUNT(*),违反"DWD 孤立"原则 | 待重构(随大架构演进) | | 5 | 后端 fdw_queries.py 中所有 `app.v_dwd_*` 直读点 | 需要梳理全部,逐一改走 Core / DWS 统一接口 | 待清单化 | | 6 | F1-7+ thin wrapper 收尾 sprint | F1-6 全部迁完后清理 fdw_queries 的 thin wrapper(详见 sandbox-replay-engine-spec.md §5.5) | 与本演进同步 | ## 四、不属于本 backlog - **F1-6 沙箱时光机阶段 B**(Sprint 1-4)— 仍按现有 ETL 库结构推进,不等本演进。Sprint 推进过程中遇到本 backlog 第 2-5 项的具体问题,各自登记到对应 Sprint 任务清单。 - **架构设计细节**(Core 层 schema 定义、库迁移策略、连接器适配 SDK 等)— 本文件仅做需求登记,详细设计待优先级到位时另起 spec。 ## 五、关联 - F1-6 Sprint 3 任务清单:[`docs/_overview/wave1-findings/F1-6-tasks.md`](wave1-findings/F1-6-tasks.md) §4 - 沙箱时光机模块 spec:[`docs/_overview/sandbox-replay-engine-spec.md`](sandbox-replay-engine-spec.md) §5.5(thin wrapper)+ §11(远期目标) - DWD 强制规则:[`apps/etl/connectors/feiqiu/CLAUDE.md`](../../apps/etl/connectors/feiqiu/CLAUDE.md) §DWD 强制规则(12 条) ## 六、决策与变更记录 | 日期 | 决策 / 变更 | 触发 | |------|------------|------| | 2026-05-06 | 创建本 backlog | F1-6 Sprint 2 #3 累计交易笔数调研发现 DWS 字段名与实算口径矛盾 + app7 直读 DWD 违规,Neo 决定将 DWD 孤立 + Core 中间件目标提上任务表 | | 2026-05-06 | 追加 §七 全局收口洞口清单 + §八 文档规范化整理大工程 | Neo 反思项目全局控制度,5 问追溯调研后立项 | | 2026-05-06 | §七 收口 #1 #2 完成 + 追加 #6~#13 + 新增 §九 全栈产品文档体系登记 | docs/roadmap/BACKLOG.md 60+ 项发现 + Wave 0 全栈文档体系实证 + 累积基线 33 项对账 | | 2026-05-06 | §七 追加 #14 AI 9 APP 全链路未完成(P0)+ 新增 §十 专题登记 | Neo 提出 AI 9 APP(8 prompt + 1 chat 实时)在接口/入库/后端处理/前端展示 4 环节有未完成,优先级很高 | | 2026-05-06 | §七 #14 主体收口(超级 Sprint)+ 追加 #15-#28 残余子任务 | 超级 Sprint 完成 49 文件改动,5 个 silent failure 修复 + chat sourcePage 全链路 + WS 鉴权;新发现 14 项独立子任务登记 | --- ## 七、全局收口洞口清单(2026-05-06 反思,逐项收口) ### 触发背景 Neo 发现"项目全局的控制度不够,有很多东西被漏了,到处都没有收口"。 经 5 问追溯调研(子代理 + Bash 实证),发现以下 5 个未收口洞口。 ### 收口清单 | # | 洞口 | 来源证据 | 状态 | 优先级 | 处理方式 | |---|------|---------|------|--------|---------| | 1 | **3 项迁移后功能验证** | `docs/audit/changes/2026-05-02__claude_code_migration.md` L111-113 | ✅ 2026-05-06 已收口 | P1 | 实测 PASS:5 slash 命令文件 + 8 subagent 文件 + 双测试库 SELECT 1 全通过;详见 `2026-05-06__closure_p1_1_migration_post_verification.md` | | 2 | **2026-04-15 ~ 05-02 累积基线 33 项对账** | `docs/audit/changes/2026-05-04__cumulative_baseline_pending_verification.md` | ✅ 2026-05-06 已对账 | P1 | 子代理对账:23 完成(70%)+ 5 部分 + 5 真正未收口(转登记 #9~#13);详见 `2026-05-06__closure_p1_2_cumulative_baseline_reconciliation.md` | | 3 | **F1-6 Sprint 3 范围描述误导** | F1-6-tasks.md §4 把 MP-2 单项 ETL 依赖错误暗示成 Sprint 3 整体不可做 | ✅ 2026-05-06 已修订 | P0 | F1-6-tasks.md §4 已修订:Sprint 3a(5 个 P1 可独立做)+ Sprint 3b(MP-2 + #11 等 ETL) | | 4 | **etl-coupon-detail 30+ "待调研"标注** 4 个月未定 | `docs/specs/etl-coupon-detail/` | ⏳ 灰色 | P2 | 待 Neo 评估是否 Wave 1 解决 | | 5 | **Sprint 3 / 4 衔接判断错误** | Claude 在 Sprint 2 收尾时推荐"跳过 Sprint 3"是错误判断 | ✅ 2026-05-06 已纠正 | P0 | Sprint 2 收尾后正确顺序 = Sprint 3 (5/6 项可做) → Sprint 4 | | 6 | **`docs/roadmap/BACKLOG.md` 60+ 项 P0-P2 待办** | `docs/roadmap/BACKLOG.md`(2026-03-27 更新,258 行)| ⏳ **乍一看适用,但需细化对账** | P1 | **Neo 指示**:大多数任务"乍一看都适用",但很多逻辑细节值得再深入调研 — 有些已不适用 / 有些与现状冲突 / 有些被更好方式实现了。**不能简单"批量标已完成"或"批量标待办"**。需逐项做细化对账(可能与 Wave 1/F1 工作有大量交叠)。本身是一个独立的中等工作量任务(~ 2-3h),建议作为独立"BACKLOG.md 复核 sprint"启动 | | 7 | **`docs/roadmap/2026-02-24__fdw-dwd-to-core-migration-plan.md`** FDW 迁移方案 | `docs/roadmap/2026-02-24__fdw-dwd-to-core-migration-plan.md` | ⏳ 待对照 | P2 | 与 backlog §一 "DWD 孤立 + Core 中间件"目标完全一致,实际是同一目标的更早期 spec。需对照本 backlog §一确认是否仍代表当前方向,或已被本 backlog 取代 | | 8 | **Wave 0 全栈产品文档体系**(已完成,但需登记并纳入 §八文档规范化范围)| `docs/_overview/01-product-overview.md` 等 5 篇 | ✅ Wave 0 完成 | — | 详见 §九新增登记;文档规范化大工程(§八)是其下一阶段,即"对完整体系进一步精化和重构,零信息损失" | | 9 | (累积基线遗留)缓存分桶 + EventBus 生产观察 | 累积基线 3.1.3 | ⏳ 未收口 | P2 | F1-6 sprint 3 完成后补 audit | | 10 | (累积基线遗留)WebSocket 消费稳定性 | 累积基线 3.1.7 | ⏳ 未收口 | P2 | 上线灰度期(5-7 ~ 5-15)长期观察 | | 11 | (累积基线遗留)ETL 库完整 GUC 传递 26 视图 | 累积基线 3.5.5 | ⏳ 未收口 | P1 | 推迟 F1-5b Wave C(已规划)| | 12 | (累积基线遗留)finance_area_daily 会员分桶 vs DWS 规范 | 累积基线 3.7.2 | ⏳ 未收口 | P1 | 数据质量 Review,上线灰度期 | | 13 | (累积基线遗留)RLS 视图 pg_get_viewdef 全量重建 | 累积基线 3.7.3 | ⏳ 未收口 | P1 | 数据质量 Review + 视图清单专题 audit | | **14** | **AI 9 APP 全链路未完成**(接口/入库/后端处理/前端展示)| Neo 2026-05-06 提出 | ✅ 2026-05-06 主体收口(超级 Sprint)| **P0** | 详见 [`2026-05-06__w1_ai_closure_super_sprint.md`](../audit/changes/2026-05-06__w1_ai_closure_super_sprint.md) — 49 文件改动 + 1 数据库迁移 + 5 个 silent failure 修复 + chat sourcePage 全链路接通 + WS 鉴权;残余 14 项独立子任务登记为 #15-#28 | | 15 | `/api/retention-clue` POST/DELETE 三端点无认证(P0-3 安全洞)| 超级 Sprint 调研发现 | ⏳ 未收口 | 🔴 **P0** | **Sprint 后立即独立修** — 加 `Depends(require_approved)` + site_id 从 JWT | | 16 | 时光机日期切换 AI 数据初始化机制 | Neo 2026-05-06 提出 | ⏳ 未收口 | P1 | F1-6 阶段 B 必做 — 切日期时该实例 cache 空触发批量初始化 + 预算保护 | | 17 | App8 落库静默吞排查(67 cache → 44 入库,差 23 条)| 超级 Sprint 调研发现 | ⏳ 未收口 | P1 | 独立 audit 数据质量 review | | 18 | App3 daily budget 超限 45% 失败率 | 超级 Sprint 调研发现 | ⏳ 未收口 | P2 | 生产灰度前复核 daily 预算上限 | | 19 | tenant-admin 新增"创建维客线索"功能(POST 端点 + UI)| 超级 Sprint 调研:source='manual' 字段已设计但 UI 录入入口缺失 | ⏳ 未收口 | P2 | 独立 M sprint(~ 2h):POST 端点 + 前端表单 + 用户校验 | | 20 | MCP 沙箱场景 B 走查(切沙箱模式只读验证)| 超级 Sprint 跳过(避免污染 prod)| ⏳ 未收口 | P2 | F1-6 阶段 B 必做 | | 21 | RLS 迁移(P1-1 public → biz schema + app.v_*)| Neo 已批选 A 但未执行 | ⏳ 未收口 | P1 | F1-6 阶段 B 收尾后 | | 22 | chat-history 新建/删除按钮 | 超级 Sprint UX 增量 | ⏳ 未收口 | P2 | 独立小 sprint | | 23 | `ai_conversations.source_page/source_context` 冗余孤儿列(已建未用)| 超级 Sprint 调研发现 | ⏳ 未收口 | P2 | 决策弃用还是启用 | | 24 | admin-web 全 snake_case → camelCase 大改造 | 超级 Sprint 调研:admin 与 xcx 端命名风格分裂 | ⏳ 未收口 | P2 | 影响面巨大,独立 sprint | | 25 | admin-web WS 客户端补 `?token=` query 参数 | 超级 Sprint P0-9 仅修后端 | ⏳ 未收口 | 🔴 **P0 安全** | **与 #15 一起立即修** — 否则 admin 监控页 WS 全部 close 4401 | | 26 | prompt/Pydantic/前端类型四端单一权威源 spec | 超级 Sprint 调研发现 | ⏳ 未收口 | P2 | 架构级,需 spec | | 27 | `cache_service._row_to_dict` datetime 强转 ISO 字符串丢 tz | 超级 Sprint 调研登记 P1 但未做(怕破坏现有调用方)| ⏳ 未收口 | P2 | 改保留 datetime 对象,由 Pydantic 序列化 | | 28 | `ai_run_logs.assistant_id` 列已加,历史回填仍未做(不阻塞功能,定位用) | 超级 Sprint 仅加列 | ⏳ 未收口 | P2 | 独立回填脚本(可选)| | 29 | `_text_coach_detail` SQL `hire_date` 列不存在 | 复盘 chat 上下文走查实证 | ⏳ 未收口 | P1 | 看 dim_assistant 实际列名,改 SQL — 影响 coach-detail 入口 chat 上下文 | | 30 | `_text_board_finance` SQL `items_sum` 列不存在(应用 DWD-DOC #1 合成表达式) | 复盘 chat 上下文走查实证 | ⏳ 未收口 | P1 | 改用 `(table_charge_money + goods_money + assistant_pd_money + assistant_cx_money + electricity_money)` 或对应 v_dws 视图字段 — 影响 board-finance 入口 chat 上下文 | | 31 | `_text_board_customer` SQL `sh.items_sum` 同 #30 | 复盘 chat 上下文走查实证 | ⏳ 未收口 | P1 | 同 #30 解法 — 影响 board-customer 入口 chat 上下文 | | 32 | `_text_performance` SQL `sc.performance_tier` 列不存在 | 复盘 chat 上下文走查实证 | ⏳ 未收口 | P1 | 看 dws_assistant_task_monthly 等表实际列,改 SQL — 影响 performance 入口 chat 上下文 | | 33 | **App1 chat 调用全链路审计** — 拉起参数完整性 / 本地 MCP 查询 / 沙箱边界收口 | Neo 2026-05-06 提出 | ⏳ 未收口 | **P1** | 详见 §十一(独立专题登记)— 独立 sprint 评估 | | 34 | **百炼调取 + 本地 SQL MCP 任务** 全部接入主任务线追踪 | Neo 2026-05-06 提出 | ⏳ 未收口 | **P1** | 详见 §十二(独立专题登记)— 独立 sprint 评估 | | 35 | chat md 渲染:`---` 水平分割线未特殊处理(被当作普通段落) | 复盘 chat md 走查发现 | ⏳ 未收口 | P2 | `mdToRichHtml` 加 `