迭代19-21收尾: 指示灯自适应探测(R-022/R-023)+ 列设置拖拽排序(R-024)+ Tab设置间隙线统一(R-025)+ 需求池归档(R-014/15/16/17/19 → 已完成)

This commit is contained in:
2026-09-10 14:04:51 +08:00
parent 8782aa9c50
commit 3dfa39b8bf
29 changed files with 1216 additions and 72 deletions
+60
View File
@@ -0,0 +1,60 @@
# 需求:R-021 神之一手数据加入会话(对象目录 + 添加机制;复盘为第一用例)· 已定稿(部分暂定)
> 登记:2026-09-08 来源:老师指令(原 R-019 + R-021 合并演进)| 状态:**已定稿(暂定项见文末)**
> 归属:迭代 17-策略会话(Phase 0)| 计划:PLAN-017 | 实现状态:已立项(设计阶段)
## 需求本质(2026-09-08 再定调,老师)
> **总体是:会话(agent)可以获取"神之一手"的数据;复盘只是 agent 获取到对应数据后的一种用法。本需求要确定两件事:① 数据怎么添加到会话 ② 哪些数据可以加。**
> (策略会话、粒度复盘、未来的盘中问答/分析 都是同一能力的消费方式——主干 = 「神之一手数据 → 会话」能力。)
## 一、数据怎么添加到会话(机制)——暂定 2026-09-08
| 维度 | 暂定结论(AI 建议,老师"暂定" | 开放注记 |
|---|---|---|
| 触发动因 | **A:人挑对象加入**——在数据展示处/会话内选一个"数据对象",生成它的数据上下文进会话 | B(agent 按需取数工具)不采纳,维持 R-019"预注入不挂工具"拍板;日后盘中问答需要实时取数时再独立讨论 |
| 注入形态 | 每个对象 = 一条只读「数据上下文」(折叠条目/引用),含快照时间;同对象重复加 = 新快照追加(不覆盖旧),模型以最近为准 | 通道形态待宿主技术调研 |
| 数据时效 | 注入"加入那一刻"的只读快照;要最新 = 重新添加 | — |
## 二、哪些数据可以加(对象目录)——候选目录,首批范围暂定
### 神之一手数据对象目录(候选全量)
账户:账户资金/资产、全部持仓(对账单快照)| 策略:策略(分组下持仓与交易)| 持仓:当前持仓行、历史(已清仓)持仓| 轮次:某一轮交易周期(round,待建模)| 交易:单笔委托/成交| 关系视图:持仓 ↔ 交易| 行情:单 code 现价(随行,不单独成对象)| 汇总:策略汇总/未分配/同步健康 | 未来:决策日志/统计/复盘记录(Phase 1/3
### 首批范围(复盘闭环所需,暂定草案,待老师细调)
| # | 对象 | 加入后 agent 拿到的数据上下文(草案) | 为什么复盘需要 |
|---|---|---|---|
| P1 | 策略 | 策略定义 + 当前持仓 + 关联交易聚合摘要 | 整策略复盘/会话依据 |
| P2 | 持仓(当前/历史) | 持仓完整档案:基本信息+自定义字段+建仓至今买卖链+现价盈亏+(历史=清仓信息) | 复盘一个持仓 |
| P3 | 持仓↔交易关系 | 该持仓全部关联委托/成交(按 holding 聚合) | 追溯买卖过程 |
| P4 | 单笔委托 | 时间/方向/量/价/费用/归属 + 该持仓上下文 | 复盘某次动作 |
| P5 | 轮次 round | 一轮建→平 全动作+结果(需本轮引入 round 建模) | 复盘最小单元(网格/做T 一轮) |
| P6 | 行情随行 | 对象行内现价/涨跌等(不单独成对象;历史 K 线不在本期数据域) | 复盘需当前价对照 |
**候选后补**:账户资产 / 全部持仓对账单 / 策略汇总 / 未分配 / 同步健康(供 Phase 1 盘中辅助与 Phase 2 日结)。
## 三、用例视角(复盘仅是用法之一)
- 复盘 = 挑对象(P1-P6 任意组合,通常 P2/P3/P4/P5)→ 数据上下文进会话 → agent 基于事实线引导复盘 → 结论留会话;
- 其他用例(未来消费方式):盘中状态问答、策略分析、计划讨论——同一"对象目录 + 添加机制"。
## 定稿边界(合并两轮结论)
**做**:数据对象目录 + 添加机制(人挑对象 → 只读数据上下文注入会话);首批对象数据上下文生成;折叠条目呈现;换/刷新/叠加;round 建模(若 P5 首批保留)。
**不做**:DSH 宿主工作区;账本写与交易执行;agent 按需取数工具(暂定);复盘结论落库/统计/决策日志实现(Phase 1/2/3,预留模型位);历史 K 线注入;通用数据视图(全部持仓/交易记录)作为对象目录外的会话依据特例——(对象目录已含"全部持仓",是否启用由首批范围定)。
## 待定/开放项
1. 首批对象范围与 P1-P6 取舍(老师可增删,含是否本期引入 round=P5);
2. 宿主注入通道形态(技术调研);
3. 各对象"数据上下文"的精确字段规格(服务端实现细节,技术方案阶段);
4. 会话侧呈现细节(UI 交互设计延后,老师先前指令)。
## 关联
- 迭代 17-策略会话(Phase 0)| R-010(持仓↔交易关系载体)| 终极目标-002/006/007
- 未来:Phase 1 决策留痕/盘中辅助、Phase 2 日结统计、Phase 3 复盘库(产品逻辑设计 §0.5)
- 归档:R-019 已并入本需求(已完成/R-019.md 为讨论史存档)
## 验收
**(技术方案定稿后补入 04-迭代记录/17-策略会话/验收标准.md)**
+37
View File
@@ -0,0 +1,37 @@
# 需求:R-022 QMT 连接健康灯自适应探测(Bridge 启动/恢复后快速回绿)· 讨论中
> 登记:2026-09-09 | 来源:老师反馈(会话头部 QMT 指示灯)| 状态:**讨论中(AI 提议定稿,待老师确认)**
> 归属:迭代 19-指示灯状态自适应探测(R-022:QMT 健康灯)| 实现状态:已实现(待验收)
## 症状(老师反馈,2026-09-09
启动 QMT Bridge 后,会话头部四个指示灯中「持仓数据 / 行情数据 / MCP」几秒内自动点亮,
唯独「QMT连接」灯一直不亮(停留在红/灰态)——「QMT 连接状态自动检查好像没有生效」。
## 根因
QmtHealthMonitor 只在**插件启动时 + 每 5 分钟**探测一次激活 Bridge /health2026-09-01 迭代 04 定的
「服务端 5 分钟定时探测 + 缓存」机制),结果缓存内存;前端 10s 轮询 sync-status 只读缓存、不触发探测。
其余三灯靠高频自愈回路:PositionSync 10s / QuoteSync 5s 定时拉 Bridge、MCP 客户端自带失败重连,
Bridge 恢复后秒级回绿。唯独健康缓存要等满 5 分钟下一次探测——Bridge 在两次探测间启动/恢复时,
灯长期停留在上一次失败结果,观感即「自动检查没生效」(反向同理:Bridge 中途宕机,灯最多 5 分钟不转红)。
## 方案(AI 提议,老师拍板确认)
**自适应探测节奏(owner = QmtHealthMonitor,单点改动)**
- 健康 → 每 5 分钟探测一次(**稳态,维持原设计低开销**);
- 异常/未知(含从未探测成功)→ **每 10 秒快速重试**(与前端 sync-status 10s 轮询对齐,
与持仓/行情 5-10s 恢复节奏一致)——Bridge 启动后灯 ≤20s 自动回绿。
**边界(不做)**:前端读缓存秒回不变;API/前端零改动;健康稳态间隔不放宽不放窄(5 分钟不变);
不新增配置项(间隔为常量,测试经构造参数注入);不做 read-path 触发探测(定时器已覆盖,避免耦合)。
## 决策记录
| 项 | 结论 | 讨论 |
|---|---|---|
| 异常重试间隔 | 10s | 与前端 10s 轮询对齐;5s 会翻倍失败探测开销(每次失败探测最长挂 5s 超时) |
| 健康稳态间隔 | 5 分钟维持 | 原设计为省探测开销;异常态才快速重试,健康态不空转 |
| 防并发/调度 | setTimeout 链 + _inFlight 去重 | 沿用原防并发语义;手动探测/热切换共用同一节奏重排 |
| baseUrl 解析异常 | 落 healthy:false 缓存走快速重试 | 原实现解析在 try 外,异常会丢缓存导致灯灰且不重试 |
+36
View File
@@ -0,0 +1,36 @@
# 需求:R-023 MCP 状态灯自适应探测(MCP 服务恢复后自动回绿)· 讨论中
> 登记:2026-09-09 | 来源:老师反馈(R-022 之后实测 MCP 灯同样不自动恢复)| 状态:**讨论中(AI 提议定稿,待老师确认)**
> 归属:迭代 19-指示灯状态自适应探测 | 实现状态:已实现(待验收)
## 症状(老师反馈,2026-09-09
QMT 健康灯修复后复查发现:会话头部 MCP 指示灯也存在同样的「状态不自动恢复」——
MCP 服务(QMT Bridge /mcp)启动/恢复后,MCP 灯停留在上次失败态,不会自动回绿。
## 根因
QmtMcpManager 的**状态缓存只在 挂载 / 配置切换 / 手动探测(点击「检测 MCP」)时刷新**,无任何定时回路;
sync-status 端点每 10s 读的只是这份缓存。dsh-mcp-client 自带的 reconnect 只恢复**真实连接**
(fiber 层),并不刷新插件自己的状态缓存——所以「连接恢复了、灯还是红的」。
## 方案(AI 提议,与 R-022 同模式,owner = QmtMcpManager
**结果驱动自适应探测**(对齐 QmtHealthMonitor):
- connected → 每 5 分钟探测一次(稳态,低开销);
- 非 connectederror/异常)→ **每 10 秒快速重试**——MCP 服务恢复后灯 ≤20s 自动回绿;
- 无激活连接(url 为空)不探测不调度;dispose() 后停止调度;
- 探测仍走 SDK 独立只读握手(Client connect → initialize + tools/list),与 dsh-mcp-client 自管连接互不干扰。
**边界(不做)**:不接管/不替代 dsh-mcp-client 的重连(那是真实连接层,保持现状 Q5);
不新增配置项(间隔为常量,测试经构造参数注入);前端/API 零改动(getStatus 读缓存语义不变)。
## 决策记录
| 项 | 结论 | 讨论 |
|---|---|---|
| 非连接态重试间隔 | 10s | 与前端 sync-status 10s 轮询、R-022 QMT 灯一致;MCP 探测最坏挂 8s 超时,快失败场景成本可忽略 |
| 已连接稳态间隔 | 5 分钟 | 与 R-022 一致;MCP 握手比重(initialize+tools/list),健康态不空转 |
| 调度停止条件 | 无激活连接 / dispose / unmount | 无 url 时探测早退置 disabled 并取消定时器,避免空转 |
| 并发防护 | _probing 去重(同 QmtHealthMonitor._inFlight | 定时器与手动/热切换探测可能撞车 |
+40
View File
@@ -0,0 +1,40 @@
# 需求:R-025 设置页 Tab 设置排序落点统一为间隙高亮线 · 已定稿
> 登记:2026-09-10 | 来源:老师指令(迭代 20 复盘遗留第 2 项确认)| 状态:**已定稿(2026-09-10 老师指令)**
> 归属:迭代 21-Tab设置排序间隙高亮统一 | 实现状态:未开始
## 诉求(老师,2026-09-10
> 神之一手设置页的分组 tab 排序(Tab 设置),也改一下上面(列设置弹层)的拖动高亮显示形式。
## 背景
- R-024/迭代 20 列设置弹层拖拽落点已从整行高亮改为**行间间隙高亮线**(UI约束-007),老师确认「直观多了」;
- 复盘遗留第 2 项:设置页「Tab 设置」的排序仍是整行高亮(overId → 行淡蓝底,UI约束-003),存在同样的
「无法判断插入前/后」观感问题;老师指令统一为间隙线形式。
## 定稿结论(2026-09-10 老师指令)
设置页「Tab 设置」排序落点从整行高亮改为**行间间隙高亮线**(复用 UI约束-007 / R-024 已验证模式):
- 拖动悬停时按鼠标在目标行内的 Y 坐标(上半/下半)判定,间隙线画在目标行上缘(插其前)/下缘(插其后);
- drop 事件内按坐标重算插入位置(不依赖 state 闭包);拖回原位置(to===from 或 to===from+1)跳过写库;
- 保留 onDragEnd 清理残留;整行高亮背景(color-mix 12%)移除;
- 其余维持不变:≡ 手柄、显隐开关、落点立即持久化(tabs/update)、「刷新页面后生效」提示、内置/策略徽标、
saving 期间禁用拖拽。
## 决策记录
| 项 | 结论 | 讨论 |
|---|---|---|
| 范围 | 仅 Tab 设置(SettingsSection.jsx TabSettings)落点指示 | 老师指令;不动表格结构、不动持久化、不动开关 |
| 落点形式 | 行间间隙高亮线(上缘=前/下缘=后) | 与 R-024 弹层全同,UI约束-007 已定义 |
| 判定 | 目标行内 Y 坐标上下半区 | 与 R-024 全同 |
| 无操作 | to===from 或 to===from+1 跳过写库 | 复用 R-024 数学式 |
| 服务端/API | 零改动 | tabs/update 整表语义不变 |
| 约束更新 | UI约束-003 变更:落点从整行高亮改间隙线;UI约束-007 补「Tab 设置已统一」 | 2026-09-10 老师指令 |
## 关联
- 上游:UI约束-007(排序交互间隙线标准)、R-024(同款模式实证)、迭代 20 复盘遗留第 2 项;
- 迭代 20 复盘遗留第 1 项(test-r013-columns 期望过期)不在本需求范围。
@@ -3,6 +3,12 @@
> 登记:2026-09-02 | 来源:架构梳理讨论 + 老师指令 | 状态:**已定稿(老师逐项拍板 4 问)**
> 归属:迭代 12 计划:PLAN-013
> **归档头(2026-09-08** | 需求状态:已完成 | 归档日期:2026-09-08 | 实现迭代:12-持仓内存快照(持仓内存快照)
> 讨论记录索引:R-014.md 正文;实现细节见 04-迭代记录/12-持仓内存快照/
> 归档路径:05-需求池/已完成/R-014.md
> 迭代状态标记:已实现(迭代 12,回归 34/34 + typecheck + build 通过)→ 已归档(2026-09-08 老师归档指令确认验收)
## 需求描述
原实盘持仓数据在**每次请求时穿透 QMT**(`PositionManager.getAllPositions()` 实时拉 `/trade/positions`),带来两个问题:
@@ -29,4 +35,4 @@
## 验收
`docs/04-迭代记录/12-持仓内存快照/验收标准.md`
`docs/04-迭代记录/12-持仓内存快照/验收标准.md`
@@ -3,6 +3,12 @@
> 登记:2026-09-02 | 来源:架构演进讨论(老师逐项拍板)| 状态:**已定稿**
> 归属:迭代 13 计划:PLAN-014
> **归档头(2026-09-08** | 需求状态:已完成 | 归档日期:2026-09-08 | 实现迭代:13-盘口内存快照(盘口数据内存化+指示灯)
> 讨论记录索引:R-015.md 正文;实现细节见 04-迭代记录/13-盘口内存快照/
> 归档路径:05-需求池/已完成/R-015.md
> 迭代状态标记:已实现(迭代 13test-quote-sync 全绿 + 存量回归通过)→ 已归档(2026-09-08 老师归档指令确认验收)
## 需求描述
持仓数据已完成「内存快照统一管理」(R-014/迭代 12)。本轮把**盘口(市场行情)数据**收敛为同一模式:
@@ -25,4 +31,4 @@
## 验收
`docs/04-迭代记录/13-盘口内存快照/验收标准.md`
`docs/04-迭代记录/13-盘口内存快照/验收标准.md`
@@ -3,6 +3,12 @@
> 登记:2026-09-07 | 来源:老师指令(优化功能需求讨论)| 状态:**已定稿(2026-09-07Q1-Q7 老师拍板)**
> 归属:迭代 14 | 计划:PLAN-015 实现状态:**已实现(2026-09-07,待老师人工验收)**
> **归档头(2026-09-08** | 需求状态:已完成 | 归档日期:2026-09-08 | 实现迭代:14-策略tab历史持仓展示(策略 tab 历史持仓展示)
> 讨论记录索引:R-016.md 正文;实现细节见 04-迭代记录/14-策略tab历史持仓展示/
> 归档路径:05-需求池/已完成/R-016.md
> 迭代状态标记:已实现(迭代 14)→ 已归档(2026-09-08 老师归档指令确认验收)
## 需求描述(老师原始诉求)
**两个策略 tab**(做T / 网格超市)**title 旁边**添加以下功能:
@@ -60,4 +66,4 @@
## 验收
`docs/04-迭代记录/14-策略tab历史持仓展示/验收标准.md`
`docs/04-迭代记录/14-策略tab历史持仓展示/验收标准.md`
@@ -4,6 +4,12 @@
> 归属:迭代 15 | 计划:PLAN-016 实现状态:**已实现(2026-09-07,待老师人工验收)**
> 前置:R-016「关联观察」所列问题的正式立项(清仓后当日委托无法通过下拉关联到对应 holding,2026-09-07 大连热电实际发生——盘中手动归属后又被清为未关联,下拉已无手动做T候选)。
> **归档头(2026-09-08** | 需求状态:已完成 | 归档日期:2026-09-08 | 实现迭代:15-归属候选纳入清仓持仓(归属候选纳入近期清仓持仓)
> 讨论记录索引:R-017.md 正文;实现细节见 04-迭代记录/15-归属候选纳入清仓持仓/
> 归档路径:05-需求池/已完成/R-017.md
> 迭代状态标记:已实现(迭代 15)后被 R-018 语义取代退役 → 已归档(2026-09-08
## 需求描述
交易记录 tab 的归属候选(orders/attribution-candidates)只回**当前持仓**——清仓后(幽灵清仓最快约 30s 转历史)当日委托在下拉中失去对应策略/持仓锚点,无法补关联。本轮:**候选 = 该 code 的当前持仓 + 近 7 天清仓的持仓**,清仓行带标记供 UI 区分展示。
@@ -27,4 +33,4 @@
## 验收
`docs/04-迭代记录/15-归属候选纳入清仓持仓/验收标准.md`
`docs/04-迭代记录/15-归属候选纳入清仓持仓/验收标准.md`
@@ -3,6 +3,11 @@
> 登记:2026-09-08 | 来源:老师指令(新需求)| 状态:**已定稿(2026-09-08F1/F2 老师确认)**
> 归属:迭代 17(待立项)| 计划:待出(PLAN-017)| 实现状态:未开始
> **归档头(2026-09-08** | 需求状态:已完成(并入合并需求)| 归档日期:2026-09-08
> 合并承接:**R-021(策略会话复盘)**——老师 2026-09-08 指令将 R-019 与 R-021 合并、逻辑整合入 R-021;本文件为 R-019 线讨论史存档(Q1-Q4/R2-Q1..Q4/R3/F1-F2
> 归档路径:05-需求池/已完成/R-019.md
## 需求描述(老师原始诉求,原话)
> **新需求,让 AI 会话可以以策略为 Workspace。**
@@ -71,4 +76,4 @@
## 验收
**(计划/迭代立项后写入迭代验收标准.md)**
**(计划/迭代立项后写入迭代验收标准.md)**
+46
View File
@@ -0,0 +1,46 @@
# 需求:R-024 策略 tab 列设置改为拖拽排序 · 已完成
> 归档日期:2026-09-10 | 需求状态:已完成 | 实现迭代:[迭代 20-策略列设置拖拽排序](../04-迭代记录/20-策略列设置拖拽排序/迭代复盘.md)
> 讨论记录索引:本文档(定稿 + 变更记录);登记:2026-09-10 | 来源:老师反馈(策略 tab 列设计细节优化)
> 实现状态:**已实现(迭代 20 验收通过,2026-09-10 老师页面确认)**
## 诉求(老师,2026-09-10
> 细节优化,策略 tab 下的列设计,可否做成鼠标选中后、**拖动排序**的形式?
## 现状
策略 tab「列设置」弹层(ColumnSettingsPopoverR-013 迭代 11 实现)管理可配置列(基础数据列 + 自定义字段列):
- 显隐:复选框勾选;
- 排序:**↑↓ 箭头按钮**(连续点按移动),保存按钮提交整份列配置(one-divine-lot/strategy-columns/update);
- 代码注释原话:「同 Tab 设置简化版:用箭头替代 DnD,零依赖稳妥」——当时刻意简化。
## 定稿结论(2026-09-10 老师确认方案 A
**方案 A:列设置弹层内拖拽排序(原生 HTML5 DnD,复用 R-011 Tab 设置已验证模式)**
- 弹层每行加 **≡ 拖拽手柄**(整行 draggable),按住拖动到目标行松手即重排;落点行高亮提示,视觉沿
Tab 设置(UI约束-003)同一套:color-mix(primary 12%) 淡底。
- **落点立即持久化**(对齐 Tab 设置体验):每次 drop 调一次 one-divine-lot/strategy-columns/update
整表提交(含不可见列保位置);点按手势(勾选显隐 / ↑↓ 微调)同步立即持久化 → **弹层去掉「保存」按钮,
只留「关闭」**,Toast 反馈保存结果。
- **↑↓ 箭头保留作兜底**(精准微调场景,与拖拽并存)。
- 固定列(代码/名称/操作/展开箭头)不参与排序,恒显示(维持现状)。
- 边界:不改服务端 APIstrategy-columns/update 已是整表覆盖语义,天然兼容);核心改动在
ColumnSettingsPopover.jsx 单文件;显隐勾选交互不变。
## 决策记录
| 项 | 结论 | 讨论 |
|---|---|---|
| 拖拽范围 | 方案 A:弹层内拖拽(≡ 手柄) | 老师 2026-09-10 确认;方案 C(表头直拖)改动大、需兼容百分比排序点击,暂不做 |
| 持久化时机 | 落点立即持久化(每次变更即写库) | 对齐 Tab 设置(UI约束-003)体验;strategy-columns/update 为整表覆盖语义,天然支持 |
| ↑↓ 箭头 | 保留作兜底 | 与拖拽并存,兼顾精准微调;不增加额外依赖 |
| 保存按钮 | 移除(改「关闭」) | 所有变更即时持久化后按钮失去意义,避免「忘了点保存」 |
| 服务端 | 零改动 | strategy-columns/update 已是整表覆盖 |
## 变更记录(追加式)
| 日期 | 变更 | 原因 |
|---|---|---|
| 2026-09-10 | 拖拽落点提示从**整行高亮**改为**行间(两列之间)间隙高亮线**,指示精确插入位置(前/后) | 老师反馈:整行高亮只能看出落在哪一行,无法判断会插入目标列的前面还是后面;间隙高亮是主流列表拖拽交互(Tab 设置的整行高亮是否同样调整待老师评估,见 UI约束-007) |