diff --git a/docs/superpowers/handoffs/em-full-direction-visualization/phase-06.md b/docs/superpowers/handoffs/em-full-direction-visualization/phase-06.md new file mode 100644 index 0000000..38b0ad3 --- /dev/null +++ b/docs/superpowers/handoffs/em-full-direction-visualization/phase-06.md @@ -0,0 +1,144 @@ +# EM 完整方向段可视化修复 — Phase 06 交接 + +## 状态 + +完成,2026-08-07。 + +启动分支为 `trajplanner`,启动 HEAD 为 `8b82467618759294c4ccf810bf0699ca804171b8`(Phase 05 handoff)。已确认 `d33257c`、`8b82467` 均为本阶段启动 HEAD 的祖先。 + +本阶段实现提交: + +- `05cfd673f504d5ecee000ab9b85c7346436f2076` — `fix: repair EM observation web charts` + +本交接文件单独提交;其真实提交哈希由提交后的最终答复提供给 Phase 07。 + +## 目标与非目标 + +完成主计划 Task 8、阶段执行计划 Task 6:真实 DOM/SVG 测试与 Web 渲染修复。 + +未进入 Task 9+、Native Painter、跨段规划扩展或实车操作,未实现缩放。MovementTest 保持 `OBSERVE_ONLY`,本阶段未触碰任何底盘、转向、制动、电机或换挡写输出。 + +## 修改文件 + +实际修改: + +- 创建:`ClumsyPilot/tests/TrajectoryPlanningVisualizationWebDom/package.json` +- 创建:`ClumsyPilot/tests/TrajectoryPlanningVisualizationWebDom/package-lock.json` +- 创建:`ClumsyPilot/tests/TrajectoryPlanningVisualizationWebDom/dashboard.dom.test.mjs` +- 修改:`ClumsyPilot/TrajectoryPlanningVisualization/Web/app.css` +- 修改:`ClumsyPilot/TrajectoryPlanningVisualization/Web/app.js` +- 修改:`ClumsyPilot/tests/TrajectoryPlanningVisualizationVerificationHost/WebAssetChecks.cs` + +白名单内 `index.html` 未改动:现有四页结构已满足 Task 8,无需重做布局。 + +## 新增或改变的接口 + +- 新增测试专用 Node 包,锁定 `jsdom` 29.1.1,`engines.node >= 24`,脚本为 `node --test dashboard.dom.test.mjs`。 +- `window.__TRAJECTORY_VISUALIZATION_TEST__ === true` 时,`app.js` 暴露冻结的 `window.__trajectoryVisualizationTestHooks`: + `setBootstrap`、`receiveFrame`、`renderActiveTab`、`installTabs`;不暴露内部 `state`,不启动 fetch/SSE。生产路径仍调用 `boot()`。 +- `app.css` 使用 `main > section[hidden] { display: none !important; }` 修复分页隐藏覆盖,并增加 y 轴刻度、语义路径、车辆/边界标记和空状态类。 +- `app.js` 新增 `niceDomain`、`formatTick`,渲染 x/y 双轴刻度及 `.axis-label-x` / `.axis-label-y`;非零常数域围绕实际值生成可读对称范围。 +- 世界图层按 coarse、Local G2、方向段、previous、current 的语义顺序绘制,并渲染车辆小轮廓、细朝向线、计划起点、换向点和最终目标标记。 +- 路径总览无可绘制路径时显示“未收到 Local G2 路径”,不留下无解释空白画布。 + +## RED / GREEN / 回归证据 + +RED: + +```powershell +npm install --package-lock-only --prefix ClumsyPilot/tests/TrajectoryPlanningVisualizationWebDom +npm test --prefix ClumsyPilot/tests/TrajectoryPlanningVisualizationWebDom +dotnet run --project ClumsyPilot/tests/TrajectoryPlanningVisualizationVerificationHost/TrajectoryPlanningVisualizationVerificationHost.csproj +``` + +首个有效 DOM 失败为分页隐藏:点击 `ls-st` 后 `getComputedStyle(overview).display` 仍为 `grid`,预期为 `none`;随后依次失败于 y ticks、语义路径/标记、empty-state 和测试钩子。.NET 宿主首个有效失败为 `hidden sections cannot be overridden by grid rules`。 + +为运行 DOM 测试,lockfile 生成后补充执行了 `npm install --prefix ClumsyPilot/tests/TrajectoryPlanningVisualizationWebDom` 安装 jsdom;验证完成后删除 `node_modules`,未提交任何依赖目录。 + +GREEN: + +```powershell +npm test --prefix ClumsyPilot/tests/TrajectoryPlanningVisualizationWebDom +``` + +退出码 0,6 个 DOM 测试全部通过,0 失败。 + +```powershell +dotnet run --project ClumsyPilot/tests/TrajectoryPlanningVisualizationVerificationHost/TrajectoryPlanningVisualizationVerificationHost.csproj +``` + +退出码 0,输出 `PASS trajectory-planning-visualization`。 + +```powershell +git diff --check +``` + +退出码 0,仅有仓库既有 LF/CRLF 提示,无新空白错误。 + +## 执行器审计与清理 + +```powershell +rg -n "SendXYThSpeed|SendMotion|DriveStop|PredefinedDriveStop|AccumulateSpeed|SetGear|SetBrake" ClumsyPilot/ParkrobTrajplanner/tarjplanner_movementtest +``` + +无匹配(rg 退出码 1,符合“无匹配”预期)。 + +```powershell +rg -n "TrajectoryPlanningVisualizationWebDom|jsdom" ClumsyPilot/TrajectoryPlanningVisualization -g "*.csproj" -g "*.cs" -g "*.html" -g "*.css" -g "*.js" +``` + +无匹配(rg 退出码 1),确认 npm 测试包不进入生产 Web/插件输出。 + +## 工作区保护 + +保留并未回退用户既有脏工作区与未跟踪内容,包括但不限于 `.gitignore`、`EmPlannerConfiguration.cs`、PathSmoothing/CoarsePath/Map 相关改动、文档和未跟踪报告。 + +实现提交只显式暂存本阶段白名单文件;提交后 `git diff --cached --name-only` 为空,未使用 `git reset --hard`、`git checkout --`、`git clean`、`git add .` 或 `git add -A`。 + +## 已知警告与偏差 + +- `npm install` 输出 npm 12 升级提示,不影响依赖锁定。 +- `git diff --check` 持续输出仓库既有 LF/CRLF 提示,不影响空白检查结果。 +- 仓库 `.gitignore` 未忽略 `node_modules/`;本阶段临时生成的 `node_modules` 已删除,避免污染工作区与提交范围。 +- `index.html` 在本次白名单内但未改动,现有四页布局未重做。 + +## 未运行项 + +- 未进入 Phase 07 或后续任何阶段。 +- 未实现图表框选、滚轮缩放、重置、全屏或任何缩放功能。 +- 未执行 Native Painter、跨段规划扩展、实车操作或 `em-core-all`。 +- 本阶段验证命令按任务要求仅执行 jsdom 测试、.NET 可视化宿主、源审计和 `git diff --check`。 + +## Phase 07 事实 + +对应主计划 Task 9,阶段执行计划 Task 7:每张图独立视域缩放,不改变规划数据。 + +Phase 07 允许创建/修改: + +- 修改:`ClumsyPilot/TrajectoryPlanningVisualization/Web/index.html` +- 修改:`ClumsyPilot/TrajectoryPlanningVisualization/Web/app.css` +- 修改:`ClumsyPilot/TrajectoryPlanningVisualization/Web/app.js` +- 修改:`ClumsyPilot/tests/TrajectoryPlanningVisualizationWebDom/dashboard.dom.test.mjs` +- 交接:`docs/superpowers/handoffs/em-full-direction-visualization/phase-07.md` + +接口与验证要求: + +- 产生每张图的 `chartViewports[id]`,仅包含可见 x/y 数据域。 +- 产生框选放大、滚轮缩放、重置和全屏;缩放前后输入快照数组必须保持字节不变。 +- SSE 新周期到达时使用仍有效的本地视域重绘,不改写原始数据,也不向规划器发送参数。 + +必须执行: + +```powershell +npm test --prefix ClumsyPilot/tests/TrajectoryPlanningVisualizationWebDom +dotnet run --project ClumsyPilot/tests/TrajectoryPlanningVisualizationVerificationHost/TrajectoryPlanningVisualizationVerificationHost.csproj +git diff --check +``` + +实现提交信息:`feat: add observation chart viewport zoom`。 + +交接文件单独提交信息:`docs: record EM full-direction phase 07 handoff`。 + +Phase 07 退出门禁:每张图都有独立局部导航且不修改规划数据;不包含 Native Painter 改动。 + +Phase 07 的 Phase 06 实现提交为 `05cfd673f504d5ecee000ab9b85c7346436f2076`,上一交接文件为本文件;调用方需在最终答复中提供本交接提交的真实哈希并验证可达。