# 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`，上一交接文件为本文件；调用方需在最终答复中提供本交接提交的真实哈希并验证可达。
